在电器制造的场景中,比如压缩机质量检测,常规的做法是压缩机上线检测设备,系统根据已有的模型来判断零件是否合格。但是准确率一直到不到要求,很多时候需要人工干预,引入大数据来迭代优化模型是一个比较好的尝试。检测设备在短时间内采样大量的数据(每秒3000次),将这些数据通过IOT传入数据湖,利用EMR集群进行训练,生成优化后的模型,再应用到检查设备,如此不断提升模型的准确率。业务场景如下图所示。
在本文中,我们讲述如何利用MQTT Broker将 检测设备产生的数据通过IoT导入云上的数据湖。AWS IoT core是一个托管的物联网服务,可以轻松支持数十亿台设备和数万亿条消息,并且可以对这些消息进行处理并将其安全可靠地路由至 AWS 终端节点和其他设备。
在当前场景下,受多种条件限制,很多设备无法直接接入IoT Core,这就需要在本地部署一个网关来做Bridge,Mosquitto就是这样一个开源的MQTT Borker,它支持MQTT V3.1协议,包括客户端和服务器端。
常见的场景示意如下:
启动和配置运行Mosquitto的EC2实例
在本实验中,我们在AWS上启动一台Linux机器来安装 Mosquitto 的服务器端和客户端。
1.切换到IAM控制台,创建一个EC2的Role
2.选择 AWSIoTConfigAccess策略
3.为策略去一个合适的名称,创建策略
4.切换到EC2的控制台
5.启动一个新的EC2,选择Amazon Linux 2 AMI就可以
6.这里选择共有子网,并分配公网地址,在IAM角色处,分配上一步创建的角色。
7.使用缺省配置添加EBS卷
8.添加一个Tag,Name:Mosquito_Broker
9.在配置安全组的页面,创建一个新的安全组,开放端口如下
10.审核配置后,启动EC2实例
安装Mosquitto服务器和客户端
1.下载和解压Mosquitto安装包
wget https://mosquitto.org/files/source/mosquitto-1.5.tar.gz
tar -zxvf mosquito-1.5.tar.gz
2.配置编译选项,进入加压后的目录,使用Vi工具编辑mk,下面几个选项需要关注,一旦启用,需要预先安装对应的包。
选项 |
说明 |
Make出错信息 |
WITH_SRV |
启用c-area支持,一个一部DNS查询的库 |
Missing ares.h |
WITH_UUID |
启用lib-uuid支持,为每个连接的客户端生成唯一的uuid |
Missing uuid.h |
WITH_WEBSOCKETS |
启用websocket支持 ,需要安装libwebsockets,支持需要使用websocket协议的应用 |
Missing libweb |
如果不需要上述的功能支持,可以在配置文件中关闭。在此例中我们选择开启。
3.安装C-areas
由于采用编译安装,需要先安装gcc
$ sudo yum install gcc
$ wget http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
$ tar xvf c-ares-1.10.0.tar.gz
$ cd c-ares-1.10.0
$ ./configure
$ make
$sudo make install
4.安装lib-uuid
$ sudo yum install libuuid-devel
5.安装libwebsockets
采用编译的安装方式,需要先安装openssl
$ sudo yum install openssl-devel
$ sudo yum install cmake
$ git clone https://github.com/warmcat/libwebsockets.git
$ cd libwebsockets
$ mkdir build
$ cd build
$ cmake ..
$sudo make install
6.开始安装mosquitto
先安装 gcc+
$ sudo yum install gcc+ gcc-c++
切换到解压的mosquitto目录下
7.安装完毕后,默认的安装目录如下:
mosquito : /usr/local/sbin
configuration: /etc/mosquito
utility command: /usr/local/bin
由于操作系统版本及架构原因,很容易出现安装之后的链接库无法扎到,比如启动时找不到libmosquitto.so.1文件,因此需要添加链接库路径
// 添加路径
$ sudo vi /etc/ld.so.conf.d/liblocal.conf
加入:
/usr/local/lib64
/usr/local/lib
保存以后,执行:
配置Broker接入AWS IoT Core
现在我们已经成功的在EC2上安装了Mosquitto(模拟本地网关),接下来我们通过AWS CLI将Mosquitto接入IoT Core。
1.在EC2上配置 CLI
2.创建IoT policy
$ aws iot create-policy --policy-name localbridge --policy-document '{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "iot:*","Resource": "*"}]}'
创建成功后,可以在IoT的控制台看到对应的policy
3.在Mosquitto的安装目录下创建一个certs目录,用了存储即将要生成的key,操作如下:
$ cd /etc/mosquitto
$ sudo mkdir certs
$ cd certs
$ sudo aws iot create-keys-and-certificate --set-as-active --certificate-pem-outfile cert.crt --private-key-outfile private.key --public-key-outfile public.key --region cn-north-1
4.检查生成的证书,并记录证书的ARN,然后将第二步创建的policy附加到生成的证书上
//查看所创建的iot证书
$ aws iot list-certificates
// 将策略附加到证书
$ aws iot attach-principal-policy --policy-name localbridge --principal <ARN-OF-CERTIFICATES>
// 为Private key和 Cert证书添加制度权限
$ sudo chmod 644 private.key
$ sudo chmod 644 cert.crt
// 下载根CA证书
$ sudo wget https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -O rootCA.pem
至此我们已经有了客户端证书,并为它附加了对应的可以访问IoT的策略,现在可以配置Mosquitto来接入IoT Core
5.创建配置文件。
$ sudo vi /etc/mosquitto/conf.d/localbridge.conf
文件内容如下(蓝色斜体部分体会成自己的内容):
# =================================================================
# Local Bridges to AWS IOT
# =================================================================
# AWS IoT endpoint, use AWS CLI 'aws iot describe-endpoint'
connection awsiot
address XXXXXXXXXX.iot.cn-north-1.amazonaws.com:8883
# Specifying which topics are bridged
topic awsiot_to_localgateway in 1
topic localgateway_to_awsiot out 1
topic both_directions both 1
# Setting protocol version explicitly
bridge_protocol_version mqttv311
bridge_insecure false
# Bridge connection name and MQTT client Id,
# enabling the connection automatically when the broker starts.
cleansession true
clientid bridgeawsiot
start_type automatic
notifications false
log_type all
# =================================================================
# Certificate based SSL/TLS support
# -----------------------------------------------------------------
#Path to the rootCA
bridge_cafile /etc/mosquitto/certs/rootCA.pem
# Path to the PEM encoded client certificate
bridge_certfile /etc/mosquitto/certs/cert.crt
# Path to the PEM encoded client private key
bridge_keyfile /etc/mosquitto/certs/private.key
配置文件设置完成,就可以准备启动mosquitto了。
6.Mosquitto默认以Mosquitto用户启动,所以创建用户和组
$ sudo groupadd mosquitto
$ sudo useradd -g mosquitto mosquitto
7.为mosquitto设置一个配置文件,操作方法如下
$ mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf
8.接下来就可以启动mosquitto
$ mosquitto -c /etc/mosquitto/conf.d/localbridge.conf -d
9.成功启动以后,可以通过AWS控制台验证是否成功接入IoT Core
//push一个message
$ mosquitto_pub -h localhost -p 1883 -q 1 -d -t localgateway_to_awsiot -i clientid1 -m "{\"key\": \"helloFromLocalGateway\"}"
在控制台看到如下信息,表示连接成功,发送消息成功
采用规则处理IoT设备传入的数据
在AWS IoT控制台选择菜单行动-》创建规则
添加一个操作,在此例子中,我们选择将上次的数据存入S3 bucket
注意上述的键值不能写成固定值,否则每次上次的数据会覆盖前一次上次的数据。IAM角色目前在北京区域需要预先在IAM中创建。
完成后的效果如下,每条消息都作为一个新的对象存储:
本篇作者