上次创建完工程,留了个点灯的尾巴,这次给完成。 Q' k$ U/ J* V4 T9 V" u/ |" R' W
: V/ C0 p5 j+ B& N5 Y- f 在IOC工程界面添加服务一个服务,会增加一个服务配置的窗口
4 U( N) R, o* q8 L ~
& g0 @; y4 t: [ 打开SERVER1的配置界面,修改UUID便于手机端辨识,还有Service name。再添加一个特征,也同样修改下UUID和名称,打算控制LED,1个字节的Value就可以。
1 T- k" v. t$ @/ Q; H! x$ C5 C% u
" t! D$ k- @# Y. f5 k( i3 g9 H& C- s
完成以上就可以更新代码了。烧录后在手机APP中搜索到XX-STTM32并连接后查看是否有刚才配置的服务和特征3 b3 P1 B% E1 z: I, v" [: |! X
/ ]9 l" Z: w, y" f# D# V3 J& D 到这里完成了一半。因为此时打开写属性,调试信息里并没有输出任何内容,需要手动添加代码。查找工程,可以看到新增加的BLE App代码文件 z1 O4 u1 R, @3 `( _! g+ s
, p% f5 X* G4 r
打开ld2.c文件查找相关内容,函数不多,可以很快定位到该服务的事件处理函数如下
, R! u" D. E2 u, o+ i
: D2 g+ E/ q5 z0 B$ O8 M2 t. C 从以上代码能够看出收到服务端的写特征数据时会再调用LD2_Notification(¬ification);函数,同时传入notification结构体,我们要提取的数据也在这个结构体里面。所有找到LD2_Notification函数,添加对playload值的提取和点灯代码。
' y9 @$ ~; @: m4 C+ k, ` + u$ B* e; |1 j( @: w- G4 A
- void LD2_Notification(LD2_NotificationEvt_t *p_Notification)
4 f9 ^ }; H1 V6 S% D& g - {
! k; J0 ^0 d* X4 J9 Y; z - /* USER CODE BEGIN Service1_Notification_1 */$ q( g' ^% V3 B* ^+ o, B- @
- uint8_t value;! B! g7 a" n" H y& u7 w2 G8 M
- /* USER CODE END Service1_Notification_1 */
5 S; U6 z$ A3 ?- v3 C4 @ - switch(p_Notification->EvtOpcode)
# C8 A1 C- d' `% `, C h" X - {( k: y- Z) f4 B
- /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */% U: A7 Q$ n' i. s
5 w b/ \7 c6 f$ C& w: ]8 r- /* USER CODE END Service1_Notification_Service1_EvtOpcode */
* E; T3 c9 X6 o' x3 e% a
" K+ n6 |# M3 t; F- case LD2_ON_WRITE_EVT:* {# U: H( @4 F. O2 B; g+ X
- /* USER CODE BEGIN Service1Char1_WRITE_EVT */
7 y s2 ?+ Q' D4 V6 U" W; i - value = p_Notification->DataTransfered.p_Payload[0];# W1 `0 j* i) z$ `
- APP_DBG_MSG(" recv msg %c\n",value);
/ F0 t5 O3 T3 n( `- n - if(value == '0'), D" z( p7 [" e3 ^: V9 E
- {
1 [! {" Q. X _# |2 L - HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_SET);( s4 t3 G) G1 U+ Y) L6 K, M( j& Q
- }else if(value == '1'){
' f# v: E" j' _% h1 `6 K; x" u - HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_RESET);- P; b4 J4 c; c
- }
' ]: c: |% b, w7 P& O8 o - /* USER CODE END Service1Char1_WRITE_EVT */
4 j2 K7 g# D( F, U1 n - break;1 z0 Q/ C9 M" [8 X8 \/ `5 | C
+ W/ ^. `0 `9 `% i5 J5 x- default:4 o) A9 `1 M, s+ S I$ i# a
- /* USER CODE BEGIN Service1_Notification_default */, ?7 X& W& e. s' }
+ s7 I. }+ p" G' k2 S& b- /* USER CODE END Service1_Notification_default */
0 b% E) I* u# k& u- r) }4 |+ p5 J - break;
* a4 U5 h% d& k+ }- P - }
2 T" R; U" V/ r* T7 H - /* USER CODE BEGIN Service1_Notification_2 */
4 h1 q9 u0 |7 e, H& s - 5 Q$ G) ^2 _3 P) h, t( d
- /* USER CODE END Service1_Notification_2 */
) M- f+ a7 V4 g" Z9 f - return; V/ R1 z& d& `, N! P; ]4 q
- }
复制代码 对于数据的处理,在客户端是支持输入ASCII和HEX格式,所以服务端也就是开发板的代码中要和输入对应。这里使用ASCII来传值。
A- r: J8 ]6 o; ~ d) H9 c- e 在串口调试助手中也打印出来收到的写特征值。如下0 ]3 r1 ^0 B* G y/ D+ d, O7 l
o7 z( A) Q! k! C6 d$ U; y2 J 不过倒是有个问题,Service name在手机客户端都显示unknow,一时没找到原因。3 \% G+ |+ t' z$ I) X* ^' R
: K* e# u7 D1 K( U
W8 c; b/ i% {2 p
|
Solved: Re: Naming BLE service on STM32WB - STMicroelectronics Community
; U8 k1 N ~3 w. Q& M