利用 net.createConnection(net.TCP, 0) 实现 ESP8266 多页面访问

我想要在一个 Lua 程序中从 Google 读取时间并发送数据到 ThingSpeak 频道。

第一个程序:

connout = nil
connout = net.createConnection(net.TCP, 0)
connout:on("receive",
  function(connout, payloadout)
    if (string.find(payloadout, "Status: 200 OK") ~= nil) then
    end
  end)
  connout:on("connection",
    function(connout, payloadout)
      connout:send("GET /update?api_key="..CHANNEL_API_KEY.."&field1="
      .. humi .. " HTTP/1.1\r\n" .. "Host: api.thingspeak.com\r\n"
      .. "Connection: close\r\n" .. "Accept: */*\r\n"
      .. "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n"
      .. "\r\n")
    end)
    connout:on("disconnection",
      function(connout, payloadout)
        connout:close();
        collectgarbage();
      end)
      connout:connect(80,'api.thingspeak.com')
      gpio.write(pinled,gpio.LOW)
    end)

第二个程序:

conn=net.createConnection(net.TCP, 0)
conn:on("connection",function(conn, payloadout)
conn:send("HEAD / HTTP/1.1\r\n".. "Host: google.com\r\n"..
  "Accept: */*\r\n"..
  "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)"..
  "\r\n\r\n")
end)
conn:on("receive",
  function(conn, payload)
    tmp = string.find(payload,"Date: ")
    print(tmp)
    conn:close()
  end)
  t = tmr.now()
  conn:connect(80,'google.com')

这两个程序独立运行都没有问题,但我想要将它们合并到一个 Lua 文件中。我应该创建两个 TCP 连接吗?还是以其他方式排列它们?

点赞
用户131929
用户131929

无论您想将其拆分为两个文件还是保持在一个文件中,都取决于您。假设您保持它们分开在init.lua中合理的启动序列可能如下所示。它设置了一个tmr.alarm,在1秒的间隔内“循环”,直到WiFi准备好。

--init.lua
function startup()
    dofile("humi.lua")
    dofile("time.lua")
end

print("set up wifi mode")
wifi.setmode(wifi.STATION)
wifi.sta.config(SSID,PASSWORD)
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
    if wifi.sta.getip() == nil then
        print("IP unavaiable, Waiting...")
    else
        tmr.stop(1)
        print("Config done, IP is "..wifi.sta.getip())
        print("You have 5 seconds to abort Startup")
        print("Waiting...")
        tmr.alarm(0, 5000, 0, startup)
    end
end)

但我强烈建议您使用专用的HTTP模块进行HTTP操作。以下是如何与thingspeak.com通讯的示例

http.get("https://api.thingspeak.com/update?api_key=" .. CHANNEL_API_KEY .. "&field1=" .. humi, nil, function(code, data)
    if (code < 0) then
        print("HTTP request failed")
    else
        print(code, data)
    end
end)

请注意,它是通过HTTPS而不是HTTP进行的。

2016-12-19 09:02:32