ahmd14
ahmd14

Reputation: 61

Only one tcp server allowed ESP8266 with Lua

I am working on ESP8266 and i am trying to program with Lua. I tried to create TCP server,but i take an error message name "only one tcp server allowed" when i wrote sample code below. I create a server and I cant close.

How can I fix it?

print("ESP8266 mode is: " .. wifi.getmode());

cfg = {};
-- Set the SSID of the module in AP mode and access password
cfg.ssid = "SSID";
cfg.pwd = "password";
if ssid and password then
    print("ESP8266 SSID is: " .. cfg.ssid .. " and PASSWORD is: " ..
            cfg.password)
end;
-- Now you should see an SSID wireless router named ESP_STATION when you scan for available WIFI networks
-- Lets connect to the module from a computer of mobile device. So, find the SSID and connect using the password selected
wifi.ap.config(cfg);
ap_mac = wifi.ap.getmac();
-- create a server on port 80 and wait for a connection, when a connection is coming in function c will be executed
sv = net.createServer(net.TCP, 30);
sv:listen(80, function(c)
    c:on("receive", function(c, pl)
        -- print the payload pl received from the connection
        print(pl);
        print(string.len(pl));
        -- wait until SSID comes back and parse the SSID and the password
        print(string.match(pl, "GET"));
        ssid_start, ssid_end = string.find(pl, "SSID=");
        if ssid_start and ssid_end then
            amper1_start, amper1_end = string.find(pl, "&", ssid_end + 1);
            if amper1_start and amper1_end then
                http_start, http_end = string.find(pl, "HTTP/1.1", ssid_end + 1);
                if http_start and http_end then
                    ssid = string.sub(pl, ssid_end + 1, amper1_start - 1);
                    password = string.sub(pl, amper1_end + 10, http_start - 2);
                    print("ESP8266 connecting to SSID: " .. ssid .. " with PASSWORD: " .. password);
                    if ssid and password then
                        sv:close();

                        -- close the server and set the module to STATION mode
                        wifi.setmode(wifi.STATION);
                        tmr.stop(2)



                        print("ESP8266 mode now is: " .. wifi.getmode());
                        -- configure the module wso it can connect to the network using the  received SSID and password
                        wifi.sta.config(ssid, password);
                        print("Setting up ESP8266 for station mode…");
                        print("Please restart your device");
                        tmr.delay(10000000);
                        print("Mode is " .. wifi.getmode());
                        print("Heap:" .. node.heap())
                        print("");
                    end;
                end;
            end;
        end;
        -- this is the web page that requests the SSID and password from the user
        c:send("<!DOCTYPE html> ")
        c:send("<html> ")
        c:send("<body> ")
        c:send("<h1>ESP8266 Wireless control setup</h1>")
        mac_mess1 = "The module MAC address is: " .. ap_mac
        mac_mess2 = "You will need this MAC address to find the IP address of  the module, please take note of it."
        c:send("<h2>" .. mac_mess1 .. "</h2>")
        c:send("<h2>" .. mac_mess2 .. "</h2>")
        c:send("<h2>Enter SSID and Password for your WIFI router</h2>")
        c:send("</form> </html>")
        c:send("<form action='' method='get'>")
        c:send("SSID:")
        c:send("<input type='text' name='SSID' value='' maxlength='100'/>")
        c:send("<br/>")
        c:send("Password:")
        c:send("<input type='text' name='Password' value='' maxlength='100'/>")
        c:send("<input type='submit' value='Submit' />")
    end);
end);

Upvotes: 2

Views: 4937

Answers (2)

user5997828
user5997828

Reputation:

You need to close the TCP server that is already running on the ESP8266. Before creating a server check whether the server is already started, If yes then close it and create a new one..

if srv~=nil then
  srv:close()
end

srv=net.createServer(net.TCP) 
srv:listen(80,function(conn) 
    conn:on("receive",function(conn,payload) 
    print(payload) 
    conn:send("<h1> Hello, World.</h1>")
    end) 
end)

Upvotes: 13

ambassallo
ambassallo

Reputation: 970

Nodemcu only allows one tcp server. when you try to save the init.lua file and using esplorer ide this is what happens.

  1. The init file already existing on the nodemcu is deleted.
  2. The new init.lua file is written.
  3. dofile("init.lua") is run on the nodemcu which executes the init.lua file.

when the third step is run there is already a tcp server that is running on the nodemcu that does not allow one more to be created.

Resolution:- Simply reset the nodemcu.The newest init.lua will be executed and your tcp server should be up and about.

Upvotes: 2

Related Questions