本帖最后由 lb8820265 于 2015-9-13 11:32 编辑
接着前面的来,有评论说需要蓝牙的APP,那么这次我就先讲蓝牙APP的制作吧。蓝牙使用的芯片是CC2541,这是一款蓝牙4.0芯片,BLE芯片大势所趋,如果还用2.0那就OUT了,而安卓系统在4.3版本以后才开始支持BLE。如果想要能够成功的编写好蓝牙APP,那么安卓4.3以上系统加支持蓝牙4.0的手机是必须的。
首先我还是从分析官方的代码开始吧,安卓支持BLE之后,发出了一个demo,这个demo大家可以通过在Android studio软件中File->Import Sample然后找到“Bluetooth Le Gatt”和“Bluetooth Chat”两个工程,一个是用来搜索设备+显示服务的,另一个是用来在两个手机之间通信的。“Bluetooth Chat”这个实测能够搜索到蓝牙4.0设备但是无法通信。如果你的电脑不能连上Google,那可能就不能打开Import Sample,那么我将两个工程放到文章末尾供大家下载,先看看Bluetooth Le Gatt工程,我是用的1.2.2版本的IDE。
工程文件如下图:
首先看AndroidManifest.xml文件,这个里面主要是注册了两个Activity,一个是DeviceControlActivity一个是DeviceScanActivity,而这个Activity的属性设置为开始启动,那么接下来看这个DeviceScanActivity,先看onCreate函数,这个函数是最先运行的函数,函数作用为修改标题为,然后检查是否支持BLE然后获取手机的蓝牙适配器句柄。然后程序接下来运行onResume函数,这是Activity规定的,详细请查看Activity的生命周期,这里将部分函数放到onResume函数中而不是onCreate中,这主要是在退出Activity时候运行onPause,然后再次运行的时候就会运行onResume,而不会运行onCreate。onResume函数作用是确认是否打开蓝牙,没有打开就提示用户打开,然后在列表中取出蓝牙的适配器,然后就是运行scanLeDevice函数,这个里面运行.starLeScan,运行10秒,在搜索到的返回函数mLeScanCallback中将搜索到的设备添加到。到此程终止了,那么接下来就是用户操作了,列表中都添加了点击相应函数接下来看onListItemClick函数,首先获取用户点击的是哪个设备,然后将设备名和地址都用传值的Intent传送并启动DeviceControlActivity,如果还在搜索那么就停止搜索。
接下来看DeviceControlActivity,先看onCreate函数,先绑定gatt_services_characteristics布局文件,然后获取上一个Activity传过来的地址是设备名并显示在界面上,然后是用bindService方法绑定BluetoothLeService服务,重写onServiceConnected函数,在里面获取手机蓝牙适配器然后运行connect,作用是连接指定的地址设备,这个connect函数是写在BluetoothLeService服务类中,之后讲解。重写onServiceDisconnected函数,在里面清空适配器服务。onResume函数和onPause函数作用分别是注册和注销广播接收器,广播接收器这里能够接收的广播有ACTION_GATT_CONNECTED,ACTION_GATT_DISCONNECTED,ACTION_GATT_SERVICES_DISCOVERED,ACTION_DATA_AVAILABLE,当然CC2541还有很多服务,可以都自己设置广播来接收。广播接收器稍后讲解。
下面来看BluetoothLeService服务,先看connect函数,这个函数在前面调用过,这个函数在确定一切正常之后,调用connectGatt函数,然后函数中有一个回调函数mGattCallback,它有多种方法,它重写了onConnectionStateChange,onServicesDiscovered,onCharacteristicRead,onCharacteristicChanged,当然还有其他的,比如onReadRemoteRssi只是它没有重写。这里就挑onServicesDiscovered讲下,一旦发现服务,便进入到这个函数中,然后运行broadcastUpdate函数,broadcastUpdate中运行sendBroadcast将广播发送出去,然后在DeviceControlActivity类中BroadcastReceiver函数接收广播,收到广播后运行displayGattServices函数,这个函数很长,作用就是将服务放到列表中。然后列表中设置按钮监听OnChildClickListener,这里面涉及到两个函数,一个是setCharacteristicNotification,在BluetoothLeService类中,在这个是用来开启和关闭数据的接收的,然后是readCharacteristic函数,这个是用来读取收到的数据的。
上面的例程什么都好,但是却唯独缺少了数据发送函数。下面我就在这个官方例程的基础上添加发送函数,其实相当的简单,只需要修改两个地方,首先在BluetoothLeService类中添加如下函数: public void writeCharacteristic(BluetoothGattCharacteristiccharacteristic) {
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(TAG, "BluetoothAdapternot initialized");
return;
}
mBluetoothGatt.writeCharacteristic(characteristic);
} 然后在DeviceControlActivity类中列表点击响应servicesListClickListner函数后面添加如下函数: if((charaProp & BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) {
byte[] t = {0x02,0x00};
characteristic.setValue(t);
characteristic.setWriteType(characteristic.getWriteType());
Log.i("Gatt", "write--- characteristic value ");
mBluetoothLeService.writeCharacteristic(characteristic);
}
好了,大功告成了。那么接下来实机运行一下,CC2541与电脑串口相连。APP运行后搜索设备单击连接后会出现很多服务,然后这里点击ff00服务再点击ff02,然后通过电脑串口发送“hello word”,同时可以通过点击ff01可以向CC3541发送0x20 0x00的数字,至于为什么是这几个UUID那就要自己看CC2451的介绍了。APP图与串口图如下:
好啦,现在实现了蓝牙数据的收发,接下来做的事情就简单了,只需要画画界面,设置好通信协议就能就能实现蓝牙遥控了,今天到这里,如果大家感兴趣,我再将蓝牙遥控器中如何最大化的利用蓝牙,通信协议的编写,界面的编辑分享给大家。
|