解决方案 arduino PubSubClient 库 MQTT 订阅主题没反应 回调函数没效果

解决方案:

①将esp8266的波特率改为14400或19200

AT+UART_DEF=14400,8,1,0,0

②服务端发布消息时,尽量发布多次,直到收到arduino的回复,下面是我的GO代码(理解思路就好)

for i := 0; i < 10000; i++ {
		text := fmt.Sprintf("msg #%d!", i)
		token := c.Publish("index", 0, false, text)
		token.Wait()
		fmt.Println("publish", text)
		if s == "1" { // arduino回复的值已经储存在s中
			time.Sleep(2000*time.Millisecond)
			s = ""
		}
		time.Sleep(200*time.Millisecond)
	}

③arduino的callback函数加上一个回复(发布指令)

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]); // 串口打印订阅信息
  }
  Serial.println();

  /** 这是自定义的函数 **/
  pubData("1", "return"); // 向主题“return”发布1,表示收到订阅
  delay(200); // 等服务器收到回复1 
  /**
   * 下面是我的传感器收到的数据,尽量不要和订阅同时发,应该等
   * 订阅停止后再发
   */
    String gps = getGPSData();
    String mpu = getMPUData();
    pubData(gps, "gpsData");
    pubData(mpu, "mpuData");
}

实验现象:

串口打印如下:
解决方案 arduino PubSubClient 库 MQTT 订阅主题没反应 回调函数没效果_第1张图片
效果还行,但还有一个bug就是wifi或MQTT服务器容易断开,欢迎有相同问题的同学留言讨论。

你可能感兴趣的:(笔记,物联网)