ble40开发整理资料.docx

上传人:牧羊曲112 文档编号:3153513 上传时间:2023-03-11 格式:DOCX 页数:12 大小:42.06KB
返回 下载 相关 举报
ble40开发整理资料.docx_第1页
第1页 / 共12页
ble40开发整理资料.docx_第2页
第2页 / 共12页
ble40开发整理资料.docx_第3页
第3页 / 共12页
ble40开发整理资料.docx_第4页
第4页 / 共12页
ble40开发整理资料.docx_第5页
第5页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《ble40开发整理资料.docx》由会员分享,可在线阅读,更多相关《ble40开发整理资料.docx(12页珍藏版)》请在三一办公上搜索。

1、ble40开发整理资料在BLE协议中,有两个角色,周边和中央;周边是 数据提供者,中央是数据使用/处理者;但是在Android SDK里面,直到目前最新的Android4.4.2,Android手机只能作为中央来使用和处理数据;那数据从哪儿来?从BLE设备来,现在的很多可穿戴设备都是用BLE来提供数据的。 大概了解了概念后,看看Android BLE SDK的四个关键类: A)BluetoothGattServer作为周边来提供数据;(server提供数据) B)BluetoothGattServerCallback返回周边的状态。 C)BluetoothGatt作为中央来使用和处理数据; D

2、)BluetoothGattCallback返回中央的状态和周边提供的数据。 因为我们讨论的是Android的BLE SDK,下面所有的BluetoothGattServer代表周边,BluetoothGatt代表中央。 一.创建一个周边 a)先看看周边用到的class,蓝色椭圆 b)说明: 每一个周边BluetoothGattServer,包含多个服务Service,每一个Service包含多个特征Characteristic。 1.new一个特征: character = new BluetoothGattCharacteristic( UUID.fromString(characteri

3、sticUUID), BluetoothGattCharacteristic.PROPERTY_NOTIFY, BluetoothGattCharacteristic.PERMISSION_READ); 2.new一个服务: service = new BluetoothGattService(UUID.fromString(serviceUUID), BluetoothGattService.SERVICE_TYPE_PRIMARY); 3.把特征添加到服务: service.addCharacteristic(character); 4.获取BluetoothManager: manage

4、r = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 5.获取/打开周边: BluetoothGattServer server = manager.openGattServer(this, new BluetoothGattServerCallback.); 6.把service添加到周边: server.addService(service); 7.开始广播service:Google还没有广播Service的API,等吧!所以目前我们还不能让一个Android手机作为周边来提供数据。 二.创建一个中央 a)

5、先看看中央用到的class,蓝色椭圆 b)说明: 为了拿到中央BluetoothGatt,可要爬山涉水十八弯: 1.先拿到BluetoothManager: bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 2.再拿到BluetoothAdapt: btAdapter = bluetoothManager.getAdapter; 3.开始扫描: btAdapter.startLeScan( BluetoothAdapter.LeScanCallback); 4.从LeScanCa

6、llback中得到BluetoothDevice: public void onLeScan(BluetoothDevice device, int rssi, byte scanRecord) . 5.用BluetoothDevice得到BluetoothGatt: gatt = device.connectGatt(this, true, gattCallback); 终于拿到中央BluetoothGatt了,它有一堆方法,调用这些方法,你就可以通过BluetoothGattCallback和周边BluetoothGattServer交互了。 一、关键概念: Generic Attribu

7、te Profile (GATT) 通过BLE连接,读写属性类小数据的Profile通用规范。现在所有的BLE应用Profile都是基于GATT的。 Attribute Protocol (ATT) GATT是基于ATT Protocol的。ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据。每个属性都有一个唯一的UUID,属性将以characteristics and services的形式传输。 Characteristic Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述。 Descriptor 对Charact

8、eristic的描述,例如范围、计量单位等。 Service Characteristic的集合。例如一个service叫做“Heart Rate Monitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heart rate measurement的Characteristic。 二、角色和职责: Android设备与BLE设备交互有两组角色: 中心设备和外围设备; GATT server vs. GATT client. Central vs. peripheral: 中心设备和外围设备的概念针对的是BLE连接本身。Central角色负责scan adverti

