开发蓝牙4.0也快两个月了,给我的感受还是颇多的。
我开发的是与TI的蓝牙模块CC2540交互的安卓端蓝牙软件,对于安卓都不是很熟悉的我,是一个不小的挑战。
废话不多说,直接谈项目。
我用的是google官方的源码,它本身把很多基本框架都搭好了。直接就能运行,当然前提是在Android Studio上,如果是Eclipse上还需要稍作改动。我们先来看下代码。它主要有两个Avtivity和一个Service组成,顾名思义,两个Activity的用途分别为设备扫描与设备管理。
这里我不准备介绍基本的BLE知识(自行百度即可),我只是说一下一些需要注意的地方,特别是我百度不到的好多东西,希望跟大家分享一下。
一开始的软件已经可以查看Service和Characteristic的UUID,不过只能接收消息,原因大概是这个Sample当初设计的时候就只负责接收。当然要发送也简单,只要在BluetoothLeService中加writeCharacteristic方法。
public boolean writeCharacteristic(BluetoothGattCharacteristic charac,String message){
//check mBluetoothGatt is available
if (mBluetoothGatt == null) {
Log.e(TAG, "lost connection");
return false;
}
charac.setValue(message.getBytes());
boolean status = mBluetoothGatt.writeCharacteristic(charac);
return status;
}
写数据比较简单,直接调用这个方法即可。当然,这里也有个陷阱,我们发现,如果你在cc2540中定义了Byte字节的长度,那么在charac.setValue()中的数组长度要跟其相同,不然模块是收不到的。
我们发现在很多地方都用到了BluetoothGattCharacteristic这个类,即特性,BLE就是靠改变特性值来传递数据的,那么,这些BluetoothGattCharacteristic是从哪里得到的呢?我们知道,BluetoothGattCharacteristic是BluetoothGattService中的属性,我们要得到BluetoothGattCharacteristic,就要先得到BluetoothGattService。那要怎么样得到BluetoothGattService呢?
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
String intentAction;
if (newState == BluetoothProfile.STATE_CO