UDP-Steckdose Multicast

Ich werde anfangen zu sagen, dass ich nicht absolut ein Netzwerk-Experte bin. Ich versuche, ein UDP-Multicast-Socket-System mit vier RaspBerry Pi-Modell B zu erstellen. In jedem Rpi läuft ein Hörscript (ich nenne es " listen.py ") Socket-Client.

Fall 1 – Ich bin vollkommen in der Lage, Datagram zu senden, wenn ich den Socket-Server ausführe (ich nenne ihn " server.py ") direkt innerhalb der Rpi (von SSH, auch mit meinem Laptop).

Ich habe: -listen.py auf boot der Rpi (hier habe ich einen Socket-Client); – Ich laufe die server.py (die server.py ist offensichtlich in die Rpi) In diesem Fall bekomme ich Antwort von allen 4 Rpi, die der Multicast-Gruppe beigetreten sind (224.1.1.1)

Fall 2 – Ich habe einen Socket-Server-Java und eine Socket-Client-Python in meinem Laptop erstellt und alles funktioniert einwandfrei (gleicher Code, gleiche Multicast-Gruppe, gleicher Multicast-Port) .Ich habe auch ohne Multicast mit nur 'localhost' probiert und alles funktioniert auch. Mit netstat kann ich Multicast-Gruppe und Port sehen.

netstat -lu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 224.1.1.1:21581 *:* //MulticastGroupIp:Port udp 0 0 192.168.1.103:ntp *:* //Static ip of one Rpi udp 0 0 *:ntp *:* 

Mein Problem ist, dass wenn ich die server.py von meinem Laptop (keine SSH) Ich habe keine Antwort von der listen.py, Socket-Client, die läuft in die Rpi. Ich muss unbedingt Datagramm von meinem Laptop (ich will eine Java-Klasse) an die 4 Rpi senden.

Ich habe die Möglichkeiten des schlechten Codes ausgeschlossen, falsche Multicast-IP-Gruppe, falsche Multicast-Port-Gruppe. Firewall ist auch in meinem Laptop und im Router aus. Der Parameter net.ipv4.ip_forward auf der Rpi ist 1. Ich weiß, dass UDP unzuverlässig ist, aber hier spreche ich etwa 100% des Datagramms verloren. IGMP ist auf meinem D-Link Router aktiviert. Ich habe das gleiche Problem mit Ethernet und WiFi Konfiguration.

Ich brauche wirklich andere Ideen ….. Also habe ich versucht, hier zu schreiben. Tut mir leid, das ist meine erste Post und ich bin Neuling ein bisschen von allem. Ich schätze jeden Vorschlag. Wahrscheinlich ist es etwas Dummes, das ich nicht verstehen kann.

Vielleicht ein paar Probleme mit der Routingtabelle ???? Das ist meins:

 route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default D-Link.Home 0.0.0.0 UG 0 0 0 wlan0 192.168.1.0 * 255.255.255.0 U 0 0 0 wlan0 

Danke im Voraus

Für mich funktioniert der Code gut und das Problem ist nicht da, aber wenn es nützlich sein kann, die Situation besser zu verstehen …..

Code of server.py (nutzlos zu sagen, dass ich Python in meiner Maschine mit Windows 7 installiert habe):

 import socket import sys # import time print 'message:' n = sys.stdin.readline() n = n.strip('\n') MCAST_GRP = '224.1.1.1' MCAST_PORT = 21581 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) sock.sendto(n, (MCAST_GRP, MCAST_PORT)) 

Oder mit Java (Es ist genau das, was ich will … eine Serversockel Java aber im Moment ist es nicht die Priorität):

 public class PythonScriptScan { private static int portMulticasting = 21581; // private boolean broadcast = true; private DatagramSocket socket; private String groupMulticast = "224.1.1.1"; // group address private int delay = 3000; public PythonScriptScan() { try { socket = new DatagramSocket(); } catch (SocketException e) { e.printStackTrace(); System.exit(1); } } public void start(String agentName) { try { InetAddress group = InetAddress.getByName(groupMulticast); @SuppressWarnings("resource") MulticastSocket s = new MulticastSocket(portMulticasting); s.joinGroup(group); // while (broadcast) { byte[] buf = new byte[10240]; buf = agentName.getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, group, portMulticasting); System.out.println(packet); socket.send(packet); // OK, I'm done talking - leave the group... s.leaveGroup(group); try { Thread.sleep(delay); } catch (InterruptedException e) { System.exit(0); } // } socket.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { System.out.println("Insert Message"); @SuppressWarnings("resource") Scanner sc = new Scanner(System.in); String agentName = sc.nextLine(); PythonScriptScan agent = new PythonScriptScan(); agent.start(agentName); } 

Und listen.py (Es läuft auf Boot in jedem Rpis, die Konfiguration, die ich will, ist mit Ethernet, jeder Rpis hat eine statische IP und sie sind richtig mit meinem D-Link Router verbunden):

 #!/usr/bin/python import socket import struct import fcntl import subprocess import sys import errno import time import os # Create the socket MCAST_GRP = "224.1.1.1" MCAST_PORT = 21581 try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) except socket.error, msg: print 'Could not create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1] sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Bind to the server address # sock.bind(('', MCAST_PORT)) sock.bind((MCAST_GRP, MCAST_PORT)) # Tell the operating system to add the socket to the multicast group on all interfaces mreq = struct.pack('4sl', socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) # Receive loop try: while True: print >>sys.stderr, '\nWAITING TO RECEIVE MESSAGE' d = sock.recvfrom(10240) data = d[0] addr = d[1] print data.strip(), addr finally: print >>sys.stderr, 'closing socket' sock.close() 

  • Python-UDP-Buchse halb zufällig fehlgeschlagen
  • Get () set () memcached listening on UDP mit Python
  • Python-Binde-Fehler bei Multicast-Bindung an Windows
  • Ist es möglich, Pakete über verschiedene Steckdosen zu senden und zu empfangen?
  • Live-Video-Stream auf Server (PC) von Bildern von Roboter über UDP gesendet
  • Verwenden eines Sockels im UDP-Chat mit Threading
  • Senden und Empfangen von Arrays über Sockets
  • Python struct.pack () für einzelne Elemente in einer Liste?
  • TCP vs. UDP-Socket-Latenz-Benchmark
  • Empfangen von Multicast-UDP-Datagrammen mit Python auf Linux
  • UDP-Tonübertragung: Gespielter Sound hat großes Rauschen
  • Python ist die beste Programmiersprache der Welt.