9、sement。而peripheral角色负责make advertisement。 GATT server vs. GATT client: 这两种角色取决于BLE连接成功后,两个设备间通信的方式。 举例说明: 现 有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角 色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。 当 连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例

10、如,如果活动追踪的BLE设备需要向 Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则 Android设备作为server端可能更合适。 三、权限及feature: 和经典蓝牙一样,应用使用蓝牙,需要声明BLUETOOTH权限,如果需要扫描设备或者操作蓝牙设置,则还需要BLUETOOTH_ADMIN权限: 除了蓝牙权限外,如果需要BLE feature则还需要声明uses-feature: 按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,A

11、ndroid设备均可正常安装运行,需要在代码运行时判断设备是否支持BLE feature: / Use this check to determine whether BLE is supported on the device. Then / you can selectively disable BLE-related features. if (!getPackageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) Toast.makeText(this, R.string.ble_not_supported, T

12、oast.LENGTH_SHORT).show; finish; 四、启动蓝牙: 在使用蓝牙BLE之前,需要确认Android设备是否支持BLE feature(required为false时),另外要需要确认蓝牙是否打开。 如果发现不支持BLE,则不能使用BLE相关的功能。如果支持BLE,但是蓝牙没打开,则需要打开蓝牙。 打开蓝牙的步骤: 1、获取BluetoothAdapter BluetoothAdapter是Android系统中所有蓝牙操作都需要的,它对应本地Android设备的蓝牙模块,在整个系统中BluetoothAdapter是单例的。当你获取到它的示例之后,就能进行相关的蓝牙操

13、作了。 获取BluetoothAdapter代码示例如下: / Initializes Bluetooth adapter. final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter; 注:这里通过getSystemService获取BluetoothManager,再通过BluetoothManager获取BluetoothAdapter。Blu

14、etoothManager在Android4.3以上支持(API level 18)。 2、判断是否支持蓝牙,并打开蓝牙 获取到BluetoothAdapter之后,还需要判断是否支持蓝牙,以及蓝牙是否打开。 如果没打开,需要让用户打开蓝牙: private BluetoothAdapter mBluetoothAdapter; . / Ensures Bluetooth is available on the device and it is enabled. If not, / displays a dialog requesting user permission to enable B

15、luetooth. if (mBluetoothAdapter = null | !mBluetoothAdapter.isEnabled) Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 五、搜索BLE设备: 通过调用BluetoothAdapter的startLeScan搜索BLE设备。调用此方法时需要传入BluetoothAdapter.LeScanCallback参数

16、。 因此你需要实现 BluetoothAdapter.LeScanCallback接口,BLE设备的搜索结果将通过这个callback返回。 由于搜索需要尽量减少功耗,因此在实际使用时需要注意: 1、当找到对应的设备后,立即停止扫描; 2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停扫描,消耗电量。 搜索的示例代码如下: /* * Activity for scanning and displaying available BLE devices. */ public class DeviceScanActivity extends ListActivit

17、y private BluetoothAdapter mBluetoothAdapter; private boolean mScanning; private Handler mHandler; / Stops scanning after 10 seconds. private static final long SCAN_PERIOD = 10000; . private void scanLeDevice(final boolean enable) if (enable) / Stops scanning after a pre-defined scan period. mHandle

18、r.postDelayed(new Runnable Override public void run mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); , SCAN_PERIOD); mScanning = true; mBluetoothAdapter.startLeScan(mLeScanCallback); else mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); . . 如果你只需要搜索指定UUID的外设,你可以调用 s

19、tartLeScan(UUID, BluetoothAdapter.LeScanCallback)方法。 其中UUID数组指定你的应用程序所支持的GATT Services的UUID。 BluetoothAdapter.LeScanCallback的实现示例如下: private LeDeviceListAdapter mLeDeviceListAdapter; . / Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallba

