Arduino MKR1000与Raspberry Pi B UDP通信故障排查请求
排查Arduino MKR1000 UDP数据包未被树莓派接收的步骤
我帮你梳理一套完整的排查流程,一步步找出问题所在,从接收端到发送端再到网络链路,逐个环节验证:
第一步:先确认树莓派接收端是否正常工作
- 首先检查你的UDP监听程序确实在运行,并且绑定的是正确的端口6661。特别要注意绑定的IP是
0.0.0.0(允许所有局域网设备访问)还是树莓派的本地局域网IP?如果绑定了127.0.0.1,那只能接收树莓派本地的数据包,肯定收不到Arduino的。
可以在树莓派终端执行命令:netstat -anu | grep 6661,如果输出里能看到0.0.0.0:6661或者树莓派的局域网IP(比如192.168.1.100:6661),状态是LISTEN,说明监听是正常的。 - 先做本地测试:在树莓派开一个终端执行
nc -ul 6661来监听UDP端口,再开另一个终端执行echo "test data" | nc -u <你的树莓派局域网IP> 6661,看看监听的终端能不能收到这条测试消息。如果本地都收不到,那问题出在接收程序本身,和Arduino无关。
第二步:检查Arduino MKR1000的发送端配置
- 确认代码里的目标IP是树莓派的局域网IP(比如
192.168.1.100),绝对不能写公网IP或者127.0.0.1。 - 核对目标端口是6661,别写错数字(比如写成6660或者6611)。
- 验证WiFi连接状态:在Arduino代码里加一段串口输出,确认已经连上局域网,比如:
打开串口监视器(波特率和代码里一致),看看是否正常输出IP地址。if (WiFi.status() != WL_CONNECTED) { Serial.println("⚠️ WiFi未连接,请检查网络"); delay(1000); } else { Serial.print("✅ WiFi已连接,本地IP:"); Serial.println(WiFi.localIP()); } - 测试Arduino能否ping通树莓派:用
WiFi.ping()函数验证网络连通性,比如:
如果ping不通,说明Arduino和树莓派之间的网络链路有问题,先解决这个。int pingTime = WiFi.ping(IPAddress(192,168,1,100)); // 替换成树莓派的IP if (pingTime == 0) { Serial.println("❌ 无法ping通树莓派,网络不通"); } else { Serial.print("✅ ping成功,响应时间:"); Serial.print(pingTime); Serial.println("ms"); }
第三步:排查局域网链路问题
- 确认两者在同一个局域网:树莓派用
ifconfig查看wlan0的IP,Arduino通过串口打印本地IP,确保两者的网段一致(比如都是192.168.1.x)。 - 检查树莓派防火墙:如果树莓派开启了ufw防火墙,需要允许6661端口的UDP流量,执行命令:
也可以临时关闭防火墙测试:sudo ufw allow 6661/udp sudo ufw reloadsudo ufw disable,如果关闭后能收到数据包,那就是防火墙拦截了。 - 检查路由器AP隔离:有些路由器默认开启AP隔离功能,会阻止局域网内设备互相通信。登录路由器后台,找到“AP隔离”或者“无线隔离”选项,关闭它再测试。
第四步:用抓包工具定位数据包流向
- 在树莓派上抓包:执行
sudo tcpdump -i wlan0 udp port 6661,然后让Arduino发送数据,看看终端有没有输出数据包信息。如果有,说明数据包已经到了树莓派,问题出在接收程序;如果没有,说明数据包没传过来。 - 如果树莓派没抓到包,找另一台同局域网的电脑,用Wireshark抓包,过滤条件设置为
udp port 6661 && ip.dst == <树莓派IP>,看看能不能抓到Arduino发出来的数据包。如果抓不到,说明Arduino发送代码有问题;如果抓到了,那就是树莓派这边的网络或防火墙问题。
内容的提问来源于stack exchange,提问作者Hamza Shafiq
相关产品推荐
相关产品推荐

