1. MQTT

本节将通过MQTT通讯,实现鲁班猫、物联网云平台和手机三者之间的数据交互。

1.1. MQTT介绍

MQTT是一种基于发布/订阅模式的轻量级消息传输协议,它专为物联网(IoT)设计,用于实现设备之间以及设备与服务器之间的数据通信。 在MQTT协议中,消息通过主题(Topic)进行分类和路由,发布者(Publisher)将消息发布到指定的主题上,而订阅者(Subscriber)则 通过订阅这些主题来接收消息。这种发布/订阅模式使得消息发布者和接收者之间实现了松散的耦合,从而提高了系统的可扩展性和灵活性。

1.2. 阿里云物联网云平台介绍

阿里云物联网云平台是阿里云推出的设备管理与数据处理平台,具有设备接入与管理、数据采集存储与分析、 边缘计算等核心功能,具备高性能海量连接、高可靠高安全、低成本全球覆盖、多形态部署灵活扩展等优势, 广泛应用于智能制造、智慧城市、智能家居等领域。

本次将使用阿里云物联网云平台作为MQTT服务器,完成鲁班猫和手机之间的数据交互。

1.3. 实验操作

1.3.1. 阿里云物联网云平台的设备创建

请下载并参考下面的文档完成阿里云物联网云平台上的设备创建:

《阿里云物联网云平台设备创建.pdf》

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

回到物联网云平台,可以看到之前创建的设备已经显示在线:

../../_images/show-operation-aliyun-devOnline.png

同时可以看到物模型数据已更新:

../../_images/show-operation-aliyun-modulesData.png

1.3.4. 手机MQTT客户端连接阿里云物联网云平台

请下载并参考下面的文档完成手机MQTT客户端连接阿里云物联网云平台:

《手机MQTT客户端连接阿里云物联网云平台.pdf》

MQTT Client_4.5.1_APKPure.apk

MQTT_Password.rar

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"
}
../../_images/show-operation-aliyun-phonePublish.png

鲁班猫端运行的程序会订阅lubancat设备的“响应Topic”,手机数据会发布到phone设备的“请求Topic”,届时phone设备的“响应Topic”会通过云产品流转的方式发送到 lubancat设备的“响应Topic”,最终程序会输出接收到的数据:

../../_images/show-operation-aliyun-lubancatRecv.png

1.3.6. lubancat发送数据到手机

同理,在手机端订阅phone设备的“响应Topic”:

../../_images/show-operation-aliyun-phoneSub.png

鲁班猫端运行程序,python运行程序:

1
2
cd python
sudo python main.py

c运行程序:

1
2
3
cd c
make
sudo ./main
1
2
cd c
sudo ./main

可以看到手机订阅的主题已有消息下发:

../../_images/show-operation-aliyun-phoneRecv.png