上次创建完工程,留了个点灯的尾巴,这次给完成。# g4 B5 s/ c1 |( l; U
. F0 C5 x9 ^4 A& N. O; q 在IOC工程界面添加服务一个服务,会增加一个服务配置的窗口4 d2 V7 P/ P1 E+ e) X( {; M# W
4 I, j( d6 \ j% Y% L3 w! ]
打开SERVER1的配置界面,修改UUID便于手机端辨识,还有Service name。再添加一个特征,也同样修改下UUID和名称,打算控制LED,1个字节的Value就可以。
' X. V' j3 @" |7 b4 \2 Q+ Y
( K7 o2 O1 l4 H Z. y 完成以上就可以更新代码了。烧录后在手机APP中搜索到XX-STTM32并连接后查看是否有刚才配置的服务和特征
- D# g) c4 ?( h+ E* j
4 y* i+ r. I& ?2 U, Z/ v+ Y
到这里完成了一半。因为此时打开写属性,调试信息里并没有输出任何内容,需要手动添加代码。查找工程,可以看到新增加的BLE App代码文件
# `& ~# E' D7 P; U9 O( J* E" `
" {! y6 H. L0 l( H0 K# A2 Q, m 打开ld2.c文件查找相关内容,函数不多,可以很快定位到该服务的事件处理函数如下1 B& u2 X$ _$ [
( J" r9 @! L" q 从以上代码能够看出收到服务端的写特征数据时会再调用LD2_Notification(¬ification);函数,同时传入notification结构体,我们要提取的数据也在这个结构体里面。所有找到LD2_Notification函数,添加对playload值的提取和点灯代码。
7 [ f1 J1 G& o! Q
6 F$ j9 @$ }* T6 f/ x+ a- X- void LD2_Notification(LD2_NotificationEvt_t *p_Notification)
( ?$ i, }1 W# i( N6 t) u3 m9 x b - {
0 j) E9 ]& q* t2 |! j - /* USER CODE BEGIN Service1_Notification_1 */
( ?$ Z6 m5 |( r8 N" ^. I - uint8_t value;
. }3 I( B' ^) Q2 b: f |) R - /* USER CODE END Service1_Notification_1 */5 z k; h7 p4 b& @
- switch(p_Notification->EvtOpcode)
: k3 t$ q0 L$ B" M4 T - {9 @1 N {$ Q* N- q0 f7 G
- /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */2 O q% M2 [$ L
" B. ~7 `7 a* r7 h! g2 x- /* USER CODE END Service1_Notification_Service1_EvtOpcode */* N( t6 {: K/ m1 C/ u+ ^1 Y
8 |# s# X) Q2 J* d' q- case LD2_ON_WRITE_EVT:5 ?- _# n" A+ n% p. I6 |
- /* USER CODE BEGIN Service1Char1_WRITE_EVT */
- ^- a f( c2 G3 }: @& G - value = p_Notification->DataTransfered.p_Payload[0];6 t3 q. l1 Y. B" n
- APP_DBG_MSG(" recv msg %c\n",value);7 ~ L4 ~1 l$ e5 B3 N% D- l
- if(value == '0')
7 ]/ K& k0 r3 O. S( } - {
! v( A. V& I) `3 X7 z - HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_SET);* F( Z6 r D. r* B; l
- }else if(value == '1'){5 [3 H6 N& h/ h1 F3 }0 K/ X
- HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_RESET);* h1 L: A A; J- B
- }; \0 W% t$ y8 A, ^
- /* USER CODE END Service1Char1_WRITE_EVT */
6 `2 u* a" v0 W4 e5 ~ - break;
% [- H" d4 ?' T8 z0 m8 E' q
7 H8 w1 S1 d1 H6 f( M- default:% x7 r `7 {' a! M! Y% z: u
- /* USER CODE BEGIN Service1_Notification_default */# K: k* o3 p ?9 P6 j3 L
# g* L0 m) U1 D a {! D0 V- /* USER CODE END Service1_Notification_default */+ f; M) p9 E5 q, q9 w
- break;3 S8 q+ F y1 J, u8 w
- }; \- }& |* L' _' `) |& L1 O, R
- /* USER CODE BEGIN Service1_Notification_2 */
& ^% o5 L5 J. s# q6 }
$ @. o" j, y4 g) s- K- /* USER CODE END Service1_Notification_2 */ q. |) `6 g' J# T- ~1 A
- return;" B$ X7 \6 t! O2 r! D; b) \
- }
复制代码 对于数据的处理,在客户端是支持输入ASCII和HEX格式,所以服务端也就是开发板的代码中要和输入对应。这里使用ASCII来传值。; R8 C3 n2 d: }; H; a o2 |: k- R
在串口调试助手中也打印出来收到的写特征值。如下
# I6 y, D& @! R6 T. ]; Q
8 G" w9 E* I1 ?) @5 {% |; V 不过倒是有个问题,Service name在手机客户端都显示unknow,一时没找到原因。
# c. J% k1 h( h0 c, z Y I: O6 `6 y. I" \: d7 R" Q& n1 V9 A
7 B9 G+ C5 ~+ |+ S" P& n8 R: d
|
Solved: Re: Naming BLE service on STM32WB - STMicroelectronics Community6 I% I7 k; ]7 ?/ y$ n! z
) B! x% [$ L, t; g% d$ [