MicroPython有socket通信功能,但实测得出仅适用于字符串收发,不适合对设备进行控制。以下是测试的具体情况。
ESP32上直接使用例程,要填写wifi名称再运行。实际使用时不能上电启动,原因不明确。
#导入Pin模块
from machine import Pin
import time
import network
import usocket#定义LED控制对象
led1=Pin(15,Pin.OUT)#路由器WIFI账号和密码
ssid=" "
password=" "#服务器地址和端口
dest_ip="192.168.1.100"
dest_port=10000#WIFI连接
def wifi_connect():wlan=network.WLAN(network.STA_IF) #STA模式wlan.active(True) #激活start_time=time.time() #记录时间做超时判断if not wlan.isconnected():print("conneting to network...")wlan.connect(ssid,password) #输入WIFI账号和密码while not wlan.isconnected():led1.value(1)time.sleep_ms(300)led1.value(0)time.sleep_ms(300)#超时判断,15 秒没连接成功判定为超时if time.time()-start_time>15:print("WIFI Connect Timeout!")breakreturn Falseelse:led1.value(0)print("network information:", wlan.ifconfig())return True#程序入口
if __name__=="__main__":if wifi_connect():socket=usocket.socket() #创建socket连接addr=(dest_ip,dest_port) #服务器IP地址和端口socket.connect(addr)socket.send("Hello PRECHIN")while True:text=socket.recv(128) #单次最多接收128字节if text==None:passelse:print(text)socket.send("I get:"+text.decode("utf-8"))time.sleep_ms(300)
电脑上可以用网络调试工具,或者用下面的python程序。由于上面的ESP32程序上电不能正常启动,需要在电脑上启动,而IDE上不能同时使用两个解释器,因此需要在文件所在目录打开命令行,使用 python+空格+文件名 运行程序。
#!/usr/bin/python3
# 文件名:server.py# 导入 socket、sys 模块
import socket
import sys
import time
# 创建 socket 对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名
host = socket.gethostname()port = 10000# 绑定端口号
serversocket.bind((host, port))# 设置最大连接数,超过后排队
serversocket.listen(5)while True:# 建立客户端连接clientsocket,addr = serversocket.accept() print("连接地址: %s" % str(addr))i=1while True:msg='welcome!'+ "\r\n"clientsocket.send(msg.encode('utf-8'))text = clientsocket.recv(1024)if text==None:passelse:print(text)time.sleep(1)
实际测试时能正常收发数据。
如果要通过socket通信操作ESP32,需要判断接收的数据的内容。本人尝试直接判断字符串内容,但不能正常运行。又测试了编码数字进行发送,测试结果是电脑上能正常发布,但MicroPython不支持对数字进行解码的功能。
总的来说,通过常规的socket通信实现物联网不是一种好方案。如果要在局域网控制设备,可以选择制作网页或使用物联网工具。