Raspberry Pi不接收多播数据包

时间:2014-03-05 23:21:06

标签: python sockets networking raspberry-pi multicast

我对python编程和linux / raspian一般都很陌生,在过去的几周里,我遇到了一个绝对的问题。我一直在努力坚持下去,但在过去的几个晚上,直到凌晨1点试图让它上班,我认为是时候寻求帮助了。

所以我设置了一个覆盆子pi,用于接收来自猫头鹰直觉(电力和光伏监视器)的数据,该数据通过224.192.32.19和22600端口的多播发送数据。

我正在使用iptables和fail2ban但是我有一个规则设置允许所有多播流量,而源ip地址不在fail2ban列表中。

iptables规则如下:

  

目标选择退出源目的地
  接受所有 - 任何地方的任何地方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组成员资格
  Interface RefCnt Group

     
     

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 addr:192.168.0.20 Bcast:192.168.0.255 Mask:255.255.255.0
           UP BROADCAST RUNNING MULTICAST MTU:1500公制: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)

我无法确定问题是否与

有关

感谢您对此提供任何帮助,这真的让我感到满意。

罗素。

1 个答案:

答案 0 :(得分:0)

耶!似乎问题在于我的天空路由器!

http://helpforum.sky.com/t5/Broadband-Setup-Connection-WiFi/Sky-Hub-Is-it-really-bad/m-p/1845916#M48979

看来OP的问题的答案是肯定的。是的,那很糟糕。

:(

不知道从哪里开始......