上次创建完工程,留了个点灯的尾巴,这次给完成。2 k* ]: ]; U3 T% ?5 r4 E
, a [ [; d& F. s4 B2 f 在IOC工程界面添加服务一个服务,会增加一个服务配置的窗口
; j4 U9 x0 u. d5 f } N
9 X7 N5 }+ I" P9 D4 [! N1 l! C
打开SERVER1的配置界面,修改UUID便于手机端辨识,还有Service name。再添加一个特征,也同样修改下UUID和名称,打算控制LED,1个字节的Value就可以。
' y3 m/ Z& A5 L/ |( C, n' s
- g7 F; ~, u2 R* }2 N 完成以上就可以更新代码了。烧录后在手机APP中搜索到XX-STTM32并连接后查看是否有刚才配置的服务和特征
$ m T+ M7 ]* M0 y6 s
' w0 o) m! Y' n; U8 L 到这里完成了一半。因为此时打开写属性,调试信息里并没有输出任何内容,需要手动添加代码。查找工程,可以看到新增加的BLE App代码文件
( E, ?0 C$ t8 ^) n3 m
7 _- O- w$ I! g5 j( V. O
打开ld2.c文件查找相关内容,函数不多,可以很快定位到该服务的事件处理函数如下/ p: L2 k# _: P' g \- t; |
+ l, N Z# s2 y6 O 从以上代码能够看出收到服务端的写特征数据时会再调用LD2_Notification(¬ification);函数,同时传入notification结构体,我们要提取的数据也在这个结构体里面。所有找到LD2_Notification函数,添加对playload值的提取和点灯代码。 6 @$ r6 K% P0 M% g; p4 v5 A
% z8 `& R( w% x0 J8 J; Z
- void LD2_Notification(LD2_NotificationEvt_t *p_Notification)7 ?9 p3 ?4 B) E. `
- {
% {& H* l4 J- Q; ~! b - /* USER CODE BEGIN Service1_Notification_1 */
) }/ H& B4 R3 O- v& C - uint8_t value;
1 c% H8 e5 k+ N8 D: _ - /* USER CODE END Service1_Notification_1 */( d( H7 h D0 G; G! N8 a3 G
- switch(p_Notification->EvtOpcode)
( a+ [, P; I$ I( D/ i0 {5 {- Y) { - {! |' z4 t# y4 c- f9 ~
- /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */
0 o. j# |+ L7 f
) u% a1 A9 o7 K" [! B$ j: q- /* USER CODE END Service1_Notification_Service1_EvtOpcode */
+ y( E( W8 I6 y) @1 z/ f! G
* q* d3 O8 Z* J) o" q9 U- case LD2_ON_WRITE_EVT:
( b/ s* o: |( _* X; p - /* USER CODE BEGIN Service1Char1_WRITE_EVT */
/ F, ~5 Y# S. l& j/ z% ? - value = p_Notification->DataTransfered.p_Payload[0];5 y; X6 L( I7 ^/ w9 m& L0 m
- APP_DBG_MSG(" recv msg %c\n",value);# R* H/ O& i6 r9 V) J2 a
- if(value == '0')$ U9 D# o8 B9 m$ ?! U# `4 v
- {: Y8 C) y( s7 t% i
- HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_SET);* e/ k$ l' j% B/ d. N
- }else if(value == '1'){
" [% s/ D3 R( }; @6 ^ P& } - HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_RESET);
$ D2 D7 e; [ u, J - }
% W! |! f6 S ~8 h3 i- P# C& _ - /* USER CODE END Service1Char1_WRITE_EVT */
* N3 t% E2 ^% G* D9 p0 w - break;4 g5 q t2 G) Q: l4 V1 J
- 8 w. l/ |- k' [) b+ P5 I) F
- default:7 h9 _6 W& M3 j9 o& y. C+ x! i, |
- /* USER CODE BEGIN Service1_Notification_default */! Z- c1 _. A0 n. {8 J' V9 k
1 p$ x( r; }) d4 l! m6 O g5 h- /* USER CODE END Service1_Notification_default */& Y, X/ M) _% U; D1 {' E
- break;: z u# Z# X3 r
- }& K) y7 c; m* R) ]- U0 f
- /* USER CODE BEGIN Service1_Notification_2 */0 a; X0 Q' Z, x& d' A
- % T+ e8 L; d! x. e! f
- /* USER CODE END Service1_Notification_2 */4 J* ]+ Y0 x" Z1 C
- return;
! G6 t1 ~4 N* B# y( U+ ~ - }
复制代码 对于数据的处理,在客户端是支持输入ASCII和HEX格式,所以服务端也就是开发板的代码中要和输入对应。这里使用ASCII来传值。
# [# R" T" O+ O2 T5 @; a 在串口调试助手中也打印出来收到的写特征值。如下
3 ?$ u% s7 m' O, c1 {7 B$ g
/ e1 e: F0 ]$ ~ y8 ?: ?) \
不过倒是有个问题,Service name在手机客户端都显示unknow,一时没找到原因。
: X% G; T+ P$ N2 E' }+ n S" E m4 @3 W: y& y
. o; ^, R( u" ?6 e. c( m# @$ S |
Solved: Re: Naming BLE service on STM32WB - STMicroelectronics Community, Q2 O' r j% Z* i* H
9 j% O7 I' ^# y" h