airble.lua 4.2 KB

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