阿里云物联网边缘计算加载MQTT驱动

简介: 本文在LinkEdge快速入门样例驱动的基础上,加载了MQTT订阅的客户端,使得边缘端容器可以通过MQTT获得外部数据。

写在前面

    本文在LinkEdge快速入门样例驱动的基础上,加载了MQTT订阅的客户端,使得边缘端容器可以通过MQTT获得外部数据。

1.         系统需求

物联网边缘计算平台,又名Link IoT Edge[1]。在物联网边缘计算帮助文档中的 “快速入门”描述了这样一种应用场景,“光照传感器检测室内光照强度是否大于500 Lux,若光照强度大于500 Lux,则光照传感器认为室内不需要开灯,从而去关闭灯(客厅灯开关等于1),否则打开灯(客厅灯开关等于0)。”

本文在该样例的基础上,在光照传感器的驱动程序上加载了MQTT订阅的客户端,使得光照传感器可以通过订阅的方式获得光照强度值。

2.         系统架构

    1 给出了样例的边缘实例架构,样例中LightSensor值是模拟值,通过定时器每2000毫秒执行表格 1中代码。

 

1 边缘实例架构

表格 1 模拟值生成代码

          if (self.lightSensor.illuminance >= 600) {

             delta = -100;

           } else if (self.lightSensor.illuminance <= 100) {

             delta = 100;

           }

          self.lightSensor.illuminance += delta;

   

   2给出了在在光照传感器的驱动程序上加载了MQTT订阅的客户端的架构。


2 光照传感器驱动挂载MQTT订阅客户端

3.         安装部署

样例完整的安装和配置流程详见帮助[2]

4.         改写驱动

4.1.        下载驱动

下载LightSensor驱动源码,下载解压后是一个index.js文件。


3 下载驱动

4.2.        编写驱动

(1)       index.js中添加MQTT订阅客户端代码

表格 2 MQTT订阅客户端代码

'use strict';

 

const {

  RESULT_SUCCESS,

  RESULT_FAILURE,

  ThingAccessClient,

} = require('linkedge-thing-access-sdk');

 

var mqtt = require('/usr/bin/mqtt');

var options={username:'admin',password:'password',clientId:'Nodejs-ed16ef77-5cf2-4e5c-b511-1af14451df51'};

var client = mqtt.connect('mqtt://*.*.*.*:1883',options);   // 连接到MQTT服务端

 

var num = 0;

var qtt = {};

 

qtt.id = '2002';

qtt.name = 'shoen';

qtt.age= 5000;

 

client.subscribe('test',{qos:1});                     //订阅主题为test的消息 

 

client.on('message',function(top,message) {  

    qtt=JSON.parse(message.toString());  

});

 

// Max retry interval in seconds for registerAndOnline.

const MAX_RETRY_INTERVAL = 30;

 

(2)       注释原有模拟部分代码,添加获得值代码。

表格 3 获得数据来源

        setInterval(function () {

          // if (self.lightSensor.illuminance >= 600) {

          //   delta = -100;

          // } else if (self.lightSensor.illuminance <= 100) {

          //   delta = 100;

          // }

          // self.lightSensor.illuminance += delta;

 

          if (self.client) {

            try {

              self.lightSensor.illuminance = qtt.age;

              var properties = {'MeasuredIlluminance': self.lightSensor.illuminance};

              console.log(`Report properties: ${JSON.stringify(properties)}`);

              self.client.reportProperties(properties);

            } catch (err) {

              console.log(err);

              self.client.cleanup();

            }

          }

        }, 2000);

 

4.3.        重新部署

(1)       index.js压缩成index.zip文件,注意index.zip仅包含index.js文件,不含其他任何文件夹。

(2)       新建驱动myLightSensor,上传index.zip文件。


4新建驱动

(3)       部署实例


5 部署实例

5.         脚本解析

在部署过程中,我们通过link-iot-edge.sh {productkey} {devicename} {devicesecret}下载和启动边缘计算平台。

分析link-iot-edge.sh后,发现边缘端实际是就是一个docker容器。其中主要几行脚本含义如下描述:


6 link-iot-edge.h源码(局部)

n  docker pull "$LINKEDGE_IMG"

Ø  LINKEDGE_IMG=$IMAGE_NAME_PREFIX:$1

Ø  registry.cn-hangzhou.aliyuncs.com/iotedge/edge_x86_centosversion

n  docker run -d --rm --privileged=true -v linkedge_vol1:/usr/.security -v linkedge_vol2:/etc/.sec/ -v linkedge_vol3:/linkedge/gateway/build/.sst -v linkedge_vol4:/tmp/var/run/ -v linkedge_vol5:/linkedge/run --name=config-params $LINKEDGE_IMG $2 $3 $4

n  docker

Ø  run创建一个新的容器并运行一个命令

Ø  -d后台运行容器,并返回容器ID

Ø  --rm 容器退出时自动清理容器并删除文件系统,

Ø  --privileged=true 以特权方式启动容器,允许挂载宿主机目录

