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
Может ли кто-нибудь помочь мне понять это.
Заранее спасибо.