上次创建完工程,留了个点灯的尾巴,这次给完成。1 m$ \9 x. X8 j4 a' `
) C+ `+ t+ c# ?+ I 在IOC工程界面添加服务一个服务,会增加一个服务配置的窗口, |' n/ _. i4 ~
0 C `# L, s& @% U2 b
打开SERVER1的配置界面,修改UUID便于手机端辨识,还有Service name。再添加一个特征,也同样修改下UUID和名称,打算控制LED,1个字节的Value就可以。
+ l) B# x8 k9 j. \+ `
9 _4 _0 b& m5 Y3 z$ T: i 完成以上就可以更新代码了。烧录后在手机APP中搜索到XX-STTM32并连接后查看是否有刚才配置的服务和特征
8 ]3 Q0 t' b' _' k
6 z/ H6 l% ?- n* X5 x 到这里完成了一半。因为此时打开写属性,调试信息里并没有输出任何内容,需要手动添加代码。查找工程,可以看到新增加的BLE App代码文件9 G4 q! o+ c: Y: X( M* j5 S
) J8 Q0 M4 B: J% X$ i( b. s 打开ld2.c文件查找相关内容,函数不多,可以很快定位到该服务的事件处理函数如下 c& H9 N0 B. D) y* P1 t
& t- Q# p% _) R2 x P# ~& a
从以上代码能够看出收到服务端的写特征数据时会再调用LD2_Notification(¬ification);函数,同时传入notification结构体,我们要提取的数据也在这个结构体里面。所有找到LD2_Notification函数,添加对playload值的提取和点灯代码。 3 B1 |" O! b5 w# ?, b, a* m7 J" M6 \8 C
e% m$ m: ^4 y; M& y- void LD2_Notification(LD2_NotificationEvt_t *p_Notification)
) Y4 K# z5 X/ v" C% m - {
4 g9 l/ V8 ^; d1 d# G, _% _& w7 m - /* USER CODE BEGIN Service1_Notification_1 */
- D: y0 n; P* q: v - uint8_t value;
6 Z* }0 T) \# l - /* USER CODE END Service1_Notification_1 */# ~: _6 D1 {; A. t
- switch(p_Notification->EvtOpcode) M/ J% Y0 ?" z$ Z3 y
- {
+ I* E% g( E- y# ~, O - /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */
6 z; [! [3 w/ X1 L
! ?. j- X4 M' i% S1 @* e2 X- /* USER CODE END Service1_Notification_Service1_EvtOpcode */3 f% u/ t, n' s* i) _% v. a" X) A
3 z0 U# G, i4 P7 [" n f, ?* @- case LD2_ON_WRITE_EVT:
# Z) s; n+ [* Z+ \) e/ Q - /* USER CODE BEGIN Service1Char1_WRITE_EVT */
. M E k9 w0 c, b- Q9 {5 t7 O" n - value = p_Notification->DataTransfered.p_Payload[0];
6 S6 A& X1 b. J7 _6 X3 B - APP_DBG_MSG(" recv msg %c\n",value);
0 Z2 q: L8 m- q2 M - if(value == '0')" g# X7 v2 J% `: J7 ?
- {
i2 t2 T% b1 {8 d. T - HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_SET);- M, A2 \- g8 A
- }else if(value == '1'){
) x1 B! c8 g5 y# j! H; }* M) @ - HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_RESET);
K; E! v- E3 D+ O% b8 A3 G - }5 a+ G4 k! S% v
- /* USER CODE END Service1Char1_WRITE_EVT */# `7 W' U. h6 \% V2 w
- break;- W7 Q/ E6 |" P* S
- 1 v8 c- M7 T9 @1 F
- default:: C t& [7 m# J% @% c5 B Z$ Q3 |/ y
- /* USER CODE BEGIN Service1_Notification_default */
D& C! A" ^9 F0 h5 O
: I5 X+ z& h* _: e# W% H- /* USER CODE END Service1_Notification_default */
& }. Q( f T3 K+ c$ p0 ? - break;
5 x9 G/ }( v- n; @ - }
8 X( t4 @6 V4 ]0 d( J - /* USER CODE BEGIN Service1_Notification_2 */
* v) ], ~1 X6 y% ?9 Y; Q
& Y+ u& L2 L! d% }- /* USER CODE END Service1_Notification_2 */
& J6 F% }4 U) `9 B3 Q3 l, |/ \ - return;
! V0 }; T- x9 P# c. U - }
复制代码 对于数据的处理,在客户端是支持输入ASCII和HEX格式,所以服务端也就是开发板的代码中要和输入对应。这里使用ASCII来传值。0 z1 `) d& Y: G3 G/ `
在串口调试助手中也打印出来收到的写特征值。如下& B5 S5 u# {3 v8 \! A
2 J; K. Z. j# n7 b 不过倒是有个问题,Service name在手机客户端都显示unknow,一时没找到原因。$ d* c7 X. l: S" u& z8 O* p
% W9 k- t0 t0 y9 u! K s6 R( X/ P
|+ p, e# X& G, [5 Q |
Solved: Re: Naming BLE service on STM32WB - STMicroelectronics Community. B6 F* ?4 W9 o. `5 `
/ C: @, F' A4 S3 G