-
导论
该篇文章简要介绍了蓝牙采用的调制方式,并以蓝牙遥控器为例,介绍信息是如何从遥控器传输到TV并进行相应处理的。
1. 蓝牙使用的调制方式
在讲解调制方式之前我们先来了解下通信系统的构成。
如上图所示,信源就是我们待传输信号的发送端,它发出的信息经过发送变换器(即我们通常所说的解调,该信号此时可以称为调制信号),它经过特定的信道(如我们蓝牙,使用的就是2.4G频段里的信道)进行传输,后续被接收变换器(特定的解调器)接收,还原出原先的信号,进入信宿并进行相应的处理。当然在信号的传输过程中,不可避免的会受到噪声的干扰(如蓝牙在2.4G频段传输中,会受到WiFi的干扰)。
调制的定义为将要发送的信号加载到高频信号的过程,因为直接使用低频信号来进行传输的话,随着传输距离的增加,信号在传输过程中会衰减的很厉害,等到达接收方后几乎不能还原正常的信号。
简单来讲,调制主要是对于正弦信号的幅度、频率、相位进行调制。对于模拟调制,对应的就是AM(调幅)、FM(调频)、PM(调相);对于数字调制,对应的ASK(幅移键控)、 FSK(频移键控) 、PSK(相移键控)。还有很多的通信技术,如CDMA、FDMA等等,有兴趣的可以自行查阅资料学习,在此不做过多赘述。
蓝牙使用的是GFSK(Gauss frequency Shift Keying )的数字调制方式,即在调制之前先通过一个高斯低通滤波器来限制信号的频谱宽度。
注:有关通信原理的更多知识,大家可以找书进行学习,如通信系统(第四版)西蒙赫金
2. 我是一个UP key
该部分主要讲解蓝牙遥控器上的UP键是如何传输到TV上,并完成相应解析的。
- 当用户按下UP键时,遥控器中的蓝牙模块会将这个信息打包成符合蓝牙传输规范的报文进行发送。
- 该报文经由BLE的数据信道进入TV中的蓝牙模块(如果TV采用外接dongle的方式,那么信息会到达此dongle模块,并经由HCI,最终传到SOC)。
注:蓝牙模块可以直接集成到SOC,这样就省去了HCI这一层。
- SOC会对接收到的数据报文进行解析和处理。
对于蓝牙数据在空中的传输,可以使用Ellisys进行抓取分析。
对于HCI log(采用外接dongle方式的设备,都会有HCI log用来方便开发人员进行调试),可以使用Frontline11.1或者wireshark软件进行分析。
由于蓝牙遥控器属于HID设备,其在Android系统中最终会创建一个hidraw的设备节点,Android通过这个设备节点进行相关信息的获取。如在/dev目录下生成hidraw0的设备节点。
使用getevent -l 可以查看该按键操作事件的信息。Android会通过/dev/input/下的event获取相应的键值,然后进行标准的Android键值映射流程。使用dumpsys input可以查看设备的详细信息。
/system/usr/keylayout/目录下的kl文件名称对应event的PID和VID,根据这两个值决定event采用哪个kl文件进行按键映射,如果解析特定的kl文件时出错,则会使用默认的Generic.kl文件 进行解析。
-
总结
此篇文章主要讲述的是蓝牙通信中的信息传递,以一个按键操作为例,简要的描述了大概的流程,并附带介绍了蓝牙的调制方式。