上次创建完工程,留了个点灯的尾巴,这次给完成。0 s3 O4 h6 l @/ H' I1 g* O
7 s i' ~& g0 K! _ A. n6 v: } 在IOC工程界面添加服务一个服务,会增加一个服务配置的窗口
/ b I" {. E+ V2 j0 Y9 L0 g
: t. s1 A9 d, m& y 打开SERVER1的配置界面,修改UUID便于手机端辨识,还有Service name。再添加一个特征,也同样修改下UUID和名称,打算控制LED,1个字节的Value就可以。
# U( M8 E( \2 z9 E, Z; I$ e
2 P- ^7 o. s- g/ q: l8 P 完成以上就可以更新代码了。烧录后在手机APP中搜索到XX-STTM32并连接后查看是否有刚才配置的服务和特征1 r( o! O: w' j& x- N
1 |- D, c0 F% W. s" g 到这里完成了一半。因为此时打开写属性,调试信息里并没有输出任何内容,需要手动添加代码。查找工程,可以看到新增加的BLE App代码文件3 ]* n( p$ w, v' q" r
8 O5 D0 @0 v7 S
打开ld2.c文件查找相关内容,函数不多,可以很快定位到该服务的事件处理函数如下
3 e4 f- |. W! F# L
, T/ l# @( u- P8 ? 从以上代码能够看出收到服务端的写特征数据时会再调用LD2_Notification(¬ification);函数,同时传入notification结构体,我们要提取的数据也在这个结构体里面。所有找到LD2_Notification函数,添加对playload值的提取和点灯代码。 7 X. {2 g9 `9 ]% [
% Z) h$ d& W# Y7 w- void LD2_Notification(LD2_NotificationEvt_t *p_Notification)
9 g+ a6 R5 W( U4 X/ k6 ?5 Q - {
3 b6 x! c; Q' A: x - /* USER CODE BEGIN Service1_Notification_1 */4 d5 @) Z8 @8 Y4 y; ?
- uint8_t value;
# y/ v% x( U: K# v* w% T, L - /* USER CODE END Service1_Notification_1 */. |, w1 N3 \' P" B+ ?
- switch(p_Notification->EvtOpcode)' O L0 V x/ P7 V9 Z
- {
8 n) R- e6 R! c0 a - /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */& x: Q2 t' t4 s$ u/ g) ?5 Y9 i3 Z, @
- 0 Z0 l. [. Q: l+ s Z' D
- /* USER CODE END Service1_Notification_Service1_EvtOpcode */
! q! H6 G( O$ O3 E3 @! G - / r8 w; t* E! X8 D5 Z
- case LD2_ON_WRITE_EVT:# L6 p" f/ N* J6 L1 K' O
- /* USER CODE BEGIN Service1Char1_WRITE_EVT */
# ?' n) u, i$ ]& b5 Q# S - value = p_Notification->DataTransfered.p_Payload[0];9 D$ N, T0 D9 L" i# B
- APP_DBG_MSG(" recv msg %c\n",value);5 q. t: G$ j) Y; K6 ?" ~' ?$ ?
- if(value == '0')" e+ S$ f$ b& `
- {0 I& e$ f/ g9 p9 m
- HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_SET);
% }& x9 g; l/ Q& g. e* W - }else if(value == '1'){
0 {3 @4 `1 u# m4 s - HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_RESET);/ S4 o) X' r/ Y( [
- }
1 @. h* W. Q- I0 J* g - /* USER CODE END Service1Char1_WRITE_EVT */& b( f- N9 x/ r* t
- break;) m9 O: h K% L
- ; h6 e1 B! @# C+ s
- default:
3 p) S! p, I3 y5 N- X - /* USER CODE BEGIN Service1_Notification_default */2 i( R3 A% F3 t1 p$ h9 X
- 6 z( g# P+ x$ N9 {. q
- /* USER CODE END Service1_Notification_default */
1 u( ?) y! x# I1 R9 Z4 S9 x - break;9 E2 k* l( z8 r6 P T/ c! {7 q) o4 _
- }
7 Z' H' z7 d# P% L - /* USER CODE BEGIN Service1_Notification_2 */" u# l5 y5 g5 _4 M/ B, i4 X
- ; _ r- i, @7 G- ^5 M6 S3 c" C: o
- /* USER CODE END Service1_Notification_2 */ \ ^/ r$ [0 S4 H/ }: b& a+ s+ C
- return;/ r4 f2 {( r5 Z, r6 L1 N' s( j9 N
- }
复制代码 对于数据的处理,在客户端是支持输入ASCII和HEX格式,所以服务端也就是开发板的代码中要和输入对应。这里使用ASCII来传值。
: a. [! T- w- J$ |2 h; D) Q- `8 { 在串口调试助手中也打印出来收到的写特征值。如下8 K& c" H8 c9 d, [: m6 G- S* O9 M
) u0 N& ^! p1 R8 U. G b
不过倒是有个问题,Service name在手机客户端都显示unknow,一时没找到原因。/ f) p9 }, L2 V" ^1 Q
3 S4 j: ]0 p! o# I$ _5 ^; R3 ^: F, H4 O. B% e
|
Solved: Re: Naming BLE service on STM32WB - STMicroelectronics Community+ b5 M/ _: O4 h- f2 ~