解決方案:
①將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服務器容易斷開,歡迎有相同問題的同學留言討論。