您的位置:首页 > 移动开发 > Android开发

Android提高之Android手机与BLE终端通信

2016-07-14 17:59 661 查看
最近穿戴设备发展得很火,把相关技术也带旺了,其中一项是BLE(Bluetooth Low Energy)。BLE是蓝牙4.0的核心Profile,主打功能是快速搜索,快速连接,超低功耗保持连接和传输数据,弱点是数据传输速率低,由于BLE的低功耗特点,因此普遍用于穿戴设备。Android 4.3才开始支持BLE API,所以请各位客官把本文代码运行在蓝牙4.0和Android 4.3及其以上的系统,另外本文所用的BLE终端是一个蓝牙4.0的串口蓝牙模块。

注:笔者的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,还有一些必要的读写蓝牙方法,应该算是简化到大家一看就可以懂了。本文完整代码可以点击此处本站下载

接下来贴出本文运行的结果,首先是连接BLE设备后,枚举出设备所有Service、Characteristic、Descriptor,并且手机会往Characteristic uuid=0000ffe1-0000-1000-8000-00805f9b34fb写入“send data->”字符串,BLE终端收到数据通过串口传到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



史上最难PHPer笔试题

【点击进入】

40分就能月薪过万!
2000多人测试,85%准确率



查 看

以下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

接下来贴出本文核心代码:

?
感兴趣的读者可以动手测试一下代码的运行情况,希望能对大家的Android项目开发有所帮助。

分享一个集成目前主流蓝牙的demo、android蓝牙4.0开发、项目中使用到了搜索BLE终端和读写BLE终端、另外还有在程序里面开房蓝牙、在Demo里面还处理了收到BLE终端数据交互的事件、代码里都有中文注释、要读性应该非常好的、应该会对开发有一定帮助、有兴趣的哥们可以下载看看



onCreate代码
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setTitle(R.string.title_devices);
mHandler = new Handler();

// 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, Toast.LENGTH_SHORT).show();
finish();
}

// Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to
// BluetoothAdapter through BluetoothManager.
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

// Checks if Bluetooth is supported on the device.
if (mBluetoothAdapter == null) {
Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
finish();
return;
}
//开启蓝牙
mBluetoothAdapter.enable();

mBLE = new BluetoothLeClass(this);
if (!mBLE.initialize()) {
Log.e(TAG, "Unable to initialize Bluetooth");
finish();
}
//发现BLE终端的Service时回调
mBLE.setOnServiceDiscoverListener(mOnServiceDiscover);
//收到BLE终端数据交互的事件
mBLE.setOnDataAvailableListener(mOnDataAvailable);
}


<iframe id="iframeu2248002_0" src="http://pos.baidu.com/uchm?rdid=2248002&dc=2&exps=112016&di=u2248002&dri=0&dis=0&dai=2&ps=1510x184&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1468477465848&ti=Android%E8%93%9D%E7%89%994.0%E5%BC%80%E5%8F%91_%E8%93%9D%E7%89%99%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B%E6%BA%90%E7%A0%81%E4%B8%8B%E8%BD%BD_DD%E5%8D%9A%E5%AE%A2&ari=1&dbv=2&drs=1&pcs=1349x632&pss=1349x1543&cfv=0&cpl=23&chi=1&cce=true&cec=UTF-8&tlm=1468477465&rw=632&ltu=http%3A%2F%2Fdwtedx.com%2Fitshare_447.html&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DgbHWAKf8724p-Jh30maMxa-l_bPUOtE9ftaiwVZCe2RNf_-zKpOSxGIZ80I10MBy%26wd%3D%26eqid%3D809ab9b10002334b0000000257872a5d&ecd=1&psr=1366x768&par=1366x728&pis=-1x-1&ccd=24&cja=false&cmi=34&col=zh-CN&cdo=-1&tcn=1468477466&qn=c1f1335952e3b2e0&tt=1468477465819.159.547.548" width="120" height="45" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="margin: 0px; padding: 0px; border-width: 0px; border-style: initial; outline: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; word-wrap: break-word; vertical-align: bottom;"></iframe>

收到BLE终端数据交互的事件
/**
* 收到BLE终端数据交互的事件
*/
private BluetoothLeClass.OnDataAvailableListener mOnDataAvailable = new OnDataAvailableListener(){

/**
* BLE终端数据被读的事件
*/
@Override
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS)
Log.e(TAG,"onCharRead " gatt.getDevice().getName()
" read "
characteristic.getUuid().toString()
" -> "
Utils.bytesToHexString(characteristic.getValue()));
}

/**
* 收到BLE终端写入数据回调
*/
@Override
public void onCharacteristicWrite(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
Log.e(TAG,"onCharWrite " gatt.getDevice().getName()
" write "
characteristic.getUuid().toString()
" -> "
new String(characteristic.getValue()));
}
};


最后给贴上Demo的源代码、希望对大家有用、有兴趣的哥们可以下载看看
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: