ESP8266 NodeMCU Lua "Socket client" to "Python Server" connection not possible

3.5k views Asked by At

I was trying to connect a NodeMCU Socket client program to a Python server program, but I was not able to establish a connection.

I tested a simple Python client server code and it worked well.

Python Server Code

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   print c.recv(1024)
   c.send('Thank you for connecting')
   c.close()                # Close the connection

Python client code (with this I tested the above code)

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.

s.connect((host, port))     
s.send('Hi i am aslam')
print s.recv(1024)
s.close                     # Close the socket when done     

The output server side was

Got connection from ('192.168.99.1', 65385)
Hi i am aslam

NodeMCU code

--set wifi as station
print("Setting up WIFI...")
wifi.setmode(wifi.STATION)
--modify according your wireless router settings
wifi.sta.config("xxx", "xxx")
wifi.sta.connect()

function postThingSpeak()
  print("hi")
  srv = net.createConnection(net.TCP, 0)
  srv:on("receive", function(sck, c) print(c) end)
  srv:connect(12345, "192.168.0.104")
  srv:on("connection", function(sck, c)
    print("Wait for connection before sending.")
    sck:send("hi how r u")
  end)
end

tmr.alarm(1, 1000, 1, function()
  if wifi.sta.getip() == nil then
    print("Waiting for IP address...")
  else
    tmr.stop(1)
    print("WiFi connection established, IP address: " .. wifi.sta.getip())
    print("You have 3 seconds to abort")
    print("Waiting...")
    tmr.alarm(0, 3000, 0, postThingSpeak)
  end
end)

But when I run the NodeMCU there is no response in the Python server.

The Output in the ESPlorer console looks like

Waiting for IP address...
Waiting for IP address...
Waiting for IP address...
Waiting for IP address...
Waiting for IP address...
Waiting for IP address...
WiFi connection established, IP address: 192.168.0.103
You have 3 seconds to abort
Waiting...
hi

Am I doing something wrong or missing some steps here?

Your guidance is appreciated.

1

There are 1 answers

3
Marcel Stör On BEST ANSWER

After I revisited this for the second time it finally clicked. I must have scanned your Lua code too quickly the first time.

You need to set up all event handlers (srv:on) before you establish the connection. They may not fire otherwise - depending on how quickly the connection is established.

srv = net.createConnection(net.TCP, 0)
srv:on("receive", function(sck, c) print(c) end)
srv:on("connection", function(sck)
  print("Wait for connection before sending.")
  sck:send("hi how r u")
end)
srv:connect(12345,"192.168.0.104")

The example in our API documentation is wrong but it's already fixed in the dev branch.