main.lua 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "wifidemo"
  3. VERSION = "1.0.0"
  4. -- 引入必要的库文件(lua编写), 内部库不需要require
  5. sys = require("sys")
  6. require("sysplus")
  7. --[[
  8. 本demo演示AP的配网实例
  9. 1. 启动后, 会创建一个 luatos_ + mac地址的热点
  10. 2. 热点密码是 12341234
  11. 3. 热点网关是 192.168.4.1, 同时也是配网网页的ip
  12. 4. http://192.168.4.1
  13. ]]
  14. if wdt then
  15. --添加硬狗防止程序卡死,在支持的设备上启用这个功能
  16. wdt.init(9000)--初始化watchdog设置为9s
  17. sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
  18. end
  19. -- 初始化LED灯, 开发板上左右2个led分别是gpio12/gpio13
  20. local LEDA= gpio.setup(12, 0, gpio.PULLUP)
  21. -- local LEDB= gpio.setup(13, 0, gpio.PULLUP)
  22. local scan_result = {}
  23. sys.taskInit(function()
  24. log.info("AP", "luatos_" .. wlan.getMac(), "12341234")
  25. sys.wait(1000)
  26. wlan.init()
  27. sys.wait(300)
  28. -- AP的ssid和password
  29. wlan.createAP("luatos_" .. wlan.getMac(), "12341234")
  30. log.info("AP", "luatos_" .. wlan.getMac(), "12341234")
  31. sys.wait(500)
  32. wlan.scan()
  33. -- sys.wait(500)
  34. httpsrv.start(80, function(fd, method, uri, headers, body)
  35. log.info("httpsrv", method, uri, json.encode(headers), body)
  36. -- /led是控制灯的API
  37. if uri == "/led/1" then
  38. LEDA(1)
  39. return 200, {}, "ok"
  40. elseif uri == "/led/0" then
  41. LEDA(0)
  42. return 200, {}, "ok"
  43. -- 扫描AP
  44. elseif uri == "/scan/go" then
  45. wlan.scan()
  46. return 200, {}, "ok"
  47. -- 前端获取AP列表
  48. elseif uri == "/scan/list" then
  49. return 200, {["Content-Type"]="applaction/json"}, (json.encode({data=_G.scan_result, ok=true}))
  50. -- 前端填好了ssid和密码, 那就连接吧
  51. elseif uri == "/connect" then
  52. if method == "POST" and body and #body > 2 then
  53. local jdata = json.decode(body)
  54. if jdata and jdata.ssid then
  55. -- 开启一个定时器联网, 否则这个情况可能会联网完成后才执行完
  56. sys.timerStart(wlan.connect, 500, jdata.ssid, jdata.passwd)
  57. return 200, {}, "ok"
  58. end
  59. end
  60. return 400, {}, "ok"
  61. -- 根据ip地址来判断是否已经连接成功
  62. elseif uri == "/connok" then
  63. return 200, {["Content-Type"]="applaction/json"}, json.encode({ip=socket.localIP()})
  64. end
  65. -- 其他情况就是找不到了
  66. return 404, {}, "Not Found" .. uri
  67. end, socket.LWIP_AP)
  68. if netdrv then
  69. local ip = netdrv.ipv4(socket.LWIP_AP)
  70. log.info("web", "pls open url http://" .. (ip or "192.168.4.1") .. "/")
  71. else
  72. log.info("web", "pls open url http://192.168.4.1/")
  73. end
  74. end)
  75. -- wifi扫描成功后, 会有WLAN_SCAN_DONE消息, 读取即可
  76. sys.subscribe("WLAN_SCAN_DONE", function ()
  77. local result = wlan.scanResult()
  78. _G.scan_result = {}
  79. for k,v in pairs(result) do
  80. log.info("scan", (v["ssid"] and #v["ssid"] > 0) and v["ssid"] or "[隐藏SSID]", v["rssi"], (v["bssid"]:toHex()))
  81. if v["ssid"] and #v["ssid"] > 0 then
  82. table.insert(_G.scan_result, v["ssid"])
  83. end
  84. end
  85. log.info("scan", "aplist", json.encode(_G.scan_result))
  86. end)
  87. sys.subscribe("IP_READY", function()
  88. -- 联网成功后, 模拟上报到服务器
  89. log.info("wlan", "已联网", "通知服务器")
  90. sys.taskInit(function()
  91. sys.wait(1000)
  92. -- 以下是rtkv库的模拟实现, 这里就不强制引入rtkv了
  93. local token = mcu.unique_id():toHex()
  94. local device = wlan.getMac()
  95. local params = "device=" .. device .. "&token=" .. token
  96. params = params .. "&key=ip&value=" .. (socket.localIP())
  97. local code = http.request("GET", "http://rtkv.air32.cn/api/rtkv/set?" .. params, {timeout=3000}).wait()
  98. log.info("上报结果", code)
  99. end)
  100. end)
  101. -- wifi的AP相关事件
  102. sys.subscribe("WLAN_AP_INC", function(evt, data)
  103. -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
  104. -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
  105. -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
  106. log.info("收到AP事件", evt, data and data:toHex())
  107. end)
  108. -- 用户代码已结束---------------------------------------------
  109. -- 结尾总是这一句
  110. sys.run()
  111. -- sys.run()之后后面不要加任何语句!!!!!