ArduinoUNO+ESP8266与MQTT服务器通信

全文包括以下几个部分:
1、搭建/配置/测试MQTT服务端
2、Arduino连接WIFI并使用软串口通信
3、在Arduino实现MQTT的PUB客户端
4、总结

搭建/配置/测试MQTT服务端
服务器用的华为学生云,ubuntu系统,感谢华为云orz
114.116.xxx.xxx
apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
apt-get update
apt-get install mosquitto
cd /etc/mosquitto/conf.d
touch myconfig.conf
vim myconfig.conf
allow_anonymous false
password_file /etc/mosquitto/pwfile.txt
port 1883

mosquitto_passwd -c /etc/mosquitto/pwfile.txt [username]
service mosquitto start

调整服务器的安全组,放行来自1883端口的数据
使用python测试服务器和安全组是否正常:
#sub.py
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
    print("Connect result:" + str(rc))
    client.subscribe("test_topic")
def on_message(client, userdata, msg):
    print(msg.topic+":" +str(msg.payload))
client = mqtt.Client("admin_sub")
client.username_pw_set("[username]","[password]")
client.on_connect = on_connect
client.on_message = on_message
print("Connectting…")
client.connect("114.116.***.***", 1883, 60)
client.loop_forever()


#pub.py
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
    print("Connect result:" + str(rc))
def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))
client = mqtt.Client("admin_pub")
client.on_connect = on_connect
client.on_message = on_message
client.connect('114.116.***.***', 1883, 60)
client.publish('test_topic', payload='test_pub_content', qos=0)

可以连接/通讯,如图:

Arduino连接WIFI并使用软串口通信
#include <SoftwareSerial.h>
SoftwareSerial wifiSerial(2, 3);
void setup() {
  Serial.begin(9600);
  wifiSerial.begin(9600);
  while(!Serial);
  while(!wifiSerial);
  wifiSerial.println("AT+CWJAP=\"hausahan\",\"[password]\"");
}
void loop() {
  if(wifiSerial.available()) {
    Serial.write(wifiSerial.read());
  }
  if(Serial.available()){
    wifiSerial.write(Serial.read());
  }
}

在昨天的基础上学习了软串口,原来加一行就可以通信了。。
连接成功了,手机上也可以看到已经连接的设备:

在Arduino实现MQTT的PUB客户端
网上能找到的资料都需要烧写ESP8266,因为怕写坏自己唯一的板子,所以尝试造一次轮子。实现软串口+TCP协议的MQTT客户端,站在别人肩膀上先实现Pub功能。参考:
https://blog.csdn.net/Fredric_2014/article/details/89602457
https://blog.csdn.net/anxianfeng55555/article/details/80908795
最终实现效果及代码:

代码放在了CSDN:https://blog.csdn.net/qq_42851946/article/details/112915356

总结
还是有很多让人疑惑的问题的,比如:
ESP8266很多指令执行后必须等几秒才能进行下一步操作。
也有收获:
每次编程后使用AT+RST进行重置并在烧写完成后复位Arduino能解决很多奇怪的问题。
更理解通信协议、wireshark的使用、、、等知识了
下一步:
考虑多买几块8266,学习对直接使用8266的方法,因为看起来好像很方便,并实现一个远程控制LED的Deeeeeemo
🙂