main.lua 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "ble2uart"
  3. VERSION = "1.0.0"
  4. log.info("main", "project name is ", PROJECT, "version is ", VERSION)
  5. local QUEUE_MAX_LEN = 10
  6. local txQueue = {}
  7. local rxQueue = {}
  8. local txTaskName = "TX_TRANS_TASK"
  9. local rxTaskName = "RX_TRANS_TASK"
  10. local MAX_MTU = 240 -- TODO, 根据实际MTU大小变化
  11. local uartId = 1
  12. local uartBaudrate = 115200
  13. local ble_isconnected = false
  14. local scan_count = 0
  15. local function ble_callback(ble_device, ble_event, ble_param)
  16. if ble_event == ble.EVENT_CONN then
  17. log.info("ble", "connect 成功")
  18. elseif ble_event == ble.EVENT_DISCONN then
  19. log.info("ble", "disconnect", ble_param.reason)
  20. ble_isconnected = false
  21. sys.timerStart(function() ble_device:scan_start() end, 1000)
  22. elseif ble_event == ble.EVENT_WRITE then
  23. log.info("ble", "write", ble_param.handle,ble_param.uuid_service:toHex(),ble_param.uuid_characteristic:toHex())
  24. log.info("ble", "data", ble_param.data:toHex())
  25. elseif ble_event == ble.EVENT_READ_VALUE then
  26. log.info("ble", "read", ble_param.handle,ble_param.uuid_service:toHex(),ble_param.uuid_characteristic:toHex(),ble_param.data:toHex())
  27. table.insert(rxQueue, ble_param.data)
  28. sys.sendMsg(rxTaskName)
  29. elseif ble_event == ble.EVENT_SCAN_REPORT then
  30. log.info("ble scan report", ble_param.addr_type,ble_param.rssi,ble_param.adv_addr:toHex(),ble_param.data:toHex())
  31. scan_count = scan_count + 1
  32. if scan_count > 100 then
  33. log.info("ble", "扫描次数超过100次, 停止扫描, 15秒后重新开始")
  34. scan_count = 0
  35. ble_device:scan_stop()
  36. sys.timerStart(function() ble_device:scan_start() end, 15000)
  37. end
  38. -- 注意, 这里是连接到另外一个设备, 设备名称带LuatOS字样
  39. if ble_param.addr_type == 0 and ble_param.data:find("LuatOS") then
  40. log.info("ble", "停止扫描, 连接设备", ble_param.adv_addr:toHex(), ble_param.addr_type)
  41. ble_device:scan_stop()
  42. ble_device:connect(ble_param.adv_addr,ble_param.addr_type)
  43. end
  44. elseif ble_event == ble.EVENT_GATT_ITEM then
  45. -- 读取GATT完成, 打印出来
  46. log.info("ble", "gatt item", ble_param)
  47. elseif ble_event == ble.EVENT_GATT_DONE then
  48. log.info("ble", "gatt done", ble_param.service_num)
  49. local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA01")}
  50. ble_device:notify_enable(wt, true) -- 开启通知
  51. ble_isconnected = true
  52. end
  53. end
  54. sys.taskInit(function()
  55. log.info("开始初始化蓝牙核心")
  56. bluetooth_device = bluetooth.init()
  57. log.info("初始化BLE功能")
  58. ble_device = bluetooth_device:ble(ble_callback)
  59. -- master
  60. ble_device:scan_create({})
  61. ble_device:scan_start()
  62. end)
  63. uart.setup(uartId, uartBaudrate)
  64. uart.on(uartId,"receive", function(id, len)
  65. while 1 do
  66. local data = uart.read(id, 1024)
  67. if not data or #data == 0 then
  68. break
  69. end
  70. if #txQueue > QUEUE_MAX_LEN then
  71. table.revmoe(txQueue, 1)
  72. end
  73. table.insert(txQueue, data)
  74. sys.sendMsg(txTaskName)
  75. end
  76. end)
  77. local function txTransTask()
  78. while 1 do
  79. sys.waitMsg(txTaskName)
  80. if ble_isconnected then
  81. while 1 do
  82. if #txQueue <= 0 then
  83. break
  84. end
  85. local data = table.remove(txQueue, 1)
  86. while 1 do
  87. local tmp = data:sub(1, MAX_MTU)
  88. log.info("tmp长度", #tmp)
  89. if tmp and #tmp > 0 then
  90. local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA02")}
  91. ble_device:write_value(wt, tmp)
  92. else
  93. break
  94. end
  95. data = data:sub(MAX_MTU + 1)
  96. end
  97. end
  98. end
  99. end
  100. end
  101. local function rxTransTask()
  102. while 1 do
  103. sys.waitMsg(rxTaskName)
  104. while 1 do
  105. if #rxQueue <= 0 then
  106. break
  107. end
  108. local data = table.remove(rxQueue, 1)
  109. uart.write(uartId, data)
  110. end
  111. end
  112. end
  113. sys.taskInitEx(txTransTask, txTaskName, nil)
  114. sys.taskInitEx(rxTransTask, rxTaskName, nil)
  115. -- 用户代码已结束---------------------------------------------
  116. -- 结尾总是这一句
  117. sys.run()
  118. -- sys.run()之后后面不要加任何语句!!!!!