【发布时间】:2014-04-08 07:47:57
【问题描述】:
总的来说,我对 python 编程和 linux / raspian 还很陌生,在过去的几周里,我遇到了一个绝对的问题。我一直在努力坚持,但在过去的几个晚上直到凌晨 1 点试图让它开始工作后,我认为是时候寻求帮助了。
所以我有一个树莓派,我已经设置它接收来自猫头鹰直觉(电力和光伏监视器)的数据,它通过多播在 224.192.32.19 和端口 22600 上发送数据。
我正在使用 iptables 和 fail2ban,但我设置了一个规则以允许所有多播流量,并且源 IP 地址不在 fail2ban 列表中。
iptables规则如下:
target prot opt in out source destination
全部接受 - 任何任何地方任何地方 PKTTYPE = 多播
我正在使用一些非常基本的 python 脚本来尝试接收数据报,但无济于事。
我已经尝试过这些相同的脚本来尝试从 239.255.255.250 : 1900 接收数据报,它工作正常。
我还在 Windows 机器上尝试了“mcsend 224.192.32.19 22600”,它可以使用“rtpqual 224.192.32.19 22600”接收数据,但 raspi 仍然不能。
奇怪的是,当我运行“netstat -g”时,即使我目前没有运行任何侦听器,我也会得到以下信息......编辑:原来我留下了一个在控制台窗口中运行的脚本。尽管如此,它什么也没收到。
IPv6/IPv4 组成员资格
接口参考组
lo 1 all-systems.mcast.net
eth0 1 224.192.32.19
eth0 1 all-systems.mcast.net
另外,如果我运行“ifconfig eth0”,我会得到:
eth0 链路封装:以太网 HWaddr b8:27:eb:4c:46:71
inet 地址:192.168.0.20 广播:192.168.0.255 掩码:255.255.255.0
UP BROADCAST RUNNING MTU:1500 Metric:1
RX 数据包:27645 错误:0 丢弃:0 超限:0 帧:0
TX 数据包:11846 错误:0 丢弃:0 超限:0 运营商:0
碰撞:0 txqueuelen:1000
RX 字节:1701082 (1.6 MiB) TX 字节:2027974 (1.9 MiB)
所以我想我可以放心地假设 pi 上支持/启用了多播。
py脚本如下(默认ip地址/端口不起作用,'help'中的ip地址/端口起作用):
from socket import socket, inet_aton, IPPROTO_IP, IP_ADD_MEMBERSHIP
from socket import AF_INET, SOCK_DGRAM, SOL_SOCKET, SO_REUSEADDR, INADDR_ANY
from optparse import OptionParser
import struct
parser = OptionParser()
parser.add_option("-g", "--group", dest="group", default="224.192.32.19", help="IP Multicast Group (default: 239.255.255.250)")
parser.add_option("-p", "--port", dest="port", default=22600, help="IP Multicast UDP port number (default: 1900)")
parser.add_option("-b", "--buffer", dest="buffer", default=1500, help="IP Socket buffer size (default: 1500 bytes)")
options, args = parser.parse_args()
MCAST_GRP = options.group
MCAST_PORT = options.port
BUFFER_SIZE = options.buffer
sock = socket(AF_INET, SOCK_DGRAM)
sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
mreq = struct.pack('=4sl', inet_aton(MCAST_GRP), INADDR_ANY) # pack MCAST_GRP correctly
sock.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq) # Request MCAST_GRP
sock.bind((MCAST_GRP, MCAST_PORT)) # Bind to all intfs
while True:
data, srv_sock = sock.recvfrom(BUFFER_SIZE) # Receive data (blocking)
srv_addr, srv_srcport = srv_sock[0], srv_sock[1]
print "%s sent: %s" % (srv_addr, data)
我无法确定问题是否与
- raspi 和可能的 iptables 规则
- 网络(路由器可能不支持在这些 IP 地址/端口上进行多播 - Multicast not received by networked computers)
- pi 上的其他东西订阅了 ip 地址并因此阻止了我的 py 脚本
感谢您对此的任何帮助,这真的让我很头疼。
罗素。
【问题讨论】:
标签: python sockets networking raspberry-pi multicast