上次创建完工程,留了个点灯的尾巴,这次给完成。1 i5 ~7 N5 i9 b+ {
( b. ]% L) d" e$ p: g
在IOC工程界面添加服务一个服务,会增加一个服务配置的窗口% g1 z1 G2 ~- x- u! F" k
% w' ]. y1 V0 P. y, h
打开SERVER1的配置界面,修改UUID便于手机端辨识,还有Service name。再添加一个特征,也同样修改下UUID和名称,打算控制LED,1个字节的Value就可以。
9 y& H h f& V3 R
1 b! B o$ r8 t( n7 ?( R
完成以上就可以更新代码了。烧录后在手机APP中搜索到XX-STTM32并连接后查看是否有刚才配置的服务和特征& _: M) S& z$ f6 [# _
( P$ Z a3 A& C8 W 到这里完成了一半。因为此时打开写属性,调试信息里并没有输出任何内容,需要手动添加代码。查找工程,可以看到新增加的BLE App代码文件' y3 k! M# `2 s. {7 c. C4 t& K
4 \# p& E+ ^- e: v. O
打开ld2.c文件查找相关内容,函数不多,可以很快定位到该服务的事件处理函数如下+ N& ?: |" V& e' C; x5 H
: Q$ O; X. o7 ]- V, l 从以上代码能够看出收到服务端的写特征数据时会再调用LD2_Notification(¬ification);函数,同时传入notification结构体,我们要提取的数据也在这个结构体里面。所有找到LD2_Notification函数,添加对playload值的提取和点灯代码。
$ o! d5 z1 z! Y% q4 g
% D5 V3 o- Z# \8 w- E* x/ Z- void LD2_Notification(LD2_NotificationEvt_t *p_Notification)8 |2 ^2 E. \6 [8 i3 c9 U
- {! I3 T9 K/ n$ X6 Z
- /* USER CODE BEGIN Service1_Notification_1 */9 \5 I/ L; Q+ R( Y8 J
- uint8_t value;3 R, y" U: i' }! \
- /* USER CODE END Service1_Notification_1 */
% w1 n7 d0 o$ }. Y: v% [; X - switch(p_Notification->EvtOpcode)
+ l5 j4 L$ A5 H0 P - {
# I; Q: o- o9 ?/ t - /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */) I! B7 K5 u8 ?/ U
- . N* s0 G# L' B: L# a; B, Q
- /* USER CODE END Service1_Notification_Service1_EvtOpcode */
" x4 K6 b& l$ L! Y( Z& f& z# b
0 }# q# X) O/ m; z7 R: ^0 ?+ [- case LD2_ON_WRITE_EVT:
( R/ o0 K; i1 h! i# k- i+ U9 a - /* USER CODE BEGIN Service1Char1_WRITE_EVT */
3 h4 ^* V: ]( o' V: z- T. R - value = p_Notification->DataTransfered.p_Payload[0];
/ C9 T5 b4 w' R# {+ ]7 r1 ?% g& ? - APP_DBG_MSG(" recv msg %c\n",value);* L* A; M4 v: T
- if(value == '0')
! i+ A6 D; q/ b3 P9 z3 y - {& l) @3 t2 \: v0 k
- HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_SET);
) n1 [! z: L: v K C3 H - }else if(value == '1'){
* B4 J! y( |- |6 \' a! e0 Q& X - HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_RESET);% f" i2 n- |& u( c0 O
- }/ g$ Q- \. G$ o) Q- k" }
- /* USER CODE END Service1Char1_WRITE_EVT */
2 Q, W+ n4 {2 z5 q5 A7 Y% c - break;
9 o, P! e* w6 x+ D: N2 A - ) W# b# a' Y" I
- default:
1 c, W3 e" J: |" H - /* USER CODE BEGIN Service1_Notification_default */: ?. z% p, {+ v' H8 Y* R
- # B p/ a2 g; u) |+ Y. ~7 j9 T
- /* USER CODE END Service1_Notification_default */: S( w8 W* l! ~' d0 }2 C a
- break;9 R9 n: A/ \9 e# V/ \
- }
, s- r X" r& I M7 e7 k* b - /* USER CODE BEGIN Service1_Notification_2 */% h" P: o9 U! F+ d- W: D, s z$ l6 N
0 J( Q, A$ g3 X5 U1 k* f- /* USER CODE END Service1_Notification_2 */
( i% ?3 y4 v& Z6 i" Y - return;( H: r$ `& }, R) B+ H4 }9 f
- }
复制代码 对于数据的处理,在客户端是支持输入ASCII和HEX格式,所以服务端也就是开发板的代码中要和输入对应。这里使用ASCII来传值。
5 p" o. }% C( v. f7 n L 在串口调试助手中也打印出来收到的写特征值。如下3 o0 H* l, d5 O6 \7 M' n
. x8 W0 m# ]0 ^, {# i) k4 t: o
不过倒是有个问题,Service name在手机客户端都显示unknow,一时没找到原因。
/ A- a' Z$ d, M4 b
& B% H- ?' f( j1 {
& S2 B8 I, s% g3 A* P# o |
Solved: Re: Naming BLE service on STM32WB - STMicroelectronics Community$ ?( c) K, }2 s! |
' \) n0 g L% l a; v+ X