文章目录[隐藏]
利用Micropython+socket通信实现两块esp32之间的通信
前言
前段时间参考灯哥开源的资料打造了一个基于esp32的四足八自由度的机械狗。前前端时间参考b站的键盘制作视频制作了一个3*3键位的小机械键盘,想着可以把这两个东西结合起来,其实就是用键盘去控制机械狗的运动,这样首先要解决的问题就是键盘和机械狗的通信问题,因为灯哥开源的机械狗是用micropython+esp32做的,所以我想另一块esp32也用micropython,但查找网上资料发现大部分都是arduino写的通信,用micro python的比较少,所以自己查找官方文档(应该是吧),参考例程用micropython把两个esp32之间的通信整出来了。
一、通信方式的选择
找资料的时候发现,esp32的无线通信可以有蓝牙,socket通信,Mqtt通信。蓝牙呢感觉距离很限制,socket与Mqtt相比简单一些,socket几乎是整个网络通信的基础,但是呢,esp32作为一个单片机,其网络环境可能是不可靠的,如果采用原始的socket通信,并不能保障信息可以到达接收方,数据的可靠性包括实时性都会有一定的影响,所以这个时候Mqtt就可以替代它。当然了,最后选择的还是socket,从易到难,仅仅根据文字表述无法真正确定socket是不是效果的确差一些,反正就头铁,试试吧。
二、esp32与PC端通信(手机热点)
1.先尝试一下官方文档给的参考(用的是Thonny写代码,固件烧录啥的可以看看其他博主)
代码如下(示例):
import network
import socket
import time
SSID = "dfrobotYanfa" #修改为你的WiFi名称
PASSWORD = "hidfrobot" #修改为你WiFi密码
port = 10000 #端口号
wlan = None #wlan
listenSocket = None #套接字
#连接WiFi
def connectWifi(ssid,passwd):
global wlan
wlan = network.WLAN(network.STA_IF)
wlan.active(True) #激活网络
wlan.disconnect() #断开WiFi连接
wlan.connect(ssid, passwd) #连接WiFi
while(wlan.ifconfig()[0] == '0.0.0.0'): #等待连接
time.sleep(1)
return True
#Catch exceptions,stop program if interrupted accidentally in the 'try'
try:
connectWifi(SSID,PASSWORD)
ip = wlan.ifconfig()[0] #获取IP地址
listenSocket = socket.socket() #创建套接字
listenSocket.bind((ip, port)) #绑定地址和端口号
listenSocket.listen(1) #监听套接字
listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #设置套接字
print ('tcp waiting...')
while True:
print("accepting.....")
conn, addr = listenSocket.accept() #接收连接请求,返回收发数据的套接字对象和客户端地址
print(addr, "connected")
while True:
data = conn.recv(1024) #接收数据(1024字节大小)
if(len(data) == 0): #判断客户端是否断开连接
print("close socket")
conn.close() #关闭套接字
break
print(data)
ret = conn.send(data) #发送数据
except:
if(listenSocket): #判断套接字是否为空
listenSocket.close() #关闭套接字
wlan.disconnect() #断开WiFi
wlan.active(False) #冻结网络
首先电脑和esp32都连上自己的热点,然后用网络串口调试助手,这里推荐使用TCP调试助手,可以百度搜一搜,之前尝试了NetAssist这个调试助手,失败了,后来又下了个TCP调试助手可以用,也不清楚为啥,可能是软件bug。然后注意一下,进入调试助手界面后自行配置好设定的端口和热点的ip地址,然后再点击助手界面里的连接网络。然后在串口助手里输入数据,点击发送,这时Thonny的运行终端界面里就可以看到传过来的数据了。
2.esp32与PC端通信(esp32作为热点)
总所周知,esp32可以作为客户端连接WiFi,也可以作为接入开启WiFi,即其本身可以作为热点,具体设置可以看参考文档。具体设置代码如下:
代码如下(示例):
import network
import socket
import time
port = 10000 #端口号
wlan = None #wlan
listenSocket = None #套接字
#创建WiFi
def createWifi():
global ap
ap = network.WLAN(network.AP_IF) #创建接入点界面
ap.active(True) #激活界面
ap.config(essid='ESP-AP') #设置接入点的ESSID,和WiFi 通道
while(ap.ifconfig()[0] == '0.0.0.0'): #等待连接
time.sleep(1)
return True
#Catch exceptions,stop program if interrupted accidentally in the 'try'
try:
createWifi()
ip = ap.ifconfig()[0] #获取IP地址
print(ip)
listenSocket = socket.socket() #创建套接字
listenSocket.bind((ip, port)) #绑定地址和端口号
listenSocket.listen(1) #监听套接字
listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #设置套接字
print ('tcp waiting...')
while True:
print("accepting.....")
conn, addr = listenSocket.accept() #接收连接请求,返回收发数据的套接字对象和客户端地址
print(addr, "connected")
while True:
data = conn.recv(1024) #接收数据(1024字节大小)
if(len(data) == 0): #判断客户端是否断开连接
print("close socket")
conn.close() #关闭套接字
break
print(data)
ret = conn.send(data) #发送数据
except:
if(listenSocket): #判断套接字是否为空
listenSocket.close() #关闭套接字
代码写好之后运行,打开电脑WiFi,你会发现有个ESP-AP的热点,连接上它,这个时候电脑和esp32就会在同一个局域网下了,当然这个局域网的ip地址和之前的手机热点ip地址肯定会不同,用TCP调试助手调试的时候注意设置。
3.esp32与esp32通信
其实上面的代码实现后,这个就不难了,唯一要注意的就是两个esp32必须处于同一局域网下,也就是说,一个esp32要设置成热点模式,另一个esp32得设置成连接WiFi模式,上代码:
代码如下(示例):
SSID = "ESP-AP" #WiFi名称
PASSWORD = "" #WiFi密码
wlan = network.WLAN(network.STA_IF) #创建WLAN对象
wlan.active(True) #激活界面
wlan.scan() #扫描接入点
wlan.isconnected() #检查站点是否连接到AP
wlan.connect(SSID, PASSWORD) #连接到AP
wlan.config('mac') #获取接口的MAC adddress
wlan.ifconfig()
s = socket.socket() # 创建 socket 对象
host = '192.168.4.1' # esp32 ip
port = 10000 # 设置端口号
s.connect((host, port))
if __name__ == '__main__':
while True:
msg = 'aaaaaaa'
s.send(msg)
time.sleep(1)
因为Thonny只能运行一个esp32的代码,所以为了方便看两个esp32的调试结果,我用upycraft运行的另一个esp32代码,这样方便看两个esp32的运行结果。
总结
暂时简单实现了两个esp32之间的通信,自己也初步尝试了发送指令控制机械狗的运动,下一步就是制作esp32无线键盘了,之后做出来看看实际效果,看看socket通信是不是可以满足我的要求;
官方文档(应该是吧)链接:http://docs.dfrobot.com.cn/upycraft/
参考文档链接:http://www.1zlab.com/wiki/micropython-esp32/pins-and-gpio/
对了,我用的esp32是安立信的NodeMCU-32S
版权声明:本文为CSDN博主「小豆的大可爱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43982855/article/details/121851251
暂无评论