利用Micropython+socket通信实现两块esp32之间的通信

利用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
在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>