20、ck Override public void onLeScan(final BluetoothDevice device, int rssi, byte scanRecord) runOnUiThread(new Runnable Override public void run mLeDeviceListAdapter.addDevice(device); mLeDeviceListAdapter.notifyDataSetChanged; ); ; 注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。 六、连接GATT Server: 两个设备通过BLE通信

21、,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。 连接GATT Server,你需要调用BluetoothDevice的connectGatt方法。此函数带三个参数:Context、autoConnect(boolean)和BluetoothGattCallback对象。调用示例: mBluetoothGatt = device.connectGatt(this, false, mGattCallback); 函数成功,返回BluetoothGatt对象,它是GATT profile的封装。通过这个对象,我们就能进行GATT Clie

22、nt端的相关操作。BluetoothGattCallback用于传递一些连接状态及结果。 BluetoothGatt常规用到的几个操作示例: connect :连接远程设备。 discoverServices : 搜索连接设备所支持的service。 disconnect:断开与远程设备的GATT连接。 close:关闭GATT Client端。 readCharacteristic(characteristic) :读取指定的characteristic。 setCharacteristicNotification(characteristic, enabled) :设置当指定charact

23、eristic值变化时,发出通知。 getServices :获取远程设备所支持的services。 等等。 注: 1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。 2、 一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调函数中返回。例如 discoverServices与onServicesDiscovered回调,readCharacteristic与 onCharacteristicRead回调,setCharacteristicNotification与 onCharacterist

24、icChanged回调等。 Generic Attribute ProfileGATT配置文件是一个通用规范,用于在 BLE链路上发送和接收被称为“属性”的数据块。目前所有的BLE应用都基于GATT。 蓝牙SIG规定了许多低功耗设备的配置文件。配置文件是设备如何在特定的应用程序中工作的规格说明。注意一个设备可以实现多个配置文件。例如,一个设备可 能包括心率监测仪和电量检测。 Attribute ProtocolGATT在ATT协议基础上建立,也被称为 GATT/ATT。ATT对在BLE设备上运行进行了优化,为此,它使用了尽可能少的字节。每个属性通过一个唯一的的统一标识符来标识,每个 Strin

25、g类型UUID使用128 bit标准格式。属性通过ATT被格式化为characteristics和services。 Characteristic 一个characteristic包括一个单一变量和0-n个用来描述characteristic变量的descriptor,characteristic可以被认为是一个类型,类似于类。 Descriptor Descriptor用来描述characteristic变量的属性。例如,一个descriptor可以规定一个可读的描述,或者一个characteristic变量可接受的范围,或者一个characteristic变量特定的测量单位。 Servic

26、e service是characteristic的集合。例如,你可能有一个叫“Heart Rate Monitor(心率监测仪)”的service,它包括了很多characteristics,如“heart rate measurement(心率测量)”等。你可以在bluetooth.org 找到一个目前支持的基于GATT的配置文件和服务列表。 以下是Android设备与BLE设备交互时的角色和责任: 中央 VS 外围设备。 适用于BLE连接本身。中央设备扫描,寻找广播;外围设备发出广播。 GATT 服务端 VS GATT 客户端。决定了两个设备在建立连接后如何互相交流。 为了方便理解,想象你

27、有一个Android手机和一个用于活动跟踪BLE设备,手机支持中央角色,活动跟踪器支持外围。 当手机和运动追踪器建立连接后,他们开始向另一方传输GATT数据。哪一方作为服务器取决于他们传输数据的种类。例如,如果运动追踪器想向手机报告传感器数据,运动追踪器是服务端。如果运动追踪器更新来自手机的数据,手机会作为服务端。 在这份文档的例子中,android app(运行在android设备上)作为GATT客户端。app从gatt服务端获得数据,gatt服务端即支持Heart Rate Profile(心率配置)的BLE心率监测仪。但是你可以自己设计android app去扮演GATT服务端角色。更多信息见BluetoothGattServer。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号