airlbs_app.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. --[[
  2. @module airlbs_app.lua
  3. @summary Airlbs应用
  4. @version 1.0
  5. @date 2025.08.13
  6. @author 王城钧
  7. @usage
  8. 本文件为airlbs“多基站”、“多基站+多wifi”两种应用场景的定位功能演示,核心业务逻辑为:
  9. 1. 等待网络就绪
  10. 2. 发起NTP授时
  11. 3. 循环定位请求
  12. 本文件没有对外接口,直接在main.lua中require "airlbs_app"就可以加载运行;
  13. ]]
  14. local airlbs = require "airlbs"
  15. local timeout = 10 -- 扫描基站/wifi 做 基站/wifi定位 的超时时间,最小5S,最大60S
  16. -- 此服务为收费服务,需自行联系销售申请或者在 https://iot.openluat.com/finance/order 购买
  17. -- 以下为合宙LBS平台开通的项目id和秘钥
  18. -- 以下项目密钥和id请根据实际项目进行修改,https://iot.openluat.com/lbs/bs 在此网址中我的项目下
  19. local airlbs_project_id = "此处换成自己的项目id"
  20. local airlbs_project_key = "此处换成自己的项目key"
  21. --多基站定位
  22. local function airlbs_multi_cells_task_func()
  23. while not socket.adapter(socket.dft()) do
  24. log.warn("lbsloc2_task_func", "wait IP_READY", socket.dft())
  25. -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
  26. -- 或者等待1秒超时退出阻塞等待状态;
  27. -- 注意:此处的1000毫秒超时不要修改的更长;
  28. -- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
  29. -- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
  30. -- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
  31. sys.waitUntil("IP_READY", 1000)
  32. end
  33. -- 检测到了IP_READY消息
  34. log.info("airlbs_multi_cells_func", "recv IP_READY", socket.dft())
  35. socket.sntp() -- 进行NTP授时
  36. sys.waitUntil("NTP_UPDATE", 1000)
  37. while 1 do
  38. if airlbs_project_id and airlbs_project_key then
  39. local result, data = airlbs.request({
  40. project_id = airlbs_project_id,-- 项目ID
  41. project_key = airlbs_project_key,-- 项目密钥
  42. timeout = timeout * 1000, -- 实际的超时时间(单位:ms)
  43. })
  44. if result then
  45. log.info("airlbs多基站定位返回的经纬度数据为", json.encode(data))
  46. end
  47. else
  48. log.warn("请检查project_id和project_key")
  49. end
  50. sys.wait(20000) -- 循环20S一次多基站定位
  51. end
  52. end
  53. --多基站+多wifi定位
  54. local function airlbs_multi_cells_wifi_task_func()
  55. while not socket.adapter(socket.dft()) do
  56. log.warn("airlbs_multi_cells_wifi_func", "wait IP_READY", socket.dft())
  57. -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
  58. -- 或者等待1秒超时退出阻塞等待状态;
  59. -- 注意:此处的1000毫秒超时不要修改的更长;
  60. -- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
  61. -- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
  62. -- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
  63. sys.waitUntil("IP_READY", 1000)
  64. end
  65. -- 检测到了IP_READY消息
  66. log.info("airlbs_multi_cells_wifi_func", "recv IP_READY", socket.dft())
  67. socket.sntp() --进行NTP授时
  68. sys.waitUntil("NTP_UPDATE", 1000)
  69. -- 如需wifi定位,需要硬件以及固件支持wifi扫描功能
  70. local wifi_info = nil
  71. if wlan then
  72. wlan.init()--初始化wlan
  73. wlan.scan()--扫描wifi
  74. sys.waitUntil("WLAN_SCAN_DONE", timeout * 1000)--等待扫描完成
  75. wifi_info = wlan.scanResult()--获取扫描结果
  76. log.info("scan", "wifi_info", #wifi_info)--打印扫描结果
  77. end
  78. while 1 do
  79. local result, data = airlbs.request({
  80. project_id = airlbs_project_id,-- 项目ID
  81. project_key = airlbs_project_key,-- 项目密钥
  82. wifi_info = wifi_info,-- wifi信息
  83. timeout = timeout * 1000,-- 实际的超时时间(单位:ms)
  84. })
  85. if result then
  86. local data_str = json.encode(data)
  87. log.info("airlbs多基站+多wifi定位返回的经纬度数据为", data_str)-- 解析经纬度
  88. local lat = data_str:match("\"lat\":([0-9.-]+)")-- 匹配lat
  89. log.info("airlbs", "lat", lat)-- 打印lat
  90. local lng = data_str:match("\"lng\":([0-9.-]+)")-- 匹配lng
  91. log.info("airlbs", "lng", lng)-- 打印lng
  92. else
  93. log.warn("请检查project_id和project_key")-- 打印提示信息
  94. end
  95. sys.wait(20000) -- 循环20S一次基站+wifi定位
  96. end
  97. end
  98. --多基站定位
  99. sys.taskInit(airlbs_multi_cells_task_func)
  100. --多基站+多wifi定位
  101. sys.taskInit(airlbs_multi_cells_wifi_task_func)