在实际物联网项目中,部分设备采用私有协议接入本地设备管理系统,部分NB-IoT设备是强制连接到本地设备管理系统部分设备连接到移动OneNET平台。但甲方客户整体业务部署在阿里云上。如何实现整体业务上云?阿里云物联网平台提供通用协议SDK接入方案。在物联网设备零改造的前提下,帮助企业在云端快速搭建桥接服务,通过桥接实现物联网终端设备与阿里云物联网平台的连接。双向数据通信。技术架构方案一:通用化SDK通用化协议SDK是一个协议自适应框架,用于构建与阿里云物联网平台高效双向通信的桥接服务。适用场景泛化协议SDK针对的目标场景包括:不具有互联网联网能力的设备。该设备使用专有协议。现有设备不修改固件逻辑适用场景通用协议SDK使桥接服务器具备与物联网平台通信的能力。提供基于配置文件的静态配置管理能力。提供设备连接管理功能。提供上行通信能力。提供下行通信能力。接入流程**使用泛化协议SDK,桥接设备与物联网平台的整体流程图如下:开发实践**泛化SDK依赖泛化协议,仅支持Java开发语言,Maven依赖项目添加泛化协议SDK,如下:com.aliyun.openservicesiot-as-bridge-sdk-core2.1.3初始化SDK您需要创建一个BridgeBootstrap对象实例并调用bootstrap方法。通用协议SDK初始化完成后,读取网桥信息,向云端发起网桥设备上线请求。另外,您可以在调用bootstrap方法接收云端下行消息的同时,向泛化协议SDK注册一个DownlinkChannelHandler回调。BridgeBootstrapbridgeBootstrap=newBridgeBootstrap();bridgeBootstrap.bootstrap(newDownlinkChannelHandler(){@OverridepublicbooleanpushToDevice(Sessionsession,Stringtopic,byte[]payload){//云下行控制命令Stringcontent=newString(bytes);log.info("GetDownLinkmessage,session:{},{},{}",session,topic,content);返回true;}@Overridepublicbooleanbroadcast(Stringtopic,byte[]payload){returnfalse;}});配置通用网桥标识创建网桥产品注册网桥设备网桥配置默认使用配置文件。默认情况下,配置文件是从Java项目默认资源文件路径(通常是src/main/resources/)下的application.conf中读取的。#服务器端点http2Endpoint="https://yourProductKey.iot-as-http2.cn-shanghai.aliyuncs.com:443"authEndpoint="https://iot-auth.cn-shanghai.aliyuncs.com/auth/bridge"#网关设备信息,productKey&deviceName&deviceSecretproductKey=${bridge-ProductKey}deviceName=${bridge-DeviceName}deviceSecret=${bridge-DeviceSecret}#subDeviceConnectMode=3,即子设备在线状态与网关是否在线无关subDeviceConnectMode=3配置桥下设备的身份创建子设备产品注册设备,获取身份三元组并配置设备原始身份标识与设备证书信息。默认使用配置文件方式,从Java项目默认资源文件路径下的devices.conf中读取配置文件(通常是src/main/resources/)${device-original-Identity}{productKey:${device-ProductKey}deviceName:${device-DeviceName}deviceSecret:${device-DeviceScret}}设备在线当设备在线时,需要传递一个session。当下行消息被回调时,Session会被回调到桥上。Session中包含设备的原始标识符字段,以便桥可以确定该消息属于哪个设备。UplinkChannelHandleruplinkHandler=newUplinkChannelHandler();//创建SessionObjectchannel=newObject();Sessionsession=Session.newInstance(originalIdentity,channel);//设备上线booleansuccess=uplinkHandler.doOnline(session,originalIdentity);if(success){//设备上线成功,桥接受后续的设备通信请求。}else{//设备上线失败,桥可以拒绝后续的设备通信请求,比如断开连接。}设备通过网桥上报数据网桥使用泛化协议SDK代理设备上报消息,代码如下:ProtocolMessageprotocolMessage=newProtocolMessage();protocolMessage.setPayload(payload);protocolMessage.setQos(0);protocolMessage.setTopic(String.format(TOPIC_TEMPLATE_USER_DEFINE,deviceIdentity.getProductKey(),deviceIdentity.getDeviceName()));//桥代理上报uplinkChannelHandler.doPublishAsyncity(originprotocolMessage);设备接收云命令。云端可以调用PubAPI向设备发送控制命令。bridge监听和处理云消息的代码如下:privatestaticExecutorServiceexecutorService=newThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),Runtime.getRuntime().availableProcessors()*2,60,TimeUnit.SECONDS,newLinkedBlockingQueue<>(1000),newThreadFactoryBuilder().setDaemon(true).setNameFormat("bridge-downlink-handle-%d").build(),newThreadPoolExecutor.AbortPolicy());公共静态无效迈n(Stringargs[]){//默认使用application.conf&devices.confbridgeBootstrap=newBridgeBootstrap();bridgeBootstrap.bootstrap(newDownlinkChannelHandler(){@OverridepublicbooleanpushToDevice(Sessionsession,Stringtopic,byte[]payload){//从云端获取消息//从云端获取下行消息executorService.submit(()->handleDownLinkMessage(会话,主题,有效负载));返回真;}@Overridepublicbooleanbroadcast(Strings,byte[]bytes){returnfalse;}});}privatestaticvoidhandleDownLinkMessage(会话会话,字符串主题,byte[]有效负载){字符串内容=新字符串(有效载荷);log.info("获取下行消息,session:{},topic:{},content:{}",session,topic,content);对象通道=session.getChannel();StringoriginalIdentity=session.getOriginalIdentity();//例如,可以通过channel向设备发送消息,具体看你的服务器实现}当设备与桥断开连接时,可以调用离线接口通知云端:upLinkHandler.doOffline(originalIdentity);【往期回顾】1.物联网传感器工作原理的39张GIF图总结[2.物联网设备发送MQTT请求的波折](https://mp.weixin.qq.com/s?sp...)[3、20要素开发Arduino环境监视器](https://mp.weixin.qq.com/s?sp...)[4.智能手持体温枪开发实践](https://mp.weixin.qq.com/s?sp...)[5.JMeter压测MQTT服务性能实战】(https://mp.weixin.qq.com/s?sp...)物联网平台产品介绍详情:https://www.aliyun.com/produc...阿里云物联网平台客户交流群