Luke
Luke

Reputation: 2168

Creating an HTTP server in NodeMCU through an access point created by the board

I am coding a robot, using NodeMCU (ESP8266) and want it to be remote controlled. My current solution is connecting to a nearby router, to the internet and creating a TCP HTTP server. Data is streamed from the mobile device (remote) to the NodeMCU (robot) via HTTP requests. The remote is loaded onto the mobile device through a browser with HTML/CSS/JavaScript.

What I want instead is for the NodeMCU to create its own hotspot, because:

I want the same TCP HTTP solution, but I don't know how to serve a webpage through a custom hotspot.

This is my code:

-- Connect to router
wifi.sta.config("ssid","password")
wifi.sta.connect()

-- Code for waiting for connection

-- Create server
srv = net.createServer(net.TCP) 
srv:listen(80,function(conn)    
conn:on("receive",function(conn,payload) 
    for line in string.gmatch(payload,'[^\r\n]+') do
        s = string.find(line, "GET /&")
        -- If query is there, control robot
        if s ~= nil then
            -- Do stuff with query
            break;
        -- If no query, serve webpage
        else
            file.open("index.html", "r")
            while true do
                s = file.read(1460)
                if s == nil then
                    break
                end
                conn:send(s)
            end
            file.close()
        end
        break
    end
    conn:on("sent", function(conn) conn:close() end)
end)
end)

Creating custom hotspot:

wifi.setmode(wifi.STATIONAP)
cfg={}
cfg.ssid="custom_ssid"
cfg.pwd="custom_password"
wifi.ap.config(cfg)

So how do I make it so the mobile can access the server? How do I get/set the IP of the server? Basically, I just need it to work. Thanks!

Upvotes: 0

Views: 1349

Answers (1)

Marcel Stör
Marcel Stör

Reputation: 23535

Not sure I fully understand but I believe you're really close. Check the documentation for the AP functions at http://nodemcu.readthedocs.io/en/latest/en/modules/wifi/#wifiap-module.

wifi.ap.config(cfg) sets SSID and pwd as you noted. Your client then connects to this AP by joining the network.

If you then print wifi.ap.getip() you'll see that the device has the IP address 192.168.1.4 by default. Hence, for clients which joined this network your server is reachable at 192.168.1.4:80 unless you set a custom IP explicitly.

However, the sending of data seems broken. You have multiple conn:send(s) (in the loop) yet you also have conn:on("sent", function(conn) conn:close() end) which means that the connection will be closed after the first conn:send! Check the docs at http://nodemcu.readthedocs.io/en/latest/en/modules/net/#netsocketsend for an example as for how to do that properly.

Upvotes: 1

Related Questions