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!")
break
return False
else:
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:
pass
else:
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=1
while True:
msg='welcome!'+ "\r\n"
clientsocket.send(msg.encode('utf-8'))
text = clientsocket.recv(1024)
if text==None:
pass
else:
print(text)
time.sleep(1)
实际测试时能正常收发数据。
如果要通过socket通信操作ESP32,需要判断接收的数据的内容。本人尝试直接判断字符串内容,但不能正常运行。又测试了编码数字进行发送,测试结果是电脑上能正常发布,但MicroPython不支持对数字进行解码的功能。
总的来说,通过常规的socket通信实现物联网不是一种好方案。如果要在局域网控制设备,可以选择制作网页或使用物联网工具。