ble_scan_data.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. --[[
  2. @module ble_ibeacon
  3. @summary Air8000演示scan功能模块
  4. @version 1.0
  5. @date 2025.07.01
  6. @author wangshihao
  7. @usage
  8. 本文件为Air8000核心板演示scan功能的代码示例,核心业务逻辑为:
  9. 观察者模式(scan)的基本流程(概要描述)
  10. 1. 初始化蓝牙框架
  11. 2. 创建BLE对象
  12. local ble_device = bluetooth_device:ble(ble_event_cb)
  13. 3.设置扫描模式
  14. ble_device:scan_create() -- 使用默认参数, addr_mode=0, scan_interval=100, scan_window=100
  15. 4. 开始扫描
  16. ble_device:scan_start()
  17. 5. 在回调函数中处理扫描事件, 如接收设备信息等
  18. 6. 按需停止扫描
  19. ble_device:scan_stop()
  20. ]]
  21. local bt_scan = false -- 是否扫描蓝牙
  22. blDataTable = {}
  23. local function ble_callback(ble_device, ble_event, ble_param)
  24. if ble_event == ble.EVENT_SCAN_INIT then
  25. log.info("ble", "scan init")
  26. elseif ble_event == ble.EVENT_SCAN_REPORT then
  27. if #blDataTable < 40 then
  28. --log.info("信息采集中")
  29. --blDataTable[#blDataTable + 1] = ble_param.adv_addr:toHex() .. os.time() -- 插入字符串
  30. -- 获取当前年月日时分秒,格式如 "2025-10-14 19:55:30"
  31. -- 获取当前时间
  32. local time_str = os.date("%Y-%m-%d %H:%M:%S")
  33. -- 读取VBAT供电电压, 单位为mV
  34. adc.open(adc.CH_VBAT)
  35. local vbat = adc.get(adc.CH_VBAT)
  36. adc.close(adc.CH_VBAT)
  37. -- adc.CH_VBAT,VBAT供电电压的通道id,内部通道,直接获取,不占用ADC 0-3,不外接任何电路
  38. -- 拼接 BLE 地址和时间
  39. local entry = ble_param.adv_addr:toHex() .. " " .. " vbat:" .. vbat
  40. -- 插入到 blDataTable
  41. blDataTable[#blDataTable + 1] = entry
  42. else
  43. --log.info("信息输出中")
  44. --local json_data = json.encode(blDataTable)
  45. --log.info("json", json_data)
  46. ble_device:scan_stop()
  47. end
  48. --log.info("ble", "scan report", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
  49. -- 解析广播数据, 日志很多, 按需使用
  50. -- local adv_data = ble_device:adv_decode(ble_param.data)
  51. -- if adv_data then
  52. -- for k, v in pairs(adv_data) do
  53. -- log.info("ble", "adv data", v.len, v.tp, v.data:toHex())
  54. -- end
  55. -- end
  56. -- if ble_param.data:byte(1) == 0x1A then
  57. -- log.info("ble", "ibeacon数据", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
  58. -- end
  59. elseif ble_event == ble.EVENT_SCAN_STOP then
  60. log.info("ble", "scan stop")
  61. end
  62. end
  63. function ble_scan()
  64. sys.waitUntil("IP_IS_READY")
  65. log.info("开始初始化蓝牙核心")
  66. bluetooth_device = bluetooth.init()
  67. sys.wait(100)
  68. log.info("初始化BLE功能")
  69. ble_device = bluetooth_device:ble(ble_callback)
  70. if ble_device == nil then
  71. log.error("当前固件不支持完整的BLE")
  72. return
  73. end
  74. sys.wait(100)
  75. -- 扫描模式
  76. sys.wait(1000)
  77. ble_device:scan_create(0,100,100) -- 使用默认参数, addr_mode=0, scan_interval=100, scan_window=100
  78. -- ble_device:scan_create(0, 10, 10) -- 使用自定义参数
  79. sys.wait(100)
  80. log.info("开始扫描")
  81. ble_device:scan_start()
  82. -- sys.wait(15000)
  83. -- log.info("停止扫描")
  84. -- ble_device:scan_stop()
  85. end
  86. --function insert_task()
  87. -- local blDataTable = {}
  88. -- local i = 0
  89. -- table.insert(blDataTable, "hello")
  90. --
  91. -- table.insert(blDataTable, "world")
  92. --
  93. -- while true do
  94. -- sys.wait(1000)
  95. -- table.insert(blDataTable, i)
  96. -- local json = json.encode(blDataTable)
  97. -- log.info("json", json)
  98. -- i = i + 1
  99. -- end
  100. --end
  101. sys.taskInit(ble_scan)