订阅(subscribe)与发布(publish)简称(sub/pub),是MQTT的一种消息范式。
可以把消息的发布者理解为向云端发送数据,在物联网开发中,我们可以将采集到的数据发送(发布)到阿里云服务器,这样后台管理人员就可以通过阿里云服务器查看到实时采集的数据了;
而消息的订阅者,提前对云端数据进行订阅,从而能接收云端发送过来的数据。我举一个订阅的栗子:订阅消息就像是订阅一个微信公众号,我们订阅了一个微信公众后,我们就能持续不断的收到微信公众号的推文。同理,当我们没有订阅微信公众号的时候,我们就不能收到微信公众号的推文。在物联网开发中,一个简单的使用阿里云物联网平台控制led灯的亮灭就是设备提前订阅了数据,然后阿里云下发指令后,设备收到指令进行数据的处理。我们明白了原理,明天我们就能通过阿里云平台来操作工业的设备,比如水闸开闸、设备开机等等。
二、使用MQTT.fx接入物联网设备
MQTT.fx是一个多平台的MQTT协议客户端,可以把它想象成一个虚拟的设备,在进行设备连接之前,可以使用MQTT.fx来测试连接是否正常。阿里云文档有相关的教程说明:阿里云物联网平台文档-使用MQTT.fx接入物联网平台
MQTT.fx会不定期更新,我最近使用最新版本的需要License,可以申请免费使用三个月,我目前使用的是1.7.1版本的做测试,总的来说,照着阿里云的教程一步步做都能完成连接。
三、使用ESP8266连接阿里云
编写代码之前需要安装3个库:<ArduinoMqttClient.h>、<ESP8266WiFi.h>、<ArduinoJson.h>
我这里编写了一个发送数据和通过阿里云平台控制LED灯的例程供大家参考,大家注意一下WiFi账号密码、发布和订阅的topoic、接入域名、客户端id、连接用户名密码的设置。
接入域名设置:
//MQTT接入域名
//以阿里云为例:a1\*\*\*.iot-as-mqtt.cn-shanghai.aliyuncs.com
//a1\*\*\* 为产品的ProductKey
//cn-shanghai 为所在地域
const char broker[] = "xxxxxx.iot-as-mqtt.cn-shanghai.aliyuncs.com";
发布和订阅消息设置:
//订阅topoic
const char inTopic[] = "/sys/k0efkfcSwlt/xxxxx/thing/service/property/set";
//发布topic
const char outTopic[] = "/sys/k0efkfcSwlt/xxxxx/thing/event/property/post";
发送数据内容如下:
//向主题发送的消息
String payload = "{\"params\": {\"temperature\": 30.5},\"version\": \"1.0\"}";
参考官方数据格式如下,在发送数据时id和version可以省略:
{
"id": "123",
"version": "1.0",
"params": {
"temperature": "30.5"
},
"method": "thing.service.property.set"
}
clientId 、username 、passwd 设置如下:
String clientId = "k0efkfcSwlt.xxxx|securemode=2,signmethod=hmacsha256,timestamp=1704798527190|";
String username = "xxxxx";
String passwd = "xxxxxx";
四、参考例程
#include <ArduinoMqttClient.h>
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
//WIFI设置信息------------------------------------------------------------------------
// WIFI名称
char ssid[] = "CMCC-H3qz";
// WIFI密码
char pass[] = "7xf47uxf";
//-----------------------------------------------------------------------------------
//mqtt设置信息-------------------------------------------------------------------------
//定义mqtt客户端对象
WiFiClient wifiClient; //创建网络连接客户端
MqttClient mqttClient(wifiClient);//通过网络客户端连接创建mqtt连接客户端
//MQTT接入域名
//以阿里云为例:a1\*\*\*.iot-as-mqtt.cn-shanghai.aliyuncs.com
//a1\*\*\* 为产品的ProductKey
//cn-shanghai 为所在地域
const char broker[] = "xxxxxxx.iot-as-mqtt.cn-shanghai.aliyuncs.com";
//端口号
int port = 1883;
//订阅topoic
const char inTopic[] = "/sys/xxxxxx/xxxxxx/thing/service/property/set";
//发布topic
const char outTopic[] = "/sys/xxxxx/xxxxx/thing/event/property/post";
//向主题发送的消息
String payload = "{\"params\": {\"temperature\": 30.5},\"version\": \"1.0\"}";
String clientId = "xxxxxxx.xxxxxx|securemode=2,signmethod=hmacsha256,timestamp=1704798527190|";
String username = "xxxxxxx";
String passwd = "xxxxxxxx";
//----------------------------------------------------------------------------------------------
//创建一个json文档对象
StaticJsonDocument<1024> doc;
//----------------------------------------------------------------------------------------------
void setup() {
//串口初始化
Serial.begin(9600);
// initialize digital pin LED\_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
//连接WiFi
Serial.print("试图连接WiFi: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
// failed, retry
Serial.print(".");
delay(5000);
}
//WiFi连接成功提示
Serial.println("WiFi连接成功");
Serial.println();
//mqtt连接客户端id
mqttClient.setId(clientId);
//mqtt 连接用户名、密码
mqttClient.setUsernamePassword(username, passwd);
//mqtt连接提示,打印连接地址
Serial.print("试图连接mqtt服务器: ");
Serial.println(broker);
//连接mqtt服务器
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT 服务器连接失败,错误代码 = ");
Serial.println(mqttClient.connectError());
while (1);
}
//连接mqtt服务器成功提示
Serial.println("成功连接mqtt服务器!");
Serial.println();
// 设置消息接收回调
mqttClient.onMessage(onMqttMessage);
//打印订阅主题信息
Serial.print("订阅主题为:: ");
Serial.println(inTopic);
Serial.println();
//mqtt订阅主题
mqttClient.subscribe(inTopic);
}
void loop() {
//轮询操作,mqtt客户端监听
//定期调用poll()确保MQTT信息接收正常
mqttClient.poll();
Serial.print("向主题发送消息: ");
Serial.println(outTopic);
Serial.println(payload);
Serial.println();
mqttClient.beginMessage(outTopic, payload.length(), false, 1, false);//构建消息端口
mqttClient.print(payload); //发送消息
mqttClient.endMessage(); //关闭端口
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/26bae7ee38b1c47a7c506319eca05f2c.png)
![img](https://img-blog.csdnimg.cn/img_convert/c24bc0da20308435ecc6851c2ddb025e.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/fe32716b005d70cd998f617a5b47aad4.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
![img](https://img-blog.csdnimg.cn/img_convert/16d81fd7fc1e345a0549f94720a80e35.png)
![img](https://img-blog.csdnimg.cn/img_convert/d8bec291e45ba14af34d567c470291ba.png)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)**
<img src="https://img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />
# 最后
**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**
**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**
容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)**
<img src="https://img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />
# 最后
**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**
**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**
**[更多资料点击此处获qu!!](https://bbs.csdn.net/topics/618376385)**