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

写在前面

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

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

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

  1. 系统架构

    图 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订阅客户端

  1. 安装部署

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

  1. 改写驱动

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 部署实例

  1. 脚本解析

在部署过程中,我们通过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

  1. Node.js实现MQTT

n 安装node

n 安装npm install mqtt

6.1. MQTT服务端

本文采用Apollo MQTT作为MQTT服务器,安装部署完毕后采用默认用户名admin,密码password。MQTT服务器采用默认的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 });

  1. 设置容器

通过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 安装淘宝cnpm:npm install -g cnpm --registry=https://registry.npm.taobao.org

n 全局安装mqtt:cnpm install –g mqtt

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

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

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

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

  1. 容器命令

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

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

(2) 查看IP地址:ip addr

(3) 下载ifconfig:curl 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

  1. 注意事项

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

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

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

图 7 Windows系统配置

  1. 最终效果

在宿主机上通过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版本设备驱动管理”,这对于我这样一位老程序员(年纪大,而非经验丰富)的吸引力是非常大的。

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

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

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

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

原文地址:http://blog.51cto.com/14031893/2328981

时间: 2024-10-06 14:45:56

阿里云物联网边缘计算加载MQTT驱动的相关文章

阿里云发布边缘节点服务2.0,建立“融合、开放、联动”的边缘计算新形态

"5G时代,边缘计算将发挥更大价值."阿里云边缘计算技术负责人杨敬宇表示,边缘计算作为5G时代的一项关键技术,未来将成为不可或缺的基础设施之一.那么云的能力是如何深入每个计算场景的?用户如何享受技术红利?阿里云ENS从1.0到2.0时代又完成了怎样的升级蜕变?在刚刚落幕的阿里云峰会北京站-边缘计算专场中,杨敬宇对以上问题做了解答. 一场计算体系架构的巨大革命,需要更多行业玩家进入在5G和边缘计算到来之后,云.端二体协同向着云边端三体协同去发展,毋庸置疑,这是未来架构的新形态,杨敬宇将整

腾讯云推出物联网边缘计算平台,加速物联网走进“边云协同”时代

8月28日,腾讯云重磅推出物联网边缘计算平台,该平台的推出将彻底打通物联网应用落地的最后一公里,让云端强大的计算能力快速延伸到用户的边缘,数以亿计的物联网设备将可以随时随地畅享云计算带来的海量数据处理能力和前沿AI技术. 这是腾讯云基于丰富的技术经验和案例实战,对物联网解决方案布局的又一次跨越. 作为一种边缘计算解决方案,腾讯云物联网边缘计算平台要解决的是物联网落地“远水救不了近火”的难题. 腾讯云物联网边缘计算产品负责人戴国超指出,边缘计算可以把云中心的计算,快速交付到离用户或者是离数据离物最

【物联网云端对接-2】通过MQTT协议与阿里云物联网套件进行云端通信

 在<程序员>杂志2017.4刊上,曾写过一篇<微软百度阿里三大物联网平台探析>,上面曾介绍了阿里云物联网套件的一些内容,在写该篇文章的时候,凌霄物联网网关还无法对接到此平台(TLS必须1.1版本以上).但是随着阿里云物联网套件的不断发展,目前设备除了支持HTTPS认证外,也支持MQTT客户端域名直连认证(可以是TCP直连模式,也可以是TLS直联模式). 最近有幸参与了阿里的飞凤物联网平台计划,可以更为深入的去研究阿里云物联网套件,除了用直接编写代码连接云外,也尝试用组态的方式去对

阿里云 物联网产品架构

阿里云物联网产品架构 一.总述 设备连接物联网平台,与物联网平台进行数据通信.物联网平台可将设备数据流转到其他阿里云产品中进行存储和处理.这是构建物联网应用的基础. 二.阿里云物联网产品分析 2.1  IoT SDK 物联网平台提供IoT SDK,设备集成SDK后,即可安全接入物联网平台,使用设备管理.数据分析.数据流转等功能. 只有支持TCP/IP协议的设备可以集成IoT SDK. 2.2 边缘计算 边缘计算能力允许您在最靠近设备的地方构建边缘计算节点,过滤清洗设备数据,并将处理后的数据上传至

万物智联,腾讯云 IoT 边缘计算揭秘——云+未来峰会开发者专场回顾

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 背景:现在是万物互联的时代,智能穿戴设备,智能家居,无人商业,改变了我们的生活方式.预计到2021年,全球物联网设数将达到150亿,超过手机和PC的总和,物联网开发将是移动互联网之后系一个风口,如何让设备快速物联网化,解决高可用.实时性和数据安全问题,腾讯云的IOT PaaS平台可以帮开发者解决了这一系列问题. 本文整理自腾讯云加速产品总监王琰在2018腾讯云云+未来峰会上的分享,介绍了腾讯云如何助力加速物联网+,提供低门槛的一站式开发

基于阿里云物联网平台实现的简易出入监控

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景在公司大门入口处布点树莓派和红外感应,实现出入口人员出入时,自动拍照并上送钉钉群机器人 准备物料准备树莓派HC-SR501 人体红外感应器树莓派摄像头母对母杜邦线三根阿里云环境准备物联网平台对象存储OSS函数计算日志服务(可选)操作步骤1 云端开发1.1 物联网平台登录阿里云控制台,进入物联网平台控制面板 1.1.1 新建产品进入设备管理,创建产品,选择

走进阿里云物联网

物联网平台是阿里云针对物联网领域开发人员推出的一款设备管理平台.高性能IoT Hub实现设备与云端稳定通信,全球多节点部署有效降低通信延时,多重防护能力保障设备云端安全.此外,物联网平台还提供丰富的设备管理功能.稳定可靠的数据存储能力,以及规则引擎.使用规则引擎,您仅需在Web上配置简单规则,即可将设备数据转发至阿里云其他产品,获得数据采集.数据计算.数据存储的全栈服务,真正实现物联网应用的灵活快速搭建. 物联网平台的主要功能如下:   设备接入 物联网平台提供设备端SDK让设备轻松接入阿里云.

10.1 阿里云物联网平台介绍

阿里云物联网平台是阿里巴巴公司推出的专业物联网服务平台,其提供的详尽的文档和清晰的管理界面非常适合刚刚接触物联网平台的初学者,对物联网系统架构.管理等有一个整体上的把握. 阿里云物联网平台文档 阿里云物联网管理平台可视化界面 (需要注册阿里云账户后才能使用) 基于阿里云物联网平台的物联网系统架构 基于阿里云物联网平台的物联网系统架构图如上图所示,整个系统可大致分为4层架构: 边缘设备:物联网系统中的数据生产者,通常为传感器,一般认为没有计算能力. 边缘节点:边缘节点对下收集边缘设备产生的数据,对

国内物联网平台初探(二) ——阿里云物联网套件

架构 数据通道 为设备和物联网应用程序提供发布和接收消息的安全通道.数据通道目前支持CCP协议和MQTT协议. 用户可以基于CCP协议实现Pub/Sub异步通信,也可以使用远程调用(RPC)的通信模式实现设备端与云端的通信. 用户也可以基于开源协议MQTT协议连接阿里云IoT,实现Pub/Sub异步通信. 安全认证&权限策略 为每个设备颁发阿里云IoT的凭证,依赖凭证才能连接阿里云IoT. 提供设备级的授权粒度,任何设备必须经过授权才能对某个Topic发布订阅消息 服务端也需要经过授权才能操作其