首页 文章 精选 留言 我的

精选列表

搜索[数据库迁移],共10000篇文章
优秀的个人博客,低调大师

IoT 存量设备 零改造,实现整体业务迁移上云

在物联网实际项目中,有些设备采用私有协议接入了本地设备管理系统,有些 NB-IoT 设备被迫接入了电信 AEP平台,有些设备接入了移动 OneNET平台。但甲方客户的整体业务都部署在阿里云上,我们如何实现整体业务上云呢?阿里云 IoT 物联网平台提供了泛化协议SDK接入的方案,在IoT设备零改造的前提下,帮助企业快速构建云上桥接服务,通过网桥实现 IoT 终端设备与阿里云 IoT 物联网平台的双向数据通信。 技术架构 方案1:泛化SDK 泛化协议SDK是协议自适应的框架,用以构建与阿里云物联网平台进行高效双向通信的桥接服务。 适用场景 泛化协议SDK面向的目标场景包括: 设备无 Internet 联网能力。 设备采用私有协议。 存量设备不修改固件逻辑 适用场景 泛化协议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 服务性能实战

资源下载

更多资源
Nacos

Nacos

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

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部分的功能。

用户登录
用户注册