你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-WB09KE评测】BLE创建服务和写特征控制LED

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

举报

2个回答
STMCU-管管 回答时间:昨天 14:42
Service name会不会是UUID格式问题; a" {  U9 z' @6 ]7 [
BinWin 回答时间:昨天 21:03
STMCU-管管 发表于 2024-11-4 14:427 D/ [; _# j* J8 t3 K5 }0 `5 H" _
Service name会不会是UUID格式问题

4 ]( r' x7 O1 W" TSolved: Re: Naming BLE service on STM32WB - STMicroelectronics Community+ |4 Y$ }$ ]0 a# W! S
; c9 G( L2 ^; ?7 `
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版