Android蓝牙数据库:优化数据传输的关键。 (android 蓝牙 数据库)

Android蓝牙数据库:优化数据传输的关键

随着移动设备和无线技术的不断发展,蓝牙技术作为较为成熟的无线通信技术之一,其应用范围也愈来愈广泛,而Android蓝牙数据库在优化数据传输方面起到了关键作用。本文将从Android蓝牙数据库的基本架构入手,并结合其在优化数据传输方面所发挥的重要作用进行探讨。

一、Android蓝牙数据库基础架构

在Android蓝牙上层协议栈中,蓝牙数据库是十分重要的一个组件,主要用来保存已连接蓝牙设备的重要信息,如设备名称、地址、服务UUID等。Android蓝牙数据库的结构如下图所示:

![image](https://user-images.githubusercontent.com/80472777/130024407-8afe72c6-ef5d-4e42-8d05-dc7b5ef35ee9.png)

Android蓝牙数据库架构图

从图中可以看出,Android蓝牙数据库主要包括三个层次,分别是Service、Profile和Device。其功能分别如下:

1. Service层:负责蓝牙协议交互和管理BluetoothGattService等数据,是整个Android蓝牙通信的核心,是连接Profile和Device的桥梁。

2. Profile层:定义BluetoothProfile的抽象类,管理所有连接的Device,其主要分为两类,即Server和Client,分别用来实现服务端或客户端的程序处理逻辑。

3. Device层:管理BluetoothDevice的实例对象,例如bluetoothDevice.getProfileConnectionState()方法可用于获取连接状态。

对于Android应用开发来说,最常用的是Profile层,通过Profile接口实现与服务器或客户端的通信。其中最常用的Profile是BluetoothGatt和BluetoothA2dp,其中BluetoothGatt用于连接和通信广泛应用于智能手表、智能硬件等场景,而BluetoothA2dp则用于音频传输,支持音频数据的高质量传输和实时控制,广泛应用于耳机、音响等场景。

二、Android蓝牙数据库优化数据传输关键

在蓝牙通信中,数据传输速率和效率一直是被广泛关注的问题之一。针对这个问题,Android蓝牙数据库在优化数据传输方面发挥了关键作用。

Android蓝牙数据库可以优化数据传输存在以下几个方面:

1. 编码方式的优化:在数据传输中,可以选择更高效的编码方式,例如base64、gzip等。这能够有效地减小数据的传输量,提高效率。

2. 发送数据分块:在发送数据的过程中,可以采用分块发送的方式,将原本一次性发送的数据切成若干小块逐一发送。这可以避免数据包过大,减小数据包的丢失风险,从而提高数据传输的成功率。

3. 建立数据缓存:在数据传输时,可以建立数据缓存,缓存等待发送的数据。这样,可以防止之前的数据完全发送完毕,下一个数据包却已经到达发送队列,从而造成数据包混乱的情况。通过建立数据缓存,保证数据包的有序传输,提高数据传输的成功率。

4. 使用队列处理数据:在数据传输中,可以使用队列进行数据处理,将需要发送的数据按照一定规则加入到队列中,然后再在队列中依次取出,这样能够避免在发送数据过程中数据包的丢失和错位,保证数据传输的成功率和速率。

以上几种优化方式都可有效提高蓝牙数据传输的速率和效率,并在Android蓝牙数据库中有所实践。深入研究这些优化方式,无疑有助于我们在日后的蓝牙通信中更加高效地进行数据传输。

三、

本文从Android蓝牙数据库的基本架构入手,结合Android蓝牙数据库优化数据传输的相关知识进行了分析和探讨。Android蓝牙数据库通过优化编码方式、分块发送、建立数据缓存、使用队列等方式,让蓝牙数据传输变得更加高效和可靠。在日后的蓝牙通信中,结合这些优化方式,我们可以更加高效地进行数据传输,从而为我们的应用程序提供更加流畅和快速的体验。

相关问题拓展阅读:

Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码)

万物互联

的物联网时代的已经来临,ble蓝牙开发在其中扮演着举重若轻的角色。最近刚好闲一点,抽时间梳理下这块的知识点。

涉及ble蓝牙通讯的客户端(开启、扫描、连接、发送和接收数据、分包解包)和服务端(初始化广播数据、开始广播、配置Services、Server回调操作)整个环节以及一些常见的问题即踩过的一些坑。

比如

1、在Android不同版本或不同手机的适配问题,扫描不到蓝拆拍牙设备

2、如何避免ble蓝牙连接出现133错误?

3、单次写的数据大小有20字节限制,如何发送长数据

蓝牙有传统(经典)蓝牙和低功耗蓝牙BLE(Bluetooth Low Energy)之分,两者的旅岩羡开发的API不一样,本文主讲Ble蓝牙开发,传统蓝牙不展开,有需要的可以自行了解。

相对传统蓝牙,BLE低功耗蓝牙,主要特点是快速搜索,快速连接,超低功耗保持连接和数据传输。

客户端

服务端

Android4.3(API Level 18)开始引入BLE的核心功能并提供了相应的 API。

应用程序

通过这些 API 扫描蓝牙设备、查询 services、读写设备的 characteristics(属性特征)等操作。

BLE蓝牙协议是GATT协议, BLE相关类不多, 全枣搭都位于android.bluetooth包和android.bluetooth.le包的几个类:

android.bluetooth.

.BluetoothGattService 包含多个Characteristic(属性

特征值

), 含有唯一的UUID作为标识

.BluetoothGattCharacteristic 包含单个值和多个Descriptor, 含有唯一的UUID作为标识

.BluetoothGattDescriptor 对Characteristic进行描述, 含有唯一的UUID作为标识

