前言
最近工作进行了蓝牙方面的开发,踩了不少坑。为了避免用过就忘,也是想拓展下蓝牙开发更深更广的领域,于是写博客进行记录。根据我用到的知识大概要分这么几个部分讲解:蓝牙基础篇,LE篇,A2dp篇,再之后其他的涉猎可能要看我后续能学习的多深入了。先一篇一篇写吧,最后再做整体的章节梳理。(本篇先介绍蓝牙基础科普知识,了解这个有助于系统性的学习蓝牙相关知识,如果是单纯想要快速上手android蓝牙开发,请看下一篇)
蓝牙是一种短距离无线通信技术。(原本以为蓝牙不能像4G那样远距离传输是因为蓝牙的波长太短不适合远距离传输,结果他俩的无线电波频率都差不多,蓝牙不适合远距离主要是因为输出功率不够)
蓝牙版本发展史
1994年,也就是我出生那年。爱立信为了为旗下产品提供更好的信息传输方式而研发了蓝牙,其命名为“蓝牙”是在1997年。
2002年,蓝牙1.1版正式推出,相当于是1.0的稳定版。1.2又加入了抗干扰跳频功能。
蓝牙1.x的版本传输速率只有800kpbs左右,蓝牙2.0使用了EDR技术使得传输速度能够达到3Mbps。
蓝牙3.0的速度达到了24Mbps,支持蓝牙的各种设备开始爆发式出现,但是功耗问题也暴露了出来。
蓝牙4.0将蓝牙的使用功耗大幅度降低,不仅如此还提升了其连接速度和传输距离(可达100m),4.1,4.2更是增加了蓝牙传输的安全性。(BLE低功耗蓝牙)
蓝牙5.0更快的传输速度,更远的传输距离(300m),精准的定位(误差在1m内)。
蓝牙协议相关
经典蓝牙(又称传统蓝牙):主要是针对4.0低功耗蓝牙之前的蓝牙协议(BR / EDR协议)的总称 。
低功耗蓝牙:牙是针对于4.0增加的BLE协议(即Bluetooth Low Energy)。另外android版本4.3以上才支持BLE。
针对于上面两种模式现在蓝牙设备分为了单模和双模两种,顾名思义,单模即是指只支持经典蓝牙或者低功耗蓝牙中的一种模式。双模则是既兼容经典蓝牙又兼容低功耗蓝牙。
蓝牙应用层协议:
HSP(HeadsetPro-file)代表耳机功能,提供手机与耳机之间通信所需的基本功能。
HFP(HandProfile)则代表免提功能,HFP在HSP的基础上增加了某些扩展功能。
A2DP(Advanced Audio Distribution Profile)指的是 蓝牙音频传输模型协定,是一种音频的高清晰度传输协议。
AVRCP(Audio/VideoRemote Control Profile)也就是音频/视频遥控规格,用于从控制器(如立体声耳机)向目标设备(如装有 Media Player 的电脑)发送命令(如前跳、暂停和播放)。
OPP(Object Push Profile)蓝牙通信程序部分需采用用于设备之间传输数据对象。
PBAP(PhonebookAccess Profile)电话号码簿访问协议。
蓝牙BLE相关
BLE四种工作模式:
1.主设备模式:蓝牙模块可以对周围设备进行搜索并选择需要连接的从机进行连接,可以发送和接收数据。
2.从设备模式:蓝牙模块只能被主机搜索,不能主动搜索。从设备跟主机连接以后,也可以和主机设备进行发送和接收数据。
3.广播模式:蓝牙模块可以进行一对多的广播。
4.mesh组网模式:蓝牙模块可以实现简单的自组网络,每个模块只需要设置相同的通讯密码就可以加入到同一网络当中,每一个模块都可以发起数据,每个模块可以收到数据并且进行回复。并且不需要网关,即使某一个设备出现故障也会跳过并选择最近的设备进行传输。
蓝牙UUID
UUID 是通用唯一识别码(Universally Unique Identifier)。
蓝牙中关于UUID的介绍一般会关联到service UUID(服务),Characteristic UUID(特性),还有Property(属性)这几个概念。
简单的理解就是蓝牙提供了不同的service (每个service 都有与众不同的UUID),而Characteristic是从属于service的(同样每个Characteristic都有与众不同的UUID),每一个Characteristic又有一个或多个Property(当然Property是没有UUID的概念)。
可以把service理解成一个家庭,每个家庭都有不同的户口id,Characteristic 就像家庭中的人,每个人有自己的身份证号,Property就是指某个家庭成员所拥有的能力(比如说我的能力“Property”有吃饭,睡觉,写Bug等等)。
关于属性我再举几个详细的例子,能更好的理解这些概念了:
Read:读属性,具有该属性的Characteristic UUID 是可读的。
Write:写属性,具有该属性的Characteristic UUID 是可以接收写入数据的。
Notify:通知属性,具有该属性的Characteristic UUID是可以发送通知的。
最后讲一下有关UUID的格式问题:
完整的格式(也是唯一的,其他格式只是对应这种格式的缩减版,都可以映射成这种格式)是128bit长度的数据。除此之外还有32bit长度和16bit长度的两种精简版
UUID的编码规则(了解就好不需用深入研究,128bit转换成16进制子串是32位长度,下面这个位是指16进制的第几位):
1)1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的惟一性;
2)9~16位采用底层的IP地址,在服务器集群中的惟一性;
3)17~24位采用当前对象的HashCode值,在一个内部对象上的惟一性;
4)25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的惟一性。
32bit长度和16bit长度UUID扩展为128bit的UUID:
若 16 bit UUID为xxxx,那么 128 bit UUID 为 0000xxxx-0000-1000-8000-00805F9B34FB
若 32 bit UUID为xxxxxxxx,那么 128 bit UUID 为 xxxxxxxx-0000-1000-8000-00805F9B34FB
还有些技术词概念和专业词汇等以后遇到了再过来补充。
android 蓝牙开发 基础篇链接:
https://www.jianshu.com/p/c223425ade4d
网友评论