写点什么

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

作者:阿里云AIoT
  • 2023-02-27
    浙江
  • 本文字数:2903 字

    阅读完需:约 10 分钟

在物联网实际项目中,有些设备采用私有协议接入了本地设备管理系统,有些 NB-IoT 设备被迫接入了电信 AEP 平台,有些设备接入了移动 OneNET 平台。但甲方客户的整体业务都部署在阿里云上,我们如何实现整体业务上云呢?阿里云 IoT 物联网平台提供了泛化协议 SDK 接入的方案,在 IoT 设备零改造的前提下,帮助企业快速构建云上桥接服务,通过网桥实现 IoT 终端设备与阿里云 IoT 物联网平台的双向数据通信。

技术架构

image.png


方案 1:泛化 SDK

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

image.png


适用场景

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

  • 设备无 Internet 联网能力。

  • 设备采用私有协议。

  • 存量设备不修改固件逻辑

适用场景

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

  • 提供基于配置文件的静态配置管理能力。

  • 提供设备连接管理能力。

  • 提供上行通信能力。

  • 提供下行通信能力。


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

image.png


   开发实战  **


泛化 SDK 依赖

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

<dependency>  <groupId>com.aliyun.openservices</groupId>  <artifactId>iot-as-bridge-sdk-core</artifactId>  <version>2.1.3</version></dependency>
复制代码

初始化 SDK 

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

BridgeBootstrap bridgeBootstrap = new BridgeBootstrap();bridgeBootstrap.bootstrap(new DownlinkChannelHandler() {    @Override    public boolean pushToDevice(Session session, String topic, byte[] payload) {        // 云端下行控制指令        String content = new String(bytes);        log.info("Get DownLink message, session:{}, {}, {}", session, topic, content);        return true;    }    @Override    public boolean broadcast(String topic, byte[] payload) {        return false;    }});
复制代码

配置泛化网桥身份 

创建网桥产品

image.png


注册网桥设备

image.png


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

# Server endpointhttp2Endpoint = "https://你的ProductKey.iot-as-http2.cn-shanghai.aliyuncs.com:443"authEndpoint = "https://iot-auth.cn-shanghai.aliyuncs.com/auth/bridge"# Gateway device info, productKey & deviceName & deviceSecretproductKey = ${bridge-ProductKey}deviceName = ${bridge-DeviceName}deviceSecret = ${bridge-DeviceSecret}
# subDeviceConnectMode = 3,即子设备在线状态和网关是否在线无关subDeviceConnectMode = 3
复制代码

配置网桥下设备身份 

创建子设备产品

image.png


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

image.png


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

${device-original-Identity} {  productKey : ${device-ProductKey}  deviceName : ${device-DeviceName}  deviceSecret : ${device-DeviceSceret}  }
复制代码

设备上线 

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

UplinkChannelHandler uplinkHandler = new UplinkChannelHandler();//创建SessionObject channel = new Object();Session session = Session.newInstance(originalIdentity, channel);//设备上线boolean success = uplinkHandler.doOnline(session, originalIdentity);if (success) {    // 设备上线成功,网桥接受后续设备通信请求。} else {    // 设备上线失败,网桥可以拒绝后续设备通信请求,如断开连接。}
复制代码


image.png

设备通过网桥上报数据 

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

// originalIdentity 设备上报数据DeviceIdentity deviceIdentity = ConfigFactory.getDeviceConfigManager().getDeviceIdentity(originalIdentity);ProtocolMessage protocolMessage = new ProtocolMessage();protocolMessage.setPayload(payload);protocolMessage.setQos(0);protocolMessage.setTopic(String.format(TOPIC_TEMPLATE_USER_DEFINE, deviceIdentity.getProductKey(), deviceIdentity.getDeviceName()));// 网桥代理上报uplinkChannelHandler.doPublishAsync(originalIdentity, protocolMessage);
复制代码


image.png

设备接收云端指令

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

private static ExecutorService executorService  = new ThreadPoolExecutor(    Runtime.getRuntime().availableProcessors(),    Runtime.getRuntime().availableProcessors() * 2,    60, TimeUnit.SECONDS,    new LinkedBlockingQueue<>(1000),    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("bridge-downlink-handle-%d").build(),    new ThreadPoolExecutor.AbortPolicy());public static void main(String args[]) {    //Use application.conf & devices.conf by default    bridgeBootstrap = new BridgeBootstrap();    bridgeBootstrap.bootstrap(new DownlinkChannelHandler() {        @Override        public boolean pushToDevice(Session session, String topic, byte[] payload) {            //get message from cloud            //get downlink message from cloud            executorService.submit(() -> handleDownLinkMessage(session, topic, payload));            return true;        }        @Override        public boolean broadcast(String s, byte[] bytes) {            return false;        }    });}private static void handleDownLinkMessage(Session session, String topic, byte[] payload) {    String content = new String(payload);    log.info("Get DownLink message, session:{}, topic:{}, content:{}", session, topic, content);    Object channel = session.getChannel();    String originalIdentity = session.getOriginalIdentity();    //for example, you can send the message to device via channel, it depends on you specific server implementation}
复制代码


image.png


image.png

设备下线

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

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


阿里云物联网平台客户交流群

用户头像

阿里云AIoT

关注

物联网内容搬运者 2022-04-22 加入

还未添加个人简介

评论

发布
暂无评论
IoT 存量设备 零改造,泛化SDK实现整体业务迁移上云——实践类_前端开发_阿里云AIoT_InfoQ写作社区