本帖最后由 wws2002 于 2024-11-21 17:26 编辑
书接上回:STM32WB09KE测评】+进阶方向+BLE钥匙功能实验https://bbs.21ic.com/icview-3414504-1-1.html
在实现了利用钥匙端(手机)发送解锁和闭锁指令成功之后,经过摸索和百度,终于实现了读取BLE的RSSI值,主要可以参考这边应用文档:AN5270 STM32WB Bluetooth® Low Energy wireless interface
https://www.st.com/resource/en/application_note/an5270-stm32wb-bluetooth-low-energy-wireless-interface-stmicroelectronics.pdf
详细的解释了读取函数HCI_READ_RSSI 的用法,这里我做了一些弯路,下面一一道来:
HCI_READ_RSSI函数的详细参数:
tBleStatus hci_read_rssi(uint16_t Connection_Handle, int8_t* RSSI) 这个函数在ble_stack_user_cfg.c中定义,一定要留意这个RSSI的数据类型,我开始就定义错了,定义成unit8_t的无符号的了,然后读出来是错的,以为还有什么换算成负的RSSI,经过一番折腾,而且网上有很多文章也是定义的是错误的。后来仔细阅读发现是有符号整型 主要关注两个参数, BLE的连接句柄uint16_t Connection_Handle,返回RSSI的数据,这个是int数据类型,再次强调一下。返回数据没有定义,先不管。
然后还在P2P_SERVER_Notification这个函数中添加代码,在控制接闭锁的同时上报钥匙端的信号强调数据。分析可以看到P2P_SERVER_Notification这个函数的输入参数一个结构体指针:typedef struct
{
P2P_SERVER_OpcodeEvt_t EvtOpcode;
P2P_SERVER_Data_t DataTransfered;
uint16_t ConnectionHandle;
uint16_t AttributeHandle;
uint8_t ServiceInstance;
/* USER CODE BEGIN Service1_NotificationEvt_t */
/* USER CODE END Service1_NotificationEvt_t */
} P2P_SERVER_NotificationEvt_t;
其中第三个参数[size=13.3333px]ConnectionHandle正好是BLE连接的句柄,可以直接适用,在定义一个RSSI返回值就可以了。
在函数开始位置定义RSSI返回值(再次提醒是int8),然后再收到开闭锁指令的位置读取rssi数据并通过串口打印出来(模拟发送给车身锁控单元),详细如下代码。
/* Functions Definition ------------------------------------------------------*/
void P2P_SERVER_Notification(P2P_SERVER_NotificationEvt_t *p_Notification)
{
/* USER CODE BEGIN Service1_Notification_1 */
int8_t RSSI;//定义BLE RSSI返回值
/* USER CODE END Service1_Notification_1 */
switch(p_Notification->EvtOpcode)
{
/* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */
/* USER CODE END Service1_Notification_Service1_EvtOpcode */
case P2P_SERVER_LED_C_READ_EVT:
/* USER CODE BEGIN Service1Char1_READ_EVT */
/* USER CODE END Service1Char1_READ_EVT */
break;
case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT:
/* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */
if(p_Notification->DataTransfered.p_Payload[1] == 0x01)
{
BSP_LED_On(LED_BLUE);
//APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 ON\n");
APP_DBG_MSG("-- P2P APPLICATION SERVER : Key unlocked, Open the door! \n");
hci_read_rssi(p_Notification->ConnectionHandle, &RSSI);//wws
APP_DBG_MSG("--------- P2P APPLICATION SERVER :RSSII: %d ------- \n",RSSI);
P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */
}
if(p_Notification->DataTransfered.p_Payload[1] == 0x00)
{
BSP_LED_Off(LED_BLUE);
//APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 OFF\n");
APP_DBG_MSG("-- P2P APPLICATION SERVER : Key locked Close the Door! \n");
P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */
hci_read_rssi(p_Notification->ConnectionHandle, &RSSI);//wws
APP_DBG_MSG("--------- P2P APPLICATION SERVER :RSSII: %d ------- \n",RSSI);
}
/* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */
break;
case P2P_SERVER_SWITCH_C_NOTIFY_ENABLED_EVT:
/* USER CODE BEGIN Service1Char2_NOTIFY_ENABLED_EVT */
P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_ON;
APP_DBG_MSG("-- P2P APPLICATION SERVER : NOTIFICATION ENABLED\n");
APP_DBG_MSG(" \n\r");
/* USER CODE END Service1Char2_NOTIFY_ENABLED_EVT */
break;
case P2P_SERVER_SWITCH_C_NOTIFY_DISABLED_EVT:
/* USER CODE BEGIN Service1Char2_NOTIFY_DISABLED_EVT */
P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_OFF;
APP_DBG_MSG("-- P2P APPLICATION SERVER : NOTIFICATION DISABLED\n");
APP_DBG_MSG(" \n\r");
/* USER CODE END Service1Char2_NOTIFY_DISABLED_EVT */
break;
default:
/* USER CODE BEGIN Service1_Notification_default */
/* USER CODE END Service1_Notification_default */
break;
}
/* USER CODE BEGIN Service1_Notification_2 */
/* USER CODE END Service1_Notification_2 */
return;
}
void P2P_SERVER_APP_EvtRx(P2P_SERVER_APP_ConnHandleNotEvt_t *p_Notification)
{
/* USER CODE BEGIN Service1_APP_EvtRx_1 */
int8_t RSSI;
/* USER CODE END Service1_APP_EvtRx_1 */
switch(p_Notification->EvtOpcode)
{
/* USER CODE BEGIN Service1_APP_EvtRx_Service1_EvtOpcode */
/* USER CODE END Service1_APP_EvtRx_Service1_EvtOpcode */
case P2P_SERVER_CONN_HANDLE_EVT :
P2P_SERVER_APP_Context.ConnectionHandle = p_Notification->ConnectionHandle;
/* USER CODE BEGIN Service1_APP_CENTR_CONN_HANDLE_EVT */
APP_DBG_MSG("-------------------The BLE KEY connected------------------------\n");
hci_read_rssi(P2P_SERVER_APP_Context.ConnectionHandle, &RSSI);//wws
APP_DBG_MSG("---------WWS2002---------- P2P APPLICATION SERVER :RSSI: %d ------- \n",RSSI);
/* USER CODE END Service1_APP_CENTR_CONN_HANDLE_EVT */
break;
case P2P_SERVER_DISCON_HANDLE_EVT :
APP_DBG_MSG("-------------------The BLE KEY disconnected------------------------\n");
P2P_SERVER_APP_Context.ConnectionHandle = 0xFFFF;
/* USER CODE BEGIN Service1_APP_DISCON_HANDLE_EVT */
P2P_SERVER_APP_LED_BUTTON_context_Init();
/* USER CODE END Service1_APP_DISCON_HANDLE_EVT */
break;
default:
/* USER CODE BEGIN Service1_APP_EvtRx_default */
/* USER CODE END Service1_APP_EvtRx_default */
break;
}
/* USER CODE BEGIN Service1_APP_EvtRx_2 */
/* USER CODE END Service1_APP_EvtRx_2 */
return;
}
然后编译,下载运行,用手机APP连接STM32WB09KE评估板,调试串口可以看到获取的RSSI数据了。
|