我正在尝试使用Raspberry Pi Zero(W)来控制一大堆esp8266,从而控制一连串的ws2812。
Pi通过小工具(本地网络10.42.0.139/24)通过usb0接口连接到我的笔记本电脑。无线接口通过hostapd用作AP。 esp8266已配置为自动连接到AP并通过DHCP获取地址。
esp8266在UDP端口7777上侦听,并接收一个编码ws2812 led颜色的字节串,而这些颜色又通过DMA被撞开:https://github.com/cnlohr/esp8266ws2812i2s
当我将缓冲区的内容单播到一个esp时,此方法完美无缺。但是,我想控制大量esp8266,以至于将数据包发送到广播地址将为所有连接的esp同步触发相同的模式。
但是,一旦我将控制器应用程序中的单播地址更改为网络的广播地址,模式就会“停顿”。显然,某些数据包被丢弃或者至少从未到达。如果我将笔记本电脑连接到“群热”网络,无线接口上的tcpdump会显示与esp8266指示灯完全相同的间歇模式,这使我得出结论:数据包实际上从未离开过覆盆子?如果它们因无线干扰而掉到空中,我希望笔记本电脑和esp之间会看到不同的模式,我也希望看到使用单播的辍学?
有关Pi接口的一些信息:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 16:01:c9:fa:e9:0b brd ff:ff:ff:ff:ff:ff
inet 10.42.0.139/24 brd 10.42.0.255 scope global usb0
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:d2:ac:16 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.1/24 brd 192.168.42.255 scope global wlan0
valid_lft forever preferred_lft foreve
路线:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.42.0.1 0.0.0.0 UG 0 0 0 usb0
10.42.0.0 0.0.0.0 255.255.255.0 U 0 0 0 usb0
192.168.42.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
(我用于发送数据包的代码的一部分):
#!/usr/bin/python
import socket
#UDP_IP = "192.168.42.255"
UDP_IP = "192.168.42.10"
UDP_PORT = 7777
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.connect((UDP_IP, UDP_PORT))
bffr = <packet information>
s.send(bffr)
我也尝试了s.sendto(bffr,(UDP_IP, UDP_PORT))
,而没有s.connect()
。没什么。
python代码是esp 2812库(https://github.com/cnlohr/esp8266ws2812i2s/tree/master/wsend)附带的C代码示例的端口,该端口显示了完全相同的问题。
esp地址为192.168.42.10。我使用的广播地址是192.168.42.255,因为usb0是默认网关接口,因此会干扰255.255.255.255。我确实尝试将默认路由添加到 wlan0接口使255.255.255.255转到wlan0接口,但这没有帮助。另外,如果网络配置有问题,我希望没有任何数据包到达吗?
什么可能导致广播数据包被丢弃到Pi上,更重要的是,我该如何解决?
更新:我当时认为(isc-)dhcp服务器在与广播数据包交互时也可能会产生干扰,但是关闭它并不能改善这种情况。
更新2:hostapd.conf中的wme_enabled = 1似乎有很大帮助?谁能解释为什么这有助于广播数据包,以及为什么传输质量降低而没有?