一、前期基础知识储备
1 )蓝牙是支持设备之间的短距离通信的无线技术(除此之外,还包括红外和WIFI );
支持手机、笔记本电脑、无线耳机等设备之间的信息交换
Android支持的蓝牙协议栈:Bluz,BlueDroid,BLE
buz是Linux发售的,目前使用最广泛; BlueDroid在Android4.0之后推出,简化了Bluz的操作; BLE是最新的低功耗协议,传输效率高和传输速度高; 2 )蓝牙开发技术共分为两类:
经典蓝牙,3.0版以下蓝牙,功耗高,传输数据量大,有效距离10米低功耗BLE,4.0版以上,低功耗,数据量小,有效距离40米; 经典蓝牙的开发包括蓝牙互联、蓝牙列表读取、文件传输和蓝牙耳机等
特点:基于套接字连接,传输速度快; 缺点:耗电量、距离短
流程中,找到设备-配对/绑定设备-建立连接-数据通信-断开连接
蓝牙的开发主要集中在低功耗设备(在邻居设备之间传输少量数据),例如血糖计、蓝牙手环手表、蓝牙温度表等安卓4.3 (API级别18 )上与传统蓝牙不同,http://www.Sina.com/http://www.Sina.com /
注意:当用户使用BLE将设备与其他设备配对时,用户设备上的所有APP应用程序都可以访问在两个设备之间传输的数据。
因此,如果APP应用程序捕获敏感数据,则必须实施APP应用层安全性以保护此类数据的隐私。
3 )蓝牙通信的基本原理:
http://www.Sina.com/APP应用程序框架提供通过Android蓝牙API访问蓝牙功能的权限。 这些API允许APP应用程序无线连接到其他蓝牙设备,并提供点对点和多点无线功能。
要允许启用蓝牙的设备相互传输数据,必须首先通过配对过程形成通信信道。 其中一个设备(可发现的设备)必须设置为能够接收传入的连接请求。 另一个设备使用服务发现过程找到此可发现的设备。 当可发现的设备接受配对请求时,两台设备将完成绑定过程,并在此期间交换安全密钥。 这些密钥将被缓存以供以后使用。 配对和绑定过程完成后,两台设备交换信息。 会话完成后,发出配对请求的设备将发出链接到可发现设备的通道。 但是,这两个设备仍然绑定,因此在以后的会话中,只要它们在彼此的范围内且未解除绑定,就可以自动重新连接。
4 )重要班级和接口
android.bluetooth软件包提供了所有蓝牙API。 以下是创建蓝牙连接所需的类和接口的概述。
蓝牙低功耗 (BLE) 旨在提供显著降低的功耗
表示本地蓝牙适配器(蓝牙无线设备)。 蓝牙适配器是所有蓝牙交互的入口点。 在此类中,可以检测其他蓝牙设备,查看绑定(配对)设备的列表,使用已知的MAC地址实例化蓝牙设备,以及
! -蓝牙连接权限--- uses-permission Android 3360 name=' Android.permission.bluetooth ' /! -蓝牙通信权限----uses-permission Android 3360 name=' Android.permission.bluetooth _ admin '//用于启动蓝牙publicvoidturnonbluetooth的intrequestcode (intent intent=new intent )蓝牙适配器. action _ request _ enabbbate activity.startactivityforresult (intent,请求代码); //mAdapter.enable (; //Google不推荐这种方式}//bluetoothpublicvoidturnoffbluetooth () {mAdapter.disable );//蓝牙可视性publicvoidenablevisibily (上下文上下文) intentintent=newintent )蓝牙适配器. action _ request _ ddapter context.star
tActivity(intent);}BluetoothDevice
表示远程蓝牙设备。借助该类,您可以通过 BluetoothSocket 请求与某个远程设备建立连接,或查询有关该设备的信息,例如设备的名称、地址、类和绑定状态等。
BluetoothSocket
表示蓝牙套接字接口(类似于 TCP Socket)。这是允许应用使用 InputStream 和 OutputStream 与其他蓝牙设备交换数据的连接点。
BluetoothServerSocket
表示用于侦听传入请求的开放服务器套接字(类似于 TCP ServerSocket)。如要连接两台 Android 设备,其中一台设备必须使用此类开放一个服务器套接字。当远程蓝牙设备向此设备发出连接请求时,该设备接受连接,然后返回已连接的 BluetoothSocket。
BluetoothSocket 和 BluetoothServerSocket
类似于Java中的套接字的 Socket 和 ServerSocket;
在服务器端和客户端进行数据传输的时候都要使用这个类;
服务器端 : 使用BluetoothServerSocket对象可以创建一个BluetoothSocket对象, 调用BluetoothServerSocket的accept()方法就可以获取该对象;
客户端 : 调用BluetoothDevice的createRfcommSocketToServiceRecord()可以获取该对象;
在服务器端BluetoothServerSocket进行accept()阻塞, 在客户端BluetoothSocket调用connect()连接服务器, 如果连接成功,
服务器端的accept()方法就会返回BluetoothSocket对象, 同时客户端的BluetoothSocket也成功连接服务器,
此时服务器端和客户端的BluetoothSocket对象就可以获取输入输出流, 对数据进行操作;
基于蓝牙这套通信流程,可以实现一个简单的聊天程序。
BluetoothHeadset
提供蓝牙耳机支持,以便与手机配合使用。这包括蓝牙耳机配置文件和免提 (v1.5) 配置文件。
BluetoothA2dp
定义如何使用蓝牙立体声音频传输配置文件 (A2DP),通过蓝牙连接将高质量音频从一个设备流式传输至另一个设备。
官方文档:《蓝牙概览》《蓝牙低功耗概览》《BluetoothA2dp》
5)电话音频协议(HSP,HFP)和媒体音频协议(A2DP,AVRCP)
HSP(手机规格)– 提供手机(移动电话)与耳机之间通信所需的基本功能。HFP(免提规格)– 在 HSP 的基础上增加了某些扩展功能,原来只用于从固定车载免提装置来控制移动电话。A2DP(高级音频传送规格)– 允许传输立体声音频信号。 (相比用于 HSP 和 HFP 的单声道加密,质量要好得多)。AVRCP(音频/视频遥控规格)–用于从控制器(如立体声耳机)向目标设备(如装有 Media Player 的电脑)发送命令(如前跳、暂停和播放)。关于A2DP,安卓手机都是支持A2DP的,只需要通过广播就可以获取状态了。
关于AVRCP,这部分嵌入式工程师的逻辑多,硬件上的按键可以控制手机app的,比如按键加减时,可以与app交互。
A2DP全名是Advanced Audio Distribution Profile,高质量音频数据传输的协议,其定义里了传送单声道或立体声等高质量音频(区别于蓝牙SCO链路上传输的普通语音)信息的协议和过程。A2DP的典型应用是将音乐播放器的音频数据发送到耳机或音箱。
参考文章:《Android 蓝牙开发之A2DP基本功能》
参考项目:sample-bluetooth-audio(Bluetooth A2DP sample using Android Things)
二,上代码,具体实现经典蓝牙开发文章:《Android蓝牙开发—经典蓝牙详细开发流程》《android 经典蓝牙开发》
BLE蓝牙开发文章:《Android之低功耗蓝牙的基本使用》《Android Kotlin&BLE(低功耗蓝牙) 笔记》
《Android BLE蓝牙详细解读》《Android 蓝牙开发(三) -- 低功耗蓝牙开发》
总结:
1)写过经典蓝牙的就知道,如果说两者的搜索操作还差不多的话,连接操作和写入操作就是完全不同的东西了。
经典蓝牙可以获取到一个类似 TCP 中 Socket 的对象,然后获取 InputStream 和OutputStream,二者分别通过套接字以及 getInputStream()和 getOutputStream()来处理数据传输。
而 BLE 中需要通过不同的 UUID 获取对应的服务、特征才可以写入数据。
2)UUID:每个服务和特征都会有唯一的 UUID ,由硬件决定。
服务(Service):蓝牙设备中可以定义多个服务,相当于功能的集合。
特征(微笑的棒球):一个服务可以包含多个特征,可以通过 UUID 获取到对应的特征的实例,通过这个实例就可以向蓝牙设备发送 / 读取数据。
蓝牙开源框架:《一款适用经典蓝牙的快速开发框架》《开源蓝牙框架 Android-BLE》
三,蓝牙5.0
《古老无线再升级 深入了解蓝牙5.0技术》
蓝牙5.0是由蓝牙技术联盟在2016年提出的蓝牙技术标准,蓝牙5.0针对低功耗设备速度有相应提升和优化,蓝牙5.0结合wifi对室内位置进行辅助定位,提高传输速度,增加有效工作距离。上一次蓝牙4.2是公布于2014年12月。
补充一点内容
划时代的蓝牙 4.0
蓝牙技术联盟(Bluetooth SIG)在2010年发布了跨时代的蓝牙4.0,它并不是蓝牙3.0的简单升级版本,
而是全新的技术架构,蓝牙4.0版本分两种模式:单模蓝牙和双模蓝牙。常见的蓝牙音箱,是典型的双模蓝牙,它需要传输大量的音频数据。
而小米手环,蓝牙温度计则属于单模蓝牙。行业里一般不讲单模蓝牙,而是统一称为低功耗蓝牙。
相对于经典蓝牙,低功耗蓝牙芯片有传输远、功耗低、延迟低等优势。传输距离方面,经典蓝牙只有10-100米,而BLE最远能传输300米;
连接方式上,经典蓝牙只能通过点对点的方式传输,而BLE设备能够能通过点对点、广播、Mesh组网与其他设备相连;
在功耗上两者的差别巨大,低功耗蓝牙运行和待机功耗极低,使用一颗纽扣电池便能连续工作数月甚至数年之久。
经典蓝牙主要用于大量音频传输的情景,而低功耗蓝牙主要用在非音频数据传输上。
基于这个差距,经典蓝牙和低功耗蓝牙应用场景有所不同。经典蓝牙主要应用在音频传输设备上,
而低功耗蓝牙主要用在数据传输领域,尤其是以物联网为主的数据传输。
如血糖仪、蓝牙手环、蓝牙手表、蓝牙温度枪、近程传感器、心率监测仪和健身设备等等。
蓝牙音频传输 - 手机端的音乐如何通过转码的方式传输到蓝牙耳机进行播放。
参考文章:
《经典蓝牙与低功耗蓝牙芯片功能性能对比》
《BLE技术揭秘》
《说说蓝牙音频常用的编解码格式》
《Audio/Video Remote Control Profile (AVRCP)》