OSError: [Errno 49] Не удается назначить запрошенный адрес

Я пытаюсь подключить датчик BCG (датчик Murata) к сети Wi-Fi и получить от него данные. Я настроил датчик, предположим, что это Wi-Fi с именем «Wifi1», а затем я пытаюсь получить доступ к данным с датчика на моем Mac, который также подключен к Wifi1. Сценарий Python сначала пытается найти узел с помощью функции ssdpSearch, а затем выполняет более поздний код. Вот весь код:

import socket 
import time 
import datetime

REPEAT = 10

def ssdpSearch():   
    print("Starting SSDP Search. 10 seconds.")   
    UDP_IP = '<broadcast>'   
    UDP_PORT = 2000   
    UDP_MESSAGE = '{"type":"SCS-DISCOVER","hostname":"Host-SCS"}'   
    networks = socket.gethostbyname_ex(socket.gethostname())[2] # Find all networks (i.e, wifi, wired)   
    sockets = []   
    for net in networks: # Connect to all networks
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # Allow broadcast
        sock.bind((net, UDP_PORT)) # Connect
        sock.settimeout(1.0) # Set timeout (if no answer when reading)
        sockets.append(sock) # Save "sock" to sockets   
        timeStart = time.time()   
        devices = []   
        print('Found devices:')   
        time.sleep(0.1) 
        while time.time() - timeStart < REPEAT:
            for sock in sockets:
              try:
                sock.sendto(UDP_MESSAGE.encode(), (UDP_IP, UDP_PORT))
                data, addr = sock.recvfrom(1024)
                data = data.decode()
                data = data[1:].split(',')
                if data[0] == '"type":"SCS-NOTIFY"': # Only accept correct responses
                  oldDevice = 0
                  # print(data)
                  for dev in devices:
                    if dev[0] == data[1]:
                      oldDevice = 1
                  if not oldDevice:
                    devices.append([data[1],data[2]]) # Save found devices
                    print('\t' + data[1] + ' ' + data[2])
              except:
                1
            time.sleep(0.2) 
            if not len(devices):
                print('\t No devices found.')
                print('')
                for sock in sockets:
                    sock.close()

def readLine(s):
# Function to read status from BCG data
    line = s.recv(1024).decode()
    return line

def main():
    print('BCG Data Logger \n Logs either raw data or BCG algorithm data to a file \ depending on configured mode.')
    # Open file
    IP = input('Insert IP address (empty for SSDP): ')
    while len(IP) == 0:
        ssdpSearch()
        IP = input('Insert IP address (empty for SSDP): ')
    PORT = 8080
    filename = 'logged_data_' + str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')) + '.txt'
    fid = open(filename,'w')
    print('')
    print('Starting to read data. Press \"ctrl+c\" to quit.')
    while True:
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.settimeout(10)
            s.connect((IP, PORT))
            while True: #
                data = readLine(s)
                print(data,)
                fid.write(data)
        except (KeyboardInterrupt, SystemExit):
            print('Exiting program.')
            fid.close()
            break
        except (socket.timeout):
            print('Timed out, reconnecting.')
        except socket.error as msg:
            print(msg)
            print('Trying to reconnect.')

if __name__ == '__main__':
    main()

В выводе он сначала спрашивает меня об IP-адресе, который я понятия не имею, какой IP-адрес он запрашивает. Мы можем оставить это поле пустым, если это SSDP, поэтому, если я оставлю его пустым, появится следующая ошибка:

>Insert IP address (empty for SSDP): 
>Starting SSDP Search. 10 seconds.
>Traceback (most recent call last):
>File "DataCollection.py", line 91, in <module>
>main()
>File "DataCollection.py", line 64, in main
>ssdpSearch()
>File "DataCollection.py", line 17, in ssdpSearch
>networks = socket.gethostbyname_ex(socket.gethostname())[2] # Find all networks (i.e, wifi, wired)
>socket.gaierror: [Errno 8] nodename nor servname provided, or not known

Может ли кто-нибудь помочь мне понять это.

Заранее спасибо.


person Kathan Vyas    schedule 22.08.2018    source источник
comment
Возможный дубликат gaierror: [ Errno 8] имя узла или имя сервера не указано или неизвестно (с macOS Sierra)   -  person TemporalWolf    schedule 22.08.2018
comment
Что возвращает socket.gethostbyname_ex(socket.gethostname())[2]? добавить отладочную печать stmt.   -  person gregory    schedule 22.08.2018
comment
@TemporaWolf Проблема в моем случае в том, что я нахожусь внутри прокси-сети моей компании, и я не могу справиться с этой проблемой так же свободно, как другие ребята.   -  person Kathan Vyas    schedule 23.08.2018
comment
@Грегори, он возвращает IP-адрес моей машины.   -  person Kathan Vyas    schedule 23.08.2018
comment
@KathanVyas Хм, это странно. Ошибка, которую вы получаете, говорит о том, что вы НЕ возвращаете имя хоста. Пройдитесь по функции: (1) посмотрите, что вы получите с помощью: socket.gethostname(), затем (2) посмотрите, что возвращает socket.gethostbyname_ex(socket.gethostname()).   -  person gregory    schedule 23.08.2018
comment
@Gregory socket.gethostname() дает имя моего MAC (MACC0XXXXXXXX) socket.gethostbyname_ex(socket.gethostname()) дает мне IP-адрес (x.x.x.x), который, как я проверил, в основном является IP-адресом моего MAC.   -  person Kathan Vyas    schedule 23.08.2018