Ø  -v linkedge_vol1:/usr/.security

宿主机的linkedge_vol1目录挂载到容器的/usr/.security

Ø  -v linkedge_vol2:/etc/.sec/

Ø  -v linkedge_vol3:/linkedge/gateway/build/.sst

Ø  -v linkedge_vol4:/tmp/var/run/

Ø  -v linkedge_vol5:/linkedge/run

Ø  --name=config-params 为容器指定一个名称config-params

Ø  $LINKEDGE_IMG 容器名称

Ø  $2 $3 $4三个均作为参数

n  为了方便访问,修改以上启动脚本,使得容器内可以访问宿主机c:/test目录。

Ø  ${preflag} docker run --rm --privileged=true -v c:/test:/data -v linkedge_vol1:/usr/.security -v linkedge_vol2:/etc/.sec/ -v linkedge_vol3:/linkedge/gateway/build/.sst -v linkedge_vol4:/tmp/var/run/ -v linkedge_vol5:/linkedge/run --name=config-params $LINKEDGE_IMG $2 $3 $4

6.         Node.js实现MQTT

n  安装node

n  安装npm install mqtt

6.1.        MQTT服务端

本文采用Apollo MQTT作为MQTT服务器,安装部署完毕后采用默认用户名admin,密码passwordMQTT服务器采用默认的1883端口。

6.2.        MQTT客户端发布

表格 4 MQTT客户端发布

var mqtt = require('mqtt');

 

var options={username:'admin',password: 'password',clientId:'Nodejs-ed16ef77-5cf2-4e5c-b511-1af14451df58'};

var client = mqtt.connect('mqtt://*.*.*.*:1883',options);  //连接到MQTT服务端

 

var num = 0;

var qtt = {};

 

qtt.id = '1001';

qtt.name = 'shoen';

qtt.age= 2222;

 

client.publish('test', JSON.stringify(qtt), { qos: 0, retain: true });    

7.         设置容器

通过link-iot-edge.sh启动边缘容器后,需要进入容器安装mqtt库,并设置容器内环境参数,使得node.js编写的mqtt客户端能够正确引用mqtt库,即var mqtt = require('/usr/bin/mqtt');

设置主要步骤如下所示:

(1)       启动容器:link-iot-edge.sh v1.7 a1xwL19pRAZ mygw uPcoNbWHYselHGpwG2HRtMvh********

(2)       进入容器:docker exec -it config-params /bin/bash

(3)       node.js设置引用

n  安装淘宝cnpmnpm install -g cnpm --registry=https://registry.npm.taobao.org

n  全局安装mqttcnpm install –g mqtt

n  查看cnpm全局仓库路径:cnpm config get prefix

n  修改cnpm全局仓库路径:cnpm config set /usr/bin

n  以上设置完毕后,才可以代码中添加引用:var mqtt = require('/usr/bin/mqtt');

n  以上设置重启本容器失效

8.         容器命令

调试过程中涉及的相关容器命令如下:

(1)       启动容器时映射宿主机和容器目录:-v c:/test:/data

(2)       查看IP地址:ip addr

(3)       下载ifconfigcurl ifconfig.me

(4)       find -name "*thing*"

n  linkedge-thing-access-sdk所在位置:./linkedge/gateway/build/bin/iot-gravity/runtime/nodejs8/node_modules/linkedge-thing-access-sdk

(5)       查看容器镜像docker image

(6)       停止容器 docker stop 容器ID

(7)       删除镜像 docker rmi 镜像ID

9.         注意事项

(1)       驱动编写错误可能包括:库文件未引用、node.js语法错误,mqtt连接错误;

(2)       边缘实例部署过程中,如发生以上错误发生,光照传感器将始终处于“离线”状态;

(3)       本文宿主机为Windows 10,系统配置如下:


7 Windows系统配置

10.     最终效果

在宿主机上通过MQTT客户端发布一个qtt.age=2222数据,该数据会发送至MQTT服务器,容器内加载的MQTT订阅客户端将收到该数据,并将该数据赋值给self.lightSensor.illuminance,获取的值将通过self.client.reportProperties(properties);上报至IOT Hub,最终在LightSensor运行状态中显示光照度检测值为2222Lux


8 最终效果

写在后面

今年3月底深圳云栖大会后,和阿里云Linkedge团队几位同学在西溪园区做了一次简单的技术交流。阿里的同学介绍了物模型、容器等概念,我则提了异构工业设备连接对于设备驱动有较为强烈的需求……眨眼到了年底,Linkedge从公测到发布,直到今天(12-5)正式发布了v1.8,新加的几项特性都值得关注,如“本地日志可以自动同步到云端的日志服务产品中,支持按照业务功能进行查询。”这极大方便了运维。此外,“支持C版本设备驱动管理”,这对于我这样一位老程序员(年纪大,而非经验丰富)的吸引力是非常大的。

