蓝牙

蓝牙分为经典蓝牙(class bluetooth)和低功耗蓝牙(bluetooth low energy)
经典蓝牙的缺点是比较耗电。后来,诺基亚发明了一种可以降低功耗的蓝牙通信方式。2010年出台的蓝牙4.0把这种通信方式规范为“低功耗蓝牙”(BLE,Bluetooth Low Energy)。BLE把通信双方分为非对称的双方,尽量让其中的一方承担主要的开销,减少另一方的负担。举例来说,手环电量少,而且需要长时间待机。BLE通信的主要负担可以放在电量较充裕且充电方便的手机一侧,从而减少手环的能耗。


BlueZ

blueZ工具:

bccmd
bluemoon
bluetoothctl
btattach
btmon
ciptool
hciattach
hciconfig
hcidump
hcitool
hex2hcd
l2ping
l2test
mpris-proxy
rctest
rfcomm
sdptool

你可以使用下面命令手动启动或者关闭蓝牙服务
sudo systemctl start bluetooth
sudo systemctl stop bluetooth
查看蓝牙服务的状态
systemctl status bluetooth


bluez源码分析

​​android 蓝牙代码架构及其uart 到rfcomm流程​​


蓝牙调试

可以通过Bluetooth Low Energy sniffer来抓包。


蓝牙的一些Profile

Headset Profile (HSP)
Handsfree Profile (HFP)
Advanced Audio Distribution Profile (A2DP)
Serial Port Profile (SP)
Human Interface Device Profile (HID)
Personal Area Network Device Profile (PAN)
Object Push Profile (OPP)
File Transfer Profile (FTP)
Generic Access Protocol GAP
Generic Attribute Profile GATT
参考文章:​​​Bluetooth Profiles​​ 不同的Profile对应不同的功能,下面就来介绍蓝牙的这些功能的实现


蓝牙传输音频

蓝牙耳机现在主要有三大规格———HSP、HFP和A2DP。
HeadsetPro-file(HSP)代表耳机功能,提供手机与耳机之间通信所需的基本功能。
HandProfile(HFP)则代表免提功能,HFP在HSP的基础上增加了某些扩展功能。
Advanced Audio Distribution Profile(A2DP),指的是 蓝牙音频传输模型协定。

蓝牙支持的音频编码格式,分成以下几种:
一、SBC,这个是蓝牙音频的标准编码格式。是A2DP(Advanced Audio Distribution Profile,蓝牙音频传输协议)协议强制规定的编码格式。 最大允许速率是单声道 320kbit/s、双声道 512kbit/s,所有的蓝牙都会支持这个音频编码格式,因此所有的蓝牙音频芯片也会支持这个音频编码格式。
二、AAC,杜比实验室为音乐社区提供的技术,是一种高压缩比的编码算法。iphone进行蓝牙传输时会使用AAC格式。目前苹果的设备蓝牙音频基本上都是采用AAC编码技术。而且市面上不少蓝牙音箱/耳机等接收设备也支持AAC解码。
三、APT-X,是CSR公司的专利编码算法,在被高通收购后,成为其主推的编码技术,宣传上是号称可以达到 CD 音质。大部分安卓新机配置了APT-X。这种音频编码技术比传统蓝牙编码效率更高,声音保留的细节更多,实际听感好于前面两者。采用APT-X技术的设备,需要向高通申请授权并交纳授权费,并且需要发射接收端都支持才行。
四、LDAC,这是SONY公司自己开发的一种音频编码技术,可以传输高分辨率(Hi-Res)音频内容,这种技术通过高效的编码和优化分包方式,可以传输约三倍于其他编码技术的数据。目前这种技术只用在SONY自己的发射和接收设备上。因此,只有买了SONY成套的支持LDAC音频编码技术的发射和接受设备,才能够支持LDAC编码的蓝牙音频数据传输。


蓝牙传输文件

openobex


Beacon定位

ibeacon是由苹果公司在2013年推出的,其初衷是解决室内定位的问题。利用低功耗的BLE多点定位来解决室内(大型商场、停车场、医院等)定位的问题也就理所应当了。
ibeacon基于BLE的广播,而BLE广播限定数据长度不能超过31 Bytes。ibeacon将广播包的长度固定为30 Bytes。
这30个Bytes分为两个AD structure(这是BLE广播数据的一种组织形式)。每个AD structure由 1字节的length+1字节的AD Type+用户数据 构成。下面拿一个实例来说明:
02 01 06 1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 29 11 30 39 cd
第一个AD structure

02 ,// AD structure的长度 这里表示接下来还有两个字节
01, //AD Type 这是由蓝牙联盟定义的标识,这里表示蓝牙支持类型
06, //0x06=0000 0110 每个位的意义如下
bit0=0 OFF // LE Limited Discoverable Mode
bit1=1 ON // LE General Discoverable Mode
bit2=1 ON // BR/EDR Not Supported
bit3=0 OFF // Simultaneous LE and BR/EDR to Same Device Capable (controller)
bit4=0 OFF //Simultaneous LE and BR/EDR to Same Device Capable (Host)

第二个AD structure

1a,               // AD structure长度,这里是26个字节
ff, // ADType. 因为ibeacon并未写入官方协议,这里使用自定义类型Manufacturer Specific Data
4c, 00, //制造商信息, 00 4c是APPLE
02, 15, //这是ibeacon的标识,指示这个广播是ibeacon广播
fd,a5,06,93,a4,e2,4f,b1,af,cf,c6,eb,07,64,78,25,//16字节的proximity UUID 由设备厂商和设备用途决定,这里用的是微信的UUID
29,11, // Major
30, 39 //Minor Major和Minor共同决定设备的编号
cd //1米距离上的信号功率,即在1米处测得该Beacon的RSSI值

执行以下命令,进行蓝牙广播

hciattach -s 115200 /dev/ttyLP1 qca 921600
hciconfig hci0 up
hciconfig hci0 leadv 3
hciconfig hci0 noscan
hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 06 1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 29 11 30 39 cd 00
hcitool -i hci0 cmd 0x08 0x000a 01

1e之后到最后00之前的部分正是我们前面讲的ibeacon广播的数据。这里有个小坑注意,1e后面必须跟31个字节的数据,不够的补 00(因为BLE广播数据的长度是31)

到这里ibeacon的配置已经全部完成了!

iphone上可以安装Beacon Tool,来查看距离信息。

或者在微信上,打开微信->发现->摇一摇, 然后摇一摇你会发现出现了一个“周边”的栏目,如果你配置的Major,和Minor是向微信申请的正式编号,这里就会显示出相应的商家页面。

蓝牙_数据