阿里云物联网边缘计算加载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,密码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)       希望提供一个能和容器外(宿主机或其他设备)通讯的样例,如通过串口、以太网,这样的样例对于学习更加有效。

 

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完爆 Best Fit,看阿里如何优化 Sigma 在线调度策略节约亿级成本

2018 年“双 11”的交易额又达到了一个历史新高度 2135 亿。相比十年前&#xff0c;我们的交易额增长了 360 多倍&#xff0c;而交易峰值增长了 1200 多倍。相对应的&#xff0c;系统数呈现爆发式增长。系统在支撑“双 11”过程中的复杂度和难度呈现指数级形式上升趋势。 作为…

重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准

重磅&#xff01;阿里巴巴工程师获得 containerd 社区席位&#xff0c;与社区共建云时代容器标准 11 月 29 日&#xff0c;CNCF containerd 社区正式宣布&#xff1a;两位阿里巴巴工程师正式获得 containerd 社区席位&#xff0c;成为 containerd 社区 Reviewer&#xff0c;未…

RabbitMQ管控台操作手册

文章目录一、MQ管控台配置1.1. 修改guest用户的默认密码1.2. 创建Virtual Hosts1.3. 创建用户1.4. 给Virtual Hosts指定用户1.5. 给Virtual Hosts创建监控用户1.6. 给Virtual Hosts指定监控用户二、 验证2.1.给proj-01项目配置mq连接信息2.2.为proj-01项目声明队列和交换机2.3.…

只有程序员才能读懂的三国演义(一)

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | popsuper1982责编&#xff5c;阿秃这是通过三国演义串起操作系统的原理。第一回&#xff1a;宴桃园豪杰三结义&#xff0c;开放平台启动内核话说天下大势&#xff0c;分久必合&#xff0c;合久必分。IT江湖起起伏伏&#xff…

基于协同过滤算法的推荐

基于协同过滤算法的推荐 &#xff08;本实验选用数据为真实电商脱敏数据&#xff0c;仅用于学习&#xff0c;请勿商用&#xff09; 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品&#xff0c;但是当超市将两种产品放到相邻货架销售的时候&a…

python三菱_三菱机器人melfarxm.ocx控件的Python使用,MelfaRxMOCX,python,用法

1. 安装控件 \MelfaRXM\MelfaRXM_Dev\Redist\Installer2. 在WINDOWS/System32里找到MelfaRxM.ocx3.把OCX控件转成C#的DLLa.打vs的开发人员命令行b.把刚刚的OCX放到命令行显示的目录c.在命令输入 &#xff1a; aximp MelfaRxM.ocx生成的DLL就是pythonnet可用调用的DLL的4.p…

如何基于阿里云搭建适合初创企业的轻量级架构?

----基于阿里云搭建的适合初创企业的轻量级架构 前言 在项目的初期往往存在很多变数&#xff0c;业务逻辑时刻在变&#xff0c;而且还要保证快速及时&#xff0c;所以&#xff0c;一个灵活多变、快速部署、持续集成并可以适应多种情况的架构便显得尤为重要。本文主要介绍基于阿…

年底了,程序员如何谈加薪?

前两天&#xff0c;我和朋友一块出去吃饭&#xff0c;他说了一个哭笑不得的事儿&#xff1a;“我面了一个2年经验的男孩&#xff0c;张嘴就要20k&#xff0c;我去了&#xff0c;我在公司呆了7年啊&#xff0c;才22k好吗&#xff1f;” 其实&#xff0c;他的问题并不是特例&…

数据库中间件介绍

文章目录 什么是数据库中间件&#xff1f;Smart-client 模式优点缺点 Proxy 模式优点缺点 单元化架构优点缺点 总结 数据库中间件是连接数据库和应用程序之间的软件层&#xff0c;用于简化数据库管理、提高性能和可伸缩性&#xff0c;同时提供额外的功能和服务。在分布式系统和…

基于阿里云物联网平台,我们这样实现简易出入监控