.BluetoothGatt 客户端相关

.BluetoothGattCallback 客户端连接回调

.BluetoothGattServer 服务端相关

.BluetoothGattServerCallback 服务端连接回调

android.bluetooth.le.

.AdvertiseCallback 服务端的广播回调

.AdvertiseData 服务端的广播数据

.AdvertiseSettings 服务端的广播设置

.BluetoothLeAdvertiser 服务端的广播

.BluetoothLeScanner 客户端扫描相关(Android5.0新增)

.ScanCallback 客户端扫描回调

.ScanFilter 客户端扫描过滤

.ScanRecord 客户端扫描结果的广播数据

.ScanResult 客户端扫描结果

.ScanSettings 客户端扫描设置

BLE设备分为两种设备: 客户端(也叫主机/中心设备/Central), 服务端(也叫从机/外围设备/peripheral)

客户端的核心类是 BluetoothGatt

服务端的核心类是 BluetoothGattServer 和 BluetoothLeAdvertiser

BLE数据的核心类是 BluetoothGattCharacteristic 和 BluetoothGattDescriptor

下面详细讲解下客户端和服务端的开发步骤流程

安卓手机

涉及蓝牙权限问题,蓝牙开发需要在AndroidManifest.xml文件中添加权限声明:

在搜索设备之前需要询问打开手机蓝牙:

注意: BLE设备地址是动态变化(每隔一段时间都会变化),而经典蓝牙设备是出厂就固定不变了!

通过扫描BLE设备,根据设备名称区分出目标设备targetDevice,下一步实现与目标设备的连接,在连接设备之前要停止搜索蓝牙;停止搜索一般需要一定的时间来完成,更好调用停止搜索函数之后加以100ms的延时,保证系统能够完全停止搜索蓝牙设备。停止搜索之后启动连接过程;

BLE蓝牙的连接方法相对简单只需调用connectGatt方法;

参数说明

与设备建立连接之后与设备通信,整个通信过程都是在BluetoothGattCallback的异步

回调函数

中完成;

BluetoothGattCallback中主要回调函数如下:

上述几个回调函数是BLE开发中不可缺少的;

当调用targetdDevice.connectGatt(context, false, gattCallback)后系统会主动发起与BLE蓝牙设备的连接,若成功连接到设备将回调onConnectionStateChange方法,其处理过程如下:

判断newState == BluetoothGatt.STATE_CONNECTED表明此时已经成功连接到设备;

mBluetoothGatt.discoverServices();

扫描BLE设备服务是

安卓系统

中关于BLE蓝牙开发的重要一步,一般在设备连接成功后调用,扫描到设备服务后回调onServicesDiscovered()函数,函数原型如下:

BLE蓝牙开发主要有负责通信的BluetoothGattService完成的。当且称为通信服务。通信服务通过

硬件工程师

提供的UUID获取。获取方式如下:

具体操作方式如下:

开启监听,即建立与设备的通信的首发数据通道,BLE开发中只有当客户端成功开启监听后才能与服务端收发数据。开启监听的方式如下:

BLE单次写的数据量大小是有限制的,

通常是20字节

,可以尝试通过requestMTU增大,但不保证能成功。分包写是一种解决方案,需要定义分包协议,假设每个包大小20字节,分两种包,

数据包

和非数据包。对于数据包,头两个字节表示包的序号,剩下的都填充数据。对于非数据包,主要是发送一些控制信息。

监听成功后通过向 writeCharacteristic写入数据实现与服务端的通信。写入方式如下:

其中:value一般为Hex格式指令,其内容由设备通信的蓝牙

通信协议

规定;

若写入指令成功则回调BluetoothGattCallback中的onCharacteristicWrite()方法,说明将数据已经发送给下位机;

若发送的数据符合通信协议,则服务端会向客户端回复相应的数据。发送的数据通过回调onCharacteristicChanged()方法获取,其处理方式如下:

通过向服务端发送指令获取服务端的回复数据,即可完成与设备的通信过程;

当与设备完成通信之后之后一定要断开与设备的连接。调用以下方法断开与设备的连接:

源码上传在CSDN上了,有需要的可以借鉴。

=====> Android蓝牙Ble通讯Demo示例源码–扫描,连接,发送和接收数据,分包解包

BLE单次写的数据量大小是有限制的,通常是20字节,可以尝试通过requestMTU增大,但不保证能成功。分包写是一种解决方案,需要定义分包协议,假设每个包大小20字节,分两种包,数据包和非数据包。对于数据包,头两个字节表示包的序号,剩下的都填充数据。对于非数据包,主要是发送一些控制信息。

总体流程如下:

1、定义

通讯协议

,如下(这里只是个举例,可以根据项目需求扩展)

2、封装通用发送数据接口(拆包)

该接口根据会发送数据内容按更大字节数拆分(一般20字节)放入队列,拆分完后,依次从队列里取出发送

3、封装通用接收数据接口(组包)

该接口根据从接收的数据按协议里的定义解析数据长度判读是否完整包,不是的话把每条消息累加起来

4、解析完整的数据包,进行业务逻辑处理

5、协议还可以引入加密解密,需要注意的选算法参数的时候,加密后的长度更好跟原数据长度一致,这样不会影响拆包组包

一般都是Android版本适配以及不同ROM机型(小米/红米、华为/荣耀等)(EMUI、MIUI、ColorOS等)的权限问题

蓝牙开发中有很多问题,要静下心分析问题,肯定可以解决的,一起加油;

关于android 蓝牙 数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Android蓝牙数据库:优化数据传输的关键。 (android 蓝牙 数据库)