开发BT audio,经常被各种BT music 断音,跳音等等问题而困扰,大部分都是因为codec出问题或是bt受干扰而throughput不够。
针对BT music使用到的codec,这篇文章有做一些总结。Understanding Bluetooth codecs
technical record
开发BT audio,经常被各种BT music 断音,跳音等等问题而困扰,大部分都是因为codec出问题或是bt受干扰而throughput不够。
针对BT music使用到的codec,这篇文章有做一些总结。Understanding Bluetooth codecs
Google认为tester是为了帮助RD提高生产效率的,并不是为了把关什么软件质量,只有RD才能真正把关质量。
由于公司是IC 设计公司,所有的软件定义都是为IC 服务,软件开发时程也是紧跟硬件的时程。SW RD的产出有很大一部分时候需要靠QA来帮忙做测试抓问题,而不是RD自己把code写的铜墙铁壁,没有漏洞。。反过来说,对RD也是一个很大的考验,如何在短时间内高质量完成自己的部分,而且不over design。
IQ调制:http://blog.chinaaet.com/molf/p/29748
通信介绍:https://zhuanlan.zhihu.com/p/23612006
https://www.cnblogs.com/shaoyou/p/4822222.html
https://en.wikipedia.org/wiki/File:Fourier_series_and_transform.gif
https://en.wikipedia.org/wiki/File:Fourier_series_square_wave_circles_animation.gif
https://en.wikipedia.org/wiki/File:Fourier_series_sawtooth_wave_circles_animation.gif
对于任何一门知识体系,一定有一个最小基本单位,基本概念,其他的概念或是规矩都是基于这几个基本的东西在玩花样。对于这个很基本的分析问题的方法,混沌大学的李善友老师还起来一个非常高大上的名字叫做“唯一性原理”,有点故弄玄虚,其实叫啥无所谓,面对同样一份原始数据,如果你有相关的知识,你就能将数据切的更细,那就能看到更多东西。
先列举下Baseband的几个基本单位:
跟其他网络技术一样,蓝牙也有自己的网络。网上把这个单词翻译成微网。在蓝牙设备没有跟其他蓝牙设备连线的时候,它自己属于一个piconet。当有连线后,piconet里有两种角色:master 和 slave。发起连线的一方是master,被连接的一方是slave。slave会以master的时钟为参照,以625us为时间单位,与master进行数据收发。每一个piconet里,一个master最多有7个slave。
这里的Mode其实对应的是Modem,数据编码不同,那Modem就不同,传输数据的速度也不同。
Clock是蓝牙通信最最基础的一个概念,clock定义了通信的时空范围,定义了这个Piconet时空的坐标系,只有在同一个坐标系里,网络内的各个角色才能相互了解对方的时间线,才知道什么时候发包,什么时候收包。
BT clock是个28bit的计数器,每tick一次是312.5us,所以总共有 (2^28 -1)个tick,算一下大约是(2^28-1)*312.5us/10^6/3600 = 23.3个小时后clock会翻转。
针对clock有几个概念也要知道下:
CLK0, 312.5us,是一个tick
CLK1, 625us, 是一个slot
CLK2, 1.25ms, 是一个frame(做一次TX 和 RX)
CLK12, 1.28s.
Clock的精确度要求为 +/-250ppm 和 +/-20ppm
蓝牙地址有48bit,需要跟IEEE去购买。
LAP中有64个:0x9E8B00-0x9E8B3F是用来做inquiry的。0x9E8B000 是用来做 General inquiry,余下的63个是用来做Dedicate inquiry。当保留LAP被使用的时候,UAP会是0x00,Default Check Initialization。
所有的蓝牙数据包都以access code为开头,所有的access code是从LAP生出来的。access code是为了告诉对方,数据包来了,该做准备了,而接收方也可以根据access code来确定这包数据是不是属于自己的。
device access code (DAC)
channel access code (CAC)
Inquiry access code (IAC)IAC 又分为 GIAC 和 DIAC
蓝牙有79个信道,每个信道2M
Spec总共有定义如下5种channel
Basic piconet physical channel
Adapted piconet physical channel
Page scan physical channel
Inquiry scan physical channel
Synchronization scan physical channel
在建立连线后,Slave会以Mater的clock为准。Master和Slave以一个slot为单位进行Tx和Rx,Master在clock为偶数时发包,Slave在clock为偶数时收包,如下面的两张图。
为了处理time sliping,定义uncertainty window来增加Rx的时候收到包的几率,Slave可以加大自己的Rx时间uncertainty window来提高收到包的几率。
如果在250ms内等不到Master的包,那Slave就只能认为是短线了。
用到的channel个数可能会少于79个,不过至少会是20个。
在Paging的时候,Master会发送paging message(就是ID packets),这个时候的跳频速度是 3200 hops/s,在Tx的slot内会打两次包,在Rx的Slot内也会收两次Slave的回应。
Slave在收到Master的paging messagse后的625us会回一个slave reponse packet。Master在收到这个reponse packet的后面的那个Tx slock再发一个master page reponse packet。
在Inquiry的时候,Master会一直发送inquiry mesasge,带上GIAC 或 DIAC。
据说跳频的理论模型还是个演员发明的。
官网规范
由于蓝牙设备在使用上有配对的流程,对于没有UI的设备来说,非常的不方便或是不安全。像Apple的Airpod,只要打开盒子,Apple的手机自动就弹出画面,只要点击一下就完成配对,非常的方便。
所以Google也在Android上搞了一个类似的东西,叫做Fast Pair。目前前几名的蓝牙大佬已经支持了。
本文就介绍Google Fast Pair (GFPS) 的基本原理。
首先厂商需要到Nearby Devie注册自己的支持Google Fast Pair的设备,Nearby Device会分配Modle ID 和public key 及private key给该设备。
设备端通过BLE advertising广播自己的身份信息,当手机端发现搜索到的广播信息里表面设备支持GFPS,而且能认出该设备广播的modle ID的时候,就发起BLE连线到该设备,设备端发送其BR/EDR地址给手机,发送的数据是加密过的,手机拿到地址后发起BR/EDR连线,触发配对等流程,等BR/EDR连线都完成后,BLE连线就断开,整个Fast pair流程就结束。
整个过程,只有手机在发现支持GFPS的设备的时候,询问用户是否要连线,用户只要点击一下就行。
设备的TX power设定有讲究
The best way to determine the value is to measure the actual output of the device using an Android phone at 1 meter away, and then add 41 dBm to that. 41 dBm is the average signal strength loss that occurs over 1 meter.
Tx power 可以设定在广播包内,也可以设定在设备注册阶段就添上。
如果是在设备注册时就添上了Tx power的话,那所有的广播包都应该用这个Tx Power3. 关于Key
- 反偷听的Public key 和private key(Anti-Spoofing Public/Private Key Pair)
Private Key是 256bits,建议保存在安全区域,避免泄露出去
Public Key在Seeker端才用得到- Account Key list
Account key是为了让Seeker能识别出来这个key是属于某个google账号的。
Service | UIID |
---|---|
Fast Pair Service | 0xFE2C |
单元格 | 单元格 |
该Serviceyou如下的Charicterristic
Fast Pair Service characteristic | Encrypted | Permissions | UUID |
---|---|---|---|
Key-based Pairing | No | Write and notify | 0x1234 |
Passkey | No | Write and notify | 0x1235 |
Account Key | No | Write | 0x1236 |
MTU 的size 应该是83,23 也是可以的。
Provider和Seeker基于一把private key,每次出发pair,public key/private key pair都应该不一样
Octet | Data type | Description | Value | Mandatory? |
---|---|---|---|---|
0 - 1 | uint128 | Encrypted Request | varies | Mandatory |
16 - 79 |Public Key|varies|Optional|
介绍git原理的不错的文章: git from inside out
Mac01:BlueShell wnnwoo$ git reflog
894474c (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
fcdea80 (origin/master) HEAD@{1}: commit: fix build error
894474c (HEAD -> master) HEAD@{2}: commit: update basic operation
94e2258 HEAD@{3}: commit: Run the scheme testing
f305bac HEAD@{4}: commit: add generics test code
4acfba7 HEAD@{5}: commit: Add error handle
control + r # search the history command