BLE主设备以及GATT客户端例程(连接安卓手机)

开始者 <a href="http://community.silabs.com/t5/Welcome-and-Announcements/Community-Ranking-System-and-Recognition-Program/m-p/140490#U140490"><font color="#000000"><font size="2">Hero Employee</font></font> </a> Kevin_Fu 修改时间 ‎07-27-2017 03:33 PM

简介

这篇文章是针对只拥有一块开发板同时想实现BLE主设备的人群。如果你有两块或以上的开发板,你可以参考SPP-over-BLE例程,其实现了主从设备两个角色,下面是链接:

http://community.silabs.com/t5/Bluetooth-Wi-Fi-Knowledge-Base/SPP-over-BLE-C-example-for-BGMxxx/ta-p...

 

如果你只有一块WSTK,你可以使用智能手机作为BLE从设备,然后在WSTK端实现主设备以及GATT客户端相关功能。

 

典型的连接过程以及连接后GATT相关操作如下:

  1. 主设备扫描附近的广播,你可以加入广播过滤逻辑来确定哪个或者哪些广播的设备是你需要连接的,如过滤设备名称、服务UUID等。
  2. 如果找到设备,建立连接。
  3. 连接之后,扫描远端设备所支持的所有服务以及特征值。
  4. 对于具有通知(notify)或者指示(indicate)的特征值,如果有需要,配置Cline Characteristic Configuration(CCC)的值,其含义如下。
  • 0x0000 – 禁止
  • 0x0001 – 使能通知
  • 0x0002 – 使能指示

如上步骤和操作是连接以及连接后的典型动作,但并非所有都是必须的。

 

如何使用这个例程

你需要如下设备

  • 一个EFR32BG或者EFR32MG开发板 – 本例程是直接基于BRD4103A Rev A01(EFR32BG12 radio board)开发的,但他可以很简单的移植到其他开发板或客户的板子。
  • 一个安卓智能手机 – 请确保此智能手机在硬件和软件上都支持BLE,安卓从3版本开始在软件上支持BLE。

GATT服务器

我加入了一个叫做“Demo service”的服务到GATT服务器,其包含了2个特征值,分别叫“NOTIFY_CHAR”和“RW_CHAR”,具体信息如下:

 

 

UUID

属性

Demo Service

df6a8b89-32d1-486d-943a-1a1f6b0b52ed

 

NOTIFY_CHAR

0ced7930-b31f-457d-a6a2-b3db9b03e39a

通知

RW_CAHR

fb958909-f26e-43a9-927c-7e17d8fb2d8d

读、写

 

 

我将源代码附在了文件末尾,其基于BRD4103A Rev A01(EFR32BG12 radio board)和Bluetooth SDK v2.4.0.1开发的,同时安卓的APP安装文件也附上了。遵循如下步骤来让例程跑起来。

  1. 将工程导入Simplicity Studio v4中,加入symbol “RETARGET_VCOM”的定义,这样打印信息会被发送至USB口,编译并将工程下载至开发板。如果想了解更多RETARGET_VCOM的相关信息,可以参考下面文章。

http://community.silabs.com/t5/Bluetooth-Wi-Fi-Knowledge-Base/Retarget-stdio-to-UART-in-BLE-SDK-2-0-...

  1. 你也可以跳过第一步,直接将“Central_Example.hex”文件烧录至开发板,并将apk文件安装至安卓手机。
  2. 打开串口工具来查看打印信息,打开app,手机和开发板会自动建立连接,并使能通知,手机会定时发送通知给开发板。
  3. 按PB0会将0x01和0x05来回地写入RW_CHAR特征值中,这个特征值的值决定了发送通知的周期。例如:特征值的值是5,那么手机会每隔5秒钟发送一次通知。

下面是手机以及串口工具的截图:

terminal.pngS70706-170904.jpg

 

安卓APP

我的专长并不是安卓开发,所以写这个app仅仅是为了配合WSTK主设备例程来进行演示。我并没有花很多时间来测试这个app的稳定性以及兼容性等,如果你有任何APP相关疑问,你需要找安卓开发工程师来寻求帮助。

测试过的设备:

型号

安卓版本

三星 Galaxy Tab S3

7.0

魅族 MX_4

5.1

 

一个已知的问题:

·         CCC descriptor – CCC descriptor has the UUID 0x2902, but Android doesn’t support 16-bit UUID, so it needs to be change to 128-bit UUID - 00002902-0000-1000-8000-00805f9b34fb. The API gecko_cmd_gatt_set_characteristic_notification will return error that it can’t find CCC descriptor with UUID 0x2902 in the characteristic. So, I write the next handle of NOTIFY_CHAR which is the location of CCC descriptor of this characteristic on the server side as workaround. This problem didn’t happen when I tested with Android 7.0 devices.

 

 安卓APP的源代码可以在这里下载 - https://github.com/fuzhen011/Android-Peripheral