阿里云物联网边缘计算加载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'); 连接到订阅主题为 // Max retry interval in seconds for registerAndOnline. const MAX_RETRY_INTERVAL = 30; |
(2) 注释原有模拟部分代码,添加获得值代码。
表格 3 获得数据来源
setInterval(function () { if (self.client) { try { 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_centosn docker
Ø run创建一个新的容器并运行一个命令
Ø -d后台运行容器,并返回容器ID
Ø --rm 容器退出时自动清理容器并删除文件系统,
Ø --privileged=true 以特权方式启动容器,允许挂载宿主机目录
Ø -v Ø -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 6. 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 }); |
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 安装淘宝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 以上设置重启本容器失效
8. 容器命令
调试过程中涉及的相关容器命令如下:
(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
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版本设备驱动管理”,这对于我这样一位老程序员(年纪大,而非经验丰富)的吸引力是非常大的。
自10月17日开始试用Linkedge,学习时断时续,这个过程中Linkedge的帮助文档不断更新,导致前面截图已失效。时至今日,终于输出此文,虽然还没有实现了详细介绍如何在边缘计算平台上编写驱动的目标,但至少走通了关于驱动的helloworld。最后,提几点意见,希望Linkedge开发团队能有所改进:
(1) 驱动调试非常麻烦,帮助中没有涉及调试方式。--这点从v1.8中的特性来看应该有很大改善。
(2) 边缘容器设置细节应对开发者开放。
(3) 希望提供一个能和容器外(宿主机或其他设备)通讯的样例,如通过串口、以太网,这样的样例对于学习更加有效。
参考文献
[1] 阿里云物联网边缘计算 [EB/OL]. https://help.aliyun.com/product/69083.html.
[2] 物联网边缘计算快速入门[EB/OL]. https://help.aliyun.com/document_detail/85389.html.
作者:shoen
原文链接
更多技术干货 请关注阿里云云栖社区微信号 :yunqiinsight
阿里云物联网边缘计算加载MQTT驱动的更多相关文章
- cideogniter部署到阿里云服务器出现session加载错误
A PHP Error was encounteredSeverity: WarningMessage: mkdir() [function.mkdir]: Invalid argumentFilen ...
- 【物联网云端对接-2】通过MQTT协议与阿里云物联网套件进行云端通信
在<程序员>杂志2017.4刊上,曾写过一篇<微软百度阿里三大物联网平台探析>,上面曾介绍了阿里云物联网套件的一些内容,在写该篇文章的时候,凌霄物联网网关还无法对接到此平台( ...
- nodejs连接阿里云物联网套件(mqtt)
文档地址:https://help.aliyun.com/document_detail/73742.html 连接方法:先HTTPS认证再连接 /* *阿里云物联网套件nodejs连接示例 *C ...
- 万物智联,腾讯云 IoT 边缘计算揭秘——云+未来峰会开发者专场回顾
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 背景:现在是万物互联的时代,智能穿戴设备,智能家居,无人商业,改变了我们的生活方式.预计到2021年,全球物联网设数将达到150亿,超过手机 ...
- 《ServerSuperIO Designer IDE使用教程》- 6.增加与阿里云物联网(IOT)对接服务,实现数据交互。发布:v4.2.4 版本
v4.2.4 更新内容:1.增加了对接阿里物联网平台的服务.下载地址:官方下载 6. 增加与阿里云物联网(IOT)对接服务,实现数据交互 6.1 概述 为了满足业务系统数据上云的要求,Se ...
- 阿里云物联网套件(iot)设备间通信(M2M)在web端的实践
之前通过nodejs连接到阿里云物联网mqtt,后又用浏览器连接,总结一下: 由于项目是SPA,使用webpack,关键代码: 同样使用mqtt.js之前先install: npm install - ...
- 阿里云物联网平台体验(NetGadgeteer+C#篇)
目前对接阿里云物联网平台有多种软件和硬件,可以有多种不同语言来实现对接,比如c/c++,Java,JS,Python,C#等等,不过C#版本只有PC对接云平台的代码,嵌入式的目前还没有看到,所以本篇文 ...
- 阿里云物联网平台体验(树莓派+Nodejs篇)
我们在<阿里云物联网平台体验(树莓派+python篇)>里,写了通过Python语言开发云到端的物联网程序,本篇文章将介绍通过nodejs来实现类似功能. 同样在阿里云官方文档里已经有了一 ...
- 阿里云物联网平台体验(树莓派+Python篇)
阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作.但是同时也见证了 ...
随机推荐
- 理解CSV格式规范(解析CSV必备)
什么是CSV逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录.每个记录由一个或多个字段组成,用逗号分隔.使 ...
- 【和孩子一起学编程】 python笔记--第一天
[该随笔记录本人在阅读过程写的笔记和一些问题,格式比较随意,不定时更新] 由于该书使用的python版本为2.5,本人使用的为3.6. 第一章: 遇到的第一个问题: 1.3节 输出指令: print ...
- PHP filter_id() 函数
定义和用法 filter_id() 函数返回指定过滤器的 ID 号. 如果成功则返回过滤器的 ID 号,如果过滤器不存在则返回 NULL. 语法 filter_id(filter_name) 参数 描 ...
- Java虚拟机解析篇之---垃圾回收器
上一篇说了虚拟机的内存模型,在说到堆内存的时候我们提到了,堆内存是Java内存中区域最大的一部分,而且垃圾回收器主要就是回收这部分的内容.那么这篇就来介绍一下垃圾回收器的原理以及回收的算法. Java ...
- 51nod1340地铁环线
经典题. 经典差分约束模型. 但是 显然这个总长是有上下界的. 直接二分总长,判断有没有负环 如果没有负环好办,有负环就不知道怎么偏了. 因为没有单调性! (如果所有没有单调性的函数图像,都知道往哪里 ...
- Centos6.6部署Redis集群
Centos6.6部署Redis集群 1环境准备 1环境安装redis 1安装ruby 2配置redis主从环境 3部署redis sentinel服务器 5集群使用 13当前集群环境说明 13测试功 ...
- centos 安装 Lamp(Linux + Apache + PHP) 并安装 phpmyadmin
来源:http://www.laozhe.net/302.html 一般情况下,安装的都是最新的正式版,除非你有特殊需求,要安装指定的版本,本文暂不讨论.从最基础的开始,一点点完成一个可用的 Linu ...
- 人物-IT-周鸿祎:百科
ylbtech-人物-IT-周鸿祎:百科 周鸿祎(zhōu hóng yī),1970年10月4日生于湖北省黄冈市蕲春县.360公司创始人.董事长兼CEO.奇酷CEO.九三学社中央委员.九三学社中央科 ...
- 95、自然语言处理svd词向量
import numpy as np import matplotlib.pyplot as plt la = np.linalg words = ["I","like& ...
- 从源码导入到github
http://stackoverflow.com/questions/4658606/import-existing-source-code-to-github If you've got local ...