本文通过一个简单实例&#xff0c;主要介绍了如何使用树莓派快速接入阿里云iot platform&#xff0c;并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应&#xff0c;实现出入口人员出入时&#xff0c;自动拍照并上送钉钉群机器…

RabbitMQ消息流转图

生产者生产消息&#xff0c;发送到MQ的交换机(exchange)上&#xff0c;交换机可以绑定多个队列&#xff08;Message Queue&#xff09;。这个图中有3个队列&#xff0c;只有一个队列收到了消息&#xff0c;这是因为咱们的交换机是有路由策略的&#xff0c;这个路由就是Routerke…

结合实际场景谈一谈微服务配置

作为 Nacos 5W1H 的系列文章&#xff0c;本文将围绕“Where”&#xff0c;讲述 Nacos 配置管理的三个典型的应用场景&#xff1a; 数据库连接信息限流阈值和降级开关流量的动态调度上一篇&#xff1a;Nacos帮我解决了什么问题&#xff1f; 数据库连接信息 曾经有朋友跟我聊过…

哈工大人工智能研究院院长刘劼:AIoT 核心在“智”不在“联”,需云边端协同...

受访者 | 刘劼采访者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;物联网是继计算机、互联网和移动通信之后的又一次信息产业的革命性发展。近几年来&#xff0c;物联网发展迅速&#xff1a;据研究机构IDC公司预测&#xff0c;到2020年&#xff0c;物联…

RabbitMQ 管控台配置导入导出和重要性

背景&#xff1a;rabbitmq100个节点&#xff0c;做迁移&#xff0c;现在linux6环境&#xff0c;想升级到linux7版本&#xff0c;然后把rabbitmq部署到linux7版本上 怎么去做呢&#xff1f; 不可能把rabbitmq重新构建好&#xff0c;再把对应的交换机、绑定、配置重新设置一遍&am…

使用Spring整合Quartz轻松完成定时任务

文章目录1. 必不可少jar包依赖2. 编写任务调度类013. 编写任务调度类024. quartz配置文件5. 测试service6. 效果图开发环境版本jdk1.8Maven3.6.1springSpring 4.2.6.RELEASEIdea2019 1. 必不可少jar包依赖 <dependency><groupId>org.springframework</groupId&g…

太真实了:程序员等级图鉴

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 肥又君责编&#xff5c;阿秃程序员是一个非常神奇的工种&#xff0c;他们对技术有特殊的崇拜&#xff0c;有着严格的等级划分&#xff0c;不同级别的程序员有什么不同之处呢&#xff1f;Let us 瞅瞅 &#xff5e;日常工作日常…

windows故障转移群集和mysql_Windows 2016 无域故障转移群集部署方法 超详细图文教程...

故障转移群集是一个很实用的功能,而windows在2016版本开始,终于支持不用域做故障转移群集.在群集中,我们可以设定一个"群集IP"而客户端只需要根据这个"群集IP"就能连接当前群集的主服务器.而不必关心群集服务器之间的替换.而更棒的是,它是"去中心&quo…

Dubbo下一站:Apache顶级项目

近日&#xff0c;在Apache Dubbo开发者沙龙杭州站的活动中&#xff0c;阿里巴巴中间件技术专家曹胜利(展图)向开发者们分享了Dubbo2.7版本的规划。 本文将为你探秘 Dubbo 2.7背后的思考和实现方式。 Dubbo 2.7 将围绕 异步支持优化、元数据改造&#xff0c;引入JDK8的特性、Net…

Java 中判断连接Oracle数据库连接成功

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Application {public static Connection getConnection() {Connection conn null;try { //连接driver为&#xff1a;oracle.jdbc.driver.OracleDriver//或者oracle…

从内部自用到对外服务,配置管理的演进和设计优化实践

本文整理自阿里巴巴中间件技术专家彦林在中国开源年会上的分享&#xff0c;通过此文&#xff0c;您将了解到&#xff1a; 微服务给配置管理所带来的变化配置管理演进过程中的设计思考配置管理开源后的新探索配置中心控制台设计实践“为什么相对于传统的软件开发模式&#xff0…