BLE p2p_Server和BLE p2p_Client是demo中提供的一对P2P应用,NUCLEO-WBA系列开发板出厂默认搭载BLE p2p_Server固件。
如果要实现完整的BLE p2p_Server和BLE p2p_Client通信,最好有两块WBA开发板,当然WB也可以。
手头恰好有上次评测的NUCLEO-WBA55CG开发板可以和本次评测的NUCLEO-WBA65RI开发板实现P2P通信。


当然p2p_Client端,也可以用软件工具来代替如ST BLE TOOLBOX或其他BLE调试工具。
 

一、关于P2P的介绍
对等互连配置文件(Peer to Peer Profile)是由意法半导体(STMicroelectronics)基于通用属性配置文件(GATT)定义的低功耗配置文件,采用专有的128位UUID。该配置文件广泛用于直接连接场景,定义了对等互连服务器设备(作为GATT服务器)的GATT服务器与采集器设备(作为GATT客户端)——如智能手机、STM32WBA对等互连客户端或对等互连路由器设备——之间的通信机制。
对等互连服务器:
  • 包含对等互连服务,该服务公开了通知与写入两个特征,以建立双向数据通信。
  • 作为GATT服务器运行。

     
采集器:
  • 访问对等互连服务器公开的信息,通过写入特征控制设备,并接收其通知。
  • 作为GATT客户端运行。

二、搭建环境
按照默认STM32cuteMX默认安装地址,2个demo源码可以在以下路径获得:

C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_WBA_V1.7.0\Projects\NUCLEO-WBA55CG\Applications\BLE\BLE_p2pClient
C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_WBA_V1.7.0\Projects\NUCLEO-WBA65RI\Applications\BLE\BLE_p2pServer

NUCLEO-WBA65RI已默认安装了BLE_p2pServer固件,可以直接使用。
NUCLEO-WBA55CG需要重新编译烧录BLE_p2pClient固件。
 


三、测试运行
P2P Service定义的服务和2个特征值LED、SWITCH:

Service
Characteristic
Mode
UUID
sizee
P2P Service
0000FE40-cc7a-482a-984a-7f2ed5b3e58f
LED
Write without Response/Read
0000FE41-8e22-4541-9d4c-21edae82ed19
2
SWITCH
Notify
0000FE42-8e22-4541-9d4c-21edae82ed19
2



LED 特征值:

Peer to Peer Service - LED Characteristic
Byte Index
0
1
Name
LED Selection
LED Level
Value
0x01: Blue LED
0x00: LED off
0x01: LED on

当特征值写入0x0100时,LED熄灭,写入0x0101时,LED点亮

SWITCH特征值(按键B1):

Peer to Peer Service - SWITCH Characteristic
Byte Index
0
1
Name
Button Selection
Status
Value
0x01: button 1
0x00 or 0x01

按下B1键,向p2p_Client端交替发送0x0100或0x01001,
p2p_Client在收到0x0100时熄灭本地LED,在收到0x0101时点亮本地LED


完整的交互关系:




四、源码分析

1、写入LED特征值处理
p_Payload第2为0x01,点亮LED,为0x00,熄灭LED

复制

 
  1.     case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT:
  2.       /* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */
  3.       if(p_Notification->DataTransfered.p_Payload[1] == 0x01)
  4.       {
  5.         #if (CFG_LED_SUPPORTED == 1)
  6.         BSP_LED_On(LED_BLUE);
  7.         #endif
  8.         LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n");
  9.         P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */
  10.       }
  11.       if(p_Notification->DataTransfered.p_Payload[1] == 0x00)
  12.       {
  13.         #if (CFG_LED_SUPPORTED == 1)
  14.         BSP_LED_Off(LED_BLUE);
  15.         #endif
  16.         LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n");
  17.         P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */
  18.       }


2、SWITCH NOTIFY处理
Sequencer中注册CFG_TASK_SEND_NOTIF_ID事件处理函数

复制

 
  1. UTIL_SEQ_RegTask( 1U << CFG_TASK_SEND_NOTIF_ID, UTIL_SEQ_RFU, P2P_SERVER_Switch_c_SendNotification);
复制

 
  1. __USED void P2P_SERVER_Switch_c_SendNotification(void) /* Property Notification */
  2. {
  3.   P2P_SERVER_APP_SendInformation_t notification_on_off = Switch_c_NOTIFICATION_OFF;
  4.   P2P_SERVER_Data_t p2p_server_notification_data;
  5.   p2p_server_notification_data.p_Payload = (uint8_t*)a_P2P_SERVER_UpdateCharData;
  6.   p2p_server_notification_data.Length = 0;
  7.   /* USER CODE BEGIN Service1Char2_NS_1 */
  8.   if(P2P_SERVER_APP_Context.ButtonControl.ButtonStatus == 0x00)
  9.   {
  10.     P2P_SERVER_APP_Context.ButtonControl.ButtonStatus = 0x01;
  11.   }
  12.   else
  13.   {
  14.     P2P_SERVER_APP_Context.ButtonControl.ButtonStatus = 0x00;
  15.   }
  16.   a_P2P_SERVER_UpdateCharData[0] = 0x01; /* Device Led selection */
  17.   a_P2P_SERVER_UpdateCharData[1] = P2P_SERVER_APP_Context.ButtonControl.ButtonStatus;
  18.   /* Update notification data length */
  19.   p2p_server_notification_data.Length = (p2p_server_notification_data.Length) + 2;
  20.   if(P2P_SERVER_APP_Context.Switch_c_Notification_Status == Switch_c_NOTIFICATION_ON)
  21.   {
  22.     LOG_INFO_APP("-- P2P APPLICATION SERVER : INFORM CLIENT BUTTON 1 PUSHED\n");
  23.     notification_on_off = Switch_c_NOTIFICATION_ON;
  24.   }
  25.   else
  26.   {
  27.     LOG_INFO_APP("-- P2P APPLICATION SERVER : CAN'T INFORM CLIENT - NOTIFICATION DISABLED\n");
  28.   }
  29.   /* USER CODE END Service1Char2_NS_1 */
  30.   if (notification_on_off != Switch_c_NOTIFICATION_OFF)
  31.   {
  32.     P2P_SERVER_UpdateValue(P2P_SERVER_SWITCH_C, &p2p_server_notification_data);
  33.   }
  34.   /* USER CODE BEGIN Service1Char2_NS_Last */
  35.   /* USER CODE END Service1Char2_NS_Last */
  36.   return;
  37. }


---------------------
作者:sujingliang
链接:https://bbs.21ic.com/icview-3498606-1-1.html?_dsign=4ac8408d
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