软件准备:upycraft,EMQ(MQTT服务器)
ps:看了很多文章,在Linux下使用mosqitto来充当Broker,实测无跨平台实现与ESP32通信。若君已实现,烦请赐教。
一:MQTT简简简介
采用MQTT通讯时必须包含三个部分:服务器,发布端,订阅端。
发布端发布带topic的消息给服务器,服务器将消息转发给订阅了此topic的终端,三者可以在一台机器上实现。
二:EMQ下载,安装,查看
下载:(仅仅在测试使用时推荐Windows端,后期建议部署在Linux服务器上)链接:https://www.emqx.io/downloads
安装:
解压完成后,将生成的lisence放进etc文件夹,再通过cmd命令进入解压出来的“bin”文件夹中,输入emqx start。
登录管理窗口(浏览器输入:http://127.0.0.1:18083/)账号:admin,密码:public。查看连接情况!
注意每次通信之前先启动,为了方便写成脚本,可参照修改路径:
D:
cd \installdir\EQM\emqx\bin
emqx start
echo "emqx start ok!"
pause
三:发布端和订阅端代码
代码主要分为三个部分:1.连接wifi,2.发布端,3订阅端
参考:ESP32 micropython 开发手册
1.连接wifi:
#sta.py
def do_connect():
import network
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
if not wifi.isconnected():
print('connecting to network...')
wifi.connect('Phd_2.4G', '15957445992')
while not wifi.isconnected():
pass
print('network config:', wifi.ifconfig())
#do_connect()
2.发布端:
#publisher.py
from umqtt.simple import MQTTClient
import time
import sta
import simple
sta.do_connect()
SERVER = '192.168.0.107'
CLIENT_ID = 'pub'
TOPIC = b'h9'
def mqtt_callback(topic, msg):
print('topic: {}'.format(topic))
print('msg: {}'.format(msg))
client = MQTTClient(CLIENT_ID, SERVER)
client.connect()
i = 0
while True:
client.publish(TOPIC, 'helloworld')
print ("publishing[%d]......" % (i))
i = i+1
time.sleep(1)
3.订阅端
#subscriber.py
from umqtt.simple import MQTTClient
import time
import sta
import simple
sta.do_connect()
SERVER = '192.168.0.107'
CLIENT_ID = 'sub'
TOPIC = b'h9'
def mqtt_callback(topic, msg):
print('topic: {}'.format(topic),end= ' ')
print('msg: {}'.format(msg),end = ' ')
client = MQTTClient(CLIENT_ID, SERVER)
client.set_callback(mqtt_callback)
client.connect()
client.subscribe(TOPIC)
i = 0
while True:
# 查看是否有数据传入
# 有的话就执行 mqtt_callback
print("\nsublishing[%d]:......"%(i),end= ' ')
i = i+1
client.check_msg()
time.sleep(1)
将sta.py分别保存在两块ESP32中,先运行订阅端,再运行发布端。注意修改服务器ip。
PS:在使用ESP32时经常发生"reflush tree false"等错误,甚至无法连接上板子,建议在开发时将文件save as到其他文件夹中(默认保存在板子上),再擦除flash,重新烧写固件(按住板子boot按键)。