瀏覽代碼

实现获取蓝牙数据,并通过mqtt发送出去

xuxinyi 1 月之前
父節點
當前提交
3953b69f04
共有 5 個文件被更改,包括 115 次插入13 次删除
  1. 99 0
      blScan/ble_scan_data.lua
  2. 0 0
      global.lua
  3. 4 1
      main.lua
  4. 3 0
      netdrv/netdrv_wifi.lua
  5. 9 12
      timer_app.lua

+ 99 - 0
blScan/ble_scan_data.lua

@@ -0,0 +1,99 @@
+--[[
+@module  ble_ibeacon
+@summary Air8000演示scan功能模块
+@version 1.0
+@date    2025.07.01
+@author  wangshihao
+@usage
+本文件为Air8000核心板演示scan功能的代码示例,核心业务逻辑为:
+观察者模式(scan)的基本流程(概要描述)
+1. 初始化蓝牙框架
+2. 创建BLE对象
+local ble_device = bluetooth_device:ble(ble_event_cb)
+3.设置扫描模式
+ble_device:scan_create() -- 使用默认参数, addr_mode=0, scan_interval=100, scan_window=100
+4. 开始扫描
+ble_device:scan_start()
+5. 在回调函数中处理扫描事件, 如接收设备信息等
+6. 按需停止扫描
+ble_device:scan_stop()
+]]
+
+local bt_scan = false -- 是否扫描蓝牙
+blDataTable = {}
+
+local function ble_callback(ble_device, ble_event, ble_param)
+    if ble_event == ble.EVENT_SCAN_INIT then
+        log.info("ble", "scan init")
+    elseif ble_event == ble.EVENT_SCAN_REPORT then
+        if #blDataTable < 20 then
+            log.info("信息采集中")
+            blDataTable[#blDataTable + 1] = ble_param.adv_addr:toHex()  -- 插入字符串
+        else
+            log.info("信息输出中")
+            local json_data = json.encode(blDataTable)
+            log.info("json", json_data)
+
+            ---- 发布消息通知其他模块
+            --sys.publish("BLE_SCAN_DONE")
+
+        end
+        log.info("ble", "scan report", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
+        -- 解析广播数据, 日志很多, 按需使用
+        -- local adv_data = ble_device:adv_decode(ble_param.data)
+        -- if adv_data then
+        --     for k, v in pairs(adv_data) do
+        --         log.info("ble", "adv data", v.len, v.tp, v.data:toHex())
+        --     end
+        -- end
+        -- if ble_param.data:byte(1) == 0x1A then
+        --     log.info("ble", "ibeacon数据", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
+        -- end
+    elseif ble_event == ble.EVENT_SCAN_STOP then
+        log.info("ble", "scan stop")
+    end
+end
+
+function ble_scan()
+    sys.waitUntil("IP_IS_READY")
+    log.info("开始初始化蓝牙核心")
+    bluetooth_device = bluetooth.init()
+    sys.wait(100)
+    log.info("初始化BLE功能")
+    ble_device = bluetooth_device:ble(ble_callback)
+    if ble_device == nil then
+        log.error("当前固件不支持完整的BLE")
+        return
+    end
+    sys.wait(100)
+    -- 扫描模式
+    sys.wait(1000)
+    ble_device:scan_create(0,1000,100) -- 使用默认参数, addr_mode=0, scan_interval=100, scan_window=100
+    -- ble_device:scan_create(0, 10, 10) -- 使用自定义参数
+    sys.wait(100)
+    log.info("开始扫描")
+    ble_device:scan_start()
+
+    -- sys.wait(15000)
+    -- log.info("停止扫描")
+    -- ble_device:scan_stop()
+
+end
+
+--function insert_task()
+--    local blDataTable = {}
+--    local i  = 0
+--    table.insert(blDataTable, "hello")
+--
+--    table.insert(blDataTable, "world")
+--
+--    while true do
+--        sys.wait(1000)
+--        table.insert(blDataTable, i)
+--        local json = json.encode(blDataTable)
+--        log.info("json", json)
+--        i = i + 1
+--    end
+--end
+
+sys.taskInit(ble_scan)

+ 0 - 0
global.lua


+ 4 - 1
main.lua

@@ -85,12 +85,15 @@ require "network_watchdog"
 require "netdrv_device"
 
 -- 加载串口应用功能模块
-require "uart_app"
+--require "uart_app"
+require "ble_scan_data"
 -- 加载定时器应用功能模块
 require "timer_app"
 
 -- 加载mqtt client 主应用功能模块
 require "mqtt_main"
+-- 加载蓝牙扫描功能模块
+
 
 -- 加载mqtt ssl client 主应用功能模块(mqtt ssl 无证书校验)
 -- require "mqtts_main"

+ 3 - 0
netdrv/netdrv_wifi.lua

@@ -16,12 +16,15 @@
 local function ip_ready_func(ip, adapter)
     if adapter == socket.LWIP_STA then
         log.info("netdrv_wifi.ip_ready_func", "IP_READY", json.encode(wlan.getInfo()))
+        sys.publish("IP_IS_READY")
+
     end
 end
 
 local function ip_lose_func(adapter)
     if adapter == socket.LWIP_STA then
         log.warn("netdrv_wifi.ip_lose_func", "IP_LOSE")
+        sys.publish("IP_IS_READY")
     end
 end
 

+ 9 - 12
timer_app.lua

@@ -42,19 +42,16 @@ end
 
 sys.taskInit(function()
     -- 延迟10秒再开始
-    sys.wait(10000)
-
+    --sys.wait(20000)
+    sys.waitUntil("IP_IS_READY")
     while true do
-        local payload = "你好,世界"
-        sys.publish("SEND_DATA_REQ",
-                    "timer",
-                    mobile.imei().."/timer/up",
-                    payload,
-                    0,
-                    {func=send_data_cbfunc, para="timer"..payload})
-
-        -- 每5秒循环一次
-        sys.wait(5000)
+        if #blDataTable >= 20 then
+            local payload = json.encode(blDataTable)
+            log.info("timer_app", "payload", payload)
+            sys.publish("SEND_DATA_REQ","timer",mobile.imei().."/timer/up",payload,0,nil)
+            blDataTable = {}
+        end
+        sys.wait(1000)
     end
 end)