学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端以及订阅主题发送主题操作

2023-11-05

MQTT原理与应用

学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端

本文章学习借鉴于太极创客团队,以表感谢。官网[http://www.taichi-maker.com/]

在这里插入图片描述



一、使用电脑客户端和ESP8266客户端来连接MQTT服务端

电脑客户端连接MQTT服务端

MQTT 客户端工具 (MQTT X 桌面客户端)

MQTT X 是 EMQ 开源的一款跨平台 MQTT 5.0 客户端工具,它支持 macOS, Linux, Windows,并且支持 MQTT 消息格式转换。

MQTT X 的用户界面借助聊天软件的形式简化了页面的操作逻辑,用户可以快速创建连接保存并同时建立多个连接客户端,方便用户快速测试 MQTT/TCP、MQTT/TLS、MQTT/WebSocket 的 连接/发布/订阅 功能及其他特性。

MQTT X 致力于打造优雅、易用的全平台 MQTT 客户端,并在最近发布了 MQTT X CLI 及 MQTT X Web 两个版本,目前在 GitHub Star 数已达到 2K,已成为使用场景最完整的 MQTT 测试客户端。

在这里插入图片描述

MQTT X 下载地址

官网下载:https://mqttx.app/zh
GitHub 下载:https://github.com/emqx/MQTTX/releases

MQTTfx 下载地址

百度网盘:https://pan.baidu.com/s/13v0ROf1dOzu2tXqmw3iBMg 提取码:r9f7

ESP8266连接MQTT服务端

ESP8266的Arduino开发环境里有多个MQTT库,我们将使用最为流行的PubSubClient库来作为本教程的主要介绍对象,我们将通过一系列课程教您如何使用ESP8266通过PubSubClient库来实现MQTT物联网应用。

ArduinoIDE 安装库
在这里插入图片描述
ArduinoIDE 导入下载的库
在这里插入图片描述

示例程序

/**********************************************************************
本程序旨在演示如何使用PubSubClient库使用ESP8266向连接MQTT服务器。
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "wifi";
const char* password = "12345678";
const char* mqttServer = "test.ranye-iot.net";
 
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/
 
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
 
void setup() {
  Serial.begin(9600);
 
  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
  
  // 连接WiFi
  connectWifi();
  
  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, 1883);
 
  // 连接MQTT服务器
  connectMQTTServer();
}
 
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())) { 
    Serial.println("MQTT Server Connected.");
    Serial.println("Server Address: ");
    Serial.println(mqttServer);
    Serial.println("ClientId:");
    Serial.println(clientId);
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(3000);
  }   
}
 
// ESP8266连接wifi
void connectWifi(){
 
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");  
  Serial.println(""); 
}

二、 MQTTfx 使用教程

下载完,安装后,打开软件 如下图,第一步骤,点击设置图标
在这里插入图片描述

创建MQTT服务
在这里插入图片描述
connect 开始连接,右侧 ,绿色说明连接成功
在这里插入图片描述
创建订阅主题
在这里插入图片描述

订阅主题发布信息
选择主题,下面输入发送的内容,点击publish 发送,

在这里插入图片描述
发送记录查看

在这里插入图片描述
同步太极创客教程 连接 https://www.bilibili.com/video/BV1T54y1k7MQ/?spm_id_from=333.999.0.0&vd_source=04d3b5e0230b02edb1f84360e21ab826

公用MQTT服务器列表

然也物联 (国内)
官网地址:http://www.ranye-iot.net
MQTT服务器地址:test.ranye-iot.net
TCP 端口:1883
TCP/TLS 端口:8883

三、学习客户端如何实现发布消息、订阅主题以及取消订阅主题

PUBLISH – 发布信息

MQTT客户端一旦连接到服务端,便可以发布消息。 每条发布的MQTT消息必须包含一个主题。MQTT服务器可以通过主题确定将消息转发给哪些客户端

在这里插入图片描述
以下是PUBLISH报文的详细信息。
在这里插入图片描述
topicName – 主题名

主题名用于识别此信息应发布到哪一个主题。关于MQTT主题的应用,我们在之前的课程中已经做了详细介绍,在后续课程中我们还会对主题的高级应用进行更加详细的讲解。

QoS – 服务质量等级
QoS(Quality of Service)表示MQTT消息的服务质量等级。QoS有三个级别:0、1和2。QoS决定MQTT通讯有什么样的服务保证。有关QoS的详细信息我们会在后续课程中详细讲解。

packetId – 报文标识符

报文标识符可用于对MQTT报文进行标识。不同的MQTT报文所拥有的标识符不同。MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。请注意:报文标识符的内容与QoS级别有密不可分的关系。只有QoS级别大于0时,报文标识符才是非零数值。如果QoS等于0,报文标识符为0。

retainFlag – 保留标志

在默认情况下,当客户端订阅了某一主题后,并不会马上接收到该主题的信息。只有在客户端订阅该主题后,服务端接收到该主题的新信息时,服务端才会将最新接收到的该主题信息推送给客户端。
但是在有些情况下,我们需要客户端在订阅了某一主题后马上接收到一条该主题的信息。这时候就需要用到保留标志这一信息。关于保留标志的具体使用方法,我们将在本教程的后续部分进行详细讲解。

Payload – 有效载荷
有效載荷是我们希望通过MQTT所发送的实际内容。我们可以使用MQTT协议发送文本,图像等格式的内容。这些内容都是通过有效載荷所发送的。

dupFlag – 重发标志
当MQTT报文的接收方没有及时确认收到报文时,发送方会重复发送MQTT报文。在重复发送MQTT报文时,发送方会将此“重发标志”设置为true。请注意,重发标志只在QoS级别大于0时使用。有关QoS的详细信息,我们将会在后续教程中为您做详细介绍。

SUBSCRIBE – 订阅主题

当客户端连接到服务端后,除了可以发布消息,也可以接收消息。我们在之前的课程讲过,所有MQTT消息都有主题。客户端要想接收消息,首先要订阅该消息的主题。这样,当有客户端向该主题发布消息后,订阅了该主题的客户端就能接收到消息了。

客户端要想订阅主题,首先要向服务端发送主题订阅请求。客户端是通过向服务端发送SUBSCRIBE报文来实现这一请求的。该报文包含有一系列“订阅主题名”。请留意,一个SUBSCRIBE报文可以包含有单个或者多个订阅主题名。也就是说,一个SUBSCRIBE报文可以用于订阅一个或者多个主题。

在以上PUBLISH报文讲解中,我们曾经提到过QoS(服务质量等级)这一概念。同样的,客户端在订阅主题时也可以明确QoS。服务端会根据SUBSCRIBE中的QoS来提供相应的服务保证。

另外每一个SUBSCRIBE报文还包含有“报文标识符”。报文标识符可用于对MQTT报文进行标识。不同的MQTT报文所拥有的标识符不同。MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。

SUBACK – 订阅确认

服务端接收到客户端的订阅报文后,会向客户端发送SUBACK报文确认订阅。

SUBACK报文包含有“订阅返回码”和“报文标识符”这两个信息。

returnCode – 订阅返回码
在这里插入图片描述

UNSUBSCRIBE – 取消订阅

顾名思义,当客户端要取消订阅某主题时,可通过向服务端发送UNSUBSCRIBE – 取消订阅报文来实现。

在这里插入图片描述
以上示意图显示,UNSUBSCRIBE报文包含两个重要信息,第一个是取消订阅的主题名称。同一个UNSUBSCRIBE报文可以同时包含多个取消订阅的主题名称。另外,UNSUBSCRIBE报文也包含“报文标识符”,MQTT设备可以通过该标识符对报文进行管理。

当服务端接收到UNSUBSCRIBE报文后,会向客户端发送取消订阅确认报文 – UNSUBACK报文。该报文含有客户端所发送的“取消订阅报文标识符”。

客户端接收到UNSUBACK报文后就可以确认取消主题订阅已经成功完成了。

ESP8266发布MQTT消息

ESP8266的Arduino开发环境里有多个MQTT库,我们将使用最为流行的PubSubClient库来作为本教程的主要介绍对象,我们将通过一系列课程教您如何使用ESP8266通过PubSubClient库来实现MQTT物联网应用。关于PubSubClient库,以下是其基本信息:

发布MQTT消息示例

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : publish_ranye_url
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200813
程序目的/Purpose          : 
本程序旨在演示如何使用PubSubClient库使用ESP8266向MQTT服务器发布信息。
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
 
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "taichi-maker";
const char* password = "12345678";
const char* mqttServer = "test.ranye-iot.net";
 
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/
 
Ticker ticker;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
 
int count;    // Ticker计数用变量
 
void setup() {
  Serial.begin(9600);
  
  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
  
  // 连接WiFi
  connectWifi();
  
  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, 1883);
 
  // 连接MQTT服务器
  connectMQTTServer();
 
  // Ticker定时对象
  ticker.attach(1, tickerCount);  
}
 
void loop() { 
  if (mqttClient.connected()) { // 如果开发板成功连接服务器
    // 每隔3秒钟发布一次信息
    if (count >= 3){
      pubMQTTmsg();
      count = 0;
    }    
    // 保持心跳
    mqttClient.loop();
  } else {                  // 如果开发板未能成功连接服务器
    connectMQTTServer();    // 则尝试连接服务器
  }
}
 
void tickerCount(){
  count++;
}
 
void connectMQTTServer(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  String clientId = "esp8266-" + WiFi.macAddress();
 
  // 连接MQTT服务器
  if (mqttClient.connect(clientId.c_str())) { 
    Serial.println("MQTT Server Connected.");
    Serial.println("Server Address: ");
    Serial.println(mqttServer);
    Serial.println("ClientId:");
    Serial.println(clientId);
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(3000);
  }   
}
 
// 发布信息
void pubMQTTmsg(){
  static int value; // 客户端发布信息用数字
 
  // 建立发布主题。主题名称以Taichi-Maker-为前缀,后面添加设备的MAC地址。
  // 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同,
  String topicString = "Taichi-Maker-Pub-" + WiFi.macAddress();
  char publishTopic[topicString.length() + 1];  
  strcpy(publishTopic, topicString.c_str());
 
  // 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。
  String messageString = "Hello World " + String(value++); 
  char publishMsg[messageString.length() + 1];   
  strcpy(publishMsg, messageString.c_str());
  
  // 实现ESP8266向主题发布信息
  if(mqttClient.publish(publishTopic, publishMsg)){
    Serial.println("Publish Topic:");Serial.println(publishTopic);
    Serial.println("Publish message:");Serial.println(publishMsg);    
  } else {
    Serial.println("Message Publish Failed."); 
  }
}
 
// ESP8266连接wifi
void connectWifi(){
 
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");  
  Serial.println(""); 
}

在这里插入图片描述

在这里插入图片描述

MQTT 主题介绍

主题基本形式

主题是区分大小写的,不建议使用中文,不建议使用空格

示例
myTopic
motorSpeed
MotorSpeed
current time

主题分级

MQTT主题各个级别之间可以使用”/”来分隔。如下例所示:
home/sensor/kitchen/temperature 四级主题
home/sensor/kitchen 三级主题

主题通配符

单级通配符: +

单级通配符可以代替一个主题级别。 以下为含有单极通配符的主题示例。
同时订阅多个主题,前后必须一致才可以
home/sensor/+/temperature

  • 可以替代中间任何的主题,
    home/sensor/kitchen/temperature
    home/sensor/bedroom/temperature

多级通配符 # (类似于匹配查询like home/senso%)
home/sensor/#
home/sensor/kitchen/temperature
home/sensor/bedroom/brightness
home/sensor/data

主题应用注意事项

以$开始的主题是MQTT服务端系统保留的特殊主题,我们不能随意订阅或者向其发布信息。

$SYS/broker/clients/connected
$SYS/broker/clients/disconnected
$SYS/broker/clients/total
$SYS/broker/messages/sent
$SYS/broker/uptime

– 不要用 “/” 作为主题开头
– 主题中不要使用空格
– 保持主题简洁明了
– 主题中尽量使用ASCII字符

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符 [1] 。在这里插入图片描述
了解一下ASCII字符即可

在主题中嵌入客户端ID

ESP8266订阅MQTT主题

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : subscribe_ranye_url
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200708
程序目的/Purpose          : 
本程序旨在演示如何使用PubSubClient库使用ESP8266向MQTT服务器订阅信息。
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "dajiating";
const char* password = "xxxx";
const char* mqttServer = "test.ranye-iot.net";
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

void setup() {
  pinMode(D4, OUTPUT);     // 设置板上LED引脚为输出模式
  digitalWrite(D4, HIGH);  // 启动后关闭板上LED
  Serial.begin(9600);               // 启动串口通讯
  
  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
  
  // 连接WiFi
  connectWifi();
  
  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, 1883);
  // 设置MQTT订阅回调函数
  mqttClient.setCallback(receiveCallback);

  // 连接MQTT服务器
  connectMQTTserver();
}

void loop() {
  if (mqttClient.connected()) { // 如果开发板成功连接服务器
    mqttClient.loop();          // 处理信息以及心跳
  } else {                      // 如果开发板未能成功连接服务器
    connectMQTTserver();        // 则尝试连接服务器
  }
}

// 连接MQTT服务器并订阅信息
void connectMQTTserver(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  String clientId = "esp8266-" + WiFi.macAddress();

  // 连接MQTT服务器
  if (mqttClient.connect(clientId.c_str())) { 
    Serial.println("MQTT Server Connected.");
    Serial.println("Server Address:");
    Serial.println(mqttServer);
    Serial.println("ClientId: ");
    Serial.println(clientId);
   // subscribeTopic(); // 订阅指定主题
    subscribeTopicList();//
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(5000);
  }   
}

// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message Received [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println("");
  Serial.print("Message Length(Bytes) ");
  Serial.println(length);

  if ((char)payload[0] == '1') {     // 如果收到的信息以“1”为开始
    digitalWrite(D4, LOW);  // 则点亮LED。
    Serial.println("LED ON");
  } else {                           
    digitalWrite(D4, HIGH); // 否则熄灭LED。
    Serial.println("LED OFF");
  }
}

// 订阅指定主题
void subscribeTopic(){

  // 建立订阅主题。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。
  // 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同
  String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress();
  char subTopic[topicString.length() + 1];  
  strcpy(subTopic, topicString.c_str());
  
  // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  if(mqttClient.subscribe(subTopic)){
    Serial.println("Subscrib Topic:");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }  
}


// 订阅多个指定主题
void subscribeTopicList(){
  //单级通配符: +
  //String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress()+"/+/data";

  //多级通配符 #
  //String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress()+"/#";

  // 建立订阅主题1。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。
  // 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同
  String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress();
  char subTopic[topicString.length() + 1];  
  strcpy(subTopic, topicString.c_str());
  
  // 建立订阅主题2
  String topicString2 = "Taichi-Maker-Sub2-" + WiFi.macAddress();
  char subTopic2[topicString2.length() + 1];  
  strcpy(subTopic2, topicString2.c_str());
  
  // 通过串口监视器输出是否成功订阅主题1以及订阅的主题1名称
  if(mqttClient.subscribe(subTopic)){
    Serial.println("Subscrib Topic:");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }  
 
  // 通过串口监视器输出是否成功订阅主题2以及订阅的主题2名称
  if(mqttClient.subscribe(subTopic2)){
    Serial.println("Subscrib Topic:");
    Serial.println(subTopic2);
  } else {
    Serial.print("Subscribe Fail...");
  }    
}

// ESP8266连接wifi
void connectWifi(){

  WiFi.begin(ssid, password);
 
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");  
  Serial.println(""); 
}

总结

 // 建立发布主题。主题名称以Taichi-Maker-为前缀,后面添加设备的MAC地址。
  // 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同,
  String topicString = "Taichi-Maker-Pub-" + WiFi.macAddress();
  char publishTopic[topicString.length() + 1];  
  strcpy(publishTopic, topicString.c_str()); //主题必须字符转化字符数组

// 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。
  String messageString = "Hello World " + String(value++); 
  char publishMsg[messageString.length() + 1];   
  strcpy(publishMsg, messageString.c_str());
  
  // 实现ESP8266向主题发布信息
 mqttClient.publish(publishTopic, publishMsg) //发布函数

 // 保持心跳,保持mqtt 正常链接。保持在线
 mqttClient.loop();
 

 subscribeTopic(); // 订阅指定主题
// 收到信息后的回调函数
//char* topic 主题,
//byte* payload, 信息内容 
//unsigned int length 信息长度
void receiveCallback(char* topic, byte* payload, unsigned int length) 


//单级通配符: +
  //String topicString = "Taichi-Maker-Sub-" +  WiFi.macAddress()+"/+/data";

  //多级通配符 #
  //String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress()+"/#";

  // 建立订阅主题1。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。
  // 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同

  //订阅指定主题
  String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress();
  char subTopic[topicString.length() + 1];  
  strcpy(subTopic, topicString.c_str());
  
  // 建立订阅主题2
  String topicString2 = "Taichi-Maker-Sub2-" + WiFi.macAddress();
  char subTopic2[topicString2.length() + 1];  
  strcpy(subTopic2, topicString2.c_str());
  
  // 通过串口监视器输出是否成功订阅主题1以及订阅的主题1名称
  if(mqttClient.subscribe(subTopic)){
    Serial.println("Subscrib Topic:");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }  
  
 // 通过串口监视器输出是否成功订阅主题2以及订阅的主题2名称
  if(mqttClient.subscribe(subTopic2)){
    Serial.println("Subscrib Topic:");
    Serial.println(subTopic2);
  } else {
    Serial.print("Subscribe Fail...");
  }    
 

最后 还是感谢太极创客团队。官网[http://www.taichi-maker.com/]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端以及订阅主题发送主题操作 的相关文章

  • 使用来自 WebSocket @ServerEndpoint 的 CDI @SessionScoped bean

    在 Web 应用程序中 用户使用 servlet HTTP 会话 一些数据存储在 CDI SessionScoped beans 中 稍后在某些页面中 WebSocket 通信是在用户浏览器和服务器之间执行的 对于 GlassFish 4
  • 如何使用 Scarlet 在 Android 上通过 WebSocket 进行连接?

    README md 中的代码 val scarletInstance Scarlet Builder webSocketFactory okHttpClient newWebSocketFactory GDAX URL addMessage
  • Java websocket 客户端不适用于 GDAX 沙箱环境

    我正在使用 spring WebSocketWebSocketClient连接 GDAX 服务器 它在实时环境中运行良好 但相同的代码不适用于沙箱环境 这是我连接到服务器的代码 public class Test public static
  • Heroku 上带有 Django Channels 的 Websocket

    我正在尝试将我的应用程序部署到heroku 该应用程序有一个简单的聊天系统 使用 Websockets 和 django 通道 当我使用 python manage py runserver 测试我的应用程序时 应用程序的行为正如预期的那样
  • 从 Lambda 向 AWS IoT Core 发布 MQTT 消息

    我是 AWS 世界的新手 目前正在开发一项 Alexa 技能 该技能只需向 AWS IoT Core 代理发布一条 mqtt 消息 与之前创建的 事物 和主题进行交互 目前我正在使用 boto3 但我不确定这是正确的路径 这是代码 但在部署
  • 客户端通过 websocket 连接从后端服务器数据库表检索数据

    我使用以下服务器代码从 postgres 数据库检索数据 const express require express const app express const server require http createServer app
  • 如何用Java处理来自客户端的Websocket消息?

    我正在使用 Websocket 用 Ja va 开发客户端 服务器应用程序 目前 所有客户端消息均使用 switch case 进行处理 如下所示 OnMessage public String onMessage String unscr
  • React Native 上的 MQTT?

    将 MQTT 添加到我的反应原生项目时 我很难找到正确的方法 该项目需要在 iOS 和 Android 上运行 因此理想情况下 MQTT 可以在 javascript 端处理 我意识到移动节点和经典节点的网络巢穴是不同的 所以我开始沿着分叉
  • webpack-dev-server 中的代理 websockets 连接

    是否可以在 webpack 开发服务器中代理 websocket 连接 我知道如何将常规 HTTP 请求代理到另一个后端 但它不适用于 websockets 大概是因为代理配置中的目标以 http 开头 webpack dev server
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h
  • WebSockets 监听 UNIX 域套接字?

    是否可以在 nginx 服务器后面设置一个 WebSockets 服务器来处理 UNIX 域套接字上的连接 我目前在同一台计算机上有多个 WebSocket 服务器实例 并且存在端口共享问题 所有实例都必须分配一个唯一的端口 我想避免这种情
  • 通过 Websockets 进行 WebRTC 视频聊天

    我正在尝试使用 webRTC 和 WebSockets 进行信号发送来开发视频聊天应用程序 我的问题是 我不知道创建 RTCPeerConnection 并通过 webSocket 连接两个对等点 2 个浏览器 的过程是什么 至少在本地 我
  • Flask-SocketIO 未使用 Gevent/Gevent-websocket

    我正在使用 Flask 和 Flask SocketIO 构建用于 websocket 通信的 Web 界面 数据 API 我想开始转向使用 Gevent Gevent websocket Gunicorn 以及最终使用 Nginx 进行负
  • 标签库支持命名空间:http://xmlns.jcp.org/jsf/core,但没有为名称定义标签:websocket

    我正在将 jsf 2 2 升级到 jsf 2 3 使用 Wildfly 11 0 0 Beta 作为服务器 我按照本网站上的说明进行操作 http arjan tijms omnifaces org p jsf 23 html 1396 h
  • 加特林负载测试期间编译错误

    我正在尝试编写一个模拟 并且希望能够运行该模拟 我在尝试 mvn gatling execute 时遇到错误 我的 pom 有以下依赖项
  • 在 Apache 上设置 websocket?

    所以我正在对 websockets 进行一些研究 我有几个问题似乎找不到明确的答案 如何在 Linux 服务器上设置 Web 套接字 有 Apache 模块吗 我可以吗have使用第 3 方 PHP 代码或类似代码 除了浏览器兼容性之外 问
  • React Native Android 无法连接到 WebSocket

    尽管 Web 实现可以工作 但 android 模拟器以及我的设备无法连接到 WebSocket 在引发错误的地方收到以下事件错误代码 然后断开连接 connection error Event isTrusted false messag
  • 在 MVC 控制器内打开 websocket 通道

    有没有人有在 MVC 控制器内打开 websocket 连接的良好经验 技术栈 ASPNET Core 1 0 RC1 MVC dnx46 System Net WebSockets 为什么使用 MVC 而不是中间件 为了整体一致性 路由
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • http://localhost:8080 未重定向到 opensso 登录页面

    我的 Liferay Tomcat 服务器在端口 8080 上运行 当我尝试通过输入 url 从服务器访问应用程序时http localhost 8080 它没有重定向到登录页面 而是给我错误 The Connection to abc x

随机推荐

  • UNITY获取物体速度的方法

    unity中如果用navmesh 里面有内置的方法可以获取速度 其他目前发现好像只能自己算了 float Speed curpos gameObject transform position 当前点 float speed Vector3
  • JoyStick Shield连接Nokia 5110--Arduino

    SpaceTrash游戏是一个简单的射击游戏 您可以在其中控制宇宙飞船 并通过移动或爆破 使用激光 来避免漂浮在周围的小行星的碰撞 该游戏是u8g2图形库附带的示例 该图形库通常用于连接具有SPI或I2C协议的各种单色8位显示器 对于此游戏
  • 解释mysql中DDL_详解MySQL第一篇—MySQL简要介绍及DDL语句

    背景 近几年 开源数据库逐渐流行起来 由于具有免费使用 配置简单 稳定性好 性能优良等优点 开源数据库在中低端应用上占据了很大的市场份额 而 MySQL 正是开源数据库中的杰出代表 MySQL 数据库目前分为社区版 Community Se
  • Bean深拷贝忽略大小写

    import java lang reflect Field import java util HashMap import java util Map public class BeanMapUtils 忽略大小写且NULL值不会覆盖新值
  • UBUNTU 18.04 Wine容器环境配置及应用问题

    1 Wine5 0的安装及配置 Wine官方网址 安装教程 https wiki winehq org Ubuntu zhcn Ubuntu 18 04 Linux Mint 19 x 没有提供 FAudio 但最新版的 Wine 依赖该软
  • 202318读书笔记|《芭蕉·芜村·一茶:俳句三圣新译300》——樱花——让一整个春夜亮起来!

    202318读书笔记 芭蕉 芜村 一茶 俳句三圣新译300 樱花 让一整个春夜亮起来 芭蕉 芜村 一茶 俳句三圣新译300 诗歌 词 短歌 俳句我都喜欢 读起来轻松明快 松尾芭蕉 与谢芜村 小林一茶并称三圣 芭蕉为俳句之圣 芜村 一茶居 至
  • StringBuffer进阶以及常用方法

    StringBuffer 类 String类 是在所有项目开发之中一定会使用到的一个功能类 并且这个类拥有如下的特点 每一个字符串的常量都属于一个 String 类的匿名对象 并且不可更改 String 有两个常量池 静态常量池 运行时常量
  • java嵌套类(重点为静态成员类的说明和使用)

    嵌套类 nested class nest d 被定义在另一个类的内部的类 外围类 enclosing class 嵌套类 nested class 有四种 静态成员类 static member class 非静态成员类 nonstati
  • mesa(OpenGL)安装

    Mesa是一个类OpenGL http www opengl org 的开源实现 环境 centos 7 安装方法1 步骤 问题及解决 在 configure 时报告以下错误 Requested libdrm intel gt 2 4 61
  • Linux中安装的Mysql中文插不进去

    查看字符集编码 MySQL gt show variables like character 修改字符集编码 方法如下 mysql gt set character set database utf8 注意 有可能在修改之后仍然在写入中文是
  • 整数除255快速算法的完全不严谨推导

    在浏览一个帖子C 语言有什么奇技淫巧 时 无意看到一个整数除255快速算法 其算法如下 define div 255 fast x x x 257 gt gt 8 gt gt 8 对此算法已有人给出证明255快除算法的证明和推广 但对于我的
  • 论Java多线程如何引发OOM—多线程开发知识点

    Java ThreadLocal 如何引发 OOM Java 内存泄漏 ThreadLocal OOM 回顾ThreadLocal 强引用 软引用 弱引用 虚引用 Java 内存泄漏 内存溢出 Out Of Memory 是指应用系统中存在
  • k8s部署tomcat数据持久化

    1 部署nfs服务器 yum y install nfs utils rpcbind 1 2 启动nfs服务 systemctl start nfs 1 3 检查rpcbind NFS rpcinfo p localhost program
  • 论文笔记--用于人体姿势估计的深度双连续网络(Deep Dual Consecutive Network for Human Pose Estimation)

    索引 复杂情况下的多帧人体姿态估计是一种挑战 尽管最先进的人体关节检测器在静态图像上表现出了显著的效果 但当我们将这些模型应用于视频序列时 它们的表现就显得不足了 普遍存在的缺点包括无法处理运动模糊 视频失焦或姿势遮挡 这是因为无法捕捉到视
  • 工具分享

    随着电子邮件的普及 电子邮件欺骗也变得越来越普遍 电子邮件欺骗是一种针对用户的网络攻击 攻击者通常伪装成合法的发送者来骗取用户的信息或资金 为了保护用户的安全 有必要使用一款强大的电子邮件欺骗漏洞检测工具 EVC就是一款非常优秀的工具 功能
  • Android Studio 将项目转变成library(model)引入到另一个项目中使用

    最近要将项目转换成library 引入到另一项目中使用 所以记录引用的过程 1 修改配置 2 修改app文件夹里面的iml文件名称 在APP文件夹下 找到app iml 文件 将文件名改为想要命名的名称 这里改成loadingviewlir
  • 服务器的文件共享,服务器文件共享设置

    服务器文件共享设置 内容精选 换一换 本文介绍了弹性文件服务SFS各特性版本的功能发布和对应的文档动态 新特性将在各个区域 Region 陆续发布 欢迎体验 云耀云服务器默认设置的时区 是您制作镜像时选择的时区 如需修改 请参见本节内容 将
  • client mac addr不能开机进不去系统_电脑的系统进不去界面重装系统的方法

    学会自己安装系统不求人全过程 纯手打 电脑系统界面进不去 但屏幕只要有字 哪怕左上角只有一横 就可以重做系统 电脑开机就怕一个字一个符号也没有 重做系统只是c盘文件丢失 其他盘文件还在 但硬盘有毛病 格式化硬盘 或者重新分区 所有的文件都没
  • 关于Cubemx(HAL库)中ADC和DMA同时启用存在的问题

    在使用Cubemx编程STM32时 若同时开启ADC和DMA 则软件自动生成的代码如下 可以看到 ADC初始化在DMA前面 这样一来 我们会发现从DMA提取的数据错误的 原因就在它们两个初始化函数的先后顺序是有讲究的 正确的顺序应该是DMA
  • 学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端以及订阅主题发送主题操作

    MQTT原理与应用 学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端 本文章学习借鉴于太极创客团队 以表感谢 官网 http www taichi maker com 文章目录 MQTT原理与应用 一 使用电脑客户端和ESP