luat_drv_ble_port.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707
  1. /*
  2. 这个文件是用来实现蓝牙的, 需要代理全部参数给airlink
  3. 1. 要把全部函数都实现, 如果不支持的就返回错误
  4. 2. 一律打包luat_drv_ble_msg_t
  5. 数据传输的数据结构如下:
  6. uint16_t cmd_id; // 蓝牙cmd的id
  7. uint16_t version; // 主机协议版本号, 目前都是0
  8. uint32_t reserved; // 保留字段, 目前都是0
  9. // 然后是命令自身的数据
  10. */
  11. #include "luat_base.h"
  12. #include "luat_airlink.h"
  13. #include "luat_bluetooth.h"
  14. #include "luat_ble.h"
  15. #include "luat_drv_ble.h"
  16. #define LUAT_LOG_TAG "drv.ble"
  17. #include "luat_log.h"
  18. luat_ble_cb_t g_drv_ble_cb;
  19. #undef LLOGD
  20. #define LLOGD(...)
  21. int luat_ble_init(void* args, luat_ble_cb_t luat_ble_cb) {
  22. LLOGD("执行luat_ble_init %p", luat_ble_cb);
  23. g_drv_ble_cb = luat_ble_cb;
  24. uint64_t seq = luat_airlink_get_next_cmd_id();
  25. airlink_queue_item_t item = {
  26. .len = 8 + sizeof(luat_airlink_cmd_t) + 8
  27. };
  28. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, 8 + 8) ;
  29. if (cmd == NULL) {
  30. return -101;
  31. }
  32. luat_drv_ble_msg_t msg = { .id = seq};
  33. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_INIT;
  34. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  35. item.cmd = cmd;
  36. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  37. return 0;
  38. }
  39. int luat_ble_deinit(void* args) {
  40. LLOGD("执行luat_ble_deinit");
  41. uint64_t seq = luat_airlink_get_next_cmd_id();
  42. airlink_queue_item_t item = {
  43. .len = 8 + sizeof(luat_airlink_cmd_t) + 8
  44. };
  45. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, 8 + 8) ;
  46. if (cmd == NULL) {
  47. return -101;
  48. }
  49. luat_drv_ble_msg_t msg = { .id = seq};
  50. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_DEINIT;
  51. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  52. item.cmd = cmd;
  53. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  54. return 0;
  55. }
  56. int luat_ble_set_name(void* args, char* name, uint8_t len) {
  57. LLOGD("执行luat_ble_set_name");
  58. uint64_t seq = luat_airlink_get_next_cmd_id();
  59. airlink_queue_item_t item = {
  60. .len = sizeof(luat_airlink_cmd_t) + sizeof(luat_drv_ble_msg_t) + len + 1
  61. };
  62. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  63. if (cmd == NULL) {
  64. return -101;
  65. }
  66. luat_drv_ble_msg_t msg = { .id = seq};
  67. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_SET_NAME;
  68. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  69. // 然后是名字长度, 1字节
  70. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &len, 1);
  71. // 然后是名字
  72. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t) + 1, name, len);
  73. item.cmd = cmd;
  74. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  75. return 0;
  76. }
  77. // advertise
  78. int luat_ble_create_advertising(void* args, luat_ble_adv_cfg_t* adv_cfg) {
  79. LLOGD("执行luat_ble_create_advertising");
  80. uint64_t seq = luat_airlink_get_next_cmd_id();
  81. airlink_queue_item_t item = {
  82. .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + sizeof(uint16_t) + sizeof(luat_ble_adv_cfg_t)
  83. };
  84. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  85. if (cmd == NULL) {
  86. return -101;
  87. }
  88. luat_drv_ble_msg_t msg = { .id = seq};
  89. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_CREATE;
  90. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  91. // 然后是结构体大小
  92. uint16_t sizeof_adv = sizeof(luat_ble_adv_cfg_t);
  93. memcpy(cmd->data + 8 + 8, &sizeof_adv, 2);
  94. // 然后是数据
  95. memcpy(cmd->data + 8 + 8 + 2, adv_cfg, sizeof_adv);
  96. item.cmd = cmd;
  97. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  98. return 0;
  99. }
  100. int luat_ble_set_adv_data(void* args, uint8_t* adv_buff, uint8_t adv_len) {
  101. LLOGD("执行luat_ble_set_adv_data %p %d", adv_buff, adv_len);
  102. uint64_t seq = luat_airlink_get_next_cmd_id();
  103. airlink_queue_item_t item = {
  104. .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + sizeof(uint16_t) + adv_len
  105. };
  106. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  107. if (cmd == NULL) {
  108. return -101;
  109. }
  110. luat_drv_ble_msg_t msg = { .id = seq};
  111. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_SET_DATA;
  112. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  113. // 然后是结构体大小
  114. uint16_t datalen = adv_len;
  115. memcpy(cmd->data + 8 + 8, &datalen, 2);
  116. // 然后是名字
  117. memcpy(cmd->data + 8 + 8 + 2, adv_buff, datalen);
  118. item.cmd = cmd;
  119. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  120. return 0;
  121. }
  122. int luat_ble_set_scan_rsp_data(void* args, uint8_t* rsp_data, uint8_t rsp_len) {
  123. LLOGD("执行luat_ble_set_scan_rsp_data %p %d", rsp_data, rsp_len);
  124. uint64_t seq = luat_airlink_get_next_cmd_id();
  125. airlink_queue_item_t item = {
  126. .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + sizeof(uint16_t) + rsp_len
  127. };
  128. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  129. if (cmd == NULL) {
  130. return -101;
  131. }
  132. luat_drv_ble_msg_t msg = { .id = seq};
  133. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_SET_SCAN_RSP_DATA;
  134. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  135. // 然后是结构体大小
  136. uint16_t datalen = rsp_len;
  137. memcpy(cmd->data + 8 + 8, &datalen, 2);
  138. // 然后是名字
  139. memcpy(cmd->data + 8 + 8 + 2, rsp_data, datalen);
  140. item.cmd = cmd;
  141. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  142. return 0;
  143. }
  144. int luat_ble_start_advertising(void* args) {
  145. LLOGD("执行luat_ble_start_advertising");
  146. uint64_t seq = luat_airlink_get_next_cmd_id();
  147. airlink_queue_item_t item = {
  148. .len = 8 + sizeof(luat_airlink_cmd_t) + 8
  149. };
  150. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  151. if (cmd == NULL) {
  152. return -101;
  153. }
  154. luat_drv_ble_msg_t msg = { .id = seq};
  155. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_START;
  156. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  157. item.cmd = cmd;
  158. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  159. return 0;
  160. }
  161. int luat_ble_stop_advertising(void* args) {
  162. LLOGD("执行luat_ble_start_advertising");
  163. uint64_t seq = luat_airlink_get_next_cmd_id();
  164. airlink_queue_item_t item = {
  165. .len = 8 + sizeof(luat_airlink_cmd_t) + 8
  166. };
  167. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  168. if (cmd == NULL) {
  169. return -101;
  170. }
  171. luat_drv_ble_msg_t msg = { .id = seq};
  172. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_STOP;
  173. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  174. item.cmd = cmd;
  175. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  176. return 0;
  177. }
  178. int luat_ble_delete_advertising(void* args) {
  179. LLOGD("执行luat_ble_start_advertising");
  180. uint64_t seq = luat_airlink_get_next_cmd_id();
  181. airlink_queue_item_t item = {
  182. .len = 8 + sizeof(luat_airlink_cmd_t) + 8
  183. };
  184. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  185. if (cmd == NULL) {
  186. return -101;
  187. }
  188. luat_drv_ble_msg_t msg = { .id = seq};
  189. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_DELETE;
  190. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  191. item.cmd = cmd;
  192. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  193. return 0;
  194. }
  195. // gatt
  196. int luat_ble_create_gatt(void* args, luat_ble_gatt_service_t* gatt) {
  197. LLOGD("执行luat_ble_create_gatt %d", gatt->characteristics_num);
  198. uint16_t tmp = 0;
  199. uint64_t seq = luat_airlink_get_next_cmd_id();
  200. int ret = 0;
  201. uint16_t descriptor_totalNum = 0;
  202. for (size_t i = 0; i < gatt->characteristics_num; i++) {
  203. descriptor_totalNum += gatt->characteristics[i].descriptors_num;
  204. // LLOGD("统计GATT描述符数量 %d/%d", gatt->characteristics[i].descriptors_num, descriptor_totalNum);
  205. }
  206. airlink_queue_item_t item = {
  207. .len = sizeof(luat_airlink_cmd_t)
  208. + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_gatt_service_t)
  209. + gatt->characteristics_num * sizeof(luat_ble_gatt_chara_t)
  210. + descriptor_totalNum * sizeof(luat_ble_gatt_descriptor_t)
  211. + 16
  212. };
  213. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  214. if (cmd == NULL) {
  215. ret = -101;
  216. goto cleanup;
  217. }
  218. // 数据部分
  219. uint8_t ptr[1024] = {0};
  220. luat_drv_ble_msg_t msg = { .id = seq};
  221. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_GATT_CREATE;
  222. memcpy(ptr, &msg, sizeof(luat_drv_ble_msg_t));
  223. // LLOGD("ptr %p cmd %p cmd->data %p", ptr, cmd + 1, cmd->data);
  224. #if 1
  225. luat_ble_gatt_pack(gatt, ptr + sizeof(luat_drv_ble_msg_t), NULL);
  226. // luat_airlink_hexdump("GATT_A1", cmd->data, cmd->len);
  227. #else
  228. tmp = sizeof(luat_ble_gatt_service_t);
  229. memcpy(ptr + sizeof(luat_drv_ble_msg_t), &tmp, 2);
  230. // 然后是luat_ble_gatt_chara_t的大小
  231. tmp = sizeof(luat_ble_gatt_chara_t);
  232. memcpy(ptr + sizeof(luat_drv_ble_msg_t) + 2, &tmp, 2);
  233. // 然后是服务id的数量
  234. tmp = gatt->characteristics_num;
  235. memcpy(ptr + sizeof(luat_drv_ble_msg_t) + 2 + 2, &tmp, 2);
  236. // 然后是luat_ble_gatt_descriptor_t的大小
  237. tmp = sizeof(luat_ble_gatt_descriptor_t);
  238. memcpy(ptr + sizeof(luat_drv_ble_msg_t) + 2 + 2 + 2, &tmp, 2);
  239. // 头部拷贝完成, 拷贝数据
  240. memcpy(ptr + sizeof(luat_drv_ble_msg_t) + 8, gatt, sizeof(luat_ble_gatt_service_t));
  241. // 然后是服务id
  242. memcpy(ptr + sizeof(luat_drv_ble_msg_t) + 8 + sizeof(luat_ble_gatt_service_t),
  243. gatt->characteristics, gatt->characteristics_num * sizeof(luat_ble_gatt_chara_t));
  244. for (size_t i = 0; i < gatt->characteristics_num; i++)
  245. {
  246. uint8_t descriptor_num = gatt->characteristics[i].descriptors_num;
  247. // 然后是描述符id
  248. memcpy(ptr + sizeof(luat_drv_ble_msg_t) + 8 + sizeof(luat_ble_gatt_service_t) + gatt->characteristics_num * sizeof(luat_ble_gatt_chara_t) + i * sizeof(luat_ble_gatt_descriptor_t),
  249. gatt->characteristics[i].descriptor, descriptor_num * sizeof(luat_ble_gatt_descriptor_t));
  250. }
  251. #endif
  252. memcpy(cmd->data, ptr, cmd->len);
  253. // LLOGD("----> %s %s", __DATE__, __TIME__);
  254. // luat_airlink_hexdump("GATT_A2", cmd->data, cmd->len);
  255. item.cmd = cmd;
  256. // LLOGD("gatt 数据长度 %d %d %d", item.len, cmd->len, cmd->len - sizeof(luat_drv_ble_msg_t));
  257. // luat_airlink_print_buff("bt req HEX", cmd->data, cmd->len);
  258. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  259. cleanup:
  260. for (size_t i = 0; i < gatt->characteristics_num; i++)
  261. {
  262. if (gatt->characteristics[i].descriptor) {
  263. luat_heap_free(gatt->characteristics[i].descriptor);
  264. gatt->characteristics[i].descriptor = NULL;
  265. }
  266. }
  267. luat_heap_free(gatt->characteristics);
  268. gatt->characteristics = NULL;
  269. return ret;
  270. }
  271. int luat_ble_write_notify_value(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint8_t *data, uint16_t len) {
  272. LLOGD("执行luat_ble_write_notify_value");
  273. uint16_t tmp = 0;
  274. uint64_t seq = luat_airlink_get_next_cmd_id();
  275. airlink_queue_item_t item = {
  276. .len = sizeof(luat_airlink_cmd_t)
  277. + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t)
  278. + len + sizeof(uint16_t)
  279. + 16
  280. };
  281. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  282. if (cmd == NULL) {
  283. return -101;
  284. }
  285. luat_drv_ble_msg_t msg = { .id = seq};
  286. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_WRITE_NOTIFY;
  287. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  288. luat_ble_rw_req_t req = {
  289. .len = len
  290. };
  291. if (uuid_service) {
  292. memcpy(&req.service, uuid_service, sizeof(luat_ble_uuid_t));
  293. }
  294. if (uuid_characteristic) {
  295. memcpy(&req.characteristic, uuid_characteristic, sizeof(luat_ble_uuid_t));
  296. }
  297. if (uuid_descriptor) {
  298. memcpy(&req.descriptor, uuid_descriptor, sizeof(luat_ble_uuid_t));
  299. }
  300. tmp = sizeof(luat_ble_rw_req_t);
  301. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &tmp, 2);
  302. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t), &req, sizeof(luat_ble_rw_req_t));
  303. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t), data, len);
  304. item.cmd = cmd;
  305. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  306. return 0;
  307. }
  308. int luat_ble_write_indicate_value(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint8_t *data, uint16_t len) {
  309. LLOGD("执行luat_ble_write_indicate_value");
  310. uint16_t tmp = 0;
  311. uint64_t seq = luat_airlink_get_next_cmd_id();
  312. airlink_queue_item_t item = {
  313. .len = sizeof(luat_airlink_cmd_t)
  314. + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t)
  315. + len + sizeof(uint16_t)
  316. + 16
  317. };
  318. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  319. if (cmd == NULL) {
  320. return -101;
  321. }
  322. luat_drv_ble_msg_t msg = { .id = seq};
  323. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_WRITE_INDICATION;
  324. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  325. luat_ble_rw_req_t req = {
  326. .len = len
  327. };
  328. if (uuid_service) {
  329. memcpy(&req.service, uuid_service, sizeof(luat_ble_uuid_t));
  330. }
  331. if (uuid_characteristic) {
  332. memcpy(&req.characteristic, uuid_characteristic, sizeof(luat_ble_uuid_t));
  333. }
  334. if (uuid_descriptor) {
  335. memcpy(&req.descriptor, uuid_descriptor, sizeof(luat_ble_uuid_t));
  336. }
  337. tmp = sizeof(luat_ble_rw_req_t);
  338. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &tmp, 2);
  339. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t), &req, sizeof(luat_ble_rw_req_t));
  340. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t), data, len);
  341. item.cmd = cmd;
  342. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  343. return 0;
  344. }
  345. int luat_ble_write_value(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint8_t *data, uint16_t len) {
  346. LLOGD("执行luat_ble_write_value");
  347. uint16_t tmp = 0;
  348. uint64_t seq = luat_airlink_get_next_cmd_id();
  349. airlink_queue_item_t item = {
  350. .len = sizeof(luat_airlink_cmd_t)
  351. + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t)
  352. + len + sizeof(uint16_t)
  353. + 16
  354. };
  355. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  356. if (cmd == NULL) {
  357. return -101;
  358. }
  359. luat_drv_ble_msg_t msg = { .id = seq};
  360. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_WRITE_VALUE;
  361. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  362. luat_ble_rw_req_t req = {
  363. .len = len
  364. };
  365. if (uuid_service) {
  366. memcpy(&req.service, uuid_service, sizeof(luat_ble_uuid_t));
  367. }
  368. if (uuid_characteristic) {
  369. memcpy(&req.characteristic, uuid_characteristic, sizeof(luat_ble_uuid_t));
  370. }
  371. if (uuid_descriptor) {
  372. memcpy(&req.descriptor, uuid_descriptor, sizeof(luat_ble_uuid_t));
  373. }
  374. tmp = sizeof(luat_ble_rw_req_t);
  375. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &tmp, 2);
  376. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t), &req, sizeof(luat_ble_rw_req_t));
  377. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t), data, len);
  378. item.cmd = cmd;
  379. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  380. return 0;
  381. }
  382. // scanning
  383. int luat_ble_create_scanning(void* args, luat_ble_scan_cfg_t* scan_cfg) {
  384. LLOGD("执行luat_ble_create_scanning");
  385. uint64_t seq = luat_airlink_get_next_cmd_id();
  386. airlink_queue_item_t item = {
  387. .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + sizeof(uint16_t) + sizeof(luat_ble_scan_cfg_t)
  388. };
  389. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  390. if (cmd == NULL) {
  391. return -101;
  392. }
  393. luat_drv_ble_msg_t msg = { .id = seq};
  394. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_SCAN_CREATE;
  395. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  396. // 然后是结构体大小
  397. uint16_t sizeof_scan = sizeof(luat_ble_scan_cfg_t);
  398. memcpy(cmd->data + 8 + 8, &sizeof_scan, 2);
  399. // 然后是数据
  400. memcpy(cmd->data + 8 + 8 + 2, scan_cfg, sizeof_scan);
  401. item.cmd = cmd;
  402. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  403. return 0;
  404. }
  405. int luat_ble_start_scanning(void* args) {
  406. LLOGD("执行luat_ble_start_scanning");
  407. uint64_t seq = luat_airlink_get_next_cmd_id();
  408. airlink_queue_item_t item = {
  409. .len = 8 + sizeof(luat_airlink_cmd_t) + 8
  410. };
  411. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  412. if (cmd == NULL) {
  413. return -101;
  414. }
  415. luat_drv_ble_msg_t msg = { .id = seq};
  416. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_SCAN_START;
  417. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  418. item.cmd = cmd;
  419. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  420. return 0;
  421. }
  422. int luat_ble_stop_scanning(void* args) {
  423. LLOGD("执行luat_ble_stop_scanning");
  424. uint64_t seq = luat_airlink_get_next_cmd_id();
  425. airlink_queue_item_t item = {
  426. .len = 8 + sizeof(luat_airlink_cmd_t) + 8
  427. };
  428. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  429. if (cmd == NULL) {
  430. return -101;
  431. }
  432. luat_drv_ble_msg_t msg = { .id = seq};
  433. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_SCAN_STOP;
  434. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  435. item.cmd = cmd;
  436. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  437. return 0;
  438. }
  439. int luat_ble_delete_scanning(void* args) {
  440. LLOGD("执行luat_ble_delete_scanning");
  441. uint64_t seq = luat_airlink_get_next_cmd_id();
  442. airlink_queue_item_t item = {
  443. .len = 8 + sizeof(luat_airlink_cmd_t) + 8
  444. };
  445. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  446. if (cmd == NULL) {
  447. return -101;
  448. }
  449. luat_drv_ble_msg_t msg = { .id = seq};
  450. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_SCAN_DELETE;
  451. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  452. item.cmd = cmd;
  453. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  454. return 0;
  455. }
  456. int luat_ble_connect(void* args, luat_ble_connect_req_t *conn) {
  457. LLOGD("执行luat_ble_connect");
  458. if (luat_airlink_sversion() < 11) {
  459. LLOGE("ble:connect not support, ble version is %d", luat_airlink_sversion());
  460. return -1;
  461. }
  462. uint64_t seq = luat_airlink_get_next_cmd_id();
  463. airlink_queue_item_t item = {
  464. .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + sizeof(luat_ble_connect_req_t) + 2
  465. };
  466. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  467. if (cmd == NULL) {
  468. return -101;
  469. }
  470. luat_drv_ble_msg_t msg = { .id = seq};
  471. uint16_t tmp = sizeof(luat_ble_connect_req_t);
  472. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_CONNECT;
  473. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  474. // 然后是结构体大小
  475. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &tmp, 2);
  476. // 然后是连接请求数据
  477. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t) + 2, conn, sizeof(luat_ble_connect_req_t));
  478. item.cmd = cmd;
  479. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  480. return -1;
  481. }
  482. int luat_ble_disconnect(void* args) {
  483. LLOGD("执行luat_ble_disconnect");
  484. if (luat_airlink_sversion() < 11) {
  485. LLOGE("ble:disconnect not support, ble version is %d", luat_airlink_sversion());
  486. return -1;
  487. }
  488. uint64_t seq = luat_airlink_get_next_cmd_id();
  489. airlink_queue_item_t item = {
  490. .len = 8 + sizeof(luat_airlink_cmd_t) + sizeof(luat_drv_ble_msg_t)
  491. };
  492. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  493. if (cmd == NULL) {
  494. return -101;
  495. }
  496. luat_drv_ble_msg_t msg = { .id = seq};
  497. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_DISCONNECT;
  498. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  499. item.cmd = cmd;
  500. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  501. return 0;
  502. }
  503. int luat_ble_read_value(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint8_t **data, uint16_t* len) {
  504. LLOGD("执行luat_ble_read_value");
  505. if (luat_airlink_sversion() < 11) {
  506. LLOGE("ble:read_value not support, ble version is %d", luat_airlink_sversion());
  507. return -1;
  508. }
  509. uint16_t tmp = 0;
  510. uint64_t seq = luat_airlink_get_next_cmd_id();
  511. airlink_queue_item_t item = {
  512. .len = sizeof(luat_airlink_cmd_t)
  513. + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t)
  514. + sizeof(uint16_t)
  515. + 16
  516. };
  517. // 暂时全是0
  518. *data = NULL;
  519. *len = 0;
  520. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  521. if (cmd == NULL) {
  522. return -101;
  523. }
  524. luat_drv_ble_msg_t msg = { .id = seq};
  525. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_READ_VALUE;
  526. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  527. luat_ble_rw_req_t req = {
  528. .len = len
  529. };
  530. if (uuid_service) {
  531. memcpy(&req.service, uuid_service, sizeof(luat_ble_uuid_t));
  532. }
  533. if (uuid_characteristic) {
  534. memcpy(&req.characteristic, uuid_characteristic, sizeof(luat_ble_uuid_t));
  535. }
  536. if (uuid_descriptor) {
  537. memcpy(&req.descriptor, uuid_descriptor, sizeof(luat_ble_uuid_t));
  538. }
  539. tmp = sizeof(luat_ble_rw_req_t);
  540. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &tmp, 2);
  541. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t), &req, sizeof(luat_ble_rw_req_t));
  542. // memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t), data, len);
  543. item.cmd = cmd;
  544. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  545. LLOGI("luat_ble_read_value 执行完成");
  546. return 0;
  547. }
  548. int luat_ble_notify_enable(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, uint8_t enable) {
  549. LLOGD("执行luat_ble_notify_enable %d", enable);
  550. if (luat_airlink_sversion() < 11) {
  551. LLOGE("ble:notify_enable not support, ble version is %d", luat_airlink_sversion());
  552. return -1;
  553. }
  554. uint16_t tmp = 0;
  555. uint64_t seq = luat_airlink_get_next_cmd_id();
  556. airlink_queue_item_t item = {
  557. .len = sizeof(luat_airlink_cmd_t)
  558. + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t)
  559. + sizeof(uint16_t)
  560. + 16
  561. };
  562. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  563. if (cmd == NULL) {
  564. return -101;
  565. }
  566. luat_drv_ble_msg_t msg = { .id = seq};
  567. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_NOTIFY_ENABLE;
  568. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  569. luat_ble_rw_req_t req = {
  570. .len = 1
  571. };
  572. if (uuid_service) {
  573. memcpy(&req.service, uuid_service, sizeof(luat_ble_uuid_t));
  574. }
  575. if (uuid_characteristic) {
  576. memcpy(&req.characteristic, uuid_characteristic, sizeof(luat_ble_uuid_t));
  577. }
  578. tmp = sizeof(luat_ble_rw_req_t);
  579. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &tmp, 2);
  580. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t), &req, sizeof(luat_ble_rw_req_t));
  581. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t), &enable, 1);
  582. item.cmd = cmd;
  583. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  584. return 0;
  585. }
  586. int luat_ble_indicate_enable(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, uint8_t enable) {
  587. LLOGD("执行luat_ble_indicate_enable %d", enable);
  588. if (luat_airlink_sversion() < 15) {
  589. LLOGE("ble:indicate_enable not support, ble version is %d", luat_airlink_sversion());
  590. return -1;
  591. }
  592. uint16_t tmp = 0;
  593. uint64_t seq = luat_airlink_get_next_cmd_id();
  594. airlink_queue_item_t item = {
  595. .len = sizeof(luat_airlink_cmd_t)
  596. + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t)
  597. + sizeof(uint16_t)
  598. + 16
  599. };
  600. luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
  601. if (cmd == NULL) {
  602. return -101;
  603. }
  604. luat_drv_ble_msg_t msg = { .id = seq};
  605. msg.cmd_id = LUAT_DRV_BT_CMD_BLE_INDICATE_ENABLE;
  606. memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
  607. luat_ble_rw_req_t req = {
  608. .len = 1
  609. };
  610. if (uuid_service) {
  611. memcpy(&req.service, uuid_service, sizeof(luat_ble_uuid_t));
  612. }
  613. if (uuid_characteristic) {
  614. memcpy(&req.characteristic, uuid_characteristic, sizeof(luat_ble_uuid_t));
  615. }
  616. tmp = sizeof(luat_ble_rw_req_t);
  617. memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &tmp, 2);
  618. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t), &req, sizeof(luat_ble_rw_req_t));
  619. memcpy(cmd->data + 2 + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_rw_req_t), &enable, 1);
  620. item.cmd = cmd;
  621. luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
  622. return 0;
  623. }