1. MQTT¶
本节将通过MQTT通讯,实现鲁班猫、物联网云平台和手机三者之间的数据交互。
1.1. MQTT介绍¶
MQTT是一种基于发布/订阅模式的轻量级消息传输协议,它专为物联网(IoT)设计,用于实现设备之间以及设备与服务器之间的数据通信。 在MQTT协议中,消息通过主题(Topic)进行分类和路由,发布者(Publisher)将消息发布到指定的主题上,而订阅者(Subscriber)则 通过订阅这些主题来接收消息。这种发布/订阅模式使得消息发布者和接收者之间实现了松散的耦合,从而提高了系统的可扩展性和灵活性。
1.2. 阿里云物联网云平台介绍¶
阿里云物联网云平台是阿里云推出的设备管理与数据处理平台,具有设备接入与管理、数据采集存储与分析、 边缘计算等核心功能,具备高性能海量连接、高可靠高安全、低成本全球覆盖、多形态部署灵活扩展等优势, 广泛应用于智能制造、智慧城市、智能家居等领域。
本次将使用阿里云物联网云平台作为MQTT服务器,完成鲁班猫和手机之间的数据交互。
1.3. 实验操作¶
1.3.2. 获取程序¶
python测试代码为:lubancat_rk_code_storage/expansion_board/mqtt/python
c测试代码为:lubancat_rk_code_storage/expansion_board/mqtt/c
将mqtt整个文件夹拷贝到板卡,请选择一个程序进行测试。修改程序,将程序中使用的三元素信息替换成自己的:
python程序中修改:
1 2 | cd python
vi main.py
|
1 2 3 4 5 | ''' main.py '''
productKey = "a1pwoLHW8Tl"
deviceName = "lubancat"
deviceSecret = "160cacffcba7b83f2eb896403688dac5"
|
c程序中修改:
1 2 | cd c
vi main.c
|
1 2 3 4 5 | /* main.c */
#define EXAMPLE_PRODUCT_KEY "a1pwoLHW8Tl"
#define EXAMPLE_DEVICE_NAME "lubancat"
#define EXAMPLE_DEVICE_SECRET "160cacffcba7b83f2eb896403688dac5"
|
1.3.3. 设备Topic介绍¶
当我们实现设备上报属性至物联网云平台时,需要订阅“请求Topic”,然后上报数据。同时也可以订阅“响应Topic”,接收数据上报成功后的返回。 “请求Topic”和“响应Topic”的格式如下:
1 2 3 4 5 | # 请求Topic
/sys/${productKey}/${deviceName}/thing/event/property/post
# 响应Topic
/sys/${productKey}/${deviceName}/thing/event/property/post_reply
|
python程序中,主题定义如下,用于上报数据和接收数据:
1 2 3 4 5 6 7 8 9 10 | ''' main.py '''
...
# 请求Topic
pubTopic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post"
# 响应Topic
subTopic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post_reply"
...
|
c程序中,主题定义如下,用于上报数据和接收数据:
1 2 3 4 5 6 7 8 9 10 | /* main.c */
...
// 订阅Topic
const char *pubTopic = "/sys/"EXAMPLE_PRODUCT_KEY"/"EXAMPLE_DEVICE_NAME"/thing/event/property/post";
// 响应Topic
const char *subTopic = "/sys/"EXAMPLE_PRODUCT_KEY"/"EXAMPLE_DEVICE_NAME"/thing/event/property/post_reply";
...
|
本次实验程序,会上传自定义的LED开关值和温度值,可在程序中自行修改。数据在发送前会按照物联网云平台的要求打包成Alink JSON格式:
python程序修改:
1 2 3 4 5 6 7 8 9 10 | ''' main.py '''
...
# 上报的温度值
temp_value = 35
# 上报的LED开关值
led_value = 1
...
|
c程序修改:
1 2 3 4 5 6 7 8 9 10 | /* main.c */
...
// 上报的温度值
#define TEMP_VALUE "35"
// 上报的LED开关值
#define LED_VALUE "1"
...
|
python运行程序:
1 2 | cd python
sudo python main.py
|
c运行程序:
1 2 3 | cd c
make
sudo ./main
|
回到物联网云平台,可以看到之前创建的设备已经显示在线:
同时可以看到物模型数据已更新:
1.3.4. 手机MQTT客户端连接阿里云物联网云平台¶
请下载并参考下面的文档完成手机MQTT客户端连接阿里云物联网云平台:
1.3.5. 手机发送数据到lubancat¶
先在鲁班猫端运行程序,python运行程序:
1 2 | cd python
sudo python main.py
|
c运行程序:
1 2 3 | cd c
make
sudo ./main
|
1 2 | cd c
sudo ./main
|
回到手机端,填入手机设备的“请求Topic”和alink json格式的数据,点击”PUBLISH”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # 请求Topic
/sys/{your_product_id}/phone/thing/event/property/post
# 要发送的数据,这里将LED的开关值设置为1,将温度值设为34摄氏度
{
"id": "123",
"version": "1.0",
"sys":
{
"ack": 0
},
"params":
{
"led":
{
"value": "1"
},
"temperature":
{
"value": "34"
}
},
"method": "thing.event.property.post"
}
|
鲁班猫端运行的程序会订阅lubancat设备的“响应Topic”,手机数据会发布到phone设备的“请求Topic”,届时phone设备的“响应Topic”会通过云产品流转的方式发送到 lubancat设备的“响应Topic”,最终程序会输出接收到的数据:
1.3.6. lubancat发送数据到手机¶
同理,在手机端订阅phone设备的“响应Topic”:
鲁班猫端运行程序,python运行程序:
1 2 | cd python
sudo python main.py
|
c运行程序:
1 2 3 | cd c
make
sudo ./main
|
1 2 | cd c
sudo ./main
|
可以看到手机订阅的主题已有消息下发: