NodeMCU:代码负责创建服务器建立新的固件

问题描述:

既然我已经更新了固件(使用https://nodemcu-build.com/和pyflasher)从0.9.6-dev_20150704释放到一个新的后停止工作,具体如下:NodeMCU:代码负责创建服务器建立新的固件

NodeMCU custom build by frightanic.com 
branch: master 
commit: c8ac5cfb912ff206b03dd7c60ffbb2dafb83fe5e 
SSL: false 
modules: file,gpio,net,node,rtcmem,rtctime,tmr,uart,wifi 
build built on: 2017-05-27 13:10 
powered by Lua 5.1.4 on SDK 2.1.0(116b762) 

下面的代码(例如,从http://nodemcu.com/index_en.html)停止工作:

print(wifi.sta.getip()) 
--nil 
wifi.setmode(wifi.STATION) 
wifi.sta.config("SSID","password") 
print(wifi.sta.getip()) 
--192.168.18.110 

-- a simple http server 
srv=net.createServer(net.TCP) 
srv:listen(80,function(conn) 
    conn:on("receive",function(conn,payload) 
    print(payload) 
    conn:send("<h1> Hello, NodeMcu.</h1>") 
    end) 
end) 

需要明确的是,它似乎是连接工作正常(因为我看到MCU名单上我的路由器),但是当我输入的相应地址单片机在浏览器中,它无法连接t到服务器。你有什么想法如何解决它?

+0

IIRC,NodeMCU支持ping,所以一个快速的“ping 192.168.18.110”可能会激发IP堆栈是否存在。此外,如果电源不稳定,这些设备往往会开始变得不稳定(VCC上是否有一个漂亮的电容来平衡流量?)。 –

+0

使用ping进行诊断的结果是流程正确,没有丢包。我很确定电源是否正常。 – Czarek

+0

@Czarek,这解决了吗? –

下面的代码(例如,从http://nodemcu.com/index_en.html)停止工作:

你的代码示例没有被列为使得页面上。您将两个单独的示例从那里拼接到一个程序中,并且失败。这部分是因为其中的一个例子不再有用。

的问题就在这里:

wifi.sta.config("SSID","password") 
print(wifi.sta.getip()) 
--192.168.18.110 

它表明wifi.sta.config是同步操作该块,直到设备接到接入点的IP地址。情况并非如此,因此,在下一行执行设备获得IP时,几乎是不可能的。如果你检查你的串口控制台,你可能会在那里看到nil

更糟糕的是,到net.createServer运行的时间还有仍然没有IP。因此,服务器套接字不受任何约束,并且您创建了一个僵尸服务器。

这里的主要信息:等到设备得到IP后才继续。我们曾经有一个漂亮的simple template in our documentation,但为了完整起见,它最近更新了:https://nodemcu.readthedocs.io/en/latest/en/upload/#initlua。对于初学者可以剥离下来到这一点:

-- load credentials, 'SSID' and 'PASSWORD' declared and initialize in there 
dofile("credentials.lua") 

function startup() 
    if file.open("init.lua") == nil then 
    print("init.lua deleted or renamed") 
    else 
    print("Running") 
    file.close("init.lua") 
    -- the actual application is stored in 'application.lua' 
    -- dofile("application.lua") 
    end 
end 

-- Define WiFi station event callbacks 
wifi_got_ip_event = function(T) 
    -- Note: Having an IP address does not mean there is internet access! 
    -- Internet connectivity can be determined with net.dns.resolve(). 
    print("Wifi connection is ready! IP address is: " .. T.IP) 
    print("Startup will resume momentarily, you have 3 seconds to abort.") 
    print("Waiting...") 
    tmr.create():alarm(3000, tmr.ALARM_SINGLE, startup) 
end 



-- Register WiFi Station event callbacks 
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, wifi_got_ip_event) 

print("Connecting to WiFi access point...") 
wifi.setmode(wifi.STATION) 
wifi.sta.config({ ssid = SSID, pwd = PASSWORD, save = true }) 
-- wifi.sta.connect() not necessary because config() uses auto-connect=true by default 

此外,如果您是从浏览器中测试你的服务器应该发送正确的HTTP报头。像这样:

local content = "<h1>Hello, world!</h1>" 
conn:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n" .. content) 
+0

也许我们可以让所有者更新nodemcu.com上的内容。 –