首页 文章 精选 留言 我的

精选列表

搜索[消息对话],共10000篇文章
优秀的个人博客,低调大师

阿里云物联网消息透传设备端payLoad设置问题

概述 由于低配置且资源受限,或者对网络流量有要求的设备,不适合直接构造JSON数据与物联网平台通信,可将原数据透传到物联网平台。本文主要针对文档中未对设备端payLoad的设置进行介绍,初次使用容易出错,结合官方示例对payLoad对象的处理进行介绍。 测试步骤 1、参考官方示例进行设置测试。 2、物理型的定义截图; 3、测试验证 0x00002233441232013fa00000 4、发送端payLoad处理,注意传入的是byte[]对象,不是String对象。 String hexString = "00002233441232013fa00000"; byte[] payLoad = hexToByteArray(hexString); request.payloadObj = payLoad; hexToByteArray方法实现:

优秀的个人博客,低调大师

重磅消息:Dromara团队正式开源高性能异步API网关-Soul

微服务为什么需要网关? 微服务的流行,服务之间的调用,需要统一的请求标准。 微服务接口,需要监控,限流,熔断,等等。 微服务接口需要统一的鉴权。 接口问题定位 A/B test等等。太多功能了,就不一一列举了。 Soul是什么? soul 是一款高性能,响应式的网关。我在参考Kong 的插件设计思想,高性能的webflux后,开发而来。 官网 : https://dromara.org 如果打不开,改成http即可. github地址 :https://github.com/Dromara/soul gitee地址: https://gitee.com/shuaiqiyu/soul Soul架构设计 执行流程图 Soul功能: 支持各种语言,无缝集成Dubbo,SpringCloud,以及http服务。 丰富的插件支持,监控,鉴权,限流,熔断,代理,防火墙等等。 网关多种规则动态配置,支持各种策略配置。 插件热插拔,易扩展。 支持集群部署,支持A/B Test。 当然也有很多其他的功能,就不一一说了。 Soul 最大的亮点? 插件的热插拔,规则的动态配置。举个列子,比如一个接口你限流是1秒50次,但是你想调小点,像Springcloud-gateway 或者zuul 是不是还得改动配置 然后重启。 soul则不需要,直接在soul-admin找到对应的接口修改即可. soul提供了比较丰富的插件功能,插件与插件规则,选择器,用户可以自由定义 不想用就停用或者删除就行。想用就开启或者新增。 soul 是基于webflux的, 依赖rxJava ,其实高性能的,响应式的网关。 soul 提供了dubbo ,springcloud rpc框架的支持。 Soul适合人群 是适合所有的微服务系统。 后端是java,使用了一些rpc框架(dubbo,springcloud), 然后前端或者其他系统是 .net php 然后需要对接? 然后你问java 后端开发者,dubbo接口怎么调用? java 狗肯定不愿意给你提供http接口,或者直接回一句,你去找领导吧? 这个时候,你只需要告诉它,使用soul,你后端代码一句都不要动,只需要告诉我你zookeeper的地址就好! 当然也适合一些其他语言的系统,或者是老系统。 只要你是http服务就行,soul会进行代理请求调用。 Soul性能 soul 天然支持集群部署,底层采用webflux。 soul 所有的配置走的都是本地缓存。 双11,我们的高峰单台QPS 1W左右。 Soul VS java体系的Zuul,springcloud-gateway 性能上来说,soul和sc-gateway 都采用webflux,性能相当 sc-gateway 或者zuul 基于配置的,接口很多很难集成,而且配置规则不是动态化的。 soul是插件化的思想,插件热插拔,配置灵活并且是动态化的。 soul还可以用来排除问题,A/B test。 soul提供了监控插件来统计qps等等信息。 soul提供了waf,sign插件,来阻止外来攻击 soul vs kong kong 也是非常优秀的框架,但是其实lua语言,开发维护成本高,但是soul完全是java,所以javaer你懂的。 篇幅原因,此文只是一个简单介绍,Soul有很大的价值,喜欢的朋友可以去官网详细介绍。也欢迎大家进行star 和fork

优秀的个人博客,低调大师

Android应用程序键盘(Keyboard)消息处理机制分析(7)

