物联网专题36:阿里云物联网 ESP8266

阿里云物联网平台

1 产品架构

设备通过 MQTT 协议接入到阿里云物联网平台,然后可以通过规则引擎将数据发送至时序数据库、云存储等。

2 计费标准

在初次开通物联网平台的前两个月,有100万条消息的免费额度。

阿里云物联网平台 MQTT

以下是阿里云物联网的文档链接:

https://help.aliyun.com/product/30520.html?spm=a2c4g.11174283.6.540.61ef1668NbRCbL

 

阿里云创建产品和设备

1 进入阿里云物联网,首页如下所示:

链接:https://iot.console.aliyun.com/lk/summary

2 创建产品:

填写产品的相关信息

3 添加设备:

进入设备页面,先选中对应的产品,然后添加设备

添加设备:

然后会生成设备证书(包括产品码、设备名、设备密钥),如下所示:

当设备接入到阿里云物联网平台时,阿里云会根据这3个参数,鉴别设备的身份。

再创建MQTT-FX客户端软件对应的设备,创建完成的两个云端设备如下所示:

4 接入物联网平台

如果要接入阿里云,需要域名、ClientID、用户名、密码等参数,参考文档 “ MQTT-TCP 连接通信 ”

https://help.aliyun.com/document_detail/73742.html?spm=a2c4g.11186623.6.588.5de26eebCAhXgL

下面是文档说明:

地区和可用区如下所示:

示例:如 ProductKey 为 a16TOCG44Rm ,地区为华东2 上海,则域名为:

a16TOCG44Rm.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883

CONNECT 连接报文

mqttClientId: clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"
mqttUsername: deviceName+"&"+productKey
mqttPassword: sign_hmac(deviceSecret,content)

由于阿里云不支持Will,因此CONNECT报文的有效载荷,只包含客户端标识符、用户名和密码,如下图所示:

这3个参数的设置方法,参见 CONNECT 报文参数说明:

其中,mqttClientId 和 mqttUsername 可以直接设置,mqttPassword 比较麻烦,sign_hmac(deviceSecret, content) ,可以看到,mqttPassword 是根据设备密钥和 content 进行哈希加密,而 content 又由多个参数字符合成。这个如果自己实现会比较麻烦,可以使用自动生成的配置工具:

接下来,使用这个工具来生成ESP8266设备的 ClientId、用户名+密码,复制设备参数并生成;

生成的配置结果如下:

分别生成两个设备(QMTT客户端和ESP8266)的参数信息。

5 消息通信格式

在设备管理->产品->Topic类列表中,有很多预定义的 Topic 类,也可以新建 Topic 类

创建一个 SW_LED 的 Topic 类,如下所示:

在设备的 Topic 类中,可以看到成功创建的 SW_LED 主题;

注意,此时8266设备只能够操作这几个主题,其他任何的主题都没有操作权限。那么,8266如何跟MQTT客户端进行通信?

6 规则引擎

阿里云的规则引擎有多种,下面是将要使用到的 “ 云产品流转 ” 简介

创建规则引擎:

规则引擎要使用 SQL 语句,先看一下 SQL 通配符:

如下是设置的 SQL 语句:

使用 *通配符选择查询所有字段,设置产品、设备和主题,然后设置转发数据(从MQTT客户端转发给8266):

创建成功,启动规则引擎:

阿里云平台的设置完成。

 

接入阿里云

1 配置MQTT-FX

2 修改 MQTT 例程,要修改的地方如下所示:

设置好域名、设备ID、用户名、密码和持有人标识,然后修改主题名(只订阅】不发布):

修改接收到的主题消息,如下所示:

下载程序并执行,一直出现一个问题:

可以看到,程序成功的解析了 SNTP 服务器域名,获取到了实时时间,但是,一直没法解析到阿里云域名对应的IP(多次尝试仍然失败),实在找不到原因,暂且放过。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

解决问题

在这个问题上纠结了一天,终于找到了问题所在,直接上图:

MQTT服务端域名要设为小写字母

重新修改程序中的网络参数,如下所示:

1 修改域名

2 修改订阅主题名:

这个主题名要和设备的主题完全一致,如下所示:

3 修改 SNTP 服务器域名

这个不是必要的,但MQTT例程中提供的是国外的域名,有时会无法获取到网络时间,因此换成国内的SNTP服务器:

4 修改接收主题参数

修改完毕,下载执行程序,结果如下:

这说明,ESP8266接入物联网成功。

5 连接MQTT-FX客户端,配置如下所示:

注意,8266和MQTT-FX的MQTT域名、设备ID、用户名+密码和下面的一致:

然后向如下的主题发布消息,根据我们设置的规则引擎,这个消息会被转发给ESP8266;

我们向这个主题发送以下JSON字符串,8266收到规则引擎转发的消息后,应该会点亮LED:

结果如下所示:

ESP8266成功接收到MQTT客户端发送的主题消息

物联网开发板LED成功点亮:

同时,在阿里云设备页面,可以看到两个设备都在线:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值