<aside> 📏
改建定位:保留 UDP socket 和 HC-SR04 测距,实现无人机近距离目标/降落区域辅助感知实验。
</aside>
先按原课程完成本地测距,再接入 UDP,分别验证传感器和网络。使用原有网络调试工具发送查询指令。增加 10、20、50厘米多次测试、无回波与网络断开测试;在原 while 等待回波逻辑中加入超时思路。
UDP回顾 → 本地测距 → 误差分析 → 远程查询 → 异常处理。测距25%,通信25%,误差25%,调试25%。
# 整体流程
# 1. 连接wifi
# 2. 启动网络功能(UDP)
# 3. 接收网络数据
# 4. 处理接收的数据
import socket
from time import sleep
import network
import machine
def do_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
while True:
status=wlan.ifconfig() #查看当前的网络连接信息,未连接成功时,ip、网关、dns皆为0.0.0.0
if status[0]=='0.0.0.0': #若本机IP地址为0.0.0.0表示未连接
print("开始连接WiFi……")
wlan.connect("402", "Syhzs402") # 连接到指定的WiFi
sleep(5) #延时函数,建立连接需要时间
print("WiFi连接状态",wlan.isconnected()) # 检查WLAN的连接状态
else:
print(f"连接WiFi成功,网络信息{status}")
break #连接成功后结束循环
def start_udp():
# 2. 启动网络功能(UDP)
# 2.1. 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.2. 绑定本地信息
udp_socket.bind(("0.0.0.0", 7788))
return udp_socket
def main():
# 1. 链接wifi
do_connect()
# 2. 创建UDP
udp_socket = start_udp()
# 3. 创建灯对象
led = machine.Pin(2, machine.Pin.OUT)
# 4.创建数据接收对象
rec_ip="192.168.50.244"
rec_port=7070
rec_addr=(rec_ip,rec_port)
# 5. 接收网络数据
while True:
recv_data, sender_info = udp_socket.recvfrom(1024)
try:
recv_data_str = recv_data.decode("utf-8")
print(recv_data_str)
except Exception as ret:
recv_data_str='error'
print("error:", ret)
# 6. 处理接收的数据
if recv_data_str == "light on":
print("这里是要灯亮的代码...")
led.value(1)
message = "已开灯"
elif recv_data_str == "light off":
print("这里是要灯灭的代码...")
led.value(0)
message = "已关灯"
#给发送者发送消息处理结果
udp_socket.sendto(message.encode('utf-8'),rec_addr)
if __name__ == "__main__":
main()