Forráskód Böngészése

add: airlink,添加bluetooth,还没搞完,先提交部分

??? 9 hónapja
szülő
commit
190bd5bc36

+ 1 - 0
components/airlink/include/luat_airlink.h

@@ -23,6 +23,7 @@ typedef struct luat_airlink_cmd
     uint16_t cmd; // 命令, 从0x0001开始, 到0xfffe结束
     uint16_t len; // 数据长度,最高64k, 实际使用最高2k
     uint8_t data[0];
+    void* func[0];
 }luat_airlink_cmd_t;
 
 typedef struct airlink_flags {

+ 56 - 0
components/airlink/include/luat_airlink_drv_bluetooth.h

@@ -0,0 +1,56 @@
+#ifndef LUAT_AIRLINK_DRV_BLUETOOTH_H
+#define LUAT_AIRLINK_DRV_BLUETOOTH_H
+
+
+#ifndef LUAT_AIRLINK_H
+#error "include luat_airlink.h first"
+#endif
+
+// bluetooth 操作
+#include "luat_bluetooth.h"
+int luat_airlink_drv_bluetooth_init(luat_bluetooth_t* luat_bluetooth);
+
+// ble 操作
+#include "luat_ble.h"
+#include "luat_bt.h"
+int luat_airlink_drv_ble_uuid_swap(uint8_t* uuid_data, luat_ble_uuid_type uuid_type);
+
+int luat_airlink_drv_ble_init(luat_ble_t* luat_ble, luat_ble_cb_t luat_ble_cb);
+
+int luat_airlink_drv_ble_deinit(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_set_name(luat_ble_t* luat_ble, char* name, uint8_t len);
+
+int luat_airlink_drv_ble_set_max_mtu(luat_ble_t* luat_ble, uint16_t max_mtu);
+
+// advertise
+int luat_airlink_drv_ble_create_advertising(luat_ble_t* luat_ble, luat_ble_adv_cfg_t* adv_cfg);
+
+int luat_airlink_drv_ble_set_adv_data(luat_ble_t* luat_ble, uint8_t* adv_buff, uint8_t adv_len);
+
+int luat_airlink_drv_ble_set_scan_rsp_data(luat_ble_t* luat_ble, uint8_t* rsp_data, uint8_t rsp_len);
+
+int luat_airlink_drv_ble_start_advertising(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_stop_advertising(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_delete_advertising(luat_ble_t* luat_ble);
+
+// gatt
+int luat_airlink_drv_ble_create_gatt(luat_ble_t* luat_ble, luat_ble_gatt_service_t* luat_ble_gatt_service);
+
+// slaver
+int luat_airlink_drv_ble_read_response_value(luat_ble_t* luat_ble, uint8_t conn_idx, uint16_t service_id, uint16_t att_handle, uint8_t *data, uint32_t len);
+
+int luat_airlink_drv_ble_write_notify_value(luat_ble_t* luat_ble, uint8_t conn_idx, uint16_t service_id, uint16_t att_handle, uint8_t *data, uint16_t len);
+
+// scanning
+int luat_airlink_drv_ble_create_scanning(luat_ble_t* luat_ble, luat_ble_scan_cfg_t* scan_cfg);
+
+int luat_airlink_drv_ble_start_scanning(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_stop_scanning(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_delete_scanning(luat_ble_t* luat_ble);
+
+#endif

+ 407 - 0
components/airlink/src/driver/luat_airlink_drv_bluetooth.c

@@ -0,0 +1,407 @@
+#include "luat_base.h"
+#include "luat_airlink.h"
+
+
+#include "luat_rtos.h"
+#include "luat_debug.h"
+#include "luat_bluetooth.h"
+#include "luat_ble.h"
+#include "luat_bt.h"
+#include "luat_mem.h"
+
+#define LUAT_LOG_TAG "airlink"
+#include "luat_log.h"
+
+#undef LLOGD
+#define LLOGD(...) 
+
+int luat_airlink_drv_bluetooth_init(luat_bluetooth_t* luat_bluetooth) {
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_bluetooth_t) + sizeof(luat_ble_t) + sizeof(luat_bt_t)+ sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_bluetooth, sizeof(luat_bluetooth_t));
+
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_uuid_swap(uint8_t* uuid_data, luat_ble_uuid_type uuid_type)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    uint8_t uuid_len = 0;
+    if(uuid_type == LUAT_BLE_UUID_TYPE_16){
+        uuid_len = 2;
+    }else if(uuid_type == LUAT_BLE_UUID_TYPE_32){
+        uuid_len = 4;
+    }else if(uuid_type == LUAT_BLE_UUID_TYPE_128){
+        uuid_len = 16;
+    }else{
+        return -101;
+    }
+
+    airlink_queue_item_t item = {
+        .len = uuid_len + 1 + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x510, item.len);
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    // memcpy(cmd->data + 8, &uuid_data, uuid_len);
+    // memcpy(cmd->data + uuid_len+ 8, &uuid_len, 1·);
+    uint8_t* data = cmd->data + 8;
+    data[0] = *uuid_data;
+    data[1] = uuid_type;
+    // memcpy(cmd->data + uuid_len + 8, &uuid_type, 1);
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+// struct luat_ble{
+//     luat_ble_actv_state state;
+//     luat_ble_cb_t cb;
+//     int lua_cb;
+//     int ble_ref;
+//     void* userdata;
+// };
+int luat_airlink_drv_ble_init(luat_ble_t* luat_ble, luat_ble_cb_t luat_ble_cb) {;
+    LLOGE("luat_airlink_drv_ble_init luat_ble_cb %d", luat_ble_cb);
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(void *) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x511, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    cmd->func[0] = luat_ble_cb;
+    item.cmd = cmd;
+
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+};
+
+int luat_airlink_drv_ble_deinit(luat_ble_t* luat_ble)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x512, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_set_name(luat_ble_t* luat_ble, char* name, uint8_t len)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + len + 1 + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x513, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    memcpy(cmd->data + sizeof(luat_ble_t) + 8, &name, len);
+    memcpy(cmd->data + sizeof(luat_ble_t) + len + 8, &len, 1);
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_set_max_mtu(luat_ble_t* luat_ble, uint16_t max_mtu)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + 1 + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x514, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    memcpy(cmd->data + sizeof(luat_ble_t) + 8, &max_mtu, 1);
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+// advertise
+int luat_airlink_drv_ble_create_advertising(luat_ble_t* luat_ble, luat_ble_adv_cfg_t* adv_cfg)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t)  + sizeof(luat_ble_adv_cfg_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x515, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    memcpy(cmd->data + sizeof(luat_ble_t) + 8, adv_cfg, sizeof(luat_ble_adv_cfg_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_set_adv_data(luat_ble_t* luat_ble, uint8_t* adv_buff, uint8_t adv_len)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + adv_len + 1 + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x516, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    memcpy(cmd->data + sizeof(luat_ble_t) + 8, &adv_buff, adv_len);
+    memcpy(cmd->data + sizeof(luat_ble_t) + adv_len + 8, &adv_len, 1);
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_set_scan_rsp_data(luat_ble_t* luat_ble, uint8_t* rsp_data, uint8_t rsp_len)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + rsp_len + 1 + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x517, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    memcpy(cmd->data + sizeof(luat_ble_t) + 8, &rsp_data, rsp_len);
+    memcpy(cmd->data + sizeof(luat_ble_t) + rsp_len + 8, &rsp_len, 1);
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_start_advertising(luat_ble_t* luat_ble)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x518, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_stop_advertising(luat_ble_t* luat_ble)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x519, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_delete_advertising(luat_ble_t* luat_ble)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x51a, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+// struct luat_ble_gatt_chara{
+//     uint16_t handle;
+//     uint8_t uuid[16];
+//     luat_ble_uuid_type uuid_type;
+//     uint16_t perm;
+//     uint16_t max_size;
+// };
+
+// typedef struct {
+//     uint8_t uuid[16];
+//     luat_ble_uuid_type uuid_type;
+//     luat_ble_gatt_chara_t* characteristics; // characteristics
+//     uint8_t characteristics_num;            // number of characteristics
+// }luat_ble_gatt_service_t;
+
+// gatt
+int luat_airlink_drv_ble_create_gatt(luat_ble_t* luat_ble, luat_ble_gatt_service_t* luat_ble_gatt_service)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(luat_ble_gatt_chara_t) * luat_ble_gatt_service->characteristics_num + sizeof(luat_ble_gatt_chara_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x51b, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    memcpy(cmd->data + sizeof(luat_ble_t) + 8, luat_ble_gatt_service, sizeof(luat_ble_gatt_service_t));
+    memcpy(cmd->data + sizeof(luat_ble_t) + sizeof(luat_ble_gatt_service_t) + 8, luat_ble_gatt_service->characteristics, sizeof(luat_ble_gatt_chara_t) * luat_ble_gatt_service->characteristics_num);
+
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+// slaver
+int luat_airlink_drv_ble_read_response_value(luat_ble_t* luat_ble, uint8_t conn_idx, uint16_t service_id, uint16_t att_handle, uint8_t *data, uint32_t len)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + 5 + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x51c, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    uint8_t* p = cmd->data + sizeof(luat_ble_t) + 8;
+    p[0] = conn_idx;
+    p[1] = service_id;
+    p[2] = att_handle;
+    p[3] = *data;
+    p[4] = len;
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_write_notify_value(luat_ble_t* luat_ble, uint8_t conn_idx, uint16_t service_id, uint16_t att_handle, uint8_t *data, uint16_t len)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + 5 + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x51d, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    uint8_t* p = cmd->data + sizeof(luat_ble_t) + 8;
+    p[0] = conn_idx;
+    p[1] = service_id;
+    p[2] = att_handle;
+    p[3] = *data;
+    p[4] = len;
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+// scanning
+int luat_airlink_drv_ble_create_scanning(luat_ble_t* luat_ble, luat_ble_scan_cfg_t* scan_cfg)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(luat_ble_scan_cfg_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x51e, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    memcpy(cmd->data + sizeof(luat_ble_t) + 8, scan_cfg, sizeof(luat_ble_scan_cfg_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_start_scanning(luat_ble_t* luat_ble)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x51f, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_stop_scanning(luat_ble_t* luat_ble)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x520, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_ble_delete_scanning(luat_ble_t* luat_ble)
+{
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_ble_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x521, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, luat_ble, sizeof(luat_ble_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}

+ 166 - 0
components/airlink/src/exec/luat_airlink_cmd_exec_bluetooth.c

@@ -0,0 +1,166 @@
+#include "luat_base.h"
+#include "luat_airlink.h"
+#include "luat_bluetooth.h"
+#include "luat_ble.h"
+#include "luat_bt.h"
+
+#include "luat_rtos.h"
+#include "luat_debug.h"
+#include "luat_netdrv.h"
+#include "luat_mem.h"
+#include "luat_msgbus.h"
+
+#define LUAT_LOG_TAG "airlink.ble"
+#include "luat_log.h"
+
+extern void luat_ble_cb(luat_ble_t* luat_ble, luat_ble_event_t ble_event, luat_ble_param_t* ble_param);
+
+int luat_airlink_cmd_exec_bluetooth_init(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_bluetooth_t *luat_bluetooth = (luat_bluetooth_t *)(cmd->data + 8);
+    int ret = luat_bluetooth_init(luat_bluetooth);
+    LLOGE("luat_airlink_cmd_exec_bluetooth_init ret=%d", ret);
+    return ret;
+}
+
+int luat_airlink_cmd_exec_ble_uuid_swap(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    uint8_t* uuid_data = cmd->data[8];
+    uint8_t uuid_len = cmd->data[9];
+
+    LLOGD("luat_airlink_cmd_exec_ble_uuid_swap");
+    return 0;
+}
+
+int luat_airlink_cmd_exec_ble_init(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    luat_ble_cb_t luat_ble_cb = cmd->func[0];
+    luat_ble_init(luat_ble, luat_ble_cb);
+    return 0;
+}
+
+int luat_airlink_cmd_exec_ble_deinit(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    int ret = luat_ble_deinit(luat_ble);
+    return ret;
+}
+
+int luat_airlink_cmd_exec_ble_set_name(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t* luat_ble = (luat_ble_t *)(cmd->data + 8);
+    char* name = (char*)cmd->data[8];
+    uint8_t len = cmd->data[9];
+    int ret = luat_ble_set_name(luat_ble, name, len);
+    return 0;
+}
+
+int luat_airlink_cmd_exec_ble_set_max_mtu(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t* luat_ble = (luat_ble_t *)(cmd->data + 8);
+    uint16_t max_mtu = cmd->data + 8 + sizeof(luat_ble_t);
+    int ret = luat_ble_set_max_mtu(luat_ble, max_mtu);
+    return ret;
+}
+
+// advertise
+int luat_airlink_cmd_exec_ble_create_advertising(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    luat_ble_adv_cfg_t *adv_cfg = (luat_ble_adv_cfg_t *)(cmd->data + 8 + sizeof(luat_ble_t));
+    int ret = luat_ble_create_advertising(luat_ble, adv_cfg);
+    return ret;
+}
+
+int luat_airlink_cmd_exec_ble_set_adv_data(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    return 0;
+}
+
+int luat_airlink_cmd_exec_ble_set_scan_rsp_data(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    return 0;
+}
+
+int luat_airlink_cmd_exec_ble_start_advertising(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    int ret = luat_ble_start_advertising(luat_ble);
+    return ret;
+}
+
+int luat_airlink_cmd_exec_ble_stop_advertising(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    int ret = luat_ble_stop_advertising(luat_ble);
+    return ret;
+}
+
+int luat_airlink_cmd_exec_ble_delete_advertising(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    int ret = luat_ble_delete_advertising(luat_ble);
+    return ret;
+}
+
+// gatt
+int luat_airlink_cmd_exec_ble_create_gatt(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    luat_ble_gatt_service_t *luat_ble_gatt_service = (cmd->data + 8 + sizeof(luat_ble_t));
+    luat_ble_gatt_service->characteristics = (luat_ble_gatt_chara_t*)luat_heap_malloc(sizeof(luat_ble_gatt_chara_t) * luat_ble_gatt_service->characteristics_num);
+    memset(luat_ble_gatt_service->characteristics, 0, sizeof(luat_ble_gatt_chara_t) * luat_ble_gatt_service->characteristics_num);
+    luat_ble_gatt_service->characteristics = (luat_ble_gatt_chara_t*)(cmd->data + 8 + sizeof(luat_ble_t) + sizeof(luat_ble_gatt_service_t));
+    int ret = luat_ble_create_gatt(luat_ble, luat_ble_gatt_service);
+    return ret;
+}
+
+// slaver
+int luat_airlink_cmd_exec_ble_read_response_value(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    uint8_t data[5];
+    memcpy(data, cmd->data + 8 + sizeof(luat_ble_t), 5);
+    int ret = luat_ble_read_response_value(luat_ble, data[0], data[1],data[2], &(data[3]), data[4]);
+    return 0;
+}
+
+int luat_airlink_cmd_exec_ble_write_notify_value(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    uint8_t data[5];
+    memcpy(data, cmd->data + 8 + sizeof(luat_ble_t), 5);
+    int ret = luat_ble_write_notify_value(luat_ble, data[0], data[1],data[2], &(data[3]), data[4]);
+    return 0;
+}
+
+// scanning
+int luat_airlink_cmd_exec_ble_create_scanning(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    luat_ble_scan_cfg_t *scan_cfg = (luat_ble_scan_cfg_t *)(cmd->data + 8 + sizeof(luat_ble_t));
+    int ret = luat_ble_create_scanning(luat_ble, scan_cfg);
+    return ret;
+}
+
+int luat_airlink_cmd_exec_ble_start_scanning(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    int ret = luat_ble_start_scanning(luat_ble);
+    return ret;
+}
+
+int luat_airlink_cmd_exec_ble_stop_scanning(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    int ret = luat_ble_stop_scanning(luat_ble);
+    return ret;
+}
+
+int luat_airlink_cmd_exec_ble_delete_scanning(luat_airlink_cmd_t *cmd, void *userdata)
+{
+    luat_ble_t *luat_ble = (luat_ble_t *)(cmd->data + 8);
+    int ret = luat_ble_delete_scanning(luat_ble);
+    return ret;
+}

+ 45 - 0
components/airlink/src/luat_airlink_cmds.c

@@ -67,6 +67,28 @@ CMD_DEFINE(uart_close);
 CMD_DEFINE(uart_data_cb);
 CMD_DEFINE(uart_sent_cb);
 
+// bluetooth 蓝牙指令,0x500开始
+CMD_DEFINE(bluetooth_init);
+
+CMD_DEFINE(ble_uuid_swap);
+CMD_DEFINE(ble_init);
+CMD_DEFINE(ble_deinit);
+CMD_DEFINE(ble_set_name);
+CMD_DEFINE(ble_set_max_mtu);
+CMD_DEFINE(ble_create_advertising);
+CMD_DEFINE(ble_set_adv_data);
+CMD_DEFINE(ble_set_scan_rsp_data);
+CMD_DEFINE(ble_start_advertising);
+CMD_DEFINE(ble_stop_advertising);
+CMD_DEFINE(ble_delete_advertising);
+CMD_DEFINE(ble_create_gatt);
+CMD_DEFINE(ble_read_response_value);
+CMD_DEFINE(ble_write_notify_value);
+CMD_DEFINE(ble_create_scanning);
+CMD_DEFINE(ble_start_scanning);
+CMD_DEFINE(ble_stop_scanning);
+CMD_DEFINE(ble_delete_scanning);
+
 // PM指令, 0x600开始
 CMD_DEFINE(pm_request);
 CMD_DEFINE(pm_power_ctrl);
@@ -129,6 +151,29 @@ __USER_FUNC_IN_RAM__ const luat_airlink_cmd_reg_t airlink_cmds[] = {
     CMD_REG(0x411, uart_sent_cb),
 #endif
 
+#ifdef LUAT_USE_AIRLINK_EXEC_BLUETOOTH
+    CMD_REG(0x500, bluetooth_init),
+
+    CMD_REG(0x510, ble_uuid_swap),
+    CMD_REG(0x511, ble_init),
+    CMD_REG(0x512, ble_deinit),
+    CMD_REG(0x513, ble_set_name),
+    CMD_REG(0x514, ble_set_max_mtu),
+    CMD_REG(0x515, ble_create_advertising),
+    CMD_REG(0x516, ble_set_adv_data),
+    CMD_REG(0x517, ble_set_scan_rsp_data),
+    CMD_REG(0x518, ble_start_advertising),
+    CMD_REG(0x519, ble_stop_advertising),
+    CMD_REG(0x51a, ble_delete_advertising),
+    CMD_REG(0x51b, ble_create_gatt),
+    CMD_REG(0x51c, ble_read_response_value),
+    CMD_REG(0x51d, ble_write_notify_value),
+    CMD_REG(0x51e, ble_create_scanning),
+    CMD_REG(0x51f, ble_start_scanning),
+    CMD_REG(0x520, ble_stop_scanning),
+    CMD_REG(0x521, ble_delete_scanning),
+#endif
+
 #ifdef LUAT_USE_AIRLINK_EXEC_PM
     CMD_REG(0x600, pm_request),
     CMD_REG(0x601, pm_power_ctrl),

+ 55 - 0
components/bluetooth/src/luat_lib_ble.c

@@ -3,6 +3,9 @@
 #include "luat_rtos.h"
 #include "luat_msgbus.h"
 #include "luat_ble.h"
+#ifdef LUAT_USE_DRV_BLUETOOTH
+#include "luat/drv_bluetooth.h"
+#endif
 
 #include "luat_log.h"
 #define LUAT_LOG_TAG "ble"
@@ -215,7 +218,11 @@ static int l_ble_gatt_create(lua_State* L) {
         }
         lua_pop(L, 1);
     }
+#ifdef LUAT_USE_DRV_BLUETOOTH
+    luat_drv_ble_create_gatt(luat_ble, &luat_ble_gatt_service);
+#else
     luat_ble_create_gatt(luat_ble, &luat_ble_gatt_service);
+#endif
     for (size_t i = 0; i < luat_ble_gatt_service.characteristics_num; i++){
         lua_pushinteger(L, luat_ble_gatt_service.characteristics[i].handle);
     }
@@ -269,7 +276,11 @@ static int l_ble_advertising_create(lua_State* L) {
     }
     lua_pop(L, 1);
 
+#ifdef LUAT_USE_DRV_BLUETOOTH
+    luat_drv_ble_create_advertising(luat_ble, &luat_ble_adv_cfg);
+#else
     luat_ble_create_advertising(luat_ble, &luat_ble_adv_cfg);
+#endif
 
     // 广播内容 (adv data)
     uint8_t adv_data[255] = {0};
@@ -290,7 +301,11 @@ static int l_ble_advertising_create(lua_State* L) {
                         uint8_t adv_type = (uint8_t)luaL_checknumber(L, -1);
                         adv_data[adv_index++] = adv_type;
                         if (adv_type == LUAT_ADV_TYPE_COMPLETE_LOCAL_NAME){
+                        #ifdef LUAT_USE_DRV_BLUETOOTH
+                            luat_drv_ble_set_name(luat_ble, data, len);
+                        #else
                             luat_ble_set_name(luat_ble, data, len);
+                        #endif
                             local_name_set_flag = 1;
                         }
                     }else{
@@ -315,17 +330,29 @@ static int l_ble_advertising_create(lua_State* L) {
 
     if (!local_name_set_flag){
         sprintf_(complete_local_name, "LuatOS_%s", luat_os_bsp());
+    #ifdef LUAT_USE_DRV_BLUETOOTH
+        luat_drv_ble_set_name(luat_ble, complete_local_name, strlen(complete_local_name));
+    #else
         luat_ble_set_name(luat_ble, complete_local_name, strlen(complete_local_name));
+    #endif
     }
 
     /* set adv paramters */
+#ifdef LUAT_USE_DRV_BLUETOOTH
+    luat_drv_ble_set_adv_data(luat_ble, adv_data, adv_index);
+#else
     luat_ble_set_adv_data(luat_ble, adv_data, adv_index);
+#endif
 
     lua_pushstring(L, "rsp_data");
     if (LUA_TSTRING == lua_gettable(L, 2)) {
         uint8_t* rsp_data = luaL_checklstring(L, -1, &len);
         if (len){
+        #ifdef LUAT_USE_DRV_BLUETOOTH
+            luat_drv_ble_set_scan_rsp_data(luat_ble, rsp_data, len);
+        #else
             luat_ble_set_scan_rsp_data(luat_ble, rsp_data, len);
+        #endif
         }
     }
     lua_pop(L, 1);
@@ -338,13 +365,21 @@ end:
 
 static int l_ble_advertising_start(lua_State* L) {
     luat_ble_t* luat_ble = (luat_ble_t *)luaL_checkudata(L, 1, LUAT_BLE_TYPE);
+#ifdef LUAT_USE_DRV_BLUETOOTH
+    lua_pushboolean(L, luat_drv_ble_start_advertising(luat_ble)?0:1);
+#else
     lua_pushboolean(L, luat_ble_start_advertising(luat_ble)?0:1);
+#endif
     return 1;
 }
 
 static int l_ble_advertising_stop(lua_State* L) {
     luat_ble_t* luat_ble = (luat_ble_t *)luaL_checkudata(L, 1, LUAT_BLE_TYPE);
+#ifdef LUAT_USE_DRV_BLUETOOTH
+    lua_pushboolean(L, luat_drv_ble_stop_advertising(luat_ble)?0:1);
+#else
     lua_pushboolean(L, luat_ble_stop_advertising(luat_ble)?0:1);
+#endif
     return 1;
 }
 
@@ -378,7 +413,11 @@ static int l_ble_read_response_value(lua_State* L) {
         size_t len = 0;
         const char* response_data = luaL_checklstring(L, -1, &len);
         LLOGD("read response conn_idx:%d service_id:%d handle:%d", conn_idx, service_id, handle);
+    #ifdef LUAT_USE_DRV_BLUETOOTH
+        int ret = luat_drv_ble_read_response_value(luat_ble, conn_idx, service_id, handle, (uint8_t *)response_data, len);
+    #else
         int ret = luat_ble_read_response_value(luat_ble, conn_idx, service_id, handle, (uint8_t *)response_data, len);
+    #endif
         lua_pushboolean(L, ret==0?1:0);
         return 1;
     }
@@ -417,7 +456,11 @@ static int l_ble_write_notify(lua_State* L) {
         size_t len = 0;
         const char* value = luaL_checklstring(L, -1, &len);
         // LLOGD("read response conn_idx:%d service_id:%d handle:%d", conn_idx, service_id, handle);
+    #ifdef LUAT_USE_DRV_BLUETOOTH
+        luat_drv_ble_write_notify_value(luat_ble, conn_idx, service_id, handle, (uint8_t *)value, len);
+    #else
         luat_ble_write_notify_value(luat_ble, conn_idx, service_id, handle, (uint8_t *)value, len);
+    #endif
 
         return 1;
     }
@@ -437,19 +480,31 @@ static int l_ble_scanning_create(lua_State* L) {
             .scan_interval = 100,
             .scan_window = 100,
         };
+    #ifdef LUAT_USE_DRV_BLUETOOTH
+        lua_pushboolean(L, luat_drv_ble_create_scanning(luat_ble,&luat_ble_scan_cfg)?0:1);
+    #else
         lua_pushboolean(L, luat_ble_create_scanning(luat_ble,&luat_ble_scan_cfg)?0:1);
+    #endif
         return 1;
     }
     return 0;
 }
 static int l_ble_scanning_start(lua_State* L) {
     luat_ble_t* luat_ble = (luat_ble_t *)luaL_checkudata(L, 1, LUAT_BLE_TYPE);
+#ifdef LUAT_USE_DRV_BLUETOOTH
+    lua_pushboolean(L, luat_drv_ble_start_scanning(luat_ble)?0:1);
+#else
     lua_pushboolean(L, luat_ble_start_scanning(luat_ble)?0:1);
+#endif
     return 1;
 }
 
 static int l_ble_scanning_stop(lua_State* L) {
     luat_ble_t* luat_ble = (luat_ble_t *)luaL_checkudata(L, 1, LUAT_BLE_TYPE);
+#ifdef LUAT_USE_DRV_BLUETOOTH
+
+    lua_pushboolean(L, luat_drv_ble_stop_scanning(luat_ble)?0:1);
+#else
     lua_pushboolean(L, luat_ble_stop_scanning(luat_ble)?0:1);
     return 1;
 }

+ 11 - 2
components/bluetooth/src/luat_lib_bluetooth.c

@@ -4,7 +4,9 @@
 #include "luat_msgbus.h"
 #include "luat_bluetooth.h"
 #include "luat_ble.h"
-
+#ifdef LUAT_USE_DRV_BLUETOOTH
+#include "luat/drv_bluetooth.h"
+#endif
 #include "luat_log.h"
 #define LUAT_LOG_TAG "bluetooth"
 
@@ -17,8 +19,11 @@ static int l_bluetooth_create_ble(lua_State* L) {
     luat_bluetooth_t* luat_bluetooth = (luat_bluetooth_t *)luaL_checkudata(L, 1, LUAT_BLUETOOTH_TYPE);
 
     luat_bluetooth->luat_ble = (luat_ble_t*)lua_newuserdata(L, sizeof(luat_ble_t));
-
+#ifdef LUAT_USE_DRV_BLUETOOTH
+    luat_drv_ble_init(luat_bluetooth->luat_ble, luat_ble_cb);
+#else
     luat_ble_init(luat_bluetooth->luat_ble, luat_ble_cb);
+#endif
 
     if (lua_isfunction(L, 2)) {
 		lua_pushvalue(L, 2);
@@ -37,7 +42,11 @@ static int l_bluetooth_create_ble(lua_State* L) {
 static int l_bluetooth_init(lua_State* L) {
     luat_bluetooth_t* luat_bluetooth = (luat_bluetooth_t*)lua_newuserdata(L, sizeof(luat_bluetooth_t));
     if (luat_bluetooth) {
+    #ifdef LUAT_USE_DRV_BLUETOOTH
+        luat_drv_bluetooth_init(luat_bluetooth);
+    #else
         luat_bluetooth_init(luat_bluetooth);
+    #endif
         luaL_setmetatable(L, LUAT_BLUETOOTH_TYPE);
         lua_pushvalue(L, -1);
         luat_bluetooth->bluetooth_ref = luaL_ref(L, LUA_REGISTRYINDEX);

+ 51 - 0
components/drv/include/luat/drv_bluetooth.h

@@ -0,0 +1,51 @@
+
+#ifndef LUAT_DRV_BLUETOOTH_H
+#define LUAT_DRV_BLUETOOTH_H
+
+#include "luat_bluetooth.h"
+#include "luat_ble.h"
+#include "luat_bt.h"
+
+int luat_drv_bluetooth_init(luat_bluetooth_t* luat_bluetooth);
+
+int luat_airlink_drv_ble_uuid_swap(uint8_t* uuid_data, luat_ble_uuid_type uuid_type);
+
+int luat_airlink_drv_ble_init(luat_ble_t* luat_ble, luat_ble_cb_t luat_ble_cb);
+
+int luat_airlink_drv_ble_deinit(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_set_name(luat_ble_t* luat_ble, char* name, uint8_t len);
+
+int luat_airlink_drv_ble_set_max_mtu(luat_ble_t* luat_ble, uint16_t max_mtu);
+
+// advertise
+int luat_airlink_drv_ble_create_advertising(luat_ble_t* luat_ble, luat_ble_adv_cfg_t* adv_cfg);
+
+int luat_airlink_drv_ble_set_adv_data(luat_ble_t* luat_ble, uint8_t* adv_buff, uint8_t adv_len);
+
+int luat_airlink_drv_ble_set_scan_rsp_data(luat_ble_t* luat_ble, uint8_t* rsp_data, uint8_t rsp_len);
+
+int luat_airlink_drv_ble_start_advertising(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_stop_advertising(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_delete_advertising(luat_ble_t* luat_ble);
+
+// gatt
+int luat_airlink_drv_ble_create_gatt(luat_ble_t* luat_ble, luat_ble_gatt_service_t* luat_ble_gatt_service);
+
+// slaver
+int luat_airlink_drv_ble_read_response_value(luat_ble_t* luat_ble, uint8_t conn_idx, uint16_t service_id, uint16_t att_handle, uint8_t *data, uint32_t len);
+
+int luat_airlink_drv_ble_write_notify_value(luat_ble_t* luat_ble, uint8_t conn_idx, uint16_t service_id, uint16_t att_handle, uint8_t *data, uint16_t len);
+
+// scanning
+int luat_airlink_drv_ble_create_scanning(luat_ble_t* luat_ble, luat_ble_scan_cfg_t* scan_cfg);
+
+int luat_airlink_drv_ble_start_scanning(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_stop_scanning(luat_ble_t* luat_ble);
+
+int luat_airlink_drv_ble_delete_scanning(luat_ble_t* luat_ble);
+
+#endif

+ 110 - 0
components/drv/src/luat_drv_bluetooth.c

@@ -0,0 +1,110 @@
+#include "luat_base.h"
+#include "luat_mem.h"
+#include "luat/drv_bluetooth.h"
+#include "luat_airlink.h"
+#include "luat_bluetooth.h"
+#include "luat_airlink_drv_bluetooth.h"
+
+#define LUAT_LOG_TAG "drv.ble"
+#include "luat_log.h"
+
+#undef LLOGD
+#define LLOGD(...) 
+
+int luat_drv_bluetooth_init(luat_bluetooth_t* luat_bluetooth) {
+    return luat_airlink_drv_bluetooth_init(luat_bluetooth);
+}
+
+int luat_drv_ble_uuid_swap(uint8_t* uuid_data, luat_ble_uuid_type uuid_type)
+{
+    return luat_airlink_drv_ble_uuid_swap(uuid_data, uuid_type);
+}
+
+int luat_drv_ble_init(luat_ble_t* luat_ble, luat_ble_cb_t luat_ble_cb){
+    return luat_airlink_drv_ble_init(luat_ble, luat_ble_cb);
+}
+
+int luat_drv_ble_deinit(luat_ble_t* luat_ble)
+{
+    return luat_airlink_drv_ble_deinit(luat_ble);
+}
+
+int luat_drv_ble_set_name(luat_ble_t* luat_ble, char* name, uint8_t len)
+{
+    return luat_airlink_drv_ble_set_name(luat_ble, name, len);
+}
+
+int luat_drv_ble_set_max_mtu(luat_ble_t* luat_ble, uint16_t max_mtu)
+{
+    return luat_airlink_drv_ble_set_max_mtu(luat_ble, max_mtu);
+}
+
+// advertise
+int luat_drv_ble_create_advertising(luat_ble_t* luat_ble, luat_ble_adv_cfg_t* adv_cfg)
+{
+    return luat_airlink_drv_ble_create_advertising(luat_ble, adv_cfg);
+}
+
+int luat_drv_ble_set_adv_data(luat_ble_t* luat_ble, uint8_t* adv_buff, uint8_t adv_len)
+{
+    return luat_airlink_drv_ble_set_adv_data(luat_ble, adv_buff, adv_len);
+}
+
+int luat_drv_ble_set_scan_rsp_data(luat_ble_t* luat_ble, uint8_t* rsp_data, uint8_t rsp_len)
+{
+    return luat_airlink_drv_ble_set_scan_rsp_data(luat_ble, rsp_data, rsp_len);
+}
+
+int luat_drv_ble_start_advertising(luat_ble_t* luat_ble)
+{
+    return luat_airlink_drv_ble_start_advertising(luat_ble);
+}
+
+int luat_drv_ble_stop_advertising(luat_ble_t* luat_ble)
+{
+    return luat_airlink_drv_ble_stop_advertising(luat_ble);
+}
+
+int luat_drv_ble_delete_advertising(luat_ble_t* luat_ble)
+{
+    return luat_airlink_drv_ble_delete_advertising(luat_ble);
+}
+
+// gatt
+int luat_drv_ble_create_gatt(luat_ble_t* luat_ble, luat_ble_gatt_service_t* luat_ble_gatt_service)
+{
+    return luat_airlink_drv_ble_create_gatt(luat_ble, luat_ble_gatt_service);
+}
+
+// slaver
+int luat_drv_ble_read_response_value(luat_ble_t* luat_ble, uint8_t conn_idx, uint16_t service_id, uint16_t att_handle, uint8_t *data, uint32_t len)
+{
+    return luat_airlink_drv_ble_read_response_value(luat_ble, conn_idx, service_id, att_handle, data, len);
+}
+
+int luat_drv_ble_write_notify_value(luat_ble_t* luat_ble, uint8_t conn_idx, uint16_t service_id, uint16_t att_handle, uint8_t *data, uint16_t len)
+{
+    return luat_airlink_drv_ble_write_notify_value(luat_ble, conn_idx, service_id, att_handle, data, len);
+}
+
+// scanning
+int luat_drv_ble_create_scanning(luat_ble_t* luat_ble, luat_ble_scan_cfg_t* scan_cfg)
+{
+    return luat_airlink_drv_ble_create_scanning(luat_ble, scan_cfg);
+}
+
+
+int luat_drv_ble_start_scanning(luat_ble_t* luat_ble)
+{
+    return luat_airlink_drv_ble_start_scanning(luat_ble);
+}
+
+int luat_drv_ble_stop_scanning(luat_ble_t* luat_ble)
+{
+    return luat_airlink_drv_ble_stop_scanning(luat_ble);
+}
+
+int luat_drv_ble_delete_scanning(luat_ble_t* luat_ble)
+{
+    return luat_airlink_drv_ble_delete_scanning(luat_ble);
+}