转载自:http://blog.csdn.net/chaoyue0071/article/details/43450183/
本文简单结合两篇文章
http://blog.csdn.net/hellogv/article/details/24267685
http://blog.csdn.net/jimoduwu/article/details/21604215
在BLE协议中,有两个角色,周边(Periphery)和中央(Central),一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央。但是不管是Periphery还是Central都是可以实现 GATT server 和 GATT client去传输数据,但是无法同时都是。
大概了解了概念后,看看Android BLE SDK的四个关键类(class):
a) BluetoothGattServer作为周边来提供数据; BluetoothGattServerCallback返回周边的状态。
b) BluetoothGatt作为中央来使用和处理数据;BluetoothGattCallback返回中央的状态和周边提供的数据。
因为我们讨论的是Android的BLE SDK,下面所有的BluetoothGattServer代表周边,BluetoothGatt代表中央。
一.创建一个周边(虽然目前周边API在Android手机上不工作,但还是看看)
a)先看看周边用到的class,蓝色椭圆
b)说明:
每一个周边BluetoothGattServer,包含多个服务Service,每一个Service包含多个特征Characteristic。
1.new一个特征:character = new BluetoothGattCharacteristic(
UUID.fromString(characteristicUUID),
BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PERMISSION_READ);
2.new一个服务:service = new BluetoothGattService(UUID.fromString(serviceUUID),
BluetoothGattService.SERVICE_TYPE_PRIMARY);
3.把特征添加到服务:service.addCharacteristic(character);
4.获取BluetoothManager:manager = (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)先看看中央用到的class,蓝色椭圆
b)说明:
为了拿到中央BluetoothGatt,可要爬山涉水十八弯:
1.先拿到BluetoothManager:bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
2.再拿到BluetoothAdapt:btAdapter = bluetoothManager.getAdapter();
3.开始扫描:btAdapter.startLeScan( BluetoothAdapter.LeScanCallback);
4.从LeScanCallback中得到BluetoothDevice:public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {…..}
5.用BluetoothDevice得到BluetoothGatt:gatt = device.connectGatt(this, true, gattCallback);
终于拿到中央BluetoothGatt了,它有一堆方法(查API吧),调用这些方法,你就可以通过BluetoothGattCallback和周边BluetoothGattServer交互了。
官方有给出BLE 通信的sample ,下面是牛人简化了代码,简化得简单明了
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!
最近穿戴设备发展得很火,把相关技术也带旺了,其中一项是BLE(Bluetooth Low Energy)。BLE是蓝牙4.0的核心Profile,主打功能是快速搜索,快速连接,超低功耗保持连接和传输数据,弱点是数据传输速率低,由于BLE的低功耗特点,因此普遍用于穿戴设备。Android 4.3才开始支持BLE API,所以请各位客官把本文代码运行在蓝牙4.0和Android 4.3及其以上的系统,另外本文所用的BLE终端是一个蓝牙4.0的串口蓝牙模块。
PS:我的i9100刷了4.4系统后,竟然也能跟BLE蓝牙模块通信。
BLE分为三部分Service、Characteristic、Descriptor,这三部分都由UUID作为唯一标示符。一个蓝牙4.0的终端可以包含多个Service,一个Service可以包含多个Characteristic,一个Characteristic包含一个Value和多个Descriptor,一个Descriptor包含一个Value。一般来说,Characteristic是手机与BLE终端交换数据的关键,Characteristic有较多的跟权限相关的字段,例如PERMISSION和PROPERTY,而其中最常用的是PROPERTY,本文所用的BLE蓝牙模块竟然没有标准的Characteristic的PERMISSION。Characteristic的PROPERTY可以通过位运算符组合来设置读写属性,例如READ|WRITE、READ|WRITE_NO_RESPONSE|NOTIFY,因此读取PROPERTY后要分解成所用的组合(本文代码已含此分解方法)。
本文代码改自Android 4.3 Sample的BluetoothLeGatt,把冗余代码去掉,获取的BLE设备信息都通过Log,还有一些必要的读写蓝牙方法,应该算是简化到大家一看就可以懂了。本文代码可以到http://download.csdn.net/detail/hellogv/7228819下载。接下来贴出本文运行的结果,首先是连接BLE设备后,枚举出设备所有Service、Characteristic、Descriptor,并且手机会往Characteristic uuid=0000ffe1-0000-1000-8000-00805f9b34fb写入“send data->”字符串,BLE终端收到数据通过串口传到PC串口助手(见PC串口助手的截图):
04-21 18:28:25.465: E/DeviceScanActivity(12254): –>service type:PRIMARY
04-21 18:28:25.465: E/DeviceScanActivity(12254): –>includedServices size:0
04-21 18:28:25.465: E/DeviceScanActivity(12254): –>service uuid:00001800-0000-1000-8000-00805f9b34fb
04-21 18:28:25.465: E/DeviceScanActivity(12254): —->char uuid:00002a00-0000-1000-8000-00805f9b34fb
04-21 18:28:25.465: E/DeviceScanActivity(12254): —->char permission:UNKNOW
04-21 18:28:25.465: E/DeviceScanActivity(12254): —->char property:READ
04-21 18:28:25.465: E/DeviceScanActivity(12254): —->char uuid:00002a01-0000-1000-8000-00805f9b34fb
04-21 18:28:25.470: E/DeviceScanActivity(12254): —->char permission:UNKNOW
04-21 18:28:25.470: E/DeviceScanActivity(12254): —->char property:READ
04-21 18:28:25.470: E/DeviceScanActivity(12254): —->char uuid:00002a02-0000-1000-8000-00805f9b34fb
04-21 18:28:25.470: E/DeviceScanActivity(12254): —->char permission:UNKNOW
04-21 18:28:25.470: E/DeviceScanActivity(12254): —->char property:READ|WRITE|
04-21 18:28:25.470: E/DeviceScanActivity(12254): —->char uuid:00002a03-0000-1000-8000-00805f9b34fb
04-21 18:28:25.470: E/DeviceScanActivity(12254): —->char permission:UNKNOW
04-21 18:28:25.475: E/DeviceScanActivity(12254): —->char property:READ|WRITE|
04-21 18:28:25.475: E/DeviceScanActivity(12254): —->char uuid:00002a04-0000-1000-8000-00805f9b34fb
04-21 18:28:25.475: E/DeviceScanActivity(12254): —->char permission:UNKNOW
04-21 18:28:25.475: E/DeviceScanActivity(12254): —->char property:READ
04-21 18:28:25.475: E/DeviceScanActivity(12254): –>service type:PRIMARY
04-21 18:28:25.475: E/DeviceScanActivity(12254): –>includedServices size:0
04-21 18:28:25.475: E/DeviceScanActivity(12254): –>service uuid:00001801-0000-1000-8000-00805f9b34fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): —->char uuid:00002a05-0000-1000-8000-00805f9b34fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): —->char permission:UNKNOW
04-21 18:28:25.480: E/DeviceScanActivity(12254): —->char property:INDICATE
04-21 18:28:25.480: E/DeviceScanActivity(12254): ——–>desc uuid:00002902-0000-1000-8000-00805f9b34fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): ——–>desc permission:UNKNOW
04-21 18:28:25.480: E/DeviceScanActivity(12254): –>service type:PRIMARY
04-21 18:28:25.480: E/DeviceScanActivity(12254): –>includedServices size:0
04-21 18:28:25.480: E/DeviceScanActivity(12254): –>service uuid:0000ffe0-0000-1000-8000-00805f9b34fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): —->char uuid:0000ffe1-0000-1000-8000-00805f9b34fb
04-21 18:28:25.480: E/DeviceScanActivity(12254): —->char permission:UNKNOW
04-21 18:28:25.480: E/DeviceScanActivity(12254): —->char property:READ|WRITE_NO_RESPONSE|NOTIFY|
04-21 18:28:25.490: E/DeviceScanActivity(12254): ——–>desc uuid:00002902-0000-1000-8000-00805f9b34fb
04-21 18:28:25.490: E/DeviceScanActivity(12254): ——–>desc permission:UNKNOW
04-21 18:28:25.490: E/DeviceScanActivity(12254): ——–>desc uuid:00002901-0000-1000-8000-00805f9b34fb
04-21 18:28:25.490: E/DeviceScanActivity(12254): ——–>desc permission:UNKNOW
04-21 18:28:26.025: E/DeviceScanActivity(12254): onCharRead BLE DEVICE read 0000ffe1-0000-1000-8000-00805f9b34fb -> 00
这里红字是由BluetoothGattCallback的onCharacteristicRead()回调而打出Log
以下Log是PC上的串口工具通过BLE模块发送过来,由BluetoothGattCallback的 onCharacteristicChanged()打出Log
04-21 18:30:18.260: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:18.745: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:19.085: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:19.350: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:19.605: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:19.835: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:20.055: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:20.320: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:20.510: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:20.735: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
04-21 18:30:21.000: E/DeviceScanActivity(12254): onCharWrite BLE DEVICE write 0000ffe1-0000-1000-8000-00805f9b34fb -> send data to phone
接下来贴出本文核心代码:
`<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DeviceScanActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ListActivity</span> {</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">static</span> String TAG = DeviceScanActivity.class.getSimpleName();
<span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">static</span> String UUID_KEY_DATA = <span class="hljs-string">"0000ffe1-0000-1000-8000-00805f9b34fb"</span>;
<span class="hljs-keyword">private</span> LeDeviceListAdapter mLeDeviceListAdapter;
<span class="hljs-javadoc">/**搜索BLE终端*/</span>
<span class="hljs-keyword">private</span> BluetoothAdapter mBluetoothAdapter;
<span class="hljs-javadoc">/**读写BLE终端*/</span>
<span class="hljs-keyword">private</span> BluetoothLeClass mBLE;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">boolean</span> mScanning;
<span class="hljs-keyword">private</span> Handler mHandler;
<span class="hljs-comment">// Stops scanning after 10 seconds. </span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> SCAN_PERIOD = <span class="hljs-number">10000</span>;
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
getActionBar().setTitle(R.string.title_devices);
mHandler = <span class="hljs-keyword">new</span> Handler();
<span class="hljs-comment">// Use this check to determine whether BLE is supported on the device. Then you can </span>
<span class="hljs-comment">// selectively disable BLE-related features. </span>
<span class="hljs-keyword">if</span> (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(<span class="hljs-keyword">this</span>, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
finish();
}
<span class="hljs-comment">// Initializes a Bluetooth adapter. For API level 18 and above, get a reference to </span>
<span class="hljs-comment">// BluetoothAdapter through BluetoothManager. </span>
<span class="hljs-keyword">final</span> BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
<span class="hljs-comment">// Checks if Bluetooth is supported on the device. </span>
<span class="hljs-keyword">if</span> (mBluetoothAdapter == <span class="hljs-keyword">null</span>) {
Toast.makeText(<span class="hljs-keyword">this</span>, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
finish();
<span class="hljs-keyword">return</span>;
}
<span class="hljs-comment">//开启蓝牙 </span>
mBluetoothAdapter.enable();
mBLE = <span class="hljs-keyword">new</span> BluetoothLeClass(<span class="hljs-keyword">this</span>);
<span class="hljs-keyword">if</span> (!mBLE.initialize()) {
Log.e(TAG, <span class="hljs-string">"Unable to initialize Bluetooth"</span>);
finish();
}
<span class="hljs-comment">//发现BLE终端的Service时回调 </span>
mBLE.setOnServiceDiscoverListener(mOnServiceDiscover);
<span class="hljs-comment">//收到BLE终端数据交互的事件 </span>
mBLE.setOnDataAvailableListener(mOnDataAvailable);
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onResume</span>() {
<span class="hljs-keyword">super</span>.onResume();
<span class="hljs-comment">// Initializes list view adapter. </span>
mLeDeviceListAdapter = <span class="hljs-keyword">new</span> LeDeviceListAdapter(<span class="hljs-keyword">this</span>);
setListAdapter(mLeDeviceListAdapter);
scanLeDevice(<span class="hljs-keyword">true</span>);
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onPause</span>() {
<span class="hljs-keyword">super</span>.onPause();
scanLeDevice(<span class="hljs-keyword">false</span>);
mLeDeviceListAdapter.clear();
mBLE.disconnect();
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onStop</span>() {
<span class="hljs-keyword">super</span>.onStop();
mBLE.close();
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onListItemClick</span>(ListView l, View v, <span class="hljs-keyword">int</span> position, <span class="hljs-keyword">long</span> id) {
<span class="hljs-keyword">final</span> BluetoothDevice device = mLeDeviceListAdapter.getDevice(position);
<span class="hljs-keyword">if</span> (device == <span class="hljs-keyword">null</span>) <span class="hljs-keyword">return</span>;
<span class="hljs-keyword">if</span> (mScanning) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
mScanning = <span class="hljs-keyword">false</span>;
}
mBLE.connect(device.getAddress());
}
<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">scanLeDevice</span>(<span class="hljs-keyword">final</span> <span class="hljs-keyword">boolean</span> enable) {
<span class="hljs-keyword">if</span> (enable) {
<span class="hljs-comment">// Stops scanning after a pre-defined scan period. </span>
mHandler.postDelayed(<span class="hljs-keyword">new</span> Runnable() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
mScanning = <span class="hljs-keyword">false</span>;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
invalidateOptionsMenu();
}
}, SCAN_PERIOD);
mScanning = <span class="hljs-keyword">true</span>;
mBluetoothAdapter.startLeScan(mLeScanCallback);
} <span class="hljs-keyword">else</span> {
mScanning = <span class="hljs-keyword">false</span>;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
invalidateOptionsMenu();
}
<span class="hljs-javadoc">/**
* 搜索到BLE终端服务的事件
*/</span>
<span class="hljs-keyword">private</span> BluetoothLeClass.OnServiceDiscoverListener mOnServiceDiscover = <span class="hljs-keyword">new</span> OnServiceDiscoverListener(){
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onServiceDiscover</span>(BluetoothGatt gatt) {
displayGattServices(mBLE.getSupportedGattServices());
}
};
<span class="hljs-javadoc">/**
* 收到BLE终端数据交互的事件
*/</span>
<span class="hljs-keyword">private</span> BluetoothLeClass.OnDataAvailableListener mOnDataAvailable = <span class="hljs-keyword">new</span> OnDataAvailableListener(){
<span class="hljs-javadoc">/**
* BLE终端数据被读的事件
*/</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCharacteristicRead</span>(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, <span class="hljs-keyword">int</span> status) {
<span class="hljs-keyword">if</span> (status == BluetoothGatt.GATT_SUCCESS)
Log.e(TAG,<span class="hljs-string">"onCharRead "</span>+gatt.getDevice().getName()
+<span class="hljs-string">" read "</span>
+characteristic.getUuid().toString()
+<span class="hljs-string">" -> "</span>
+Utils.bytesToHexString(characteristic.getValue()));
}
<span class="hljs-javadoc">/**
* 收到BLE终端写入数据回调
*/</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCharacteristicWrite</span>(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
Log.e(TAG,<span class="hljs-string">"onCharWrite "</span>+gatt.getDevice().getName()
+<span class="hljs-string">" write "</span>
+characteristic.getUuid().toString()
+<span class="hljs-string">" -> "</span>
+<span class="hljs-keyword">new</span> String(characteristic.getValue()));
}
};
<span class="hljs-comment">// Device scan callback. </span>
<span class="hljs-keyword">private</span> BluetoothAdapter.LeScanCallback mLeScanCallback =
<span class="hljs-keyword">new</span> BluetoothAdapter.LeScanCallback() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onLeScan</span>(<span class="hljs-keyword">final</span> BluetoothDevice device, <span class="hljs-keyword">int</span> rssi, <span class="hljs-keyword">byte</span>[] scanRecord) {
runOnUiThread(<span class="hljs-keyword">new</span> Runnable() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};
<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">displayGattServices</span>(List<BluetoothGattService> gattServices) {
<span class="hljs-keyword">if</span> (gattServices == <span class="hljs-keyword">null</span>) <span class="hljs-keyword">return</span>;
<span class="hljs-keyword">for</span> (BluetoothGattService gattService : gattServices) {
<span class="hljs-comment">//-----Service的字段信息-----// </span>
<span class="hljs-keyword">int</span> type = gattService.getType();
Log.e(TAG,<span class="hljs-string">"-->service type:"</span>+Utils.getServiceType(type));
Log.e(TAG,<span class="hljs-string">"-->includedServices size:"</span>+gattService.getIncludedServices().size());
Log.e(TAG,<span class="hljs-string">"-->service uuid:"</span>+gattService.getUuid());
<span class="hljs-comment">//-----Characteristics的字段信息-----// </span>
List<BluetoothGattCharacteristic> gattCharacteristics =gattService.getCharacteristics();
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">final</span> BluetoothGattCharacteristic gattCharacteristic: gattCharacteristics) {
Log.e(TAG,<span class="hljs-string">"---->char uuid:"</span>+gattCharacteristic.getUuid());
<span class="hljs-keyword">int</span> permission = gattCharacteristic.getPermissions();
Log.e(TAG,<span class="hljs-string">"---->char permission:"</span>+Utils.getCharPermission(permission));
<span class="hljs-keyword">int</span> property = gattCharacteristic.getProperties();
Log.e(TAG,<span class="hljs-string">"---->char property:"</span>+Utils.getCharPropertie(property));
<span class="hljs-keyword">byte</span>[] data = gattCharacteristic.getValue();
<span class="hljs-keyword">if</span> (data != <span class="hljs-keyword">null</span> && data.length > <span class="hljs-number">0</span>) {
Log.e(TAG,<span class="hljs-string">"---->char value:"</span>+<span class="hljs-keyword">new</span> String(data));
}
<span class="hljs-comment">//UUID_KEY_DATA是可以跟蓝牙模块串口通信的Characteristic </span>
<span class="hljs-keyword">if</span>(gattCharacteristic.getUuid().toString().equals(UUID_KEY_DATA)){
<span class="hljs-comment">//测试读取当前Characteristic数据,会触发mOnDataAvailable.onCharacteristicRead() </span>
mHandler.postDelayed(<span class="hljs-keyword">new</span> Runnable() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
mBLE.readCharacteristic(gattCharacteristic);
}
}, <span class="hljs-number">500</span>);
<span class="hljs-comment">//接受Characteristic被写的通知,收到蓝牙模块的数据后会触发mOnDataAvailable.onCharacteristicWrite() </span>
mBLE.setCharacteristicNotification(gattCharacteristic, <span class="hljs-keyword">true</span>);
<span class="hljs-comment">//设置数据内容 </span>
gattCharacteristic.setValue(<span class="hljs-string">"send data->"</span>);
<span class="hljs-comment">//往蓝牙模块写入数据 </span>
mBLE.writeCharacteristic(gattCharacteristic);
}
<span class="hljs-comment">//-----Descriptors的字段信息-----// </span>
List<BluetoothGattDescriptor> gattDescriptors = gattCharacteristic.getDescriptors();
<span class="hljs-keyword">for</span> (BluetoothGattDescriptor gattDescriptor : gattDescriptors) {
Log.e(TAG, <span class="hljs-string">"-------->desc uuid:"</span> + gattDescriptor.getUuid());
<span class="hljs-keyword">int</span> descPermission = gattDescriptor.getPermissions();
Log.e(TAG,<span class="hljs-string">"-------->desc permission:"</span>+ Utils.getDescPermission(descPermission));
<span class="hljs-keyword">byte</span>[] desData = gattDescriptor.getValue();
<span class="hljs-keyword">if</span> (desData != <span class="hljs-keyword">null</span> && desData.length > <span class="hljs-number">0</span>) {
Log.e(TAG, <span class="hljs-string">"-------->desc value:"</span>+ <span class="hljs-keyword">new</span> String(desData));
}
}
}
}<span class="hljs-comment">// </span>
}
} `
💬 评论