函数首先根据文件名来打开这个设备文件: fd=open(deviceName,O_RDWR); 系统中所有输入设备文件信息都保存在成员变量mDevicesById中,因此,先在mDevicesById找到一个空位置来保存当前打开的设备文件信息: mDevicesById[devid].seq=(mDevicesById[devid].seq+(1<<SEQ_SHIFT))&SEQ_MASK; if(mDevicesById[devid].seq==0){ mDevicesById[devid].seq=1<<SEQ_SHIFT; } 找到了空闲位置后,就为这个输入设备文件创建相应的device_t信息: mDevicesById[devid].seq=(mDevicesById[devid].seq+(1<<SEQ_SHIFT))&SEQ_MASK; if(mDevicesById[devid].seq==0){ mDevicesById[devid].seq=1<<SEQ_SHIFT; } new_mFDs=(pollfd*)realloc(mFDs,sizeof(mFDs[0])*(mFDCount+1)); new_devices=(device_t**)realloc(mDevices,sizeof(mDevices[0])*(mFDCount+1)); if(new_mFDs==NULL||new_devices==NULL){ LOGE("outofmemory"); return-1; } mFDs=new_mFDs; mDevices=new_devices; ...... device_t*device=newdevice_t(devid|mDevicesById[devid].seq,deviceName,name); if(device==NULL){ LOGE("outofmemory"); return-1; } device->fd=fd; 同时,这个设备文件还会保存在数组mFDs中: mFDs[mFDCount].fd=fd; mFDs[mFDCount].events=POLLIN; mFDs[mFDCount].revents=0; 接下来查看这个设备是不是键盘: //Figureoutthekindsofeventsthedevicereports. uint8_tkey_bitmask[sizeof_bit_array(KEY_MAX+1)]; memset(key_bitmask,0,sizeof(key_bitmask)); LOGV("Gettingkeys..."); if(ioctl(fd,EVIOCGBIT(EV_KEY,sizeof(key_bitmask)),key_bitmask)>=0){ //Seeifthisisakeyboard.Ignoreeverythinginthebuttonrangeexceptfor //gamepadswhicharealsoconsideredkeyboards. if(containsNonZeroByte(key_bitmask,0,sizeof_bit_array(BTN_MISC)) ||containsNonZeroByte(key_bitmask,sizeof_bit_array(BTN_GAMEPAD), sizeof_bit_array(BTN_DIGI)) ||containsNonZeroByte(key_bitmask,sizeof_bit_array(KEY_OK), sizeof_bit_array(KEY_MAX+1))){ device->classes|=INPUT_DEVICE_CLASS_KEYBOARD; device->keyBitmask=newuint8_t[sizeof(key_bitmask)]; if(device->keyBitmask!=NULL){ memcpy(device->keyBitmask,key_bitmask,sizeof(key_bitmask)); }else{ deletedevice; LOGE("outofmemoryallocatingkeybitmask"); return-1; } } } 如果是的话,还要继续进一步初始化前面为这个设备文件所创建的device_t结构体,主要就是把结构体device的classes成员变量的INPUT_DEVICE_CLASS_KEYBOARD位置为1了,以表明这是一个键盘。 如果是键盘设备,初始化工作还未完成,还要继续设置键盘的布局等信息: if((device->classes&INPUT_DEVICE_CLASS_KEYBOARD)!=0){ chartmpfn[sizeof(name)]; charkeylayoutFilename[300]; //amoredescriptivename device->name=name; //replaceallthespaceswithunderscores strcpy(tmpfn,name); for(char*p=strchr(tmpfn,'');p&&*p;p=strchr(tmpfn,'')) *p='_'; //findthe.klfileweneedforthisdevice constchar*root=getenv("ANDROID_ROOT"); snprintf(keylayoutFilename,sizeof(keylayoutFilename), "%s/usr/keylayout/%s.kl",root,tmpfn); booldefaultKeymap=false; if(access(keylayoutFilename,R_OK)){ snprintf(keylayoutFilename,sizeof(keylayoutFilename), "%s/usr/keylayout/%s",root,"qwerty.kl"); defaultKeymap=true; } status_tstatus=device->layoutMap->load(keylayoutFilename); if(status){ LOGE("Error%dloadingkeylayout.",status); } //telltheworldaboutthedevname(thedescriptivename) if(!mHaveFirstKeyboard&&!defaultKeymap&&strstr(name,"-keypad")){ //thebuilt-inkeyboardhasawell-knowndeviceIDof0, //thisdevicebetternotgoaway. mHaveFirstKeyboard=true; mFirstKeyboardId=device->id; property_set("hw.keyboards.0.devname",name); }else{ //ensuremFirstKeyboardIdissetto-something-. if(mFirstKeyboardId==0){ mFirstKeyboardId=device->id; } } charpropName[100]; sprintf(propName,"hw.keyboards.%u.devname",device->id); property_set(propName,name); //'Q'keysupport=cheaptestofwhetherthisisanalpha-capablekbd if(hasKeycodeLocked(device,AKEYCODE_Q)){ device->classes|=INPUT_DEVICE_CLASS_ALPHAKEY; } //SeeifthisdevicehasaDPAD. if(hasKeycodeLocked(device,AKEYCODE_DPAD_UP)&& hasKeycodeLocked(device,AKEYCODE_DPAD_DOWN)&& hasKeycodeLocked(device,AKEYCODE_DPAD_LEFT)&& hasKeycodeLocked(device,AKEYCODE_DPAD_RIGHT)&& hasKeycodeLocked(device,AKEYCODE_DPAD_CENTER)){ device->classes|=INPUT_DEVICE_CLASS_DPAD; } //Seeifthisdevicehasagamepad. for(size_ti=0;i<sizeof(GAMEPAD_KEYCODES)/sizeof(GAMEPAD_KEYCODES[0]);i++){ if(hasKeycodeLocked(device,GAMEPAD_KEYCODES[i])){ device->classes|=INPUT_DEVICE_CLASS_GAMEPAD; break; } } LOGI("Newkeyboard:device->id=0x%xdevname='%s'propName='%s'keylayout='%s'\n", device->id,name,propName,keylayoutFilename); } 到这里,系统中的输入设备文件就打开了。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966619,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册