FiPy Wi-Fi Node-to-Node Socket Error (OSError: -1)
-
Hello!
Apologies if someone has already posted this issue (or a similar one).
I'm attempting to connect two FiPy's directly (no router) through Wi-Fi with one of the Fipy's as the client, and the other as the access point. I've managed to get the client to connect to the access point. However, when I try to create a socket on the client side, I get OSError: -1.
Potential issues (based on Python documentation) and attempted solutions:
- Memory issues. Updated the firmware to 1.17.5.b6.
- Socket connection issues. Double checked IP and socket connection parameters. Please see below for the client code.
# This file is prototype source code for Wi-Fi master that establishes # uni-directional communication (Master -> Slave) with Wi-Fi slave. from network import WLAN import socket import pycom import time networkFound = Falseo netSSID = None pycom.heartbeat(False) pycom.rgbled(0xff3333) # red time.sleep(1) print("Starting MASTER up!") wlan = WLAN() wlan.init(mode=WLAN.STA_AP, ssid="FiPy1_WiFi", auth=(WLAN.WPA2,"fipy1wifiprototype"), channel=11, antenna=WLAN.EXT_ANT) # wlan.init(mode=WLAN.STA) # network_found = False while networkFound is False: print("Commencing scan!") nets = wlan.scan() print(nets) time.sleep(5) for net in nets: # Connect to Wi-Fi slave access point if net.ssid == "FiPy2_WiFi": # network_found = True print(net.ssid) time.sleep(1) networkFound = True wlan.connect(net.ssid, auth=(net.sec, "fipy2wifiprototype"), timeout=5000) netSSID = net.ssid pycom.rgbled(0x33ff33) # green time.sleep(1) # wlan.ifconfig(id=0) time.sleep(10) print(wlan.isconnected()) time.sleep(1) break else: pycom.rgbled(0xff3333) # red time.sleep(1) print("NOT CONNECTED!") # print (wlan.ifconfig()) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) pycom.rgbled(1000) # blue time.sleep(1) print ("Socket successfully created!") except socket.error as err: pycom.rgbled(0xff3333) # red time.sleep(1) print ("Socket failed to be created with error %s" %err) print(netSSID) time.sleep(2) print(wlan.isconnected()) time.sleep(2) # port = 12345 # host_ip = '192.168.4.1' print(socket.getaddrinfo("192.168.4.1", 80)) time.sleep(2) print(socket.getaddrinfo("192.168.4.1", 80)[0][-1]) time.sleep(2) s.connect(socket.getaddrinfo("192.168.4.1", 80)[0][-1]) pycom.rgbled(0xffbb33) # orange time.sleep(2) print("The socket has successfully connected to your boy on port = %s" %(host_ip)) dataString = "Sent from FiPy1" dataBytes = bytes(dataString, "utf-8") # Send data as quickly as possible for iteration in range(10): s.sendto(dataBytes, host_ip) pycom.rgbled(0x33ffdd) # green/blue hybrid print("Sent Data!") print("End of program!") # inputs = s.recv(1024) # barray = binascii.hexlify(inputs) # barray=barray.decode('utf-8') # color = hex(int(barray,16) + int ("0x00",16)) # color = int(color) # pycom.rgbled(color)
For reference, below is the access point code.
# This file is prototype source code for Wi-Fi slave that establishes # uni-directional communication (Master -> Slave) with Wi-Fi master. from network import WLAN import socket import pycom import time pycom.heartbeat(False) pycom.rgbled(0xff3333) # red time.sleep(1) print("Starting SLAVE up!") conn = None # Configure access point wlan = WLAN() wlan.init(mode=WLAN.AP, ssid="FiPy2_WiFi", auth=(WLAN.WPA2, 'fipy2wifiprototype'), channel=11, antenna=WLAN.EXT_ANT) # wlan.init(mode=WLAN.STA) time.sleep(10) wlan.ifconfig(id=1) time.sleep(10) print(wlan.isconnected()) time.sleep(1) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) pycom.rgbled(0x33ff33) # green time.sleep(1) print ("Socket successfully created!") except socket.error as err: pycom.rgbled(0xff3333) # red time.sleep(1) print ("socket failed to be created with error %s" %err) port = 12345 host_ip = '' s.bind((host_ip,port)) s.listen() pycom.rgbled(1000) # blue time.sleep(1) print("Listening for connection requests!") time.sleep(1) # Keep looping until connected.` # 1. One socket for listening for connection requests. # 2. One socket for actually receiving and sending data to client. while conn is None: print("Reached!") conn, addr = s.accept() pycom.rgbled(0xffbb33) # orange time.sleep(1) # Receive data from socket buffer while True: data = conn.recv(256) data = data.decode("utf-8") pycom.rgbled(0x33ffdd) # green/blue hybrid time.sleep(1) print(data)
I'm somewhat baffled as I have been able to successfully connect to a router and create a socket on the client side.
Any insights or suggestions would be greatly appreciated.
Thank you!
-
Hi @joseph,
No, not yet. I have spent a few days on it, but no progress. I keep gettingConnection refused
when trying to connect, so something must be wrong with my server code. Have you tried connecting it to a different device (e.g your computer)?
-
Hi @dan,
Were you able to find anything more about the issue?
And if I may, could I ask you to test the on a pair of LoPy's? If the code works on the LoPy's, we'll probably purchase several LoPy's.
Thanks!
-
Hi @Joseph,
I'm looking into it, it indeed doesn't work. I was able to get a more "descriptive" error
OSError: [Errno 104] ECONNRESET
by addingtry-except
tos.connect(...)
. I'll get back to you when I have more info.