Ubuntu, Python и получение пакетов широковещания UDP - PullRequest
0 голосов
/ 04 июля 2019

Я действительно изо всех сил пытаюсь получить широковещательные пакеты UDP в моем приложении Python, и я не до конца понимаю, почему. Я использую Python 2.7.15+ на Ubuntu 18.04, если это имеет значение.

У меня есть датчик Ethernet, который выдает сообщения о состоянии с интервалом 1 Гц по широковещательному адресу (255.255.255.255) на порту 45000.

Этот датчик подключен к адаптеру USB-Ethernet, опять же, если это что-то изменит - я не уверен.

Используя Wireshark, я вижу, что эти сообщения приходят с типичным интервалом, и (используя специальный декодер Lua) я вижу, что эти сообщения действительны.

Мой код класса Python выглядит следующим образом:

def startListening(self):
    print("listening")
    # Create the UDP socket
    self.udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.udpSocket.bind(('',45000)) 
    self.udpSocket.setblocking(0)

    print(self.udpSocket.getsockname())
    # prints ('0.0.0.0', 45000)

    self.running = True
    self.thread = threading.Thread(target=self.datagramPoll,args=(self.udpSocket,))
    self.thread.start()

    sleep(1)

def stopListening(self):
    self.running = False
    self.thread.join()
    self.udpSocket.close()

def datagramPoll(self,sock):
    while self.running:
        try:
            print("loop")
            # Anything to read
            data,addr = sock.recvfrom(1024)
            print(data)
        except socket.error, e:
            print(e)
            pass

        sleep(1)    

Я обнаружил, что всегда получаю исключение [Errno 11] Resource temporarily unavailable, которое, как я понимаю, EWOULDBLOCK, поскольку нет данных для чтения из сокета.

У меня есть эквивалентный код в Qt / C ++, который работает абсолютно нормально. Я проверил ufw и включил соответствующие порты, но все равно ничего не получаю.

...