main.lua 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "wifidemo"
  3. VERSION = "1.0.0"
  4. --[[
  5. 本demo需要 V100x系列固件, 不兼容V000x系列
  6. https://gitee.com/openLuat/LuatOS/releases
  7. ]]
  8. -- 引入必要的库文件(lua编写), 内部库不需要require
  9. sys = require("sys")
  10. require("sysplus")
  11. if wdt then
  12. --添加硬狗防止程序卡死,在支持的设备上启用这个功能
  13. wdt.init(9000)--初始化watchdog设置为9s
  14. sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
  15. end
  16. sys.subscribe("IP_READY", function(ip)
  17. log.info("wlan", "ip ready", ip)
  18. -- 联网成功, 可以发起http, mqtt, 等请求了
  19. end)
  20. fdb.kvdb_init()
  21. -- 把BOOT键, 即GPIO9, 作为清除配网信息的按钮
  22. BTN_BOOT = 9
  23. gpio.debounce(BTN_BOOT, 1000)
  24. gpio.setup(BTN_BOOT, function()
  25. log.info("gpio", "boot button pressed")
  26. sys.publish("BTN_BOOT")
  27. end)
  28. sys.subscribe("SC_RESULT", function(ssid, password)
  29. log.info("why", ssid, password)
  30. end)
  31. sys.taskInit(function()
  32. sys.wait(500) -- 这里等500ms只是方便看日志,非必须
  33. wlan.init() -- 初始化wifi协议栈
  34. -- 获取上次保存的配网信息, 如果存在就直接联网, 不需要配网了
  35. -- 注意, fdb保存的数据是掉电存储的, 刷脚本/刷固件也不会清除
  36. -- 如需完全清除配置信息, 可调用 fdb.clear() 全清
  37. if fdb.kv_get("wlan_ssid") then
  38. wlan.connect(fdb.kv_get("wlan_ssid"), fdb.kv_get("wlan_passwd"))
  39. return -- 等联网就行了
  40. end
  41. -- 以下是smartconfig之 esptouch 配网
  42. -- 配网APP请搜索 esptouch , 当前最新版2.3.0
  43. -- 配网时选用 esptouch, 虽然esptouch V2也是支持的,但 esptouch兼容性比较好
  44. -- ESP32C3仅支持2.4G的wifi, 5G wifi是不支持的
  45. -- 配网时, 手机应靠近模块, 以便更快配网成功
  46. while 1 do
  47. -- 启动配网, 默认是esptouch模式,这里改成AIRKISS
  48. log.info("wlan", "启动airkiss")
  49. wlan.smartconfig(wlan.AIRKISS)
  50. local ret, ssid, passwd = sys.waitUntil("SC_RESULT", 180*1000) -- 等3分钟
  51. if ret == false then
  52. log.info("smartconfig", "timeout")
  53. wlan.smartconfig(wlan.STOP)
  54. sys.wait(3000) -- 再等3s重新配网, 或者直接reboot也行
  55. else
  56. -- 获取配网后, ssid和passwd会有值
  57. log.info("smartconfig", ssid, passwd)
  58. -- 获取IP成功, 将配网信息存入fdb, 做持久化存储
  59. log.info("fdb", "save ssid and passwd")
  60. -- fdb.kv_set("wlan_ssid", ssid)
  61. -- fdb.kv_set("wlan_passwd", passwd)
  62. -- 这里建议重启, 当然这也不是强制的
  63. -- log.info("wifi", "wait 3s to reboot")
  64. -- sys.wait(3000)
  65. -- 重启后有配网信息, 所以就自动连接
  66. --rtos.reboot()
  67. break
  68. end
  69. end
  70. end)
  71. -- 下面的task是演示通过按键清除配网信息
  72. -- 实现的效果是: 开机500ms后, 长按BOOT按钮3秒以上, 清除配网信息, 然后重启或者快速闪灯.
  73. sys.taskInit(function()
  74. -- 开机后, 先等500ms
  75. sys.wait(500)
  76. -- 然后开始监听BTN按钮
  77. while true do
  78. local flag = true
  79. while true do
  80. -- 等待boot按钮按下
  81. local ret = sys.waitUntil("BTN_BOOT", 3000)
  82. --log.info("gpio", "BTN_BOOT", "wait", ret)
  83. if ret then
  84. break
  85. end
  86. end
  87. log.info("wifi", "Got BOOT button pressed")
  88. for i=1, 30 do
  89. -- 要求持续3s的低电平, 若中途松开了,就无效咯
  90. if gpio.get(BTN_BOOT) ~= 0 then
  91. log.info("wifi", "BOOT button released, wait next press")
  92. flag = false
  93. break
  94. end
  95. sys.wait(100)
  96. end
  97. if flag then
  98. -- 用户的确要请求配网信息, 那就清除吧
  99. log.info("gpio", "boot pressed 3s, remove ssid/passwd")
  100. fdb.kv_del("wlan_ssid")
  101. fdb.kv_del("wlan_passwd")
  102. -- fdb.clear() -- 这里还有一个方案是清除fdb里的全部数据,从业务上说相当于恢复出厂配置
  103. log.info("gpio", "removed, wait for reboot")
  104. -- 方案1, 直接重启, 重启后因为没有配网数据了, 就自动开始配网
  105. -- rtos.reboot()
  106. -- 方案2, 100ms闪灯, 让用户自行复位重启
  107. gpio.setup(12, 0)
  108. while 1 do
  109. gpio.toggle(12)
  110. sys.wait(100)
  111. end
  112. end
  113. end
  114. end)
  115. -- 用户代码已结束---------------------------------------------
  116. -- 结尾总是这一句
  117. sys.run()
  118. -- sys.run()之后后面不要加任何语句!!!!!