看了很多的博客文章的技术,今天也写一写自己的第一篇博客文章,我只说说如何用,具体实现的原理,原谅我不太清楚,但对于大多数人来说,知道怎么做出来就很不错了哈哈!不多说了,开始吧。
首先要知道几个类,BluetoothAdapter,BluetoothGatt,BluetoothDevice,BluetoothCattService,BluetoothCattCharacteristic。
第一个是蓝牙设配器,对蓝牙的操作都需要用到它,很重要,BluetoothGatt作为中央来使用和处理数据,使用时有一个回调方法BluetoothGattCallback返回中央的状态和周边提供的数据,BluetoothCattService作为周边来提供数据;BluetoothGattServerCallback返回周边的状态。BluetoothDevice是蓝牙设备,BluetoothCattCharacteristic是蓝牙设备的特征。
看着有点乱,我们来打个比喻:BluetoothDevice为学校,BluetoothGatt为学校到达某一个班级的通道,BluetoothCattService为学校的某一个班级,BluetoothCattCharacteristic为班级中的某一个学生。那么蓝牙连接通信的过程就是这样,BluetoothAdapter先找到学校(就是连接目的设备),再通过通道找到目标班级,最后从班级中找到目标学生,这个学生就是我们设备之间通信的中介,很重要,学校有唯一的MAC地址,班级有唯一的serviceUUID,学生有唯一的charactersticUUID(相当于学号),所以就是在一所学校找一个学生的问题,好了,应该了解了吧。
下面正是开始
1.加上蓝牙访问权限
2.打开蓝牙,两种方式,一种是询问式,一种是自动式,你百度一下就有很多,很简单,这里就不多说。
3.搜索周边的蓝牙设备
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.startDiscovery();//此过程会发送广播信息,我们在BroadcastReceiver中去接收即可
我这里把能搜索到的设备保存在list列表中,名字也保存在一个列表中,然后再UI界面上的listView中显示出来,就可以看到搜索到了几个蓝牙设备,名字各是什么
4.获取目的设备的MAC地址,因为我们已经搜索到很多设备,所以直接mac = device.getAddress().toString()即获取到设备的MAC地址
5.既然找到了地址,那就可以开始连接了,注意一点,连接的时候一定要先关闭上面的搜索蓝牙功能,直接adapter.cancelDiscovery就可以了
知道了MAC地址,那就可以获取到该MAC地址对应的蓝牙设备mDevice = adapter.getRemoteDevice(mac),这个mDevice就是我们的学校,
学校有了,那就要找到通道,bluetoothGatt = mDevice.connectGatt(this,false,new BluetoothGattCallback() ),bluetoothGatt就是通道,BluetoothGattCallback()是回调类,里面有很多方法,寻找班级和学生就在它的方法里面去实现。
里面有几个比较重要的方法,分别是onConnectionStateChange(),onServiceDiscovered(),onCharacteristicRead(),onCharacteristicChanged(),几个方法之间是独立的,同时又有联系的,过程是这样,连接通道时最先触发的是onConnectionStateChange()方法,在该方法里面启动服务发现后会触发onConnectionStateChange(),此方就是寻找班级和学生的重点方法,在通道通过UUID找到班级,在班级通过UUID找到学生,每个设备有多个班级UUID,每个班级对应多个学生UUID,所以你可以先打印出来这些信息,获取有用的班级UUID和学生UUID,找到了学生,就可以发出通知了,即把学生通知出去,上面说了学生只是一个通信的中介,此时会触发onCharacteristicChanged()方法,在该方法里面就可以获取到设备那边传过来的数据包了,另外onCharacteristicRead()方法被触发的前提是要在onServiceDiscovered()里面执行readCharacteristic()方法,然后就可以在onCharacteristicRead()里面做自己想要的操作了,整个过程就是这样,下面给出这个过程的完整代码:
蓝牙连接通信有两种形式,一种是通过socket的形式,另一种就是我这篇文章写的通过MAC地址来实现的,对于数据包的解析就靠你们自己了,这个需要蓝牙协议的,每个协议都不同,解析的过程也不同,在这里无法讲,主要是对数据包的结构要熟悉,这样的话就基本不成问题了。
好了,第一篇博客就写这么多,谢谢你们的阅读!