wws2002 发表于 2024-11-21 14:27

【STM32WB09KE测评】+进阶方向+BLE信号强度读取

本帖最后由 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;
其中第三个参数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 == 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 == 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数据了。










wws2002 发表于 2024-11-21 14:35

本帖最后由 wws2002 于 2025-7-22 14:48 编辑

评估暂告一段了,下面要开始项目的实际设计和调试,如果有成果再来汇报给大家,多谢大家的关注!

wws2002 发表于 2025-7-21 09:55

本帖最后由 wws2002 于 2025-7-21 17:35 编辑

增加一个小资料
页: [1]
查看完整版本: 【STM32WB09KE测评】+进阶方向+BLE信号强度读取