上次创建完工程,留了个点灯的尾巴,这次给完成。( e4 a$ X* l! H
- j/ i2 T) R% c& Z' C! H
在IOC工程界面添加服务一个服务,会增加一个服务配置的窗口
0 s6 J$ r6 j: v9 A4 ]! q' X
: T+ P$ _' M. K 打开SERVER1的配置界面,修改UUID便于手机端辨识,还有Service name。再添加一个特征,也同样修改下UUID和名称,打算控制LED,1个字节的Value就可以。' ~9 J. K* J! ]7 _- ?
6 w3 I3 U/ A J" Y( b 完成以上就可以更新代码了。烧录后在手机APP中搜索到XX-STTM32并连接后查看是否有刚才配置的服务和特征
# ~4 f1 [' X, k- [9 g
' w4 G& s- Q) ^0 |+ c) z2 K' ]
到这里完成了一半。因为此时打开写属性,调试信息里并没有输出任何内容,需要手动添加代码。查找工程,可以看到新增加的BLE App代码文件
' ]+ w! R' I) e' \% p3 M1 ?% V& k
: I8 s# Z5 V1 h4 U( X) p, G: J 打开ld2.c文件查找相关内容,函数不多,可以很快定位到该服务的事件处理函数如下
* f7 J6 ]( b: e" R5 _ n6 S
4 L" b( `! k$ w# k
从以上代码能够看出收到服务端的写特征数据时会再调用LD2_Notification(¬ification);函数,同时传入notification结构体,我们要提取的数据也在这个结构体里面。所有找到LD2_Notification函数,添加对playload值的提取和点灯代码。 8 a/ D- b* T6 r6 j. I1 h1 ^
: E& ?9 F2 B0 R- m# X0 f9 C
- void LD2_Notification(LD2_NotificationEvt_t *p_Notification)9 W- L2 O: H C g/ ?& ~
- {
5 K& O) [6 n m' G; |5 X - /* USER CODE BEGIN Service1_Notification_1 */8 R4 j4 S5 c) `1 ~# G [
- uint8_t value;
1 h d I% ~0 ~+ l( H8 ~8 q - /* USER CODE END Service1_Notification_1 */$ B- K4 z: y) A$ d. K n& x# C
- switch(p_Notification->EvtOpcode): |5 R2 R; A2 n* D
- {! s8 E8 m, U k/ m8 p
- /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */
1 T/ s- N( g7 O& Z - 5 g! v: @" C- @( ~3 Z4 e2 p
- /* USER CODE END Service1_Notification_Service1_EvtOpcode */
4 o3 w7 x p: O& Q, x) }3 { - ( i+ ^" _/ l1 Y
- case LD2_ON_WRITE_EVT:
; Q9 b- \! x$ z# R - /* USER CODE BEGIN Service1Char1_WRITE_EVT */4 Z W8 V8 }4 y0 \) e2 i7 _9 _5 ~
- value = p_Notification->DataTransfered.p_Payload[0];
2 a0 ^, P6 d" T2 d% x% f - APP_DBG_MSG(" recv msg %c\n",value);
# M( }7 A' E3 E* D - if(value == '0')
* i+ Q0 w4 ~$ [4 r - {: I: L4 _- u( D
- HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_SET);
/ r a, N" ^$ t( c v0 G, v0 W6 { - }else if(value == '1'){5 t2 R8 O' o) l# H
- HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_RESET);5 G1 o+ d' i! r4 f3 y7 I3 U2 o2 a
- }
3 B0 p. W4 W$ h2 l1 H S" A - /* USER CODE END Service1Char1_WRITE_EVT */
3 M$ t7 @1 W A! P# x$ O K - break;
5 p n+ a0 O- q2 r - 8 Y6 y" r, g( p; i/ }- _
- default:
4 }' K) u8 B# A8 S7 c5 r - /* USER CODE BEGIN Service1_Notification_default */
' M0 W! }0 z( p! A- `* Y - + u7 k. Q+ S2 S4 i: H c
- /* USER CODE END Service1_Notification_default */
9 C/ h. t1 B8 d$ d: [" p - break;$ D* |, Z- c, b( b
- }
. z& z. `& ^; U) ^ - /* USER CODE BEGIN Service1_Notification_2 */
( J& Z2 \1 {1 T5 x - 1 ?5 z7 A9 D, o1 W
- /* USER CODE END Service1_Notification_2 */* B) q, B) Q9 {1 e2 D& `4 p
- return;* g2 G+ G9 ?5 `! Q. ?+ g E- m
- }
复制代码 对于数据的处理,在客户端是支持输入ASCII和HEX格式,所以服务端也就是开发板的代码中要和输入对应。这里使用ASCII来传值。
3 I+ }) g6 d4 V- T+ p$ h! o: I$ T 在串口调试助手中也打印出来收到的写特征值。如下
1 C4 H7 C3 L/ i! p w
+ O/ N' W8 ]+ P9 b 不过倒是有个问题,Service name在手机客户端都显示unknow,一时没找到原因。2 t0 X- d# a% B: w' ?% c. i3 K+ v
+ c) r( R# R) d8 K
% A# b5 X" T* L' l |
Solved: Re: Naming BLE service on STM32WB - STMicroelectronics Community+ |4 Y$ }$ ]0 a# W! S
; c9 G( L2 ^; ?7 `