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

【实战经验】STM32+BLE通过Notification与Android应用程序通信

[复制链接]
zero99 发布时间:2017-4-1 15:07
STM32+BLE通过 Notification与 Android应用程序通信的例程
前言
) ^% z7 a+ L+ w$ t* ~1 I; j, CBLE通信中,常见的操作有请求、响应、命令、指示、通知、确认,可根据不同的操作完成不同的应用功能设计。
) _  U% H; u+ S) J2 e  Z: U+ o7 x( N# x  e& V
应用原理# j, b: n6 M  J( g3 ~* ?# [
BLE 协议栈中,有两种角色,一种是客户端(Client),一种是服务端(Server)。服务端提供数据,客户端使用数据。客户端发送获取数据请求后,服务端对客户端做出应答,并数据发送给客户端。% n/ a" g" [8 }( @% n: r
11.jpg 6 V: s  _, ?* S# w1 a: X8 j% }) L$ [: U
服务端发送带有数据的通知到客户端,通知不需要客户端做出响应。; a# y; s, m' X. d
12.jpg
  E/ k. \: L3 S1 z  h" d( u
4 k% }6 X) ~' P& f5 Z+ t硬件环境& F' ~& b$ s; i8 T" F. q$ K  g( Z
• STM32L152RE-NUCLEO
7 z4 K9 C9 o& b- {4 B$ S3 I, p• BlueNRG扩展板X-NUCLEO-IDB04A1
4 D) y" \" }) ^/ _
' q: L1 A* H7 z  q; `9 G% K软件设计
; ?2 G3 p/ T- T- Z2 {+ C, j4 OBLE协议栈基于ST的BlueNRG DK软件。
2 p. v# ]7 G& f5 B' V1 @7 M9 P4 t# C' z
服务端(Server)代码设计
2 c! s! E, z$ \' w创建一个Service,其UUID为“03366e80-cf3a-11e1-9ab4-0002a5d5c51b”,该Service包含的Characteristic的UUID为("e33e78a0-cf4a-11e1-8ffc-0002a5d5c51b"。
& }9 e- r5 n& \: z: K
13.jpg
' Q; p; g2 X9 p2 x1 s, u$ D; f
14.jpg
" b. ?( H& f/ B9 o, x$ s4 b这里定义了Characteristic的值的长度为6个字节,支持Read和Notification属性。
! w. Y) w. |6 H8 z/ S! P
5 w, S, A1 Q9 J6 w添加了Characteristic后,再定义当Client读取 Characteristic值的处理函数,如下所示。2 Y. ?0 s. p- {$ o
15.jpg
8 m( [4 q1 S$ P/ B5 h7 r$ W这里固定的写6个字节0x66,可根据要传输的数据进行填充。4 X% R* U: n. _. I  n: a: W' e

6 w' F( {! b* k8 x. o( S3 c8 _* L: o添加服务端Characteristic值Notification处理,代码如下。 - M5 |1 V1 x; b$ x0 p
16.jpg ' o1 k, U& F# A8 {

, |+ h: O5 [4 ?& @- I3 \+ @6 F- [完成了服务端的软件设计后,先用手机端的LightBlue软件和设备端配合测试下设备端软件是否正常。使用LightBlue连接设备后,以下红色部分是LightBlue获取到的设备端的服务和该服务下的Characteristic的UUID。
9 U) x0 _- P) C0 ~5 x- s1 n
17.jpg
( R. y# j- Z  q3 X( K- m
/ Q& \. G+ G  Y1 J1 a界面中点击该Characteristic,在进入的界面中再点击“Listen for notification”来监听服务端的数据,可以看到LightBlue界面中连续收到了服务端发送过来的数据0x666666666666。( U( i  k& x6 |
18.jpg - y; q0 h4 d. {, V. F, h" d7 v7 w
4 H5 Y. H9 {6 L% ~+ q
从测试结果看,服务端端软件工作正常,下一步是编写Android手机端的软件,配合设备端一起使用。& N5 O. V+ v( W$ X3 G9 F  m/ w' h

% ~0 n6 G1 b4 j$ P' bAndroid客户端(Client)代码设计
( G% s# ]' X$ _; [' |  h8 k/ aAndroid手机使用Samsung Galaxy S6,系统更新到Android-6.0.1。& C4 Y" z' G, j! y+ q
以下介绍实现Notification功能的核心部分Android软件。首先定义客户端Characteristic的UUID。
8 B- t7 d  \2 m. A  Q
21.png . s0 c. @* C1 k% z5 ~  _- t

' C# _! a+ w8 C+ a$ S& ?' ]  z4 x扫描完蓝牙设备后,从ArrayList中获取对应UUID的索引,将其存起来。. ]9 u& R" Y* w% }4 u+ N& _
22.png
6 r' `$ X. H* {- M, r" r  G$ t9 r$ V
setCharacteristicNotification方法中,使能Notification功能。. G1 K5 z+ `( @. x
23.png
( f& C  R6 s# G; H  |  z2 a4 ~1 Y' x1 W2 c, U
onCharacteristicChanged方法用来监测来自服务端的数据。
7 t+ g$ s: M' e+ i& e2 e 24.png 6 _5 [6 \# j! o$ o4 @2 a. u
0 J3 d$ G" u5 F) ]
以下是调试应用程序时Logcat打印的Log信息。 & E$ L7 o( a( R0 ]5 `8 x! b
25.png + a- R6 D$ F3 k0 J( y( u
26.png 8 x) K# D) _+ V  n

1 B  Y! R2 ?6 U9 Z4 |6 i- M5 j      从Log信息看,手机端(客户端)已经正确收到来自设备端(服务端)的数据0x666666666666,至此服务端和客户端的 Notification数据通信部分调试完成。* r9 n# c6 J; s9 x2 P% I

) ^  u1 i. r/ |总结3 H( i# j. G' _) m" @
支持BLE的设备和手机端通信方法中,常见的是手机主动读取设备的Characteristic UUID的数据。对于一些周期性的或需要设备主动发送数据到手机端且又不需要手机端做出应答的应用,使用Notification方法能够满足这样的应用。
# T5 W+ s7 r# C. U1 C
  ^  W! i/ e2 S% E9 s" T  ^# X1 i% b
STM32 BLE通过Notification与Android应用程序通信的例程.pdf (711.06 KB, 下载次数: 67)
收藏 1 评论1 发布时间:2017-4-1 15:07

举报

1个回答
asmhai 回答时间:2017-4-2 08:23:27
好多用处的地方,好玩,接收和发送GPRS数据也就可以实现了,谢谢楼主分享。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版