当前位置:   article > 正文

IoT 存量设备 零改造,泛化SDK实现整体业务迁移上云——实践类_sdk适配存量设备

sdk适配存量设备

在物联网实际项目中,有些设备采用私有协议接入了本地设备管理系统,有些 NB-IoT 设备被迫接入了电信 AEP 平台,有些设备接入了移动 OneNET 平台。但甲方客户的整体业务都部署在阿里云上,我们如何实现整体业务上云呢?


阿里云 IoT 物联网平台提供了泛化协议SDK接入的方案,在 IoT 设备零改造的前提下,帮助企业快速构建云上桥接服务,通过网桥实现 IoT 终端设备与阿里云 IoT 物联网平台的双向数据通信。

技术架构

方案1:泛化SDK

泛化协议SDK是协议自适应的框架,用以构建与阿里云物联网平台进行高效双向通信的桥接服务。

 

适用场景

泛化协议SDK面向的目标场景包括:

  • 设备无 Internet 联网能力。
  • 设备采用私有协议。
  • 存量设备不修改固件逻辑

适用场景

泛化协议SDK使得网桥Server具备与物联网平台进行通信的能力。

  • 提供基于配置文件的静态配置管理能力。
  • 提供设备连接管理能力。
  • 提供上行通信能力。
  • 提供下行通信能力。

   接入流程  **


使用泛化协议SDK,桥接设备与物联网平台的整体流程图,如下:

   开发实战  **


泛化 SDK 依赖
泛化协议仅支持Java开发语言,添加泛化协议SDK的项目Maven依赖,如下:

  1. <dependency>
  2. <groupId>com.aliyun.openservices</groupId>
  3. <artifactId>iot-as-bridge-sdk-core</artifactId>
  4. <version>2.1.3</version>
  5. </dependency>

初始化 SDK 
您需要创建一个BridgeBootstrap对象实例,并调用bootstrap方法。泛化协议SDK初始化工作完成后,读取网桥信息,并向云端发起网桥设备上线请求等。
此外,可以在调用bootstrap方法的同时,向泛化协议SDK注册一个DownlinkChannelHandler回调,用于接收云端下行消息。

  1. BridgeBootstrap bridgeBootstrap = new BridgeBootstrap();
  2. bridgeBootstrap.bootstrap(new DownlinkChannelHandler() {
  3. @Override
  4. public boolean pushToDevice(Session session, String topic, byte[] payload) {
  5. // 云端下行控制指令
  6. String content = new String(bytes);
  7. log.info("Get DownLink message, session:{}, {}, {}", session, topic, content);
  8. return true;
  9. }
  10. @Override
  11. public boolean broadcast(String topic, byte[] payload) {
  12. return false;
  13. }
  14. });


配置泛化网桥身份 

创建网桥产品

注册网桥设备


网桥配置默认使用配置文件方式。默认从Java工程默认资源文件路径(一般是src/main/resources/)下的application.conf中读取配置文件。

  1. # Server endpoint
  2. http2Endpoint = "https://你的ProductKey.iot-as-http2.cn-shanghai.aliyuncs.com:443"
  3. authEndpoint = "https://iot-auth.cn-shanghai.aliyuncs.com/auth/bridge"
  4. # Gateway device info, productKey & deviceName & deviceSecret
  5. productKey = ${bridge-ProductKey}
  6. deviceName = ${bridge-DeviceName}
  7. deviceSecret = ${bridge-DeviceSecret}
  8. # subDeviceConnectMode = 3,即子设备在线状态和网关是否在线无关
  9. subDeviceConnectMode = 3


配置网桥下设备身份 
创建子设备产品

注册设备,获取身份三元组


配置设备原始身份标识符和设备证书信息的映射关系。默认使用配置文件方式,默认从Java工程的默认资源文件路径(一般是src/main/resources/)下的devices.conf中读取配置文件。

  1. ${device-original-Identity} {
  2. productKey : ${device-ProductKey}
  3. deviceName : ${device-DeviceName}
  4. deviceSecret : ${device-DeviceSceret}
  5. }


设备上线 
设备上线时,需要传Session。下行消息回调时,会把Session回调给网桥。Session中包含设备的原始身份标识符字段,以便网桥判断消息属于哪个设备。

  1. UplinkChannelHandler uplinkHandler = new UplinkChannelHandler();
  2. //创建Session
  3. Object channel = new Object();
  4. Session session = Session.newInstance(originalIdentity, channel);
  5. //设备上线
  6. boolean success = uplinkHandler.doOnline(session, originalIdentity);
  7. if (success) {
  8. // 设备上线成功,网桥接受后续设备通信请求。
  9. } else {
  10. // 设备上线失败,网桥可以拒绝后续设备通信请求,如断开连接。
  11. }



设备通过网桥上报数据 
网桥使用泛化协议 SDK 代理设备上报消息,代码如下:

  1. // originalIdentity 设备上报数据
  2. DeviceIdentity deviceIdentity = ConfigFactory.getDeviceConfigManager().getDeviceIdentity(originalIdentity);
  3. ProtocolMessage protocolMessage = new ProtocolMessage();
  4. protocolMessage.setPayload(payload);
  5. protocolMessage.setQos(0);
  6. protocolMessage.setTopic(String.format(TOPIC_TEMPLATE_USER_DEFINE, deviceIdentity.getProductKey(), deviceIdentity.getDeviceName()));
  7. // 网桥代理上报
  8. uplinkChannelHandler.doPublishAsync(originalIdentity, protocolMessage);


设备接收云端指令
云端可以调用Pub API给设备下发控制指令,网桥监听和处理云端消息的代码如下:

  1. private static ExecutorService executorService = new ThreadPoolExecutor(
  2. Runtime.getRuntime().availableProcessors(),
  3. Runtime.getRuntime().availableProcessors() * 2,
  4. 60, TimeUnit.SECONDS,
  5. new LinkedBlockingQueue<>(1000),
  6. new ThreadFactoryBuilder().setDaemon(true).setNameFormat("bridge-downlink-handle-%d").build(),
  7. new ThreadPoolExecutor.AbortPolicy());
  8. public static void main(String args[]) {
  9. //Use application.conf & devices.conf by default
  10. bridgeBootstrap = new BridgeBootstrap();
  11. bridgeBootstrap.bootstrap(new DownlinkChannelHandler() {
  12. @Override
  13. public boolean pushToDevice(Session session, String topic, byte[] payload) {
  14. //get message from cloud
  15. //get downlink message from cloud
  16. executorService.submit(() -> handleDownLinkMessage(session, topic, payload));
  17. return true;
  18. }
  19. @Override
  20. public boolean broadcast(String s, byte[] bytes) {
  21. return false;
  22. }
  23. });
  24. }
  25. private static void handleDownLinkMessage(Session session, String topic, byte[] payload) {
  26. String content = new String(payload);
  27. log.info("Get DownLink message, session:{}, topic:{}, content:{}", session, topic, content);
  28. Object channel = session.getChannel();
  29. String originalIdentity = session.getOriginalIdentity();
  30. //for example, you can send the message to device via channel, it depends on you specific server implementation
  31. }


设备下线
当设备从网桥断开后,可以调用下线接口,告知云端:

upLinkHandler.doOffline(originalIdentity);




【往期回顾】
1、39张IoT传感器工作原理GIF图汇总
2、IoT 设备发送 MQTT 请求的曲折经历
3、20元体 Arduino 环境监测仪开发
4、智能手持测温枪开发实践
5、JMeter 压测 MQTT 服务性能实战


物联网平台产品介绍详情:https://www.aliyun.com/product/iot/iot_instc_public_cn
 
阿里云物联网平台客户交流群

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/382998
推荐阅读
相关标签
  

闽ICP备14008679号