Files
99_7018_lmx/apps/earphone/xtell_Sensor/client_handler.c
2025-12-02 19:13:01 +08:00

1570 lines
48 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "system/app_core.h"
#include "system/includes.h"
#include "app_config.h"
#include "app_action.h"
#include "btstack/btstack_task.h"
#include "btstack/bluetooth.h"
#include "user_cfg.h"
#include "vm.h"
#include "btcontroller_modules.h"
#include "bt_common.h"
#include "le_client_demo.h"
#include "le_common.h"
#include "ble_user.h"
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_WIRELESS_MIC_CLIENT)
#define SUPPORT_TEST_BOX_BLE_MASTER_TEST_EN 0
#define SHOW_RX_DATA_RATE 1
#define SHOW_TX_DATA_RATE 1
#if LE_DEBUG_PRINT_EN
/* #define log_info printf */
#define log_info(x, ...) printf("[LE_CLIENT]" x " ", ## __VA_ARGS__)
#define log_info_hexdump put_buf
#else
#define log_info(...)
#define log_info_hexdump(...)
#endif
//------
#define ATT_LOCAL_MTU_SIZE (517) //note: need >= 20
#define ATT_SEND_CBUF_SIZE (200)//(256)//(512*10) //note: need >= 20,缓存大小,可修改
#define ATT_RAM_BUFSIZE (ATT_CTRL_BLOCK_SIZE + ATT_LOCAL_MTU_SIZE + ATT_SEND_CBUF_SIZE) //note:
static u8 att_ram_buffer[ATT_RAM_BUFSIZE] __attribute__((aligned(4)));
#define SEARCH_PROFILE_BUFSIZE (512) //note:
static u8 search_ram_buffer[SEARCH_PROFILE_BUFSIZE] __attribute__((aligned(4)));
#define scan_buffer search_ram_buffer
//---------------
//搜索类型
#define SET_SCAN_TYPE SCAN_ACTIVE
//搜索 周期大小, 参数一320 参数二320 参数三168
#define SET_SCAN_INTERVAL 320//48//256//48 //(unit:0.625ms) 96没有干扰的情况下 连接速度为60ms, 如需要降低功耗, 可以在+16的倍数
//搜索 窗口大小 参数一102 参数二70 参数三30
#define SET_SCAN_WINDOW 70//48//24//48 //(unit:0.625ms)
//连接周期
#define SET_CONN_INTERVAL 3 //(unit:1.25ms)
//连接latency
#define SET_CONN_LATENCY 0 //(unit:conn_interval)
//连接超时
#define SET_CONN_TIMEOUT 400 //(unit:10ms)
#if WIRELESS_TOOL_BLE_NAME_EN
#define TEST_BOX_BLE_NAME "W_MIC_01"
#define TEST_BOX_BLE_NAME_LEN (sizeof(TEST_BOX_BLE_NAME)-1)
static u8 *match_name;
#endif
//----------------------------------------------------------------------------
static u8 scan_ctrl_en;
static u8 ble_work_state = 0;
static void (*app_recieve_callback)(void *priv, void *buf, u16 len) = NULL;
static void (*app_ble_state_callback)(void *priv, ble_state_e state) = NULL;
static void (*ble_resume_send_wakeup)(void) = NULL;
static u32 channel_priv;
static hci_con_handle_t con_handle;
#define BLE_VM_HEAD_TAG (0xB95C)
#define BLE_VM_TAIL_TAG (0x5CB9)
struct pair_info_t {
u16 head_tag;
u8 pair_flag;
u8 peer_address_info[7];
u16 tail_tag;
};
static struct pair_info_t conn_pair_info;
static u8 pair_bond_enable = 0;
//-------------------------------------------------------------------------------
typedef struct {
uint16_t read_handle;
uint16_t read_long_handle;
uint16_t write_handle;
uint16_t write_no_respond;
uint16_t notify_handle;
uint16_t indicate_handle;
} target_hdl_t;
//记录handle 使用
static target_hdl_t target_handle;
static opt_handle_t opt_handle_table[OPT_HANDLE_MAX];
static u8 opt_handle_used_cnt;
static u8 force_seach_onoff = 0;
static s8 force_seach_rssi = -127;
static u8 cur_peer_address_info[7];
static u8 flag_specific_adv_name = 0;
static u8 flag_need_judge_rssi = 0;
static u8 flag_specific_sacn = 0;
static void bt_ble_create_connection(u8 *conn_addr, u8 addr_type);
static int bt_ble_scan_enable(void *priv, u32 en);
static int client_write_send(void *priv, u8 *data, u16 len);
static int client_operation_send(u16 handle, u8 *data, u16 len, u8 att_op_type);
#if WIRELESS_TOOL_BLE_NAME_EN
static ble_state_e get_ble_work_state(void);
#else
static void set_ble_work_state(ble_state_e state);
#endif
static void client_create_connection_cannel(void);
//---------------------------------------------------------------------------
#if 1//default
//指定搜索uuid
//指定搜索uuid
static const target_uuid_t default_search_uuid_table[] = {
// for uuid16
// PRIMARY_SERVICE, ae30
// CHARACTERISTIC, ae01, WRITE_WITHOUT_RESPONSE | DYNAMIC,
// CHARACTERISTIC, ae02, NOTIFY,
{
.services_uuid16 = 0xae30,
.characteristic_uuid16 = 0xae01,
.opt_type = ATT_PROPERTY_WRITE_WITHOUT_RESPONSE,
},
{
.services_uuid16 = 0xae30,
.characteristic_uuid16 = 0xae02,
.opt_type = ATT_PROPERTY_NOTIFY,
},
//for uuid128,sample
// PRIMARY_SERVICE, 0000F530-1212-EFDE-1523-785FEABCD123
// CHARACTERISTIC, 0000F531-1212-EFDE-1523-785FEABCD123, NOTIFY,
// CHARACTERISTIC, 0000F532-1212-EFDE-1523-785FEABCD123, WRITE_WITHOUT_RESPONSE | DYNAMIC,
/*
{
.services_uuid16 = 0,
.services_uuid128 = {0x00,0x00,0xF5,0x30 ,0x12,0x12 ,0xEF, 0xDE ,0x15,0x23 ,0x78,0x5F,0xEA ,0xBC,0xD1,0x23} ,
.characteristic_uuid16 = 0,
.characteristic_uuid128 = {0x00,0x00,0xF5,0x31 ,0x12,0x12 ,0xEF, 0xDE ,0x15,0x23 ,0x78,0x5F,0xEA ,0xBC,0xD1,0x23},
.opt_type = ATT_PROPERTY_NOTIFY,
},
{
.services_uuid16 = 0,
.services_uuid128 = {0x00,0x00,0xF5,0x30 ,0x12,0x12 ,0xEF, 0xDE ,0x15,0x23 ,0x78,0x5F,0xEA ,0xBC,0xD1,0x23} ,
.characteristic_uuid16 = 0,
.characteristic_uuid128 = {0x00,0x00,0xF5,0x32 ,0x12,0x12 ,0xEF, 0xDE ,0x15,0x23 ,0x78,0x5F,0xEA ,0xBC,0xD1,0x23},
.opt_type = ATT_PROPERTY_WRITE_WITHOUT_RESPONSE,
},
*/
};
static void default_report_data_deal(att_data_report_t *report_data, target_uuid_t *search_uuid)
{
log_info("report_data:%02x,%02x,%d,len(%d)", report_data->packet_type,
report_data->value_handle, report_data->value_offset, report_data->blob_length);
log_info_hexdump(report_data->blob, report_data->blob_length);
switch (report_data->packet_type) {
case GATT_EVENT_NOTIFICATION: //notify
break;
case GATT_EVENT_INDICATION://indicate
case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT://read
break;
case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT://read long
break;
default:
break;
}
}
static const u8 test_remoter_name1[] = "CM-22222";
// static const u8 test_remoter_name1[] = "AC637N_MX(BLE)";//
/* static const u8 test_remoter_name2[] = "AC630N_HID567(BLE)";// */
static u16 default_client_write_handle;
static u16 test_client_timer = 0;
static const client_match_cfg_t match_dev01 = {
.create_conn_mode = BIT(CLI_CREAT_BY_NAME),
.compare_data_len = sizeof(test_remoter_name1) - 1, //去结束符
.compare_data = test_remoter_name1,
.bonding_flag = 0,
};
/* static const client_match_cfg_t match_dev02 = { */
/* .create_conn_mode = BIT(CLI_CREAT_BY_NAME), */
/* .compare_data_len = sizeof(test_remoter_name2) - 1, //去结束符 */
/* .compare_data = test_remoter_name2, */
/* .bonding_flag = 1, */
/* }; */
static void default_test_write(void)
{
static u32 count = 0;
count++;
int ret = client_operation_send(default_client_write_handle, &count, 16, ATT_OP_WRITE_WITHOUT_RESPOND);
log_info("test_write:%x", ret);
}
static void default_event_callback(le_client_event_e event, u8 *packet, int size)
{
switch (event) {
case CLI_EVENT_MATCH_DEV: {
client_match_cfg_t *match_dev = packet;
log_info("match_name:%s\n", match_dev->compare_data);
}
break;
case CLI_EVENT_MATCH_UUID: {
opt_handle_t *opt_hdl = packet;
if (opt_hdl->search_uuid == &default_search_uuid_table[0]) {
default_client_write_handle = opt_hdl->value_handle;
log_info("match_uuid22\n");
}
}
break;
case CLI_EVENT_SEARCH_PROFILE_COMPLETE:
log_info("CLI_EVENT_SEARCH_PROFILE_COMPLETE\n");
if ((!test_client_timer) && default_client_write_handle) {
log_info("test timer_add\n");
test_client_timer = sys_hi_timer_add(0, default_test_write, 500);
}
break;
case CLI_EVENT_CONNECTED:
break;
case CLI_EVENT_DISCONNECT:
if (test_client_timer) {
sys_timeout_del(test_client_timer);
test_client_timer = 0;
}
default_client_write_handle = 0;
break;
default:
break;
}
}
static const client_conn_cfg_t client_conn_config_default = {
.match_dev_cfg[0] = &match_dev01,
.match_dev_cfg[1] = NULL,
.match_dev_cfg[2] = NULL,
/* .match_dev_cfg[1] = &match_dev02, */
.report_data_callback = default_report_data_deal,
.search_uuid_cnt = (sizeof(default_search_uuid_table) / sizeof(target_uuid_t)),
.search_uuid_table = default_search_uuid_table,
.security_en = 0,
.event_callback = default_event_callback,
};
#endif
//---------------------------------------------------------------------------
static client_conn_cfg_t *client_config = (void *) &client_conn_config_default ;
//----------------------------------------------------------------------------
static const struct conn_update_param_t connection_param_table[] = {
{16, 24, 0, 600},//11
{12, 28, 0, 600},//3.7
{8, 20, 0, 600},
{50, 60, 0, 600},
};
static u8 send_param_index = 3;
static int client_create_connect_api(u8 *addr, u8 addr_type, u8 mode);
static int client_create_cannel_api(void);
//----------------------------------------------------------------------------
static void client_event_report(le_client_event_e event, u8 *packet, int size)
{
if (client_config->event_callback) {
client_config->event_callback(event, packet, size);
}
}
static bool check_device_is_match(u8 info_type, u8 *data, int size)
{
int i;
u8 conn_mode = BIT(info_type);
client_match_cfg_t *cfg;
/* log_info_hexdump(data,size); */
for (i = 0; i < CLIENT_MATCH_CONN_MAX; i++) {
cfg = client_config->match_dev_cfg[i];
if (cfg == NULL) {
continue;
}
/* log_info("cfg = %08x\n",cfg); */
/* log_info_hexdump(cfg,sizeof(client_match_cfg_t)); */
if (cfg->create_conn_mode == conn_mode && size == cfg->compare_data_len) {
log_info("match check\n");
/* log_info_hexdump(data, size); */
/* log_info_hexdump(cfg->compare_data, size); */
if (0 == memcmp(data, cfg->compare_data, cfg->compare_data_len)) {
log_info("match ok\n");
pair_bond_enable = cfg->bonding_flag;
client_event_report(CLI_EVENT_MATCH_DEV, cfg, sizeof(client_match_cfg_t));
return true;
}
}
}
return false;
}
static void conn_pair_vm_do(struct pair_info_t *info, u8 rw_flag)
{
/* return; */
int ret;
int vm_len = sizeof(struct pair_info_t);
log_info("-conn_pair_info vm_do:%d\n", rw_flag);
if (rw_flag == 0) {
ret = syscfg_read(CFG_BLE_MODE_INFO, (u8 *)info, vm_len);
if (!ret) {
log_info("-null--\n");
}
if ((BLE_VM_HEAD_TAG == info->head_tag) && (BLE_VM_TAIL_TAG == info->tail_tag)) {
log_info("-exist--\n");
log_info_hexdump((u8 *)info, vm_len);
} else {
memset(info, 0, vm_len);
info->head_tag = BLE_VM_HEAD_TAG;
info->tail_tag = BLE_VM_TAIL_TAG;
}
} else {
syscfg_write(CFG_BLE_MODE_INFO, (u8 *)info, vm_len);
}
}
//------------------------------------------------------------
static ble_state_e get_ble_work_state(void)
{
return ble_work_state;
}
void clear_bonding_info(void)
{
log_info("client_clear_bonding_info\n");
conn_pair_vm_do(&conn_pair_info, 0);
if (conn_pair_info.pair_flag) {
//del pair bond
memset(&conn_pair_info, 0, sizeof(struct pair_info_t));
conn_pair_vm_do(&conn_pair_info, 1);
#if WIRELESS_PAIR_BONDING
if (get_ble_work_state() == BLE_ST_CREATE_CONN) {
client_create_connection_cannel();
bt_ble_scan_enable(0, 1);
} else if (con_handle) {
ble_disconnect();
}
#endif
}
}
//------------------------------------------------------------
static void set_ble_work_state(ble_state_e state)
{
if (state != ble_work_state) {
log_info("ble_client_work_st:%x->%x\n", ble_work_state, state);
ble_work_state = state;
if (app_ble_state_callback) {
app_ble_state_callback((void *)channel_priv, state);
}
}
}
//-------------------------------------------------------------------------------
static void check_target_uuid_match(search_result_t *result_info)
{
u32 i;
target_uuid_t *t_uuid;
for (i = 0; i < client_config->search_uuid_cnt; i++) {
t_uuid = &client_config->search_uuid_table[i];
if (result_info->services.uuid16) {
if (result_info->services.uuid16 != t_uuid->services_uuid16) {
/* log_info("b1"); */
continue;
}
} else {
if (memcmp(result_info->services.uuid128, t_uuid->services_uuid128, 16)) {
/* log_info("b2"); */
continue;
}
}
if (result_info->characteristic.uuid16) {
if (result_info->characteristic.uuid16 != t_uuid->characteristic_uuid16) {
/* log_info("b3"); */
/* log_info("%d: %04x--%04x",result_info->characteristic.uuid16,t_uuid->characteristic_uuid16); */
continue;
}
} else {
if (memcmp(result_info->characteristic.uuid128, t_uuid->characteristic_uuid128, 16)) {
/* log_info("b4"); */
continue;
}
}
break;//match one
}
if (i >= client_config->search_uuid_cnt) {
return;
}
if (opt_handle_used_cnt >= OPT_HANDLE_MAX) {
log_info("opt_handle is full!!!\n");
return;
}
if ((t_uuid->opt_type & result_info->characteristic.properties) != t_uuid->opt_type) {
log_info("properties not match!!!\n");
return;
}
log_info("match one uuid\n");
opt_handle_t *opt_get = &opt_handle_table[opt_handle_used_cnt++];
opt_get->value_handle = result_info->characteristic.value_handle;
opt_get->search_uuid = t_uuid;
switch (t_uuid->opt_type) {
case ATT_PROPERTY_READ:
target_handle.read_handle = result_info->characteristic.value_handle;
break;
case ATT_PROPERTY_WRITE_WITHOUT_RESPONSE:
target_handle.write_no_respond = result_info->characteristic.value_handle;
break;
case ATT_PROPERTY_WRITE:
target_handle.write_handle = result_info->characteristic.value_handle;
break;
case ATT_PROPERTY_NOTIFY:
target_handle.notify_handle = result_info->characteristic.value_handle;
break;
case ATT_PROPERTY_INDICATE:
target_handle.indicate_handle = result_info->characteristic.value_handle;
break;
default:
break;
}
client_event_report(CLI_EVENT_MATCH_UUID, opt_get, sizeof(opt_handle_t));
}
//操作handle完成 write ccc
static void do_operate_search_handle(void)
{
u16 tmp_16;
u16 i, cur_opt_type;
opt_handle_t *opt_hdl_pt;
log_info("opt_handle_used_cnt= %d\n", opt_handle_used_cnt);
log_info("find target_handle:");
log_info_hexdump(&target_handle, sizeof(target_hdl_t));
if (0 == opt_handle_used_cnt) {
goto opt_end;
}
/* test_send_conn_update();//for test */
for (i = 0; i < opt_handle_used_cnt; i++) {
opt_hdl_pt = &opt_handle_table[i];
cur_opt_type = opt_hdl_pt->search_uuid->opt_type;
switch ((u8)cur_opt_type) {
case ATT_PROPERTY_READ:
if (1) {
tmp_16 = 0x55A2;//fixed
log_info("read_long:%04x\n", opt_hdl_pt->value_handle);
client_operation_send(opt_hdl_pt->value_handle, (u8 *)&tmp_16, 2, ATT_OP_READ_LONG);
} else {
tmp_16 = 0x55A1;//fixed
log_info("read:%04x\n", opt_hdl_pt->value_handle);
client_operation_send(opt_hdl_pt->value_handle, (u8 *)&tmp_16, 2, ATT_OP_READ);
}
break;
case ATT_PROPERTY_NOTIFY:
tmp_16 = 0x01;//fixed
log_info("write_ntf_ccc:%04x\n", opt_hdl_pt->value_handle);
client_operation_send(opt_hdl_pt->value_handle + 1, &tmp_16, 2, ATT_OP_WRITE);
break;
case ATT_PROPERTY_INDICATE:
tmp_16 = 0x02;//fixed
log_info("write_ind_ccc:%04x\n", opt_hdl_pt->value_handle);
client_operation_send(opt_hdl_pt->value_handle + 1, &tmp_16, 2, ATT_OP_WRITE);
break;
default:
break;
}
}
opt_end:
set_ble_work_state(BLE_ST_SEARCH_COMPLETE);
}
//协议栈内部调用
//return: 0--accept,1--reject
int l2cap_connection_update_request_just(u8 *packet, hci_con_handle_t handle)
{
log_info("slave request conn_update:\n-interval_min= %d,\n-interval_max= %d,\n-latency= %d,\n-timeout= %d\n",
little_endian_read_16(packet, 0), little_endian_read_16(packet, 2),
little_endian_read_16(packet, 4), little_endian_read_16(packet, 6));
return 0;
/* return 1; */
}
//协议栈内部调用
void user_client_report_search_result(search_result_t *result_info)
{
if (result_info == (void *) - 1) {
log_info("client_report_search_result finish!!!\n");
do_operate_search_handle();
client_event_report(CLI_EVENT_SEARCH_PROFILE_COMPLETE, 0, 0);
return;
}
log_info("\n*** services, uuid16:%04x,index=%d ***\n", result_info->services.uuid16, result_info->service_index);
log_info("{charactc, uuid16:%04x,index=%d,handle:%04x~%04x,value_handle=%04x}\n",
result_info->characteristic.uuid16, result_info->characteristic_index,
result_info->characteristic.start_handle, result_info->characteristic.end_handle,
result_info->characteristic.value_handle
);
if (!result_info->services.uuid16) {
log_info("######services_uuid128:");
log_info_hexdump(result_info->services.uuid128, 16);
}
if (!result_info->characteristic.uuid16) {
log_info("######charact_uuid128:");
log_info_hexdump(result_info->characteristic.uuid128, 16);
}
check_target_uuid_match(result_info);
}
#if (SHOW_RX_DATA_RATE | SHOW_TX_DATA_RATE)
static u32 client_timer_handle = 0;
static u32 test_rx_data_count;
static u32 test_tx_data_count;
static void client_timer_handler(void)
{
if (!con_handle) {
test_rx_data_count = 0;
test_tx_data_count = 0;
return;
}
if (test_rx_data_count) {
log_info("peer_rssi = %d\n", ble_vendor_get_peer_rssi(con_handle));
/* log_info("\n-ble_data_rate: %d bps-\n", test_rx_data_count * 8); */
log_info("%d bytes receive: %d.%02d KB/s \n", test_rx_data_count, test_rx_data_count / 1000, test_rx_data_count % 1000);
test_rx_data_count = 0;
}
if (test_tx_data_count) {
log_info("peer_rssi = %d\n", ble_vendor_get_peer_rssi(con_handle));
log_info("%d bytes send: %d.%02d KB/s \n", test_tx_data_count, test_tx_data_count / 1000, test_tx_data_count % 1000);
test_tx_data_count = 0;
}
}
static void client_timer_start(void)
{
client_timer_handle = sys_timer_add(NULL, client_timer_handler, 1000);
}
#endif /* SHOW_RX_DATA_RATE | SHOW_TX_DATA_RATE */
static target_uuid_t *get_match_handle_target(u16 handle)
{
for (int i = 0; i < opt_handle_used_cnt; i++) {
if (opt_handle_table[i].value_handle == handle) {
return opt_handle_table[i].search_uuid;
}
}
return NULL;
}
//协议栈内部调用
void user_client_report_data_callback(att_data_report_t *report_data)
{
/* log_info("\n-report_data:type %02x,handle %04x,offset %d,len %d:",report_data->packet_type, */
/* report_data->value_handle,report_data->value_offset,report_data->blob_length); */
/* log_info_hexdump(report_data->blob,report_data->blob_length); */
#if SHOW_RX_DATA_RATE
test_rx_data_count += report_data->blob_length;
#endif /* SHOW_RX_DATA_RATE */
target_uuid_t *search_uuid = get_match_handle_target(report_data->value_handle);
if (client_config->report_data_callback) {
client_config->report_data_callback(report_data, search_uuid);
return;
}
switch (report_data->packet_type) {
case GATT_EVENT_NOTIFICATION://notify
// log_info("\n-notify_rx(%d):",report_data->blob_length);
case GATT_EVENT_INDICATION://indicate
case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT://read
case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT://read long
break;
default:
break;
}
}
// PRIMARY_SERVICE,AE30
/* static const u16 test_services_uuid16 = 0xae30; */
// PRIMARY_SERVICE, 0000F530-1212-EFDE-1523-785FEABCD123
/* static const u8 test_services_uuid128[16] = {0x00,0x00,0xF5,0x30 ,0x12,0x12 ,0xEF, 0xDE ,0x15,0x23 ,0x78,0x5F,0xEA ,0xBC,0xD1,0x23}; */
static void client_search_profile_start(void)
{
opt_handle_used_cnt = 0;
memset(&target_handle, 0, sizeof(target_hdl_t));
user_client_init(con_handle, search_ram_buffer, SEARCH_PROFILE_BUFSIZE);
if (client_config->search_uuid_cnt) {
printf("[debug] %s, %d\n", __FUNCTION__, __LINE__);
ble_op_search_profile_all();
} else {
printf("[debug] %s, %d\n", __FUNCTION__, __LINE__);
user_client_set_search_complete();
}
}
//------------------------------------------------------------
static bool resolve_adv_report(u8 *adv_address, u8 data_length, u8 *data, s8 rssi)
{
u8 i, lenght, ad_type;
u8 *adv_data_pt;
u8 find_remoter = 0;
/* u8 tmp_addr[6]; */
u32 tmp32;
if (check_device_is_match(CLI_CREAT_BY_ADDRESS, adv_address, 6)) {
find_remoter = 1;
}
adv_data_pt = data;
for (i = 0; i < data_length;) {
if (*adv_data_pt == 0) {
/* log_info("analyze end\n"); */
break;
}
lenght = *adv_data_pt++;
if (lenght >= data_length || (lenght + i) >= data_length) {
/*过滤非标准包格式*/
printf("!!!error_adv_packet:");
put_buf(data, data_length);
break;
}
ad_type = *adv_data_pt++;
i += (lenght + 1);
switch (ad_type) {
case HCI_EIR_DATATYPE_FLAGS:
/* log_info("flags:%02x\n",adv_data_pt[0]); */
break;
case HCI_EIR_DATATYPE_MORE_16BIT_SERVICE_UUIDS:
case HCI_EIR_DATATYPE_COMPLETE_16BIT_SERVICE_UUIDS:
case HCI_EIR_DATATYPE_MORE_32BIT_SERVICE_UUIDS:
case HCI_EIR_DATATYPE_COMPLETE_32BIT_SERVICE_UUIDS:
case HCI_EIR_DATATYPE_MORE_128BIT_SERVICE_UUIDS:
case HCI_EIR_DATATYPE_COMPLETE_128BIT_SERVICE_UUIDS:
/* log_info("service uuid:"); */
/* log_info_hexdump(adv_data_pt, lenght - 1); */
break;
case HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME:
case HCI_EIR_DATATYPE_SHORTENED_LOCAL_NAME:
tmp32 = adv_data_pt[lenght - 1];
adv_data_pt[lenght - 1] = 0;;
log_info("remoter_name: %s,rssi:%d\n", adv_data_pt, rssi);
log_info_hexdump(adv_address, 6);
adv_data_pt[lenght - 1] = tmp32;
//-------
#if 0 //无线麦产线通过识别特殊字符串进行近距离连接测试
if (0 == memcmp(adv_data_pt, SPECIFIC_STRING, strlen(SPECIFIC_STRING))) {
flag_specific_adv_name = 1;
flag_need_judge_rssi = 1;
}
if (flag_specific_sacn) {
flag_need_judge_rssi = 1;
}
if (flag_need_judge_rssi) {
flag_need_judge_rssi = 0;
if (rssi + TCFG_WIRELESS_RSSI < 0) {
printf("rssi no satisfy,break");
break;
} else {
printf("rssi satisfy,RSSI = %d", rssi);
if (flag_specific_adv_name) {
find_remoter = 1;
break;
}
}
}
flag_specific_adv_name = 0;
#endif
#if SUPPORT_TEST_BOX_BLE_MASTER_TEST_EN
#if !WIRELESS_TOOL_BLE_NAME_EN
#define TEST_BOX_BLE_NAME "W_MIC_01"
#define TEST_BOX_BLE_NAME_LEN sizeof(TEST_BOX_BLE_NAME)
printf("TEST_BOX_BLE_NAME_LEN=%d", TEST_BOX_BLE_NAME_LEN);
if (0 == memcmp(adv_data_pt, TEST_BOX_BLE_NAME, TEST_BOX_BLE_NAME_LEN)) {
find_remoter = 1;
break;
}
#else
put_buf(match_name, strlen(match_name));
if (lenght == strlen(match_name) + 1) {
printf("TEST_BOX_BLE_NAME_LEN=%d", TEST_BOX_BLE_NAME_LEN);
if (0 == memcmp(adv_data_pt, match_name, lenght - 1)) {
find_remoter = 1;
break;
}
}
#endif
#endif
/* log_info("target name:%s", client_config->compare_data); */
if (check_device_is_match(CLI_CREAT_BY_NAME, adv_data_pt, lenght - 1)) {
find_remoter = 1;
log_info("catch name ok\n");
}
break;
case HCI_EIR_DATATYPE_MANUFACTURER_SPECIFIC_DATA:
if (check_device_is_match(CLI_CREAT_BY_TAG, adv_data_pt, lenght - 1)) {
log_info("get_tag_string!\n");
find_remoter = 1;
}
break;
case HCI_EIR_DATATYPE_APPEARANCE_DATA:
/* log_info("get_class_type:%04x\n",little_endian_read_16(adv_data_pt,0)); */
break;
default:
/* log_info("unknow ad_type:"); */
break;
}
if (find_remoter) {
log_info_hexdump(adv_data_pt, lenght - 1);
}
adv_data_pt += (lenght - 1);
}
return find_remoter;
}
static void client_report_adv_data(adv_report_t *report_pt, u16 len)
{
bool find_remoter;
/* log_info("event_type,addr_type: %x,%x; ",report_pt->event_type,report_pt->address_type); */
/* log_info_hexdump(report_pt->address,6); */
/* log_info("adv_data_display:"); */
/* log_info_hexdump(report_pt->data,report_pt->length); */
// log_info("rssi:%d\n",report_pt->rssi);
#if WIRELESS_PAIR_BONDING
if (conn_pair_info.pair_flag) {
if (report_pt->event_type != 1) {
return;
}
printf("report_add_type == %x", report_pt->address_type);
printf("conn_add_type == %x", conn_pair_info.peer_address_info[0]);
put_buf(report_pt->address, 6);
put_buf(&conn_pair_info.peer_address_info[1], 6);
if (report_pt->address_type == conn_pair_info.peer_address_info[0]
&& 0 == memcmp(&conn_pair_info.peer_address_info[1], report_pt->address, 6)) {
log_info("match bond_dev\n");
find_remoter = 1;
goto just_creat;
} else {
return;
}
}
find_remoter = resolve_adv_report(report_pt->address, report_pt->length, report_pt->data, report_pt->rssi);
just_creat:
#else
find_remoter = resolve_adv_report(report_pt->address, report_pt->length, report_pt->data, report_pt->rssi);
#endif
if (find_remoter) {
if (force_seach_onoff && force_seach_rssi > report_pt->rssi) {
log_info("match but rssi fail!!!:%d,%d\n", force_seach_rssi, report_pt->rssi);
return;
}
log_info("rssi:%d\n", report_pt->rssi);
log_info("\n*********create_connection***********\n");
log_info("***remote type %d,addr:", report_pt->address_type);
log_info_hexdump(report_pt->address, 6);
bt_ble_scan_enable(0, 0);
client_create_connect_api(report_pt->address, report_pt->address_type, 0);
log_info("*create_finish\n");
}
}
static void client_create_connection(u8 *conn_addr, u8 addr_type)
{
struct create_conn_param_t *create_conn_par = scan_buffer;
if (get_ble_work_state() == BLE_ST_CREATE_CONN) {
log_info("already create conn!!!\n");
return;
}
create_conn_par->conn_interval = SET_CONN_INTERVAL;
create_conn_par->conn_latency = SET_CONN_LATENCY;
create_conn_par->supervision_timeout = SET_CONN_TIMEOUT;
memcpy(create_conn_par->peer_address, conn_addr, 6);
create_conn_par->peer_address_type = addr_type;
set_ble_work_state(BLE_ST_CREATE_CONN);
log_info_hexdump(create_conn_par, sizeof(struct create_conn_param_t));
ble_op_create_connection(create_conn_par);
}
static void bt_ble_create_connection(u8 *conn_addr, u8 addr_type)
{
client_create_connection(conn_addr, addr_type);
}
static void client_create_connection_cannel(void)
{
if (get_ble_work_state() == BLE_ST_CREATE_CONN) {
set_ble_work_state(BLE_ST_SEND_CREATE_CONN_CANNEL);
ble_op_create_connection_cancel();
}
}
static int ble_disconnect(void *priv)
{
if (con_handle) {
if (BLE_ST_SEND_DISCONN != get_ble_work_state()) {
log_info(">>>ble send disconnect\n");
set_ble_work_state(BLE_ST_SEND_DISCONN);
ble_op_disconnect(con_handle);
} else {
log_info(">>>ble wait disconnect...\n");
}
return APP_BLE_NO_ERROR;
} else {
return APP_BLE_OPERATION_ERROR;
}
}
static void connection_update_complete_success(u8 *packet)
{
int con_handle, conn_interval, conn_latency, conn_timeout;
conn_interval = hci_subevent_le_connection_update_complete_get_conn_interval(packet);
conn_latency = hci_subevent_le_connection_update_complete_get_conn_latency(packet);
conn_timeout = hci_subevent_le_connection_update_complete_get_supervision_timeout(packet);
log_info("conn_interval = %d\n", conn_interval);
log_info("conn_latency = %d\n", conn_latency);
log_info("conn_timeout = %d\n", conn_timeout);
}
static void cbk_sm_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size)
{
sm_just_event_t *event = (void *)packet;
u32 tmp32;
switch (packet_type) {
case HCI_EVENT_PACKET:
switch (hci_event_packet_get_type(packet)) {
case SM_EVENT_JUST_WORKS_REQUEST:
sm_just_works_confirm(sm_event_just_works_request_get_handle(packet));
log_info("Just Works Confirmed.\n");
break;
case SM_EVENT_PASSKEY_DISPLAY_NUMBER:
log_info_hexdump(packet, size);
memcpy(&tmp32, event->data, 4);
log_info("Passkey display: %06u.\n", tmp32);
break;
}
break;
}
}
static void can_send_now_wakeup(void)
{
/* putchar('E'); */
if (ble_resume_send_wakeup) {
ble_resume_send_wakeup();
}
}
const char *const phy_result[] = {
"None",
"1M",
"2M",
"Coded",
};
static void set_connection_data_length(u16 tx_octets, u16 tx_time)
{
if (con_handle) {
ble_op_set_data_length(con_handle, tx_octets, tx_time);
}
}
static void set_connection_data_phy(u8 tx_phy, u8 rx_phy)
{
if (0 == con_handle) {
return;
}
u8 all_phys = 0;
u16 phy_options = 0;
ble_op_set_ext_phy(con_handle, all_phys, tx_phy, rx_phy, phy_options);
}
static void client_profile_start(u16 con_handle)
{
ble_op_att_send_init(con_handle, att_ram_buffer, ATT_RAM_BUFSIZE, ATT_LOCAL_MTU_SIZE);
set_ble_work_state(BLE_ST_CONNECT);
printf("[debug] %s, %d\n", __FUNCTION__, __LINE__);
if (0 == client_config->security_en) {
printf("[debug] %s, %d\n", __FUNCTION__, __LINE__);
client_search_profile_start();
}
}
/* LISTING_START(packetHandler): Packet Handler */
static void cbk_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size)
{
int mtu;
u32 tmp;
u8 status;
switch (packet_type) {
case HCI_EVENT_PACKET:
switch (hci_event_packet_get_type(packet)) {
/* case DAEMON_EVENT_HCI_PACKET_SENT: */
/* break; */
case ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE:
log_info("ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE\n");
case ATT_EVENT_CAN_SEND_NOW:
can_send_now_wakeup();
break;
case HCI_EVENT_LE_META:
switch (hci_event_le_meta_get_subevent_code(packet)) {
case HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE:
status = hci_subevent_le_enhanced_connection_complete_get_status(packet);
if (status) {
log_info("LE_MASTER CREATE CONNECTION FAIL!!! %0x\n", status);
set_ble_work_state(BLE_ST_DISCONN);
break;
}
con_handle = hci_subevent_le_enhanced_connection_complete_get_connection_handle(packet);
log_info("HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE : 0x%0x\n", con_handle);
log_info("conn_interval = %d\n", hci_subevent_le_enhanced_connection_complete_get_conn_interval(packet));
log_info("conn_latency = %d\n", hci_subevent_le_enhanced_connection_complete_get_conn_latency(packet));
log_info("conn_timeout = %d\n", hci_subevent_le_enhanced_connection_complete_get_supervision_timeout(packet));
client_profile_start(con_handle);
break;
case HCI_SUBEVENT_LE_CONNECTION_COMPLETE:
if (packet[3]) {
log_info("LE_MASTER CREATE CONNECTION FAIL!!! %0x\n", packet[3]);
set_ble_work_state(BLE_ST_DISCONN);
break;
}
con_handle = hci_subevent_le_connection_complete_get_connection_handle(packet);
log_info("HCI_SUBEVENT_LE_CONNECTION_COMPLETE : %0x\n", con_handle);
connection_update_complete_success(packet + 8);
client_profile_start(con_handle);
client_event_report(CLI_EVENT_CONNECTED, packet, size);
#if WIRELESS_PAIR_BONDING
memcpy(cur_peer_address_info, &packet[7], 7);
conn_pair_info.pair_flag = 1;
printf("pair_flag == %d", conn_pair_info.pair_flag);
put_buf(cur_peer_address_info, 7);
memcpy(&conn_pair_info.peer_address_info, cur_peer_address_info, 7);
conn_pair_info.head_tag = BLE_VM_HEAD_TAG;
conn_pair_info.tail_tag = BLE_VM_TAIL_TAG;
conn_pair_vm_do(&conn_pair_info, 1);
#else
if (pair_bond_enable) {
conn_pair_info.pair_flag = 1;
memcpy(&conn_pair_info.peer_address_info, &packet[7], 7);
conn_pair_vm_do(&conn_pair_info, 1);
pair_bond_enable = 0;
}
#endif
break;
case HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE:
log_info("APP HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE\n");
connection_update_complete_success(packet);
client_event_report(CLI_EVENT_CONNECTION_UPDATE, packet, size);
break;
case HCI_SUBEVENT_LE_DATA_LENGTH_CHANGE:
log_info("APP HCI_SUBEVENT_LE_DATA_LENGTH_CHANGE");
break;
case HCI_SUBEVENT_LE_PHY_UPDATE_COMPLETE:
log_info("APP HCI_SUBEVENT_LE_PHY_UPDATE %s\n", hci_event_le_meta_get_phy_update_complete_status(packet) ? "Fail" : "Succ");
log_info("Tx PHY: %s\n", phy_result[hci_event_le_meta_get_phy_update_complete_tx_phy(packet)]);
log_info("Rx PHY: %s\n", phy_result[hci_event_le_meta_get_phy_update_complete_rx_phy(packet)]);
break;
}
break;
case HCI_EVENT_DISCONNECTION_COMPLETE:
log_info("HCI_EVENT_DISCONNECTION_COMPLETE: %0x\n", packet[5]);
con_handle = 0;
ble_op_att_send_init(con_handle, 0, 0, 0);
set_ble_work_state(BLE_ST_DISCONN);
client_event_report(CLI_EVENT_DISCONNECT, packet, size);
//auto to do
#if !WIRELESS_PAIR_BONDING
if (conn_pair_info.pair_flag) {
client_create_connect_api(0, 0, 1);
} else
#endif
{
bt_ble_scan_enable(0, 1);
}
break;
case ATT_EVENT_MTU_EXCHANGE_COMPLETE:
mtu = att_event_mtu_exchange_complete_get_MTU(packet) - 3;
log_info("ATT MTU = %u\n", mtu);
ble_op_att_set_send_mtu(mtu);
break;
case HCI_EVENT_VENDOR_REMOTE_TEST:
log_info("--- HCI_EVENT_VENDOR_REMOTE_TEST\n");
break;
case L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_RESPONSE:
tmp = little_endian_read_16(packet, 4);
log_info("-update_rsp: %02x\n", tmp);
break;
case GAP_EVENT_ADVERTISING_REPORT:
/* putchar('@'); */
client_report_adv_data((void *)&packet[2], packet[1]);
break;
case HCI_EVENT_ENCRYPTION_CHANGE:
log_info("HCI_EVENT_ENCRYPTION_CHANGE= %d\n", packet[2]);
if (client_config->security_en) {
client_search_profile_start();
}
break;
}
break;
}
}
static int get_buffer_vaild_len(void *priv)
{
u32 vaild_len = 0;
ble_op_att_get_remain(&vaild_len);
return vaild_len;
}
static int client_operation_send(u16 handle, u8 *data, u16 len, u8 att_op_type)
{
int ret = APP_BLE_NO_ERROR;
if (!con_handle) {
return APP_BLE_OPERATION_ERROR;
}
if (!handle) {
log_info("handle is null\n");
return APP_BLE_OPERATION_ERROR;
}
if (get_buffer_vaild_len(0) < len) {
/* log_info("opt_buff_full!!!\n"); */
return APP_BLE_BUFF_FULL;
}
ret = ble_op_att_send_data(handle, data, len, att_op_type);
if (ret == BLE_BUFFER_FULL) {
ret = APP_BLE_BUFF_FULL;
} else {
#if SHOW_TX_DATA_RATE
test_tx_data_count += len;
#endif /* SHOW_TX_DATA_RATE */
}
return ret;
}
//-----------------------------------------------
static int client_write_send(void *priv, u8 *data, u16 len)
{
return client_operation_send(target_handle.write_handle, data, len, ATT_OP_WRITE);
}
static int client_write_without_respond_send(void *priv, u8 *data, u16 len)
{
return client_operation_send(target_handle.write_no_respond, data, len, ATT_OP_WRITE_WITHOUT_RESPOND);
}
static int client_read_value_send(void *priv)
{
u16 tmp_flag = 0x55A1;
return client_operation_send(target_handle.read_handle, (u8 *)&tmp_flag, 2, ATT_OP_READ);
}
static int client_read_long_value_send(void *priv)
{
u16 tmp_flag = 0x55A2;
return client_operation_send(target_handle.read_handle, (u8 *)&tmp_flag, 2, ATT_OP_READ_LONG);
}
//扫描数设置
static void scanning_setup_init(void)
{
ble_op_set_scan_param(SET_SCAN_TYPE, SET_SCAN_INTERVAL, SET_SCAN_WINDOW);
}
static int bt_ble_scan_enable(void *priv, u32 en)
{
ble_state_e next_state, cur_state;
if (!scan_ctrl_en && en) {
return APP_BLE_OPERATION_ERROR;
}
if (en) {
next_state = BLE_ST_SCAN;
} else {
next_state = BLE_ST_IDLE;
}
cur_state = get_ble_work_state();
switch (cur_state) {
case BLE_ST_SCAN:
case BLE_ST_IDLE:
case BLE_ST_INIT_OK:
case BLE_ST_NULL:
case BLE_ST_DISCONN:
case BLE_ST_CONNECT_FAIL:
case BLE_ST_SEND_CREATE_CONN_CANNEL:
break;
default:
return APP_BLE_OPERATION_ERROR;
break;
}
if (cur_state == next_state) {
return APP_BLE_NO_ERROR;
}
log_info("scan_en:%d\n", en);
set_ble_work_state(next_state);
if (en) {
scanning_setup_init();
}
ble_op_scan_enable2(en, 0);
return APP_BLE_NO_ERROR;
}
static int client_regiest_wakeup_send(void *priv, void *cbk)
{
/* att_regist_wakeup_send(cbk); */
return APP_BLE_NO_ERROR;
}
static int client_regiest_recieve_cbk(void *priv, void *cbk)
{
channel_priv = (u32)priv;
app_recieve_callback = cbk;
return APP_BLE_NO_ERROR;
}
static int client_regiest_state_cbk(void *priv, void *cbk)
{
channel_priv = (u32)priv;
app_ble_state_callback = cbk;
return APP_BLE_NO_ERROR;
}
//该接口重新配置搜索的配置项
static int client_init_config(void *priv, const client_conn_cfg_t *cfg)
{
log_info("client_init_config\n");
client_config = cfg;//reset config
return APP_BLE_NO_ERROR;
}
//可配置进入强制搜索方式连接,更加信号强度过滤设备
static int client_force_search(u8 onoff, s8 rssi)
{
force_seach_rssi = rssi;
if (force_seach_onoff != onoff) {
force_seach_onoff = onoff;
//强制搜索前后,关创建监听
if (get_ble_work_state() == BLE_ST_CREATE_CONN) {
client_create_connection_cannel();
}
}
return 0;
}
static int client_create_connect_api(u8 *addr, u8 addr_type, u8 mode)
{
u8 cur_state = get_ble_work_state();
switch (cur_state) {
case BLE_ST_SCAN:
case BLE_ST_IDLE:
case BLE_ST_INIT_OK:
case BLE_ST_NULL:
case BLE_ST_DISCONN:
case BLE_ST_CONNECT_FAIL:
case BLE_ST_SEND_CREATE_CONN_CANNEL:
break;
default:
return APP_BLE_OPERATION_ERROR;
break;
}
if (cur_state == BLE_ST_SCAN) {
log_info("stop scan\n");
bt_ble_scan_enable(0, 0);
}
//pair mode
if (mode == 1) {
if (conn_pair_info.pair_flag) {
if (conn_pair_info.pair_flag) {
//有配对,跳过搜索,直接创建init_creat
log_info("pair to creat!\n");
log_info_hexdump(conn_pair_info.peer_address_info, 7);
bt_ble_create_connection(&conn_pair_info.peer_address_info[1], conn_pair_info.peer_address_info[0]);
return 0;
}
} else {
log_info("no pair to creat!\n");
return APP_BLE_OPERATION_ERROR;
}
} else {
log_info("addr to creat!\n");
log_info_hexdump(addr, 7);
bt_ble_create_connection(addr, addr_type);
}
return 0;
}
static int client_create_cannel_api(void)
{
if (get_ble_work_state() == BLE_ST_CREATE_CONN) {
client_create_connection_cannel();
return 0;
}
return 1;
}
static const struct ble_client_operation_t client_operation = {
.scan_enable = bt_ble_scan_enable,
.disconnect = ble_disconnect,
.get_buffer_vaild = get_buffer_vaild_len,
.write_data = (void *)client_write_without_respond_send,
.read_do = (void *)client_read_value_send,
.regist_wakeup_send = client_regiest_wakeup_send,
.regist_recieve_cbk = client_regiest_recieve_cbk,
.regist_state_cbk = client_regiest_state_cbk,
.init_config = client_init_config,
.opt_comm_send = client_operation_send,
.set_force_search = client_force_search,
.create_connect = client_create_connect_api,
.create_connect_cannel = client_create_cannel_api,
.get_work_state = get_ble_work_state,
};
struct ble_client_operation_t *ble_get_client_operation_table(void)
{
return &client_operation;
}
#define PASSKEY_ENTER_ENABLE 0 //输入passkey使能可修改passkey
//重设passkey回调函数在这里可以重新设置passkey
//passkey为6个数字组成十万位、万位。。。。个位 各表示一个数字 高位不够为0
static void reset_passkey_cb(u32 *key)
{
#if 1
u32 newkey = rand32();//获取随机数
newkey &= 0xfffff;
if (newkey > 999999) {
newkey = newkey - 999999; //不能大于999999
}
*key = newkey; //小于或等于六位数
log_info("set new_key= %06u\n", *key);
#else
*key = 123456; //for debug
#endif
}
#if 0
//协议栈内部调用
extern void sm_set_master_request_pair(int enable);
static void ble_sm_setup_init(io_capability_t io_type, u8 auth_req, uint8_t min_key_size, u8 security_en)
{
//setup SM: Display only
sm_init();
sm_set_io_capabilities(io_type);
sm_set_authentication_requirements(auth_req);
sm_set_encryption_key_size_range(min_key_size, 16);
sm_set_master_request_pair(security_en);
sm_event_callback_set(&cbk_sm_packet_handler);
if (io_type == IO_CAPABILITY_DISPLAY_ONLY) {
reset_PK_cb_register(reset_passkey_cb);
}
}
#endif
//协议栈内部调用
void ble_profile_init(void)
{
log_info("ble profile init\n");
le_device_db_init();
ble_stack_gatt_role(1);
//#if PASSKEY_ENTER_ENABLE
// ble_sm_setup_init(IO_CAPABILITY_DISPLAY_ONLY, SM_AUTHREQ_MITM_PROTECTION | SM_AUTHREQ_BONDING, 7, client_config->security_en);
//#else
// ble_sm_setup_init(IO_CAPABILITY_NO_INPUT_NO_OUTPUT, SM_AUTHREQ_MITM_PROTECTION | SM_AUTHREQ_BONDING, 7, client_config->security_en);
//#endif
/* setup ATT client */
gatt_client_init();
gatt_client_register_packet_handler(cbk_packet_handler);
// register for HCI events
hci_event_callback_set(&cbk_packet_handler);
le_l2cap_register_packet_handler(&cbk_packet_handler);
ble_vendor_set_default_att_mtu(ATT_LOCAL_MTU_SIZE);
}
static void device_bonding_init(void)
{
int i;
int cfg_bonding = 0;
client_match_cfg_t *cfg;
for (i = 0; i < CLIENT_MATCH_CONN_MAX; i++) {
cfg = client_config->match_dev_cfg[i];
if (cfg == NULL) {
continue;
}
if (cfg->bonding_flag) {
cfg_bonding = 1;
}
}
if (!cfg_bonding) {
clear_bonding_info();
}
}
static u8 client_idle_query(void)
{
return 0;
}
REGISTER_LP_TARGET(client_user_target) = {
.name = "client_user_demo",
.is_idle = client_idle_query,
};
void bt_ble_init(void)
{
log_info("***** ble_init******\n");
#if WIRELESS_TOOL_BLE_NAME_EN
u8 *config_name;
u8 config_name_len;
#endif
#if (WIRELESS_24G_ENABLE)
rf_set_24g_hackable_coded(WIRELESS_24G_CODE_ID);
#endif
#if WIRELESS_TOOL_BLE_NAME_EN
#if 1 //使用配置工具的蓝牙名
extern const char *bt_get_local_name();
config_name = (u8 *)(bt_get_local_name());
config_name_len = strlen(config_name) + 1;
put_buf(config_name, config_name_len);
printf("len = %d", config_name_len);
#else
config_name = TEST_BOX_BLE_NAME;
config_name_len = sizeof(TEST_BOX_BLE_NAME);
#endif
match_name = (u8 *)zalloc(config_name_len);
memcpy(match_name, config_name, config_name_len);
printf("match_name");
put_buf(match_name, config_name_len);
printf("%s", match_name);
#endif
// if (0 == memcmp(match_name, SPECIFIC_STRING, strlen(SPECIFIC_STRING))) {
// match_name = &match_name[strlen(SPECIFIC_STRING)];
// printf("specific scan%s", match_name);
// flag_specific_sacn = 1;
// }
set_ble_work_state(BLE_ST_INIT_OK);
conn_pair_vm_do(&conn_pair_info, 0);
#if !WIRELESS_PAIR_BONDING
device_bonding_init();
#endif
ble_module_enable(1);
extern void wifi_detect_set_master_first(u8 first);
#if TCFG_WIFI_DETECT_ENABLE
#if TCFG_WIFI_DETCET_PRIOR
wifi_detect_set_master_first(0);
#else
wifi_detect_set_master_first(1);
#endif
#endif
#if (SHOW_RX_DATA_RATE | SHOW_TX_DATA_RATE)
client_timer_start();
#endif /* SHOW_RX_DATA_RATE | SHOW_TX_DATA_RATE */
}
void bt_ble_exit(void)
{
log_info("***** ble_exit******\n");
}
void ble_app_disconnect(void)
{
ble_disconnect(NULL);
}
//统一接口,关闭模块
void bt_ble_adv_enable(u8 enable)
{
ble_module_enable(enable);
}
//模块开关
void ble_module_enable(u8 en)
{
log_info("mode_en:%d\n", en);
if (en) {
scan_ctrl_en = 1;
bt_ble_scan_enable(0, 1);
} else {
if (con_handle) {
scan_ctrl_en = 0;
ble_disconnect(NULL);
} else {
bt_ble_scan_enable(0, 0);
scan_ctrl_en = 0;
}
}
}
void client_send_conn_param_update(void)
{
struct conn_update_param_t *param = (void *)&connection_param_table[send_param_index];//for test
log_info("client update param:-%d-%d-%d-%d-\n", param->interval_min, param->interval_max, param->latency, param->timeout);
if (con_handle) {
ble_op_conn_param_update(con_handle, param);
}
}
//----------------------------------------------------------------------------------
//lmx
void rcsp_adv_fill_mac_addr(u8 *mac_addr_buf)
{
#if (MUTIl_CHARGING_BOX_EN)
u8 *mac_addr = get_chargebox_adv_addr();
if (mac_addr) {
swapX(mac_addr, mac_addr_buf, 6);
}
/* printf("mac_addr:"); */
/* printf_buf(mac_addr_buf, 6); */
#else
swapX(bt_get_mac_addr(), mac_addr_buf, 6);
#endif
}
#endif