在电器制造的场景中,比如压缩机质量检测,常规的做法是压缩机上线检测设备,系统根据已有的模型来判断零件是否合格。但是准确率一直到不到要求,很多时候需要人工干预,引入大数据来迭代优化模型是一个比较好的尝试。检测设备在短时间内采样大量的数据(每秒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中创建。
 
       完成后的效果如下,每条消息都作为一个新的对象存储:
 
       
 
       本篇作者