Browse Source

add: airlink,bt,能收到消息了,但还不能读写数据

Wendal Chen 7 months ago
parent
commit
a112e76b21

+ 52 - 18
components/airlink/src/exec/luat_airlink_bt_exec_task.c

@@ -23,8 +23,42 @@
 static luat_rtos_queue_t evt_queue;
 static luat_rtos_task_handle g_task_handle;
 
-static void drv_ble_cb(luat_ble_t* luat_ble, luat_ble_event_t ble_event, luat_ble_param_t* ble_param) {
+static void drv_ble_cb(luat_ble_t* luat_ble, luat_ble_event_t event, luat_ble_param_t* param) {
     // 注意, 这里要代理不同的事件, 转发到airlink
+    LLOGD("drv_ble event %d", event);
+    uint64_t seq = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len =  sizeof(luat_airlink_cmd_t) + sizeof(luat_drv_ble_msg_t) + (param ? 1000 : 16)
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x510, item.len - sizeof(luat_airlink_cmd_t));
+    if (cmd == NULL) {
+        LLOGW("out of memory when alloc ble event");
+        return;
+    }
+    luat_drv_ble_msg_t *msg = (luat_drv_ble_msg_t *)cmd->data;
+    msg->id = seq;
+    msg->cmd_id = LUAT_DRV_BT_CMD_BLE_EVENT_CB;
+
+    uint32_t tmp = event;
+    memcpy(msg->data, &tmp, 4);
+    if (param) {
+        if (param->adv_req.data && param->adv_req.data_len > 0) {
+            memcpy(msg->data + 4 + sizeof(luat_ble_param_t), param->adv_req.data, param->adv_req.data_len);
+        }
+        else if (param->read_req.value && param->read_req.len > 0) {
+            memcpy(msg->data + 4 + sizeof(luat_ble_param_t), param->read_req.value, param->read_req.len);
+        }
+        else if (param->write_req.value && param->write_req.len > 0) {
+            memcpy(msg->data + 4 + sizeof(luat_ble_param_t), param->write_req.value, param->write_req.len);
+        }
+        param->adv_req.data = NULL;
+        param->read_req.value = NULL;
+        param->write_req.value = NULL;
+        memcpy(msg->data + 4, param, sizeof(luat_ble_param_t));
+    }
+
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
 }
 
 static int drv_gatt_create(luat_drv_ble_msg_t *msg) {
@@ -33,16 +67,16 @@ static int drv_gatt_create(luat_drv_ble_msg_t *msg) {
     uint16_t sizeof_gatt = 0;
     uint16_t sizeof_gatt_chara = 0;
     uint16_t num_of_gatt_srv = 0;
-    memcpy(&sizeof_gatt, msg->data + 6, 2); // 注意, data已经去掉2个字节的cmd_id
-    memcpy(&sizeof_gatt_chara, msg->data + 8, 2); // 注意, data已经去掉2个字节的cmd_id
-    memcpy(&num_of_gatt_srv, msg->data + 10, 2); // 注意, data已经去掉2个字节的cmd_id
-    LLOGD("sizeof(luat_ble_gatt_service_t) = %d act %d", sizeof(luat_ble_gatt_service_t), sizeof_gatt);
-    LLOGD("sizeof(luat_ble_gatt_service_t) = %d act %d", sizeof(luat_ble_gatt_chara_t), sizeof_gatt_chara);
-    memcpy(&gatt, msg->data + 12, sizeof(luat_ble_gatt_service_t));
-    gatt.characteristics = msg->data + 12 + sizeof_gatt;
+    memcpy(&sizeof_gatt, msg->data, 2);
+    memcpy(&sizeof_gatt_chara, msg->data + 2, 2);
+    memcpy(&num_of_gatt_srv, msg->data + 4, 2);
+    // LLOGD("sizeof(luat_ble_gatt_service_t) = %d act %d", sizeof(luat_ble_gatt_service_t), sizeof_gatt);
+    // LLOGD("sizeof(luat_ble_gatt_service_t) = %d act %d", sizeof(luat_ble_gatt_chara_t), sizeof_gatt_chara);
+    memcpy(&gatt, msg->data + 8, sizeof(luat_ble_gatt_service_t));
+    gatt.characteristics = msg->data + 8 + sizeof_gatt;
     for (size_t i = 0; i < num_of_gatt_srv; i++)
     {
-        LLOGD("gatt chara %d maxsize %d", i, gatt.characteristics[i].max_size);
+        LLOGD("gatt char %d maxsize %d", i, gatt.characteristics[i].max_size);
     }
     return luat_ble_create_gatt(NULL, &gatt);
 }
@@ -51,25 +85,25 @@ static int drv_adv_create(luat_drv_ble_msg_t *msg) {
     // 从数据中解析出参数, 重新组装
     luat_ble_adv_cfg_t adv = {0};
     uint16_t sizeof_adv = 0;
-    memcpy(&sizeof_adv, msg->data + 6, 2);
-    memcpy(&adv, msg->data + 8, sizeof(luat_ble_adv_cfg_t));
+    memcpy(&sizeof_adv, msg->data, 2);
+    memcpy(&adv, msg->data + 2, sizeof(luat_ble_adv_cfg_t));
     return luat_ble_create_advertising(NULL, &adv);
 }
 
 static int drv_adv_set_data(luat_drv_ble_msg_t *msg) {
     // 从数据中解析出参数, 重新组装
     uint16_t datalen = 0;
-    memcpy(&datalen, msg->data + 6, 2);
+    memcpy(&datalen, msg->data, 2);
     LLOGD("adv set data len %d", datalen);
-    return luat_ble_set_adv_data(NULL, msg->data + 8, datalen);
+    return luat_ble_set_adv_data(NULL, msg->data + 2, datalen);
 }
 
 static int drv_adv_set_scan_rsp_data(luat_drv_ble_msg_t *msg) {
     // 从数据中解析出参数, 重新组装
     uint16_t datalen = 0;
-    memcpy(&datalen, msg->data + 6, 2);
+    memcpy(&datalen, msg->data, 2);
     LLOGD("adv set scan rsp data len %d", datalen);
-    return luat_ble_set_scan_rsp_data(NULL, msg->data + 8, datalen);
+    return luat_ble_set_scan_rsp_data(NULL, msg->data + 2, datalen);
 }
 
 static void drv_bt_task(void *param) {
@@ -108,9 +142,9 @@ static void drv_bt_task(void *param) {
                 LLOGD("ble gatt create %d", ret);
                 break;
             case LUAT_DRV_BT_CMD_BLE_SET_NAME:
-                memcpy(buff, msg->data + 7, msg->data[6]);
-                buff[msg->data[6]] = 0;
-                ret = luat_ble_set_name(NULL, buff, msg->data[6]);
+                memcpy(buff, msg->data + 1, msg->data[0]);
+                buff[msg->data[0]] = 0;
+                ret = luat_ble_set_name(NULL, buff, msg->data[0]);
                 LLOGD("ble set name %d", ret);
                 break;
             case LUAT_DRV_BT_CMD_BLE_ADV_CREATE:

+ 41 - 9
components/airlink/src/exec/luat_airlink_cmd_exec_bluetooth.c

@@ -19,20 +19,19 @@
 
 int luat_airlink_cmd_exec_bt_request(luat_airlink_cmd_t *cmd, void *userdata)
 {
-    LLOGD("收到bt request len=%d", cmd->len);
-    if (cmd->len < 10) {
+    // LLOGD("收到bt request len=%d", cmd->len);
+    if (cmd->len < sizeof(luat_drv_ble_msg_t)) {
         return -100;
     }
-    luat_drv_ble_msg_t *msg = luat_heap_malloc(sizeof(luat_drv_ble_msg_t) + cmd->len);
+    luat_drv_ble_msg_t *msg = luat_heap_malloc(cmd->len);
     if (msg == NULL) {
         LLOGE("out of memory when malloc luat_drv_ble_msg_t");
         return -1;
     }
-    memcpy(&msg->id, cmd->data, 8);
-    memcpy(&msg->cmd_id, cmd->data + 8, 2);
-    memcpy(&msg->data, cmd->data + 10, cmd->len - 10);
-    msg->len = cmd->len - 10;
-    LLOGD("bt request cmd_id=%d", msg->cmd_id);
+    memcpy(msg, cmd->data, cmd->len);
+    msg->len = cmd->len - sizeof(luat_drv_ble_msg_t);
+    LLOGD("bt request cmd_id=%d len %d", msg->cmd_id, msg->len);
+    // luat_airlink_print_buff("bt req HEX", cmd->data, cmd->len);
     if (msg->cmd_id == 0) {
         luat_drv_bt_task_start();
     }
@@ -40,4 +39,37 @@ int luat_airlink_cmd_exec_bt_request(luat_airlink_cmd_t *cmd, void *userdata)
     return 0;
 }
 
-#endif
+#endif
+
+
+#include "luat_drv_ble.h"
+
+extern luat_ble_cb_t g_drv_ble_cb;
+
+int luat_airlink_cmd_exec_bt_resp_cb(luat_airlink_cmd_t *cmd, void *userdata) {
+    if (cmd->len < 10) {
+        return -100;
+    }
+    if (g_drv_ble_cb == NULL) {
+        return -101;
+    }
+    luat_drv_ble_msg_t* msg = (luat_drv_ble_msg_t *)(cmd->data);
+    if (msg->cmd_id == LUAT_DRV_BT_CMD_BLE_EVENT_CB) {
+        uint32_t tmp = 0;
+        memcpy(&tmp, msg->data, 4);
+        luat_ble_event_t event = (luat_ble_event_t)tmp;
+        luat_ble_param_t param = {0};
+        memcpy(&param, msg->data + 4, sizeof(luat_ble_param_t));
+        // 以下数据暂时填0, 还没想好怎么传
+        param.adv_req.data_len = 0;
+        param.adv_req.data = NULL;
+        param.read_req.len = 0;
+        param.read_req.value = NULL;
+        param.write_req.len = 0;
+        param.write_req.value = NULL;
+        LLOGD("收到bt event %d %d", event, cmd->len - sizeof(luat_drv_ble_msg_t));
+        g_drv_ble_cb(NULL, event, &param);
+        return 0;
+    }
+    return 0;
+}

+ 64 - 124
components/bluetooth/drv/luat_drv_ble_port.c

@@ -19,9 +19,12 @@ uint32_t reserved; // 保留字段, 目前都是0
 #define LUAT_LOG_TAG "drv.ble"
 #include "luat_log.h"
 
+luat_ble_cb_t g_drv_ble_cb;
+
 int luat_ble_init(void* args, luat_ble_cb_t luat_ble_cb) {
-    LLOGD("执行luat_ble_init");
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    LLOGD("执行luat_ble_init %p", luat_ble_cb);
+    g_drv_ble_cb = luat_ble_cb;
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = 8 + sizeof(luat_airlink_cmd_t) + 8
     };
@@ -29,16 +32,9 @@ int luat_ble_init(void* args, luat_ble_cb_t luat_ble_cb) {
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_INIT;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_INIT;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
 
     item.cmd = cmd;
     luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
@@ -47,7 +43,7 @@ int luat_ble_init(void* args, luat_ble_cb_t luat_ble_cb) {
 
 int luat_ble_deinit(void* args) {
     LLOGD("执行luat_ble_deinit");
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = 8 + sizeof(luat_airlink_cmd_t) + 8
     };
@@ -55,16 +51,9 @@ int luat_ble_deinit(void* args) {
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_DEINIT;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_DEINIT;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
 
     item.cmd = cmd;
     luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
@@ -74,28 +63,22 @@ int luat_ble_deinit(void* args) {
 
 int luat_ble_set_name(void* args, char* name, uint8_t len) {
     LLOGD("执行luat_ble_set_name");
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
-        .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + len + sizeof(uint16_t)
+        .len = sizeof(luat_airlink_cmd_t) + sizeof(luat_drv_ble_msg_t) + len + 1
     };
     luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_SET_NAME;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_SET_NAME;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
+
     // 然后是名字长度, 1字节
-    memcpy(cmd->data + 8 + 8, &len, 1);
+    memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &len, 1);
     // 然后是名字
-    memcpy(cmd->data + 8 + 8 + 1, name, len);
+    memcpy(cmd->data + sizeof(luat_drv_ble_msg_t) + 1, name, len);
 
     item.cmd = cmd;
     luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
@@ -104,14 +87,14 @@ int luat_ble_set_name(void* args, char* name, uint8_t len) {
 
 
 int luat_ble_set_max_mtu(void* args, uint16_t max_mtu) {
-    LLOGE("not support yet");
+    LLOGE("set max mtu %d not support yet", max_mtu);
     return -1;
 }
 
 // advertise
 int luat_ble_create_advertising(void* args, luat_ble_adv_cfg_t* adv_cfg) {
     LLOGD("执行luat_ble_create_advertising");
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + sizeof(uint16_t) + sizeof(luat_ble_adv_cfg_t)
     };
@@ -119,16 +102,10 @@ int luat_ble_create_advertising(void* args, luat_ble_adv_cfg_t* adv_cfg) {
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_ADV_CREATE;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_CREATE;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
+
     // 然后是结构体大小
     uint16_t sizeof_adv = sizeof(luat_ble_adv_cfg_t);
     memcpy(cmd->data + 8 + 8, &sizeof_adv, 2);
@@ -143,7 +120,7 @@ int luat_ble_create_advertising(void* args, luat_ble_adv_cfg_t* adv_cfg) {
 
 int luat_ble_set_adv_data(void* args, uint8_t* adv_buff, uint8_t adv_len) {
     LLOGD("执行luat_ble_set_adv_data %p %d", adv_buff, adv_len);
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + sizeof(uint16_t) + adv_len
     };
@@ -151,16 +128,9 @@ int luat_ble_set_adv_data(void* args, uint8_t* adv_buff, uint8_t adv_len) {
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_ADV_SET_DATA;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_SET_DATA;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
     // 然后是结构体大小
     uint16_t datalen = adv_len;
     memcpy(cmd->data + 8 + 8, &datalen, 2);
@@ -175,7 +145,7 @@ int luat_ble_set_adv_data(void* args, uint8_t* adv_buff, uint8_t adv_len) {
 
 int luat_ble_set_scan_rsp_data(void* args, uint8_t* rsp_data, uint8_t rsp_len) {
     LLOGD("执行luat_ble_set_scan_rsp_data %p %d", rsp_data, rsp_len);
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + sizeof(uint16_t) + rsp_len
     };
@@ -183,16 +153,10 @@ int luat_ble_set_scan_rsp_data(void* args, uint8_t* rsp_data, uint8_t rsp_len) {
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_ADV_SET_SCAN_RSP_DATA;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_SET_SCAN_RSP_DATA;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
+
     // 然后是结构体大小
     uint16_t datalen = rsp_len;
     memcpy(cmd->data + 8 + 8, &datalen, 2);
@@ -207,7 +171,7 @@ int luat_ble_set_scan_rsp_data(void* args, uint8_t* rsp_data, uint8_t rsp_len) {
 
 int luat_ble_start_advertising(void* args) {
     LLOGD("执行luat_ble_start_advertising");
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = 8 + sizeof(luat_airlink_cmd_t) + 8
     };
@@ -215,16 +179,9 @@ int luat_ble_start_advertising(void* args) {
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_ADV_START;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_START;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
 
     item.cmd = cmd;
     luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
@@ -234,7 +191,7 @@ int luat_ble_start_advertising(void* args) {
 
 int luat_ble_stop_advertising(void* args) {
     LLOGD("执行luat_ble_start_advertising");
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = 8 + sizeof(luat_airlink_cmd_t) + 8
     };
@@ -242,16 +199,9 @@ int luat_ble_stop_advertising(void* args) {
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_ADV_STOP;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_STOP;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
 
     item.cmd = cmd;
     luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
@@ -260,8 +210,8 @@ int luat_ble_stop_advertising(void* args) {
 
 
 int luat_ble_delete_advertising(void* args) {
-        LLOGD("执行luat_ble_start_advertising");
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    LLOGD("执行luat_ble_start_advertising");
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
         .len = 8 + sizeof(luat_airlink_cmd_t) + 8
     };
@@ -269,16 +219,9 @@ int luat_ble_delete_advertising(void* args) {
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_ADV_START;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_ADV_DELETE;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
 
     item.cmd = cmd;
     luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
@@ -290,46 +233,43 @@ int luat_ble_delete_advertising(void* args) {
 int luat_ble_create_gatt(void* args, luat_ble_gatt_service_t* gatt) {
     LLOGD("执行luat_ble_create_gatt");
     uint16_t tmp = 0;
-    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    uint64_t seq = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
-        .len = 8 + sizeof(luat_airlink_cmd_t) 
-               + 8 + sizeof(luat_ble_gatt_service_t) 
+        .len = sizeof(luat_airlink_cmd_t) 
+               + sizeof(luat_drv_ble_msg_t) + sizeof(luat_ble_gatt_service_t) 
                + gatt->characteristics_num * sizeof(luat_ble_gatt_chara_t)
-               + 8
+               + 16
     };
     luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-     // 前2个字节是蓝牙cmd id
-    uint16_t id = LUAT_DRV_BT_CMD_BLE_GATT_CREATE;
-    memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-    // 剩余4个字节做预留
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_GATT_CREATE;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
     
     // 数据部分
     // 首先是luat_ble_gatt_service_t结构的大小
     tmp = sizeof(luat_ble_gatt_service_t);
-    memcpy(cmd->data + 8 + 8, &tmp, 2);
+    memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &tmp, 2);
     // 然后是luat_ble_gatt_chara_t的大小
     tmp = sizeof(luat_ble_gatt_chara_t);
-    memcpy(cmd->data + 8 + 8 + 2, &tmp, 2);
+    memcpy(cmd->data + sizeof(luat_drv_ble_msg_t) + 2, &tmp, 2);
     // 然后是服务id的数量
     tmp = gatt->characteristics_num;
-    memcpy(cmd->data + 8 + 8 + 2 + 2, &tmp, 2);
+    memcpy(cmd->data + sizeof(luat_drv_ble_msg_t) + 2 + 2, &tmp, 2);
 
     // 头部拷贝完成, 拷贝数据
-    memcpy(cmd->data + 8 + 8 + 2 + 2 + 2, gatt, sizeof(luat_ble_gatt_service_t));
+    memcpy(cmd->data + sizeof(luat_drv_ble_msg_t) + 8, gatt, sizeof(luat_ble_gatt_service_t));
     // 然后是服务id
-    memcpy(cmd->data + 8 + 8 + 2 + 2 + 2 + sizeof(luat_ble_gatt_service_t), 
+    memcpy(cmd->data + sizeof(luat_drv_ble_msg_t) + 8 + sizeof(luat_ble_gatt_service_t), 
         gatt->characteristics, gatt->characteristics_num * sizeof(luat_ble_gatt_chara_t));
 
     item.cmd = cmd;
+
+    LLOGD("gatt 数据长度 %d %d %d", item.len, cmd->len, cmd->len - sizeof(luat_drv_ble_msg_t));
+    luat_airlink_print_buff("bt req HEX", cmd->data, cmd->len);
     luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
     return 0;
 }

+ 21 - 15
components/bluetooth/drv/luat_drv_bt_port.c

@@ -17,23 +17,15 @@ int luat_bluetooth_init(void* args) {
     LLOGD("执行luat_bluetooth_init");
     uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
     airlink_queue_item_t item = {
-        .len = 8 + sizeof(luat_airlink_cmd_t) + 8
+        .len = sizeof(luat_airlink_cmd_t) + sizeof(luat_drv_ble_msg_t)
     };
-    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, 8 + 8) ;
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
     if (cmd == NULL) {
         return -101;
     }
-    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
-    uint8_t data[8] = {0};
-    // 前2个字节是蓝牙cmd id
-    // uint16_t id = LUAT_DRV_BT_CMD_BT_INIT;
-    // memcpy(data, &id, 2);
-    // 然后2个字节的主机协议版本号, 当前全是0
-
-    // 这个指令当没有参数, 加4个字节备用吧
-
-    // 全部拷贝过去
-    memcpy(cmd->data + 8, data, 8);
+    luat_drv_ble_msg_t msg = { .id = luat_airlink_next_cmd_id};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BT_INIT;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
 
     item.cmd = cmd;
     luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
@@ -41,8 +33,22 @@ int luat_bluetooth_init(void* args) {
 }
 
 int luat_bluetooth_deinit(void* args) {
-    LLOGE("not support yet");
-    return -1;
+    LLOGD("执行luat_bluetooth_deinit");
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_airlink_cmd_t) + sizeof(luat_drv_ble_msg_t)
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
+    if (cmd == NULL) {
+        return -101;
+    }
+    luat_drv_ble_msg_t msg = { .id = luat_airlink_next_cmd_id};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BT_DEINIT;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
+
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
 }
 
 int luat_bluetooth_get_mac(void* args, uint8_t *addr) {

+ 1 - 0
components/bluetooth/include/luat_ble.h

@@ -177,6 +177,7 @@ typedef struct{
         luat_ble_write_req_t write_req;
         luat_ble_read_req_t read_req;
         luat_ble_adv_req_t adv_req;
+        uint8_t data[128]; // 预留一个大的后备区域
     };
 } luat_ble_param_t;
 

+ 4 - 0
components/bluetooth/include/luat_drv_ble.h

@@ -6,6 +6,8 @@ typedef struct luat_drv_ble_msg
     uint64_t id; // 命令seq序号
     uint16_t cmd_id;
     uint16_t len;
+    uint16_t version;
+    uint16_t reserved;
     uint8_t data[0];
 }luat_drv_ble_msg_t;
 
@@ -25,6 +27,8 @@ enum {
     LUAT_DRV_BT_CMD_BLE_ADV_SET_DATA, // 设置广播数据
     LUAT_DRV_BT_CMD_BLE_ADV_SET_SCAN_RSP_DATA, // 设置广播响应数据
 
+    LUAT_DRV_BT_CMD_BLE_EVENT_CB = 128, // 事件回调
+
     LUAT_DRV_BT_CMD_MAX
 };
 

+ 7 - 2
components/bluetooth/src/luat_lib_ble.c

@@ -12,7 +12,7 @@
 extern int g_bt_ble_ref;
 extern int g_ble_lua_cb_ref;
 
-static int luatos_ble_callback(lua_State *L, void* ptr){
+int l_ble_callback(lua_State *L, void* ptr) {
 	(void)ptr;
     rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
     luat_ble_event_t evt = (luat_ble_event_t)msg->arg1;
@@ -23,6 +23,10 @@ static int luatos_ble_callback(lua_State *L, void* ptr){
         lua_geti(L, LUA_REGISTRYINDEX, g_bt_ble_ref);
         lua_pushinteger(L, evt);
     }
+    else {
+        LLOGE("用户回调函数不存在");
+        goto exit;
+    }
 
     switch(evt){
         case LUAT_BLE_EVENT_WRITE:{
@@ -96,6 +100,7 @@ static int luatos_ble_callback(lua_State *L, void* ptr){
             lua_call(L, 2, 0);
             break;
     }
+exit:
     if (param){
         luat_heap_free(param);
         param = NULL;
@@ -122,7 +127,7 @@ void luat_ble_cb(luat_ble_t* args, luat_ble_event_t ble_event, luat_ble_param_t*
     }
     
     rtos_msg_t msg = {
-        .handler = luatos_ble_callback,
+        .handler = l_ble_callback,
         .ptr = (void*)NULL,
         .arg1 = (int)ble_event,
         .arg2 = (int)luat_ble_param,

+ 1 - 1
luat/demo/airlink/air8000_ble_peripheral/main.lua

@@ -92,7 +92,7 @@ sys.taskInit(function()
         intv_max = 120,
         adv_data = {
             {ble.FLAGS,string.char(0x06)},
-            {ble.COMPLETE_LOCAL_NAME, "LuatOS"},
+            {ble.COMPLETE_LOCAL_NAME, "LuatOS123"},
             {ble.SERVICE_DATA, string.fromHex("FE01")},
             {ble.MANUFACTURER_SPECIFIC_DATA, string.fromHex("05F0")},
         }