解决方案:
①将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服务器容易断开,欢迎有相同问题的同学留言讨论。