master.lua 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. --- 模块功能:蓝牙功能测试
  2. -- @author openLuat
  3. -- @module bluetooth.master
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2020.09.27
  7. -- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本
  8. module(..., package.seeall)
  9. local function init()
  10. log.info("bt", "init")
  11. rtos.on(rtos.MSG_BLUETOOTH, function(msg)
  12. if msg.event == btcore.MSG_OPEN_CNF then
  13. log.info("bt", "ble open") --蓝牙打开成功
  14. sys.publish("BT_OPEN", msg.result) --蓝牙打开成功
  15. elseif msg.event == btcore.MSG_CLOSE_CNF then
  16. log.info("bt", "ble close") --蓝牙关闭成功
  17. elseif msg.event == btcore.MSG_BLE_CONNECT_CNF then
  18. sys.publish("BT_CONNECT_IND", {["handle"] = msg.handle, ["result"] = msg.result, ["addr"] = msg.addr}) --蓝牙连接成功
  19. elseif msg.event == btcore.MSG_BLE_DISCONNECT_CNF then
  20. log.info("bt", "ble disconnect") --蓝牙断开连接
  21. elseif msg.event == btcore.MSG_BLE_DATA_IND then
  22. sys.publish("BT_DATA_IND", {["data"] = msg.data, ["uuid"] = msg.uuid, ["len"] = msg.len}) --接收到的数据内容
  23. elseif msg.event == btcore.MSG_BLE_SCAN_CNF then
  24. if(msg.enable == 1) then
  25. sys.publish("BT_SCAN_OPEN_CNF", msg.result) --打开扫描成功
  26. else
  27. sys.publish("BT_SCAN_CLOSE_CNF", msg.result) --关闭扫描成功
  28. end
  29. elseif msg.event == btcore.MSG_BLE_SCAN_IND then
  30. sys.publish("BT_SCAN_IND", {["name"] = msg.name, ["addr_type"] = msg.addr_type, ["addr"] = msg.addr, ["manu_data"] = msg.manu_data,
  31. ["raw_data"] = msg.raw_data, ["raw_len"] = msg.raw_len, ["rssi"] = msg.rssi}) --接收到扫描广播包数据
  32. elseif msg.event == btcore.MSG_BLE_FIND_CHARACTERISTIC_IND then
  33. sys.publish("BT_FIND_CHARACTERISTIC_IND", msg.result) --发现服务包含的特征
  34. elseif msg.event == btcore.MSG_BLE_FIND_SERVICE_IND then
  35. log.info("bt", "find service uuid",msg.uuid) --发现蓝牙包含的16bit uuid
  36. if msg.uuid == 0x1800 then --根据想要的uuid修改
  37. sys.publish("BT_FIND_SERVICE_IND", msg.result)
  38. end
  39. elseif msg.event == btcore.MSG_BLE_FIND_CHARACTERISTIC_UUID_IND then
  40. uuid_c = msg.uuid
  41. log.info("bt", "find characteristic uuid",msg.uuid) --发现到服务内包含的特征uuid
  42. elseif msg.event == btcore.MSG_BLE_READ_VALUE_IND then
  43. log.info("bt", "read characteristic value",msg.data) --读特征value值
  44. end
  45. end)
  46. end
  47. local function poweron()
  48. log.info("bt", "poweron")
  49. btcore.open(1) --打开蓝牙主模式
  50. _, result = sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功
  51. end
  52. local function scan()
  53. log.info("bt", "scan")
  54. --btcore.setscanparam(1,48,6,0,0)--扫描参数设置(扫描类型,扫描间隔,扫描窗口,扫描过滤测量,本地地址类型)
  55. btcore.scan(1) --开启扫描
  56. _, result = sys.waitUntil("BT_SCAN_OPEN_CNF", 50000) --等待扫描打开成功
  57. if result ~= 0 then
  58. return false
  59. end
  60. sys.timerStart(
  61. function()
  62. sys.publish("BT_SCAN_IND", nil)
  63. end,
  64. 10000)
  65. while true do
  66. _, bt_device = sys.waitUntil("BT_SCAN_IND") --等待扫描回复数据
  67. if not bt_device then
  68. -- 超时结束
  69. btcore.scan(0) --停止扫描
  70. return false
  71. else
  72. log.info("bt", "scan result")
  73. log.info("bt.scan_name", bt_device.name) --蓝牙名称
  74. log.info("bt.rssi", bt_device.rssi) --蓝牙信号强度
  75. log.info("bt.addr_type", bt_device.addr_type) --地址种类
  76. log.info("bt.scan_addr", bt_device.addr) --蓝牙地址
  77. if bt_device.manu_data ~= nil then
  78. log.info("bt.manu_data", string.toHex(bt_device.manu_data)) --厂商数据
  79. end
  80. log.info("bt.raw_len", bt_device.raw_len)
  81. if bt_device.raw_data ~= nil then
  82. log.info("bt.raw_data", string.toHex(bt_device.raw_data)) --广播包原始数据
  83. end
  84. --蓝牙连接 根据设备蓝牙广播数据协议解析广播原始数据(bt_device.raw_data)
  85. if (bt_device.name == "Luat_Air724UG") then --连接的蓝牙名称根据要连接的蓝牙设备修改
  86. name = bt_device.name
  87. addr_type = bt_device.addr_type
  88. addr = bt_device.addr
  89. manu_data = bt_device.manu_data
  90. adv_data = bt_device.raw_data -- 广播包数据 根据蓝牙广播包协议解析
  91. end
  92. if addr == bt_device.addr and bt_device.raw_data ~= adv_data then --接收到两包广播数据
  93. scanrsp_data = bt_device.raw_data --响应包数据 根据蓝牙广播包协议解析
  94. btcore.scan(0) --停止扫描
  95. btcore.connect(bt_device.addr,bt_device.addr_type)
  96. log.info("bt.connect_name", name)
  97. log.info("bt.connect_addr_type", addr_type)
  98. log.info("bt.connect_addr", addr)
  99. if manu_data ~= nil then
  100. log.info("bt.connect_manu_data", manu_data)
  101. end
  102. if adv_data ~= nil then
  103. log.info("bt.connect_adv_data", adv_data)
  104. end
  105. if scanrsp_data ~= nil then
  106. log.info("bt.connect_scanrsp_data", scanrsp_data)
  107. end
  108. return true
  109. end
  110. end
  111. end
  112. return true
  113. end
  114. local function data_trans()
  115. _, bt_connect = sys.waitUntil("BT_CONNECT_IND") --等待连接成功
  116. if bt_connect.result ~= 0 then
  117. return false
  118. end
  119. --链接成功
  120. log.info("bt.connect_handle", bt_connect.handle)--蓝牙连接句柄
  121. log.info("bt", "find all service uuid")
  122. btcore.findservice()--发现所有16bit服务uuid
  123. _, result = sys.waitUntil("BT_FIND_SERVICE_IND") --等待发现uuid
  124. if not result then
  125. return false
  126. end
  127. btcore.findcharacteristic(0xfee0)--服务uuid
  128. _, result = sys.waitUntil("BT_FIND_CHARACTERISTIC_IND") --等待发现服务包含的特征成功
  129. if not result then
  130. return false
  131. end
  132. btcore.opennotification(0xfee2); --打开通知 对应特征uuid
  133. --btcore.findcharacteristic("9ecadc240ee5a9e093f3a3b50100406e")--服务uuid
  134. --_, result = sys.waitUntil("BT_FIND_CHARACTERISTIC_IND") --等待发现服务包含的特征成功
  135. --if not result then
  136. -- return false
  137. --end
  138. --btcore.opennotification("9ecadc240ee5a9e093f3a3b50200406e"); --打开通知 对应特征uuid
  139. log.info("bt.send", "Hello I'm Luat BLE")
  140. sys.wait(1000)
  141. while true do
  142. local data = "123456"
  143. btcore.send(data,0xfee1, bt_connect.handle) --发送数据(数据 对应特征uuid 连接句柄)
  144. --btcore.send(bt_recv.data,"9ecadc240ee5a9e093f3a3b50300406e",bt_connect.handle)
  145. _, bt_recv = sys.waitUntil("BT_DATA_IND") --等待接收到数据
  146. local data = ""
  147. local len = 0
  148. local uuid = ""
  149. while true do
  150. local recvuuid, recvdata, recvlen = btcore.recv(3)
  151. if recvlen == 0 then
  152. break
  153. end
  154. uuid = recvuuid
  155. len = len + recvlen
  156. data = data .. recvdata
  157. end
  158. if len ~= 0 then
  159. log.info("bt.recv_data", data)
  160. log.info("bt.recv_data len", len)
  161. log.info("bt.recv_uuid", uuid)
  162. end
  163. end
  164. end
  165. local ble_test = {init, poweron, scan, data_trans}
  166. sys.taskInit(function()
  167. for _, f in ipairs(ble_test) do
  168. f()
  169. end
  170. end)