airble.lua 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. local airble = {}
  2. dnsproxy = require("dnsproxy")
  3. dhcpsrv = require("dhcpsrv")
  4. httpplus = require("httpplus")
  5. local run_state = false -- 判断本UI DEMO 是否运行
  6. local ble_state = "未初始"
  7. local Characteristic1 = "EA01"
  8. local Characteristic1_read = nil
  9. local Characteristic1_write = nil
  10. local Characteristic2 = "EA02"
  11. local Characteristic2_write = nil
  12. local Characteristic3 = "EA03"
  13. local Characteristic3_read = nil
  14. local Characteristic4 = "EA04"
  15. local Characteristic4_read = nil
  16. local Characteristic4ind = nil
  17. local att_db = nil
  18. ble_stat = false
  19. local function set_att_db()
  20. att_db = { -- Service
  21. string.fromHex("FA00"), -- Service UUID
  22. -- Characteristic
  23. { -- Characteristic 1
  24. string.fromHex(Characteristic1), -- Characteristic UUID Value
  25. ble.NOTIFY | ble.READ | ble.WRITE -- Properties
  26. }, { -- Characteristic 2
  27. string.fromHex(Characteristic2), ble.WRITE
  28. }, { -- Characteristic 3
  29. string.fromHex(Characteristic3), ble.READ
  30. }, { -- Characteristic 4
  31. string.fromHex(Characteristic4), ble.IND | ble.READ
  32. }
  33. }
  34. end
  35. local function ble_callback(dev, evt, param)
  36. if evt == ble.EVENT_CONN then
  37. log.info("ble", "connect 成功", param, param and param.addr and param.addr:toHex() or "unknow")
  38. ble_stat = true
  39. elseif evt == ble.EVENT_DISCONN then
  40. log.info("ble", "disconnect")
  41. ble_stat = false
  42. -- 1秒后重新开始广播
  43. sys.timerStart(function() dev:adv_start() end, 1000)
  44. elseif evt == ble.EVENT_WRITE then
  45. -- 收到写请求
  46. log.info("ble", "接收到写请求", param.uuid_service:toHex(), param.data:toHex())
  47. if param.uuid_service == Characteristic1 then
  48. Characteristic1_write = param.data:toHex()
  49. elseif param.uuid_service == Characteristic2 then
  50. Characteristic2_write = param.data:toHex()
  51. end
  52. end
  53. end
  54. local function ble_peripheral_setup()
  55. local ret = 0
  56. set_att_db()
  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. log.info('开始创建GATT')
  69. ret = ble_device:gatt_create(att_db)
  70. log.info("创建的GATT", ret)
  71. sys.wait(100)
  72. log.info("开始设置广播内容")
  73. ble_device:adv_create({
  74. addr_mode = ble.PUBLIC,
  75. channel_map = ble.CHNLS_ALL,
  76. intv_min = 120,
  77. intv_max = 120,
  78. adv_data = {
  79. {ble.FLAGS, string.char(0x06)},
  80. {ble.COMPLETE_LOCAL_NAME, "LuatOS123"},
  81. {ble.SERVICE_DATA, string.fromHex("FE01")},
  82. {ble.MANUFACTURER_SPECIFIC_DATA, string.fromHex("05F0")}
  83. }
  84. })
  85. sys.wait(100)
  86. log.info("开始广播")
  87. ble_device:adv_start()
  88. end
  89. local function start_notify()
  90. end
  91. function airble.run()
  92. log.info("airble.run")
  93. lcd.setFont(lcd.font_opposansm12_chinese) -- 设置中文字体
  94. run_state = true
  95. sysplus.taskInitEx(ble_peripheral_setup,"airble")
  96. while true do
  97. sys.wait(10)
  98. lcd.clear(_G.bkcolor)
  99. lcd.drawStr(0,80,"当前蓝牙状态:" .. ble_state )
  100. lcd.drawStr(0,100,"特征:" .. Characteristic1 .. ",可读数据为:" .. Characteristic1_read.. "被写入数据为:" .. Characteristic1_write)
  101. lcd.drawStr(0,120,"特征:" .. Characteristic2 .. "被写入数据为:" .. Characteristic2_write)
  102. lcd.drawStr(0,140,"特征:" .. Characteristic3 .. ",可读数据为:" .. Characteristic3_read)
  103. lcd.drawStr(0,160,"特征:" .. Characteristic4 .. "可读数据为:" .. Characteristic4_read)
  104. lcd.showImage(130,350,"/luadb/start.jpg") -- EA01 发送数据
  105. lcd.flush()
  106. if not run_state then -- 等待结束,返回主界面
  107. return true
  108. end
  109. end
  110. end
  111. function airble.tp_handal(x,y,event)
  112. if x > 20 and x < 100 and y > 360 and y < 440 then
  113. run_state = false
  114. elseif x > 130 and x < 230 and y > 397 and y < 444 then
  115. sysplus.taskInitEx(start_notify, "start_notify")
  116. end
  117. end
  118. return airble