IoT 存量设备 零改造,实现整体业务迁移上云
在物联网实际项目中,有些设备采用私有协议接入了本地设备管理系统,有些 NB-IoT 设备被迫接入了电信 AEP 平台,有些设备接入了移动 OneNET 平台。但甲方客户的整体业务都部署在阿里云上,我们如何实现整体业务上云呢?
阿里云 IoT 物联网平台提供了泛化协议SDK接入的方案,在 IoT 设备零改造的前提下,帮助企业快速构建云上桥接服务,通过网桥实现 IoT 终端设备与阿里云 IoT 物联网平台的双向数据通信。
技术架构
方案1:泛化SDK
泛化协议SDK是协议自适应的框架,用以构建与阿里云物联网平台进行高效双向通信的桥接服务。
适用场景
泛化协议SDK面向的目标场景包括:
适用场景
泛化协议SDK使得网桥Server具备与物联网平台进行通信的能力。
- 提供基于配置文件的静态配置管理能力。
- 提供设备连接管理能力。
- 提供上行通信能力。
- 提供下行通信能力。
接入流程 **
使用泛化协议SDK,桥接设备与物联网平台的整体流程图,如下:
开发实战 **
泛化 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; } });
配置泛化网桥身份
创建网桥产品
注册网桥设备
网桥配置默认使用配置文件方式。默认从Java工程默认资源文件路径(一般是src/main/resources/)下的application.conf中读取配置文件。
# Server endpoint http2Endpoint = "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 & deviceSecret productKey = ${bridge-ProductKey} deviceName = ${bridge-DeviceName} deviceSecret = ${bridge-DeviceSecret} # subDeviceConnectMode = 3,即子设备在线状态和网关是否在线无关 subDeviceConnectMode = 3
配置网桥下设备身份
创建子设备产品
注册设备,获取身份三元组
配置设备原始身份标识符和设备证书信息的映射关系。默认使用配置文件方式,默认从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(); //创建Session Object channel = new Object(); Session session = Session.newInstance(originalIdentity, channel); //设备上线 boolean success = uplinkHandler.doOnline(session, originalIdentity); if (success) { // 设备上线成功,网桥接受后续设备通信请求。 } else { // 设备上线失败,网桥可以拒绝后续设备通信请求,如断开连接。 }
设备通过网桥上报数据
网桥使用泛化协议 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);
设备接收云端指令
云端可以调用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 }
设备下线
当设备从网桥断开后,可以调用下线接口,告知云端:
upLinkHandler.doOffline(originalIdentity);
【往期回顾】
1、39张IoT传感器工作原理GIF图汇总
2、IoT 设备发送 MQTT 请求的曲折经历
3、20元体 Arduino 环境监测仪开发
4、智能手持测温枪开发实践
5、JMeter 压测 MQTT 服务性能实战

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
实时计算 Flink 版 最佳实践
金融行业 行业背景 金融是现代经济的核心。我国金融业在市场化改革和对外开放中不断发展,金融总量大幅增长。金融稳定直接关系到国家经济发展的前途和命运,金融业是国民经济发展的晴雨表。对我国金融业发展现状进行客观分析,对金融业发展趋势进行探索,有助于消除金融隐患,使金融业朝着健康、有序方向发展。 解决方案 金融行业的实时数仓建设实践 IoT行业 行业背景 物联网(Internet of Things,以下简写为 IoT)是互联网、传统电信网等资讯的承载体,让所有具备独立功能的普通物体实现互联互通的网络。物联网广泛应用于运输和物流、健康医疗、智慧环境(家庭、办公、工厂)等领域, 具有十分广阔的市场和应用前景。物联网将智能感知、识别技术、网络通信与普适计算等技术融合起来,被认为是继计算机、互联网、智能手机之后世界信息产业发展的下一个风口。据 IDC 估计,到 2020 年物联网将在全球范围内产生 1.46 万亿美元的价值。据预测,届时中国的物联网市场规模将超过 1.8 万亿人民币。得益于庞大的人口基数和低廉的芯片制造成本,中国将成为物联网行业的主要参与者,并在推动全球物联网市场增长上发挥重要的作...
- 下一篇
IoT 设备免烧录三元组,基于MQTT动态注册身份,快速上云方案
背景 物联网场景中,设备产线烧录不同三元组成本很高,Android设备更是无法独立烧录三元组,IoT 存量设备迁移更是无法预置身份三元组,面对这种场景,IoT物联网平台提供了无需预注册三元组,在设备运行时通过MQTT动态注册,获取认证信息,再发起设备业务连接的方案。 安全提示 对于一型一密免预注册方式,请在设备端使用4.X版C SDK。该SDK包含DAS(设备取证服务),可以对设备可能产生的安全事件进行风控。物联网平台不承担因设备端没有使用该SDK而导致的安全风险。 流程图 设备动态注册三元组流程如下: 开发实战 创建产品 我们接入 IoT 物联网平台,注册一个新产品:Android设备。进入产品详情,获取productKey和productSecret。开启动态注册功能,如下图: 接下来,我们无需按常规流程,在控制台注册设备,而是直接开发设备端程序。 设备端开发 我们以Node.js代码演示设备动态注册原理。 动态注册 设备发送CONNECT报文,报文中包含动态注册参数,请求建立连接。• MQTT连接域名:公共实例的连接域名为${YourProductKey}.iot-as-mqtt...
相关文章
文章评论
共有0条评论来说两句吧...