关于安卓蓝牙连接通信的实现

简介: 生活中用到蓝牙的电子设备很多,作为一名开发者,有必要了解蓝牙连接通信的实现

看了很多的博客文章的技术,今天也写一写自己的第一篇博客文章,我只说说如何用,具体实现的原理,原谅我不太清楚,但对于大多数人来说,知道怎么做出来就很不错了哈哈!不多说了,开始吧。

首先要知道几个类,BluetoothAdapter,BluetoothGatt,BluetoothDevice,BluetoothCattService,BluetoothCattCharacteristic。

第一个是蓝牙设配器,对蓝牙的操作都需要用到它,很重要,BluetoothGatt作为中央来使用和处理数据,使用时有一个回调方法BluetoothGattCallback返回中央的状态和周边提供的数据,BluetoothCattService作为周边来提供数据;BluetoothGattServerCallback返回周边的状态。BluetoothDevice是蓝牙设备,BluetoothCattCharacteristic是蓝牙设备的特征。

看着有点乱,我们来打个比喻:BluetoothDevice为学校,BluetoothGatt为学校到达某一个班级的通道,BluetoothCattService为学校的某一个班级,BluetoothCattCharacteristic为班级中的某一个学生。那么蓝牙连接通信的过程就是这样,BluetoothAdapter先找到学校(就是连接目的设备),再通过通道找到目标班级,最后从班级中找到目标学生,这个学生就是我们设备之间通信的中介,很重要,学校有唯一的MAC地址,班级有唯一的serviceUUID,学生有唯一的charactersticUUID(相当于学号),所以就是在一所学校找一个学生的问题,好了,应该了解了吧。

下面正是开始

1.加上蓝牙访问权限
image.png

2.打开蓝牙,两种方式,一种是询问式,一种是自动式,你百度一下就有很多,很简单,这里就不多说。

3.搜索周边的蓝牙设备
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.startDiscovery();//此过程会发送广播信息,我们在BroadcastReceiver中去接收即可
image.png

我这里把能搜索到的设备保存在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()里面做自己想要的操作了,整个过程就是这样,下面给出这个过程的完整代码:
20171229113553567.jpg

蓝牙连接通信有两种形式,一种是通过socket的形式,另一种就是我这篇文章写的通过MAC地址来实现的,对于数据包的解析就靠你们自己了,这个需要蓝牙协议的,每个协议都不同,解析的过程也不同,在这里无法讲,主要是对数据包的结构要熟悉,这样的话就基本不成问题了。

好了,第一篇博客就写这么多,谢谢你们的阅读!

相关文章
|
3天前
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
26 1
|
2月前
|
Android开发
如何用Airtest脚本无线连接Android设备?
如何用Airtest脚本无线连接Android设备?
|
4月前
|
XML 物联网 API
Android Ble蓝牙App(五)数据操作
Android Ble蓝牙App(五)数据操作
|
4月前
|
Android开发
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
100 0
|
4月前
|
Java 关系型数据库 数据库
Android App连接真机步骤与APP的开发语言和工程结构讲解以及运行实例(超详细必看)
Android App连接真机步骤与APP的开发语言和工程结构讲解以及运行实例(超详细必看)
36 0
|
3天前
|
运维 网络协议 Linux
Android 双网卡配置为连接到Android主机的PC提供外网访问(1)
Android 双网卡配置为连接到Android主机的PC提供外网访问(1)
16 0
|
4月前
|
物联网 Android开发
Android Ble蓝牙App(七)扫描过滤
Android Ble蓝牙App(七)扫描过滤
|
4月前
|
物联网 Android开发
Android Ble蓝牙App(六)请求MTU与显示设备信息
Android Ble蓝牙App(六)请求MTU与显示设备信息
|
4月前
|
物联网 Android开发
Android Ble蓝牙App(四)UI优化和描述符
Android Ble蓝牙App(四)UI优化和描述符
|
4月前
|
传感器 监控 物联网
Android Ble蓝牙App(三)特性和属性
Android Ble蓝牙App(三)特性和属性