ble_peripheral.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. --[[
  2. @module ble_ibeacon
  3. @summary Air8000演示ibeacon功能模块
  4. @version 1.0
  5. @date 2025.07.01
  6. @author wangshihao
  7. @usage
  8. 本文件为Air8000核心板演示peripheral功能的代码示例,核心业务逻辑为:
  9. 从机模式(peripheral)的基本流程(概要描述)
  10. 1. 初始化蓝牙框架
  11. 2. 创建BLE对象
  12. local ble_device = bluetooth_device:ble(ble_event_cb)
  13. 3. 创建GATT描述
  14. local att_db = {xxx}
  15. 4. 创建广播信息
  16. ble_device:adv_create(adv_data)
  17. 5. 开始广播
  18. ble_device:adv_start()
  19. 6. 等待连接
  20. 7. 在回调函数中处理连接事件, 如接收数据, 发送数据等
  21. ]]
  22. local att_db = { -- Service
  23. string.fromHex("FA00"), -- Service UUID
  24. -- Characteristic
  25. { -- Characteristic 1
  26. string.fromHex("EA01"), -- Characteristic UUID Value
  27. ble.NOTIFY | ble.READ | ble.WRITE -- Properties
  28. }, { -- Characteristic 2
  29. string.fromHex("EA02"), ble.WRITE
  30. }, { -- Characteristic 3
  31. string.fromHex("EA03"), ble.READ
  32. }, { -- Characteristic 4
  33. string.fromHex("EA04"), ble.IND | ble.READ
  34. }
  35. }
  36. ble_stat = false
  37. local function ble_callback(dev, evt, param)
  38. if evt == ble.EVENT_CONN then
  39. log.info("ble", "connect 成功", param, param and param.addr and param.addr:toHex() or "unknow")
  40. ble_stat = true
  41. elseif evt == ble.EVENT_DISCONN then
  42. log.info("ble", "disconnect")
  43. ble_stat = false
  44. -- 1秒后重新开始广播
  45. sys.timerStart(function() dev:adv_start() end, 1000)
  46. elseif evt == ble.EVENT_WRITE then
  47. -- 收到写请求
  48. log.info("ble", "接收到写请求", param.uuid_service:toHex(), param.uuid_characteristic:toHex(), param.data:toHex())
  49. end
  50. end
  51. local bt_scan = false -- 是否扫描蓝牙
  52. function ble_peripheral()
  53. local ret = 0
  54. sys.wait(500)
  55. log.info("开始初始化蓝牙核心")
  56. bluetooth_device = bluetooth.init()
  57. sys.wait(100)
  58. log.info("初始化BLE功能")
  59. ble_device = bluetooth_device:ble(ble_callback)
  60. if ble_device == nil then
  61. log.error("当前固件不支持完整的BLE")
  62. return
  63. end
  64. sys.wait(100)
  65. log.info('开始创建GATT')
  66. ret = ble_device:gatt_create(att_db)
  67. log.info("创建的GATT", ret)
  68. sys.wait(100)
  69. log.info("开始设置广播内容")
  70. ble_device:adv_create({
  71. addr_mode = ble.PUBLIC,
  72. channel_map = ble.CHNLS_ALL,
  73. intv_min = 120,
  74. intv_max = 120,
  75. adv_data = {
  76. {ble.FLAGS, string.char(0x06)},
  77. {ble.COMPLETE_LOCAL_NAME, "LuatOS123"},
  78. {ble.SERVICE_DATA, string.fromHex("FE01")},
  79. {ble.MANUFACTURER_SPECIFIC_DATA, string.fromHex("05F0")}
  80. }
  81. })
  82. sys.wait(100)
  83. log.info("开始广播")
  84. ble_device:adv_start()
  85. -- 放入预设值, 注意是有READ属性的特性才能读取
  86. -- 手机APP设置MTU到256
  87. local wt = {
  88. uuid_service = string.fromHex("FA00"),
  89. uuid_characteristic = string.fromHex("EA01"),
  90. }
  91. ble_device:write_value(wt, "12345678901234567890")
  92. while 1 do
  93. sys.wait(3000)
  94. if ble_stat then
  95. local wt = {
  96. uuid_service = string.fromHex("FA00"),
  97. uuid_characteristic = string.fromHex("EA01"),
  98. }
  99. local result = ble_device:write_notify(wt, "123456" .. os.date())
  100. log.info("ble", "发送数据", result)
  101. else
  102. -- log.info("等待连接成功之后发送数据")
  103. end
  104. local wt = {
  105. uuid_service = string.fromHex("FA00"),
  106. uuid_characteristic = string.fromHex("EA03"),
  107. }
  108. ble_device:write_value(wt, "8888 123454")
  109. end
  110. end
  111. sys.taskInit(ble_peripheral)