1.介绍
本来这一篇要写活动状态识别,但是下井人员代码有一些问题,所以做了代码迁移,将之前合并的代码迁移到【On-board Sensor Tag Demo】,为什么要迁移到这个例程中,是因为这个例程中有我所需要的各个驱动代码,已经广播例程。
2.代码迁移
本来觉得是一件非常容易的事,但是有一个问题卡了挺久的,就是动态广播,代码中没有对广播内容直接修改的样例,尝试上一篇中的打开再关闭,出现错误。
GAPM_CancelCmd();
APP_FollowSetAdvScanData();
//set_adv_data(&app_adv_info);
HRPS_Setup();
HRPS_StartAdvertisement();
也尝试了许多打开再关闭的办法,比如广播超时后,重置的时候刷新,那么就可以等到超时的时候修改广播中的内容,将超时设置为5S,但是这个方案不行。
当手机连接之后,会重新发起广播,这时候广播包中的内容会被修改,所以尝试模拟手机连接,但是有耦合,故失败。
手机连接和断开的代码:
static int GAPC_ConnectionReqInd(ke_msg_id_t const msg_id, struct gapc_connection_req_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
{
if (ble_env.state != BLE_STATE_CONNECTED)
{
ble_env.conidx = KE_IDX_GET(src_id);
if (ble_env.conidx != GAP_INVALID_CONIDX)
{
ble_env.state = BLE_STATE_CONNECTED;
ble_env.conhdl = param->conhdl;
BDK_BLE_SendConnectionConfirmation();
BDK_BLE_SetServiceState(true);
}
}
return KE_MSG_CONSUMED;
}
static int GAPC_DisconnectInd(ke_msg_id_t const msg_id, struct gapc_disconnect_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
{
if (ble_env.state != BLE_STATE_CONNECTED)
{
return (KE_MSG_CONSUMED);
}
/* Go to the ready state */
ble_env.state = BLE_STATE_READY;
ble_env.conidx = INVALID_DEV_IDX;
/* Disable services for this connection */
BDK_BLE_SetServiceState(false);
return KE_MSG_CONSUMED;
}
最后发现了有一个刷新广播包内容的命令,但是没有相关例程,尝试写了一下,最后写出来了,具体代码如下:
void BDK_BLE_ADV_Refresh(void)
{
if (ble_env.state != BLE_STATE_CONNECTED)
{
struct gapm_update_advertise_data_cmd *cmd1;
cmd1 = KE_MSG_ALLOC(GAPM_UPDATE_ADVERTISE_DATA_CMD, TASK_GAPM, TASK_APP,
gapm_update_advertise_data_cmd);
cmd1->operation = GAPM_UPDATE_ADVERTISE_DATA;
cmd1->adv_data[0] = 1 + ble_env.local_name_len;
cmd1->adv_data[1] = GAP_AD_TYPE_COMPLETE_NAME;
memcpy(&cmd1->adv_data[2], ble_env.local_name, ble_env.local_name_len);
cmd1->adv_data_len = 2 + ble_env.local_name_len;
cmd1->adv_data[cmd1->adv_data_len] = BDK_BLE_MANUFACTURER_ID_LENGTH + ble_env.manu_data_len;
memcpy(&cmd1->adv_data[cmd1->adv_data_len + 1], BDK_BLE_MANUFACTURER_ID, BDK_BLE_MANUFACTURER_ID_LENGTH);
memcpy(&cmd1->adv_data[cmd1->adv_data_len + 1 + BDK_BLE_MANUFACTURER_ID_LENGTH], ble_env.manu_data, ble_env.manu_data_len);
cmd1->adv_data_len += 1 + BDK_BLE_MANUFACTURER_ID_LENGTH + ble_env.manu_data_len;
/* Send the message */
ke_msg_send(cmd1);
}
}
这里要注意一点,当手机连接之后,就不能修改广播包内容,否在会导致错误,所以需要判断一下是否连接中,如果连接中就不要刷新广播内容了。
3.总结
还是对代码不够熟悉,需要多花一些时间对代码进行研究,好在最后找到的最佳的解决办法,坚持不懈很重要!下一篇正式开始活动识别了。