零基础入门学用物联网(ESP8266) 第二部分 MQTT基础篇(二)

零基础入门学用物联网(ESP8266) 第二部分 MQTT基础篇(二) 参考教程https://www.bilibili.com/video/BV1L7411c7jw/?spm_id_from333.1387.favlist.content.click四、MQTT服务端连接操作1、电脑客户端连接MQTT服务端1电脑可以作为MQTT客户端与MQTT服务端连接。MQTT客户端软件有很多款本教程使用MQTT.fx的1.7.1版本进行演示。2建立与MQTT服务端的连接①首先打开MQTT.fx如下图所示点击“设置”图标。②在弹出的“Edit Connection Profiles”对话框中可以配置若干个MQTT连接点击左下角的“”即可增加MQTT连接点击左下角的“”即可删除MQTT连接。③在右边的详情页中可以配置MQTT连接的信息如MQTT服务端的地址等配置完成后点击右下角的“OK”即可。④配置完成后在“设置”图标左边选择好刚刚配置的MQTT连接点击“设置”图标右边的“Connect”如果右边的圆形指示灯变为绿色说明连接成功然后再点击“设置”图标右边的“Disconnect”即可断开MQTT连接。2、ESP8266连接MQTT服务端1要想使用ESP8266连接MQTT服务端首先需要为IDE安装PubSubClient库。2ESP8266连接MQTT服务端示例程序①程序框图②程序代码#include ESP8266WiFi.h #include PubSubClient.h // 设置Wi-Fi接入信息 const char* ssid Zevalin_Computer; const char* password 00114514; const char* mqttServer test.mosquitto.org; //如无法使用可更换为其它公用MQTT服务器地址 WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); //基于wifiClient对象建立MQTT客户端对象 void setup() { Serial.begin(9600); WiFi.mode(WIFI_STA); //设置ESP8266工作模式为无线终端模式 connectWifi(); //连接Wi-Fi mqttClient.setServer(mqttServer, 1883); //设置MQTT服务端地址和端口号 connectMQTTServer(); //连接MQTT服务器 } void loop() { if (mqttClient.connected()) { // 如果开发板成功连接服务器 mqttClient.loop(); // 保持客户端心跳 } else { // 如果开发板未能成功连接服务器 connectMQTTServer(); // 继续尝试连接服务器 } } void connectMQTTServer(){ // 根据ESP8266的MAC地址生成客户端ID避免与其它ESP8266的客户端ID重名 String clientId esp8266- WiFi.macAddress(); // 连接MQTT服务器 if (mqttClient.connect(clientId.c_str())) { //配置clientId为刚刚生成的客户端ID发送CONNECT报文 Serial.println(MQTT Server Connected.); Serial.println(Server Address: ); Serial.println(mqttServer); //打印MQTT服务端地址 Serial.println(ClientId:); Serial.println(clientId); //打印clientId } else { Serial.print(MQTT Server Connect Failed. Client State:); Serial.println(mqttClient.state()); //打印连接返回码returnCode delay(3000); } } void connectWifi(){ //ESP8266连接wifi WiFi.begin(ssid, password); //等待Wi-Fi连接,成功连接后输出成功信息 while (WiFi.status() ! WL_CONNECTED) { delay(1000); Serial.print(.); } Serial.println(); Serial.println(WiFi Connected!); Serial.println(); }[1]创建PubSubClient类时需要给构造函数传入客户端对象可以认为这个客户端对象实现了底层向上层提供的服务PubSubClient类则是基于底层提供的服务在应用层实现MQTT通讯。[2]PubSubClient类的成员函数setServer用于设置需要连接MQTT服务端的地址和端口号其函数参数依次为需要连接MQTT服务端的地址和端口号。[3]PubSubClient类的成员函数connect用于向MQTT服务端发送CONNECT报文如果收到CONNACK报文且连接返回码为“0”则返回True否则返回False如示例代码所示函数参数为MQTT客户端ID字符串类型。[4]PubSubClient类的成员函数state用于获取MQTT服务端返回的CONNACK报文中的returnCode。[5]PubSubClient类的成员函数connected用于检查是否与MQTT服务端连接如连接则返回True否则返回False。[6]PubSubClient类的成员函数loop用于给MQTT服务端发送心跳消息以确保MQTT服务端知晓连接仍然保持。五、发布、订阅和取消订阅1、PUBLISH——发布信息1MQTT客户端一旦连接到MQTT服务端便可以发布MQTT报文每条所发布的MQTT报文必须包含一个主题MQTT服务端可以通过主题确定将消息转发给哪些MQTT客户端。2MQTT客户端发布消息时会向服务端发送PUBLISH报文以下是PUBLISH报文的详细信息[1]packetId——报文标识符用于对MQTT报文进行标识不同的MQTT报文所拥有的标识符不同MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。需要注意的是报文标识符的内容与QoS级别有密不可分的关系只有QoS级别大于0时报文标识符才是非零数值如果QoS等于0报文标识符为0[2]topicName——主题名用于识别信息应发布到哪一个主题。[3]qos——服务质量等级表示MQTT消息的服务质量等级决定MQTT通讯有什么样的服务保证有三个级别——0、1和2。[4]retainFlag——保留标志置为TrueMQTT服务端收到MQTT报文后将其保存只要有MQTT客户端订阅该主题MQTT服务端马上将该主题信息发给它置为FalseMQTT服务端收到MQTT报文后直接将其转发已订阅该主题的MQTT客户端然后将报文丢弃。[5]payload——有效载荷希望通过MQTT报文所发送的实际内容如文本、图像等格式的内容。[6]dupFlag——重发标志当MQTT报文的接收方没有及时确认收到报文时发送方会重复发送MQTT报文在重复发送MQTT报文时发送方会将此“重发标志”设置为True。需要注意的是重发标志只在QoS级别大于0时使用2、SUBSCRIBE——订阅主题1MQTT客户端要想订阅主题首先要向MQTT服务端发送主题订阅请求MQTT客户端是通过向MQTT服务端发送SUBSCRIBE报文来实现这一请求的。2SUBSCRIBE报文包含有一系列“订阅主题名”也就是说一个SUBSCRIBE报文可以包含有单个或者多个订阅主题名一个SUBSCRIBE报文可以用于订阅一个或者多个主题。3MQTT客户端在订阅主题时也可以明确QoSMQTT服务端会根据SUBSCRIBE中的QoS来提供相应的服务保证。4每一个SUBSCRIBE报文包含有“报文标识符”报文标识符可用于对MQTT报文进行标识不同的MQTT报文所拥有的标识符不同MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。3、SUBACK——订阅确认1MQTT服务端接收到MQTT客户端的订阅报文后会向MQTT客户端发送SUBACK报文确认订阅SUBACK报文包含有“订阅返回码”和“报文标识符”这两个信息。2SUBACK报文的订阅返回码——returnCode用于告知MQTT客户端是否成功订阅了主题以下是返回码的详细说明针对不同主题的订阅QoSMQTT服务端的订阅成功返回码会有所不同。返回码描述00级QoS——订阅成功11级QoS——订阅成功22级QoS——订阅成功128订阅失败3每一个SUBACK报文包含有“报文标识符”报文标识符可用于对MQTT报文进行标识不同的MQTT报文所拥有的标识符不同MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。4、UNSUBSCRIBE——取消订阅UNSUBACK——取消订阅确认1当MQTT客户端要取消订阅某主题时可通过向MQTT服务端发送UNSUBSCRIBE报文来实现。2UNSUBSCRIBE报文包含两个重要信息①第一个是取消订阅的主题名称同一个UNSUBSCRIBE报文可以同时包含多个取消订阅的主题名称。②第二个是“报文标识符”MQTT设备可以通过该标识符对报文进行管理。3当MQTT服务端接收到UNSUBSCRIBE报文后会向MQTT客户端发送取消订阅确认报文——UNSUBACK报文该报文含有客户端所发送的“取消订阅报文标识符”MQTT客户端接收到UNSUBACK报文后就可以确认取消主题订阅的操作已经成功完成了。5、电脑MQTT客户端进行发布、订阅和取消订阅1与MQTT服务端连接后在Subscribe一栏中可以向MQTT服务端订阅某主题的信息。2与MQTT服务端连接后在Publish一栏中可以向MQTT服务端发布某主题的信息。3在Subscribe一栏中的已订阅主题列表中每个已订阅主题都配备Unsubscribe选项点击它即可取消对应主题的订阅。