上次创建完工程,留了个点灯的尾巴,这次给完成。
O$ i; o) l, B+ R. n* n, E
8 @. p0 G" a3 d/ k& c& J( s0 [ 在IOC工程界面添加服务一个服务,会增加一个服务配置的窗口9 {' j9 M0 j0 \+ S) d- b: ]
2 {7 b! f8 H' J! J8 |
打开SERVER1的配置界面,修改UUID便于手机端辨识,还有Service name。再添加一个特征,也同样修改下UUID和名称,打算控制LED,1个字节的Value就可以。
, G' B/ I: x* v7 [1 m8 O
$ o2 p# A# m" T( a4 C# S
完成以上就可以更新代码了。烧录后在手机APP中搜索到XX-STTM32并连接后查看是否有刚才配置的服务和特征- \$ k! Y; b9 r
0 I( Z2 D6 f% W1 W" {( ?8 z5 p 到这里完成了一半。因为此时打开写属性,调试信息里并没有输出任何内容,需要手动添加代码。查找工程,可以看到新增加的BLE App代码文件
" L9 K( I+ Y; E# I( G
7 J% |! ^6 f4 u7 j# M 打开ld2.c文件查找相关内容,函数不多,可以很快定位到该服务的事件处理函数如下3 p% r# C' N* d" u1 C/ C# e6 \
1 S/ w: D" |( \5 t. h' v
从以上代码能够看出收到服务端的写特征数据时会再调用LD2_Notification(¬ification);函数,同时传入notification结构体,我们要提取的数据也在这个结构体里面。所有找到LD2_Notification函数,添加对playload值的提取和点灯代码。 4 h2 E/ b- ?& V, _
$ d+ o# |+ l( X$ L9 l" @+ u8 X
- void LD2_Notification(LD2_NotificationEvt_t *p_Notification)
1 o- w9 e, Y+ }! K- ?0 u - {: ~ \) h) i7 l4 P
- /* USER CODE BEGIN Service1_Notification_1 */! U7 a- a: B9 N7 i
- uint8_t value;/ v, S/ m/ e6 t, M
- /* USER CODE END Service1_Notification_1 */
9 \- D* ]; K: P+ {1 q - switch(p_Notification->EvtOpcode)
- H1 I0 s3 v" N( K - {
( Y4 M0 K7 Q3 o- `7 v - /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */
# l6 P+ E f1 Y3 G - ( }; I& y5 e7 [+ q: S8 t
- /* USER CODE END Service1_Notification_Service1_EvtOpcode */
( f6 v A# }* A7 W. e8 c! o7 u- } - 1 R$ n# Q* G( I' S: `2 w! P
- case LD2_ON_WRITE_EVT:4 l+ X& h0 U, Z2 h) f0 m
- /* USER CODE BEGIN Service1Char1_WRITE_EVT */
% `# e% o3 G1 v2 ` - value = p_Notification->DataTransfered.p_Payload[0];
0 c6 f! q4 c# y' N" P' E0 M i7 ? - APP_DBG_MSG(" recv msg %c\n",value);
, m0 G0 x2 Y7 ?0 i$ y, z - if(value == '0')
( F& n8 ^1 a$ \- [3 G) @0 S! A - {! w Q2 ~* G3 a: g
- HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_SET);6 T, L1 i6 v% O7 {1 }( |6 U/ f
- }else if(value == '1'){
4 @* H9 a* ^) v* @ - HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_RESET);6 |( v, g2 z% b9 k4 C
- }
' M% [2 _# ?- e6 ?3 L0 e- t - /* USER CODE END Service1Char1_WRITE_EVT */
# d( E* ]! V, N- k* ] i0 P3 y - break;; w4 p# M5 i/ L: l6 Y& s
% v7 F- y7 \" ~/ p: A1 h O4 i; T- default:
& p" }; J' J9 Y, L3 x' J5 G+ U. z! g - /* USER CODE BEGIN Service1_Notification_default */* Y2 X: S, D. x
- 7 y8 _3 U6 @" m- c* E
- /* USER CODE END Service1_Notification_default */
! [* S) \, ~4 ^ - break;
! @& T/ L; i* I* p, J - }
' p' i0 G" M! L! a9 ] - /* USER CODE BEGIN Service1_Notification_2 */
0 \" A4 ~8 T) y; W7 l
; i5 L8 }+ x1 c) D( i/ c" M- /* USER CODE END Service1_Notification_2 */: z' X# w: k$ }- U
- return;2 h3 i4 R3 D o/ ` b( W7 g
- }
复制代码 对于数据的处理,在客户端是支持输入ASCII和HEX格式,所以服务端也就是开发板的代码中要和输入对应。这里使用ASCII来传值。0 b4 {" Q3 y( M
在串口调试助手中也打印出来收到的写特征值。如下
+ u8 X4 h2 @5 u' K
& H! q3 D3 G$ Z0 Y( f$ J" D+ w* @ 不过倒是有个问题,Service name在手机客户端都显示unknow,一时没找到原因。
" _8 Q6 g+ |6 u& Z0 h. i1 a2 u& D, {% o
8 Z9 w4 F6 z3 n( B |
Solved: Re: Naming BLE service on STM32WB - STMicroelectronics Community1 o, R* x, I% p s; P
# |' T2 g5 J4 j3 Q3 l8 g