main.lua 4.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "ble_scan"
  3. VERSION = "1.0.0"
  4. --[[
  5. Air8000的BLE支持4种模式,分别是主机模式(central),从机模式(peripheral),广播者模式(ibeacon),以及观察者模式(scan)。
  6. 1.主机模式(central):
  7. 主机模式是能够搜索别人并主动建立连接的一方,从扫描状态转化而来的。其可以和一个或多个从设备进行连接通信,它会定期的扫描周围的广播状态设备发送的广播信息,可以对周围设备进行搜索并选择所需要连接的从设备进行配对连接,建立通信链路成功后,主从双方就可以发送接收数据。
  8. 2.从机模式(peripheral):
  9. 从机模式是从广播者模式转化而来的,未被连接的从机首先进入广播状态,等待被主机搜索,当主机扫描到从设备建立连接后,就可以和主机设备进行数据的收发,其不能主动的建立连接,只能等别人来连接自己。和广播模式有区别的地方在于,从机模式的设备是可以被连接的,定期的和主机进行连接和数据传输,在数据传输过程中作从机。
  10. 3.广播者模式(ibeacon)
  11. 处于广播模式的设备,会周期性的广播beacon信息, 但不会被扫描到, 也不会连接其他设备。
  12. 4.观察者模式(scan)
  13. 观察者模式,该模式下模块为非连接,相对广播者模式的一对多发送广播,观察者可以一对多接收数据。在该模式中,设备可以仅监听和读取空中的广播数据。和主机唯一的区别是不能发起连接,只能持续扫描从机。
  14. 蓝牙中的重要概念
  15. 1. GATT(通用属性配置文件)
  16. - 定义 BLE 设备如何组织和传输数据,以 “服务(Service)” 和 “特征(Characteristic)” 为单位。
  17. - 示例:心率监测设备的 GATT 服务包含 “心率特征”,手机通过读取该特征获取心率数据。
  18. 2. 服务和特征
  19. - 服务是特征的容器,通过逻辑分组简化复杂功能的管理;
  20. - 特征是数据交互的最小单元,通过属性定义实现灵活的读写与推送机制;
  21. - 两者结合构成 GATT 协议的核心框架,支撑蓝牙设备间的标准化数据交互(如智能穿戴、医疗设备、物联网传感器)。
  22. 3. 特征的关键属性(Properties)
  23. 特征通过 “属性” 定义数据的操作方式,常见属性包括:
  24. 1. 可读(Read):允许客户端读取特征值(如读取电池电量)。
  25. 2. 可写(Write):允许客户端写入特征值(如设置设备参数)。
  26. 3. 通知(Notification):服务端主动发送特征值更新(如心率变化时推送给手机)。
  27. 4. 指示(Indication):比通知更可靠的推送(需客户端确认接收)。
  28. 4. UUID
  29. UUID 是蓝牙 GATT 协议的 “数字身份证”,通过标准化的唯一标识机制,实现了跨厂商设备的功能互认(标准 UUID)与厂商个性化功能的扩展(自定义 UUID)
  30. Air8000 的所有操作,都通过UUID来索引和管理
  31. ]]
  32. log.info("main", "project name is ", PROJECT, "version is ", VERSION)
  33. -- 通过boot按键方便刷Air8000S
  34. function PWR8000S(val)
  35. gpio.set(23, val)
  36. end
  37. gpio.debounce(0, 1000)
  38. gpio.setup(0, function()
  39. sys.taskInit(function()
  40. log.info("复位Air8000S")
  41. PWR8000S(0)
  42. sys.wait(20)
  43. PWR8000S(1)
  44. end)
  45. end, gpio.PULLDOWN)
  46. local function ble_callback(ble_device, ble_event, ble_param)
  47. if ble_event == ble.EVENT_SCAN_INIT then
  48. log.info("ble", "scan init")
  49. elseif ble_event == ble.EVENT_SCAN_REPORT then
  50. log.info("ble", "scan report", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
  51. elseif ble_event == ble.EVENT_SCAN_STOP then
  52. log.info("ble", "scan stop")
  53. end
  54. end
  55. local bt_scan = false -- 是否扫描蓝牙
  56. sys.taskInit(function()
  57. sys.wait(500)
  58. log.info("开始初始化蓝牙核心")
  59. bluetooth_device = bluetooth.init()
  60. sys.wait(100)
  61. log.info("初始化BLE功能")
  62. ble_device = bluetooth_device:ble(ble_callback)
  63. if ble_device == nil then
  64. log.error("当前固件不支持完整的BLE")
  65. return
  66. end
  67. sys.wait(100)
  68. -- 扫描模式
  69. sys.wait(1000)
  70. ble_device:scan_create() -- 使用默认参数, addr_mode=0, scan_interval=100, scan_window=100
  71. -- ble_device:scan_create(0, 10, 10) -- 使用自定义参数
  72. sys.wait(100)
  73. log.info("开始扫描")
  74. ble_device:scan_start()
  75. sys.wait(15000)
  76. log.info("停止扫描")
  77. ble_device:scan_stop()
  78. end)
  79. -- 用户代码已结束---------------------------------------------
  80. -- 结尾总是这一句
  81. sys.run()
  82. -- sys.run()之后后面不要加任何语句!!!!!