airkiss_task.lua 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. --[[
  2. @module airkiss_task
  3. @summary airkiss 配网功能模块
  4. @version 1.0
  5. @date 2025.12.8
  6. @author 拓毅恒
  7. @usage
  8. 用法实例
  9. 启动 AirKiss 配网功能
  10. - 运行 airkiss_task 任务,先检查是否有已保存的配网信息
  11. - 如有保存的信息则直接连接,否则启动airkiss配网
  12. - 配网成功后将信息保存到fskv并重启设备
  13. 注:本demo无需额外配置,直接在 main.lua 中 require "airkiss_task" 即可加载运行。
  14. ]]
  15. -- 订阅IP_READY事件,获取IP成功后触发
  16. local function get_ip_ready(ip)
  17. log.info("wlan", "ip ready", ip)
  18. -- 联网成功, 可以发起http, mqtt, 等请求了
  19. end
  20. sys.subscribe("IP_READY", get_ip_ready)
  21. -- 订阅SC_RESULT事件,配网成功后触发
  22. local function on_airkiss_success(ssid, password)
  23. log.info("airkiss", "配网成功", ssid, password)
  24. end
  25. sys.subscribe("SC_RESULT", on_airkiss_success)
  26. local function start_airkiss()
  27. -- 初始化fskv, 用于存储配网信息
  28. fskv.init()
  29. -- 初始化wifi协议栈
  30. wlan.init()
  31. -- 获取上次保存的配网信息, 如果存在就直接联网, 不需要配网了
  32. -- 注意, fskv保存的数据是掉电存储的, 刷脚本/刷固件也不会清除
  33. -- 如需完全清除配置信息, 可调用 fskv.clear() 全清
  34. if fskv.get("wlan_ssid") then
  35. wlan.connect(fskv.get("wlan_ssid"), fskv.get("wlan_passwd"))
  36. return
  37. end
  38. -- 配网时选用 AirKiss 模式
  39. -- 仅支持2.4G的wifi, 5G wifi是不支持的
  40. -- 配网时, 手机应靠近模块, 以便更快配网成功
  41. while true do
  42. log.info("wlan", "启动airkiss")
  43. wlan.smartconfig(wlan.AIRKISS)
  44. local ret, ssid, passwd = sys.waitUntil("SC_RESULT", 180*1000) -- 等3分钟
  45. if ret == false then
  46. log.info("smartconfig", "timeout")
  47. wlan.smartconfig(wlan.STOP)
  48. sys.wait(3000)
  49. else
  50. -- 获取配网后, ssid和passwd会有值
  51. log.info("smartconfig", ssid, passwd)
  52. -- 获取IP成功, 将配网信息存入fskv, 掉电也能保存
  53. log.info("fskv", "save ssid and passwd")
  54. fskv.set("wlan_ssid", ssid)
  55. fskv.set("wlan_passwd", passwd)
  56. -- 重启后将使用配网信息自动连接
  57. log.info("wifi", "wait 3s to reboot")
  58. sys.wait(3000)
  59. rtos.reboot()
  60. break
  61. end
  62. end
  63. end
  64. sys.taskInit(start_airkiss)