亚马逊AWS官方博客

AWS IoT 助力工业零件检测

在电器制造的场景中,比如压缩机质量检测,常规的做法是压缩机上线检测设备,系统根据已有的模型来判断零件是否合格。但是准确率一直到不到要求,很多时候需要人工干预,引入大数据来迭代优化模型是一个比较好的尝试。检测设备在短时间内采样大量的数据(每秒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目录下

$ sudo make install

 

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

保存以后,执行:

$ ldconfig

 

配置Broker接入AWS IoT Core

现在我们已经成功的在EC2上安装了Mosquitto(模拟本地网关),接下来我们通过AWS CLI将Mosquitto接入IoT Core。

1.在EC2上配置 CLI

$ aws configure

 

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中创建。

完成后的效果如下,每条消息都作为一个新的对象存储:

本篇作者

卲虎

AWS解决方案架构师,负责企业客户应用在AWS的架构咨询和设计。在微服务架构设计、数据库等领域有丰富的经验