解決方案 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");
}

實驗現象:

串口打印如下:
在這裏插入圖片描述
效果還行,但還有一個bug就是wifi或MQTT服務器容易斷開,歡迎有相同問題的同學留言討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章