main.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "ble"
  3. VERSION = "1.0.0"
  4. -- 引入必要的库文件(lua编写), 内部库不需要require
  5. sys = require("sys")
  6. log.info("main", "project name is ", PROJECT, "version is ", VERSION)
  7. -- 通过boot按键方便刷Air8000S
  8. function PWR8000S(val) gpio.set(23, val) end
  9. gpio.debounce(0, 1000)
  10. gpio.setup(0, function()
  11. sys.taskInit(function()
  12. log.info("复位Air8000S")
  13. PWR8000S(0)
  14. sys.wait(20)
  15. PWR8000S(1)
  16. end)
  17. end, gpio.PULLDOWN)
  18. local att_db = { -- Service
  19. string.fromHex("FA00"), -- Service UUID
  20. -- Characteristic
  21. { -- Characteristic 1
  22. string.fromHex("EA01"), -- Characteristic UUID Value
  23. ble.NOTIFY | ble.READ | ble.WRITE -- Properties
  24. }, { -- Characteristic 2
  25. string.fromHex("EA02"), ble.WRITE
  26. }, { -- Characteristic 3
  27. string.fromHex("EA03"), ble.READ
  28. }, { -- Characteristic 4
  29. string.fromHex("EA04"), ble.IND | ble.READ
  30. }
  31. }
  32. ble_stat = false
  33. local function ble_callback(dev, evt, param)
  34. if evt == ble.EVENT_CONN then
  35. log.info("ble", "connect 成功", param, param and param.addr and param.addr:toHex() or "unknow")
  36. ble_stat = true
  37. elseif evt == ble.EVENT_DISCONN then
  38. log.info("ble", "disconnect")
  39. ble_stat = false
  40. -- 1秒后重新开始广播
  41. sys.timerStart(function() dev:adv_start() end, 1000)
  42. elseif evt == ble.EVENT_WRITE then
  43. -- 收到写请求
  44. log.info("ble", "接收到写请求", param.uuid_service:toHex(), param.uuid_characteristic:toHex(), param.data:toHex())
  45. end
  46. end
  47. local bt_scan = false -- 是否扫描蓝牙
  48. sys.taskInit(function()
  49. local ret = 0
  50. sys.wait(500)
  51. log.info("开始初始化蓝牙核心")
  52. bluetooth_device = bluetooth.init()
  53. sys.wait(100)
  54. log.info("初始化BLE功能")
  55. ble_device = bluetooth_device:ble(ble_callback)
  56. if ble_device == nil then
  57. log.error("当前固件不支持完整的BLE")
  58. return
  59. end
  60. sys.wait(100)
  61. log.info('开始创建GATT')
  62. ret = ble_device:gatt_create(att_db)
  63. log.info("创建的GATT", ret)
  64. sys.wait(100)
  65. log.info("开始设置广播内容")
  66. ble_device:adv_create({
  67. addr_mode = ble.PUBLIC,
  68. channel_map = ble.CHNLS_ALL,
  69. intv_min = 120,
  70. intv_max = 120,
  71. adv_data = {
  72. {ble.FLAGS, string.char(0x06)},
  73. {ble.COMPLETE_LOCAL_NAME, "LuatOS123"},
  74. {ble.SERVICE_DATA, string.fromHex("FE01")},
  75. {ble.MANUFACTURER_SPECIFIC_DATA, string.fromHex("05F0")}
  76. }
  77. })
  78. sys.wait(100)
  79. log.info("开始广播")
  80. ble_device:adv_start()
  81. -- 放入预设值, 注意是有READ属性的特性才能读取
  82. -- 手机APP设置MTU到256
  83. local wt = {
  84. uuid_service = string.fromHex("FA00"),
  85. uuid_characteristic = string.fromHex("EA01"),
  86. }
  87. ble_device:write_value(wt, "12345678901234567890")
  88. while 1 do
  89. sys.wait(3000)
  90. if ble_stat then
  91. local wt = {
  92. uuid_service = string.fromHex("FA00"),
  93. uuid_characteristic = string.fromHex("EA01"),
  94. }
  95. local result = ble_device:write_notify(wt, "123456" .. os.date())
  96. log.info("ble", "发送数据", result)
  97. else
  98. -- log.info("等待连接成功之后发送数据")
  99. end
  100. local wt = {
  101. uuid_service = string.fromHex("FA00"),
  102. uuid_characteristic = string.fromHex("EA03"),
  103. }
  104. ble_device:write_value(wt, "8888 123454")
  105. end
  106. end)
  107. -- 用户代码已结束---------------------------------------------
  108. -- 结尾总是这一句
  109. sys.run()
  110. -- sys.run()之后后面不要加任何语句!!!!!