打印
[STM32WB]

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

[复制链接]
210|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wws2002|  楼主 | 2024-11-21 14:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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数据了。










使用特权

评论回复
沙发
wws2002|  楼主 | 2024-11-21 14:35 | 只看该作者
评估暂告一段了,下面要开始项目的实际设计和调试,如果有成果再来汇报给大家,多谢大家的关注!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

18

帖子

0

粉丝