#include "shell.h" #include <FreeRTOS.h> #include "task.h" #include "board.h" #include "bluetooth.h" #include "conn.h" #if defined(BL702) || defined(BL602) #include "ble_lib_api.h" #elif defined(BL616) #include "btble_lib_api.h" #endif #include "hci_driver.h" #include "bl616_glb.h" #include "ble_cli_cmds.h" #include "rfparam_adapter.h" #include "hci_core.h" static struct bflb_device_s uart0; extern void shell_init_with_task(struct bflb_device_s shell); static int btblecontroller_em_config(void) { extern uint8_t __LD_CONFIG_EM_SEL; volatile uint32_t em_size; em_size = (uint32_t)&__LD_CONFIG_EM_SEL; if (em_size == 0) { GLB_Set_EM_Sel(GLB_WRAM160KB_EM0KB); } else if (em_size == 321024) { GLB_Set_EM_Sel(GLB_WRAM128KB_EM32KB); } else if (em_size == 641024) { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } else { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } return 0; } void bt_enable_cb(int err) { if (!err) { bt_addr_le_t bt_addr; bt_get_local_public_address(&bt_addr); printf("BD_ADDR:(MSB)%02x:%02x:%02x:%02x:%02x:%02x(LSB) \n", bt_addr.a.val[5], bt_addr.a.val[4], bt_addr.a.val[3], bt_addr.a.val[2], bt_addr.a.val[1], bt_addr.a.val[0]); ble_cli_register(); } } int main(void) { board_init(); configASSERT((configMAX_PRIORITIES > 4)); uart0 = bflb_device_get_by_name("uart0"); shell_init_with_task(uart0); /* set ble controller EM Size / btblecontroller_em_config(); / Init rf */ if (0 != rfparam_init(0, NULL, 0)) { printf("PHY RF init failed!\r\n"); return 0; } // Initialize BLE controller #if defined(BL702) || defined(BL602) ble_controller_init(configMAX_PRIORITIES - 1); #else btble_controller_init(configMAX_PRIORITIES - 1); #endif // Initialize BLE Host stack hci_driver_init(); bt_enable(bt_enable_cb); vTaskStartScheduler(); while (1) { } }如何修改运行该代码的单片机能被设备扫描到给出完整代码
时间: 2023-12-06 14:04:22 浏览: 178
该代码是一个基于 FreeRTOS 的蓝牙 BLE 控制器和主机栈的示例程序,需要配合特定的硬件平台才能运行。
要使设备能够被扫描到,需要进行以下步骤:
1. 在 BLE 主机栈初始化完成后,在 bt_enable_cb() 回调函数中调用 bt_le_adv_start() 启动广播,如下所示:
```c
void bt_enable_cb(int err) {
if (!err) {
bt_addr_le_t bt_addr;
bt_get_local_public_address(&bt_addr);
printf("BD_ADDR:(MSB)%02x:%02x:%02x:%02x:%02x:%02x(LSB) \n", bt_addr.a.val[5], bt_addr.a.val[4], bt_addr.a.val[3], bt_addr.a.val[2], bt_addr.a.val[1], bt_addr.a.val[0]);
ble_cli_register(); // 注册 BLE 命令行命令
// 启动广播
bt_le_adv_start(BT_LE_ADV_CONN_NAME, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
}
}
```
其中,ad 和 sd 是广播数据和扫描响应数据,可以根据需求自定义。
2. 在 BLE 主机栈初始化时,需要设置自己的设备名称和服务 UUID,可以在 hci_driver_init() 函数中调用 bt_set_name() 和 bt_gatt_service_register() 进行设置,如下所示:
```c
void hci_driver_init(void)
{
int err;
err = bt_enable(NULL);
if (err) {
printf("Bluetooth init failed (err %d)\n", err);
return;
}
// 设置设备名称
bt_set_name(DEVICE_NAME);
// 注册服务 UUID
err = bt_gatt_service_register(&service);
if (err) {
printf("Failed to register GATT service (err %d)\n", err);
return;
}
}
```
其中,DEVICE_NAME 和 service 是自定义的设备名称和服务 UUID。
3. 如果需要进行配对和加密,可以在 bt_enable_cb() 回调函数中调用 bt_le_set_auto_conn() 设置连接参数,如下所示:
```c
void bt_enable_cb(int err) {
if (!err) {
bt_addr_le_t bt_addr;
bt_get_local_public_address(&bt_addr);
printf("BD_ADDR:(MSB)%02x:%02x:%02x:%02x:%02x:%02x(LSB) \n", bt_addr.a.val[5], bt_addr.a.val[4], bt_addr.a.val[3], bt_addr.a.val[2], bt_addr.a.val[1], bt_addr.a.val[0]);
ble_cli_register(); // 注册 BLE 命令行命令
// 设置连接参数
bt_le_set_auto_conn(&bt_addr, BT_LE_CONN_PARAM_DEFAULT);
// 启动广播
bt_le_adv_start(BT_LE_ADV_CONN_NAME, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
}
}
```
其中,BT_LE_CONN_PARAM_DEFAULT 是连接参数的默认值,可以根据需求进行修改。
完整代码如下:
阅读全文