zoukankan      html  css  js  c++  java
  • 阿里云物联网边缘计算加载MQTT驱动

    写在前面

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

    1. 系统需求

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

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

    2. 系统架构

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

     3f9b6e5a64fb0104c0d5091de1fde34233b8ac8d

    图 1 边缘实例架构

    表格 1 模拟值生成代码

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

                 delta = -100;

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

                 delta = 100;

               }

              self.lightSensor.illuminance += delta;

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

    8d3dd9c1e0fafb8a815017050ede9e990d449332

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

    3.  安装部署

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

    4. 改写驱动

    4.1. 下载驱动

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

    5e02272912abedad264da8dc8fafb3c76bd1170a

    图 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文件。

    3a901361653a5338266935ae176170eeef487272

    图 4新建驱动

    (3) 部署实例

    daa15a2aad671dee43b076c926afa91f2c9fda2e

    图 5 部署实例

    5. 脚本解析

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

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

    b543ec29d46866e9f555567503f9fc4164d7afdd

    图 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,系统配置如下:

    270f09ce0cb749fed87b5a330c0ac3a48e2ed52a

    图 7 Windows系统配置

    10. 最终效果

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

    f4d119153d6f52652ae8c1cb0c6ae8a2516ca47c

    图 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

  • 相关阅读:
    day79——基础知识复习3(django)
    day78——基础知识复习2
    bjday5——组件的嵌套与传值
    drfday2——序列化组件serializer
    drfday5——权限,频率,异常处理
    drfday1——入门规范
    ElasticSearch基本查询使用(2)
    RocketMQ(2) 消息的生产和存储
    ElasticSearch基础介绍(1)
    RocketMQ(3) 根据消息key查询功能的实现: indexFile
  • 原文地址:https://www.cnblogs.com/zhaowei121/p/10102684.html
Copyright © 2011-2022 走看看