1017日开始试用Linkedge,学习时断时续,这个过程中Linkedge的帮助文档不断更新,导致前面截图已失效。时至今日,终于输出此文,虽然还没有实现了详细介绍如何在边缘计算平台上编写驱动的目标,但至少走通了关于驱动的helloworld。最后,提几点意见,希望Linkedge开发团队能有所改进:

(1)       驱动调试非常麻烦,帮助中没有涉及调试方式。--这点从v1.8中的特性来看应该有很大改善。

(2)       边缘容器设置细节应对开发者开放。

(3)       希望提供一个能和容器外(宿主机或其他设备)通讯的样例,如通过串口、以太网,这样的样例对于学习更加有效。

 

 

参考文献

[1] 阿里云物联网边缘计算 [EB/OL]. https://help.aliyun.com/product/69083.html.

[2] 物联网边缘计算快速入门[EB/OL].

 


目录
相关文章
|
11天前
|
消息中间件 安全 物联网
海量接入、毫秒响应:易易互联基于 Apache RocketMQ + MQTT 构筑高可用物联网消息中枢
易易互联科技有限公司是吉利集团旗下专注于换电生态的全资子公司,致力于打造安全、便捷、便宜的智能换电网络。公司依托吉利GBRC换电平台,基于电池共享与车辆全生命周期运营,已布局超470座换电站,覆盖40多个城市,计划2027年达2000座。面对海量设备高并发连接、高实时性要求及数据洪峰挑战,易易互联采用阿里云MQTT与RocketMQ构建高效物联网通信架构,实现稳定接入、低延迟通信与弹性处理,全面支撑其全国换电网络规模化运营与智能化升级。
海量接入、毫秒响应:易易互联基于 Apache RocketMQ + MQTT 构筑高可用物联网消息中枢
|
11天前
|
消息中间件 安全 物联网
海量接入、毫秒响应:易易互联携手阿里云构筑高可用物联网消息中枢
面对换电生态高速发展的通信挑战,易易互联通过采用阿里云 MQTT + RocketMQ 的融合解决方案,成功构建了“海量接入、实时响应、弹性处理、安全可信”的物联网通信底座。该架构不仅显著提升了系统稳定性与可扩展性,更保障了高并发场景下的业务连续性,为实现“让换电成为营运补能第一选择”的战略目标提供了坚实的技术支撑。
|
4月前
|
物联网
(手把手)在华为云、阿里云搭建自己的物联网MQTT消息服务器,免费IOT平台
本文介绍如何在阿里云搭建自己的物联网MQTT消息服务器,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
1863 42
|
4月前
|
物联网
如何在腾讯云等平台搭建自己的物联网MQTT服务器Broker
物联网技术及MQTT协议被广泛应用于各种场景。本文介绍物联网MQTT服务助手下载,如何搭建自己的物联网平台,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
404 37
|
4月前
|
边缘计算 弹性计算 人工智能
魔搭社区大模型一键部署到阿里云边缘云(ENS)
随着大模型技术的快速发展,业界的关注点正逐步从模型训练往模型推理 转变。这一转变不仅反映了大模型在实际业务中的广泛应用需求,也体现了技术优化和工程化落地的趋势。
497 7
|
6月前
|
监控 物联网 网络性能优化
【杂谈】-MQTT与HTTP在物联网中的比较:为什么MQTT是更好的选择
通过上述分析,可以看出MQTT在物联网应用中的确是更好的选择。其高效的通信模型、低带宽消耗、稳定的连接保持机制以及可靠的消息质量保证,使其在各种物联网场景中都能表现出色。开发者在设计和实现物联网系统时,应优先考虑采用MQTT协议,以充分发挥其在资源受限环境下的优势,提升系统的整体性能和可靠性。
668 26
|
6月前
|
存储 监控 安全
工业物联网关应用:PLC数据通过智能网关上传阿里云实战
本文介绍如何使用智能网关将工厂PLC数据传输至阿里云平台,适合中小企业远程监控设备状态。硬件准备包括三菱FX3U PLC、4G智能网关和24V电源。接线步骤涵盖PLC编程口与网关连接、运行状态检测及天线电源接入。配置过程涉及通讯参数、阿里云对接和数据点映射。PLC程序关键点包括数据上传触发和温度值处理。阿里云平台操作包含实时数据查看、数据可视化和规则引擎设置。最后提供常见故障排查表和安全建议,确保系统稳定运行。
563 1
|
6月前
|
边缘计算 Cloud Native 调度
感谢认可!阿里云云原生大规模云边协同技术荣获浙江省科学技术进步奖一等奖
感谢认可!阿里云云原生大规模云边协同技术荣获浙江省科学技术进步奖一等奖
113 0
|
7月前
|
存储 人工智能 搜索推荐
阿里云佘俊泉:边缘云场景的探索与机遇
阿里云佘俊泉:边缘云场景的探索与机遇
226 0
|
7月前
|
存储 人工智能 边缘计算
对话阿里云佘俊泉:边缘云的持续突破和创新
对话阿里云佘俊泉:边缘云的持续突破和创新

热门文章

最新文章

相关产品

  • 物联网平台
  • 物联网边缘计算