记这一周物联网系统集成开发课程中--Android端BLE蓝牙开发所遇到的坑

一、嵌入式所用的蓝牙和手机蓝牙有很大区别

嵌入式蓝牙所用到的协议是BLE,意思是低功耗蓝牙(Bluetooh Low Energy)。通信方式是发送和接收都是以最快的方式完成,完成后暂停发送。而普通的蓝牙则是以持续保持连接。所以BLE通过mBluetoothGatt来实现通信,而普通蓝牙以BluetoothSocket来进行通信

二、ListView组件要自定义一个Adapter来作为子元素,不然界面有点丑,而且可能达不到要求

三、进行数据传输时,BluetoothGatt、BluetoothGattService、BluetoothGattCharacteristic,值得注意的是BluetoothGattService要在BluetoothGatt的回调函数中onServicesDiscovered(BluetoothGatt gatt, int status) 方法中初始化,而且用的时候要判断其是否是空对象,避免出错闪退

mBluetoothGatt = bluetoothDevice.connectGatt(context, true, mBluetoothGattCallback);
List<BluetoothGattService> list = gatt.getServices();
String Uuid = null;
for(BluetoothGattService i:list ){
Uuid = i.getUuid().toString();
break;
}
bluetoothGattService = gatt.getService(UUID.fromString(Uuid));
List<BluetoothGattCharacteristic>  characteristics = bluetoothGattService.getCharacteristics();
String string = null;
for(BluetoothGattCharacteristic i : characteristics){
Log.d("characteristics",i.getUuid().toString());
string = i.getUuid().toString();
break;
}
mCharacteristic = bluetoothGattService.getCharacteristic(UUID.fromString(string));

四、等到getServices()函数中到底是使用谁的?是本机的mBluetoothGatt还是回调函数中的gatt。通过查看ServerUUID的种类来看,两者连接应该是内容相同的对象,所以使用那个并没有太大区别。

五、不必强行知道你所用的蓝牙的ServerUUID、sendUUID等,因为你可以在运行时得到。

六、如果没有特别的说明,发送的byte[]数据中并不需要添加类似于0xaa的头和尾部,如果你下位机收到的数据有乱码,可以考虑一下这个问题。我按照网上的教程添加了一个字符,然后收到的字符串中第一个字符就乱码了。

七、附上一些代码图

八、在网上很多教程都挺老久的。。。放进代码里不一定能用,深刻理解才行

九、由于时间不长,只实现了两个界面,连接ble蓝牙,通过ble蓝牙发送消息的功能。github上有源码

发表评论

电子邮件地址不会被公开。 必填项已用*标注