好记性不如铅笔头

Bluetooth, 网络通讯

《实战Linux Bluetooth编程》简略笔记

本文参考系列博客
http://blog.sina.com.cn/s/blog_602f87700100e0vb.html
http://blog.sina.com.cn/s/blog_602f87700100e57t.html
http://blog.sina.com.cn/s/blog_602f87700100e5q9.html
http://blog.sina.com.cn/s/blog_602f87700100e902.html
http://blog.sina.com.cn/s/blog_602f87700100ehs3.html
https://www.cnblogs.com/LittleHann/p/5598425.html

仅笔记了部分概念和整体介绍,有大量删改。

CONTENTS

Bluetooth基本概念

Bluetooth是爱立信、诺基亚、东芝、IBM和Intel 5家公司在1998年联合推出的一项无线网络技术。其宗旨是提供一种短距离、低成本的无线传输应用技术。在行业协会筹备阶段,需要一个极具有表现力的名字来命名这项高新技术。行业组织人员,在经过一夜关于欧洲历史和未来无限技术发展的讨论后,有些人认为用Blatand国王的名字命名再合适不过了。Blatand国王将现在的挪威,瑞典和丹麦统一起来;就如同这项即将面世的技术,将标准不一的短距离无线传输技术统一起来。
蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应用底层硬件部分包括无线跳频(RF)、基带(BB)和链路管理(LM)。无线跳频层通过2.4GHz无需授权的ISM频段的微波,实现数据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。基带负责跳频以及蓝牙数据和信息帧的传输链路管理负责连接、建立和拆除链路并进行安全控制

蓝牙的核心协议由基带,链路管理,逻辑链路控制与适应协议和服务搜索协议等4部分组成。
1. 核心协议
1) BaseBand(基带协议): 基带协议确保各个蓝牙设备之间的射频连接,以形成无线网络
2) LMP(链路管理协议): 链路管理协议(LMP)负责蓝牙各设备间连接的建立和设置。LMP通过连接的发起,交换和核实进行身份验证和加密,通过协商确定基带数据分组大小; 除此之外还控制无线设备的节能模式和工作周期,以及无线网络内设备单元的连接状态
3) L2CAP(逻辑链路控制和适配协议): 逻辑链路控制和适配协议(L2CAP)是基带的上层协议,可以认为L2CAP与LMP并行工作。L2CAP与LMP的区别在于当业务数据不经过LMP时,L2CAP为上层提供服务
4) SDP(使用服务搜索协议): 使用服务搜索协议(SDP)可以查询到设备信息和服务类型,从而在蓝牙设备间建立相应的连接
2. 电缆替代协议: PFCOMM
3. 电话传送控制协议
1) TCS-Binary 2) AT命令集
4. 选用协议
1) PPP 2) UDP/TCP/IP 3) OBEX 4) WAP 5) vCard 6) vCal 7) IrMC 8) WAE
除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口,HCI位于L2CAP的下层,但HCI也可位于L2CAP上层。
蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。

1. 基带协议
基带和链路控制层确保微微网内各蓝牙设备单元之间由射频构成的物理连接。蓝牙的射频系统是一个跳频系统,其任一分组在指定时隙、指定频率上发送。它使用查询和分页进程同步不同设备间的发送频率和时钟,为基带数据分组提供了两种物理连接方式,即
1) 面向连接(SCO): SCO适用于话音以及话音与数据的组合,所有的话音和数据分组都附有不同级别的前向纠错(FEC)或循环冗余校验(CRC),而且可进行加密。此外,对于不同数据类型(包括连接管理信息和控制信息)都分配一个特殊通道
2) 无连接(ACL): ACL适用于数据分组
在同一射频上可实现多路数据传送,可使用各种用户模式在蓝牙设备间传送话音,面向连接的话音分组只需经过基带传输,而不到达L2CAP。话音模式在蓝牙系统内相对简单,只需开通话音连接就可传送话音
2. 连接管理协议(LMP)
该协议负责各蓝牙设备间连接的建立。它通过连接的发起、交换、核实,进行身份认证和加密,通过协商确定基带数据分组大小。它还控制无线设备的电源模式和工作周期,以及微微网内设备单元的连接状态
3. 逻辑链路控制和适配协议(L2CAP)
该协议是基带的上层协议,可以认为它与LMP并行工作,它们的区别在于,当业务数据不经过LMP时,L2CAP为上层提供服务。L2CAP向上层提供面向连接的和无连接的数据服务,它采用了多路技术、分割和重组技术、群提取技术。L2CAP允许高层协议以64k字节长度收发数据分组。虽然基带协议提供了SCO和ACL两种连接类型,但L2CAP只支持ACL。
4. 服务发现协议(SDP)
发现服务在蓝牙技术框架中起着至关紧要的作用,它是所有用户模式的基础。使用SDP可以查询到设备信息和服务类型,从而在蓝牙设备间建立相应的连接
5. 电缆替代协议(RFCOMM)
RFCOMM是基于ETSI-07.10规范的串行线仿真协议。它在蓝牙基带协议上仿真RS-232控制和数据信号,为使用串行线传送机制的上层协议(如OBEX)提供服务。
6. 电话控制协议
1. 二元电话控制协议(TCS-Binary或TCSBIN): 该协议是面向比特的协议,它定义了蓝牙设备间建立语音和数据呼叫的控制信令,定义了处理蓝牙TCS设备群的移动管理进程。基于ITU TQ.931建议的TCSBinary被指定为蓝牙的二元电话控制协议规范。
2. AT命令集电话控制协议: SIG定义了控制多用户模式下移动电话和调制解调器的AT命令集,该AT命令集基于ITU TV.250建议和GSM07.07,它还可以用于传真业务。
7. 选用协议
1. 点对点协议(PPP): 在蓝牙技术中,PPP位于RFCOMM上层,完成点对点的连接
2. TCP/UDP/IP: 该协议是由互联网工程任务组制定,广泛应用于互联网通信的协议。在蓝牙设备中,使用这些协议是为了与互联网相连接的设备进行通信
3. 对象交换协议(OBEX): IrOBEX(简写为OBEX)是由红外数据协会(IrDA)制定的会话层协议,它采用简单的和自发的方式交换目标。OBEX是一种类似于 HTTP的协议,它假设传输层是可靠的,采用客户机/服务器模式,独立于传输机制和传输应用程序接口(API)
4. 电子名片交换格式(vCard)、电子日历及日程交换格式(vCal)都是开放性规范,它们都没有定义传输机制,而只是定义了数据传输格式。SIG采用vCard/ vCal规范,是为了进一步促进个人信息交换
5. 无线应用协议(WAP): 该协议是由无线应用协议论坛制定的,它融合了各种广域无线网络技术,其目的是将互联网内容和电话传送的业务传送到数字蜂窝电话和其他无线终端上

Linux下Bluetooth协议栈的介绍

Linux下开放的蓝牙协议栈主要包括IBM公司的BlueDrekar,Nokia公司的Affix, Axis公司的OpenBT和官方协议栈BlueZ。我们主要面对Bluez来探讨。
BlueZ基础代码均是由Maxim Krasnyansky完成的。包括:HCI,L2CAP,RFCOMM和基本socket的实现。
Bluez分2部分实现:
1.Kernel层实现:
正如上一篇所谈到的,bluetooth协议栈有多层结构,最底层的硬件协议在硬件中就已经实现了。软件级别的协议实现,从HCI这一层起就可以了。 BlueZ对各层协议的实现是依托于Socket的。BlueZ首先创建了一个新的Socket中的协议–PF_BLUETOOTH (AF_BLUETOOTH=31). (也就是说,Socket()的第一个参数:domain必须是:PF_BLUETOOTH )。这也意味着,地址类型需要使用Bluetooth所定义的。
其实很简单,就是在net_families(网络协议列表)中添加了PF_BLUETOOTH这一项。如果对Linux Kernel有了解的话,就知道这个注册动作一定在Bluetooth init部分作的。
同样,各个协议层(如:HCI,L2CAP,HID等)都将自己的行为规范添加到PF_BLUETOOTH协议中。
2.应用程序层实现:
虽然Kernel层已经将Bluetooth协议栈完全实现了,但如果要使用起来,还是非常不方便的。毕竟应用程序与kernel最方便的交流通道就是ioctl().这非常不直观。于是,BlueZ又提供了一套API,这个API帮助开发者方便的与Kernel层协议打交道。当然,这些API底层的实现其就是是ioctl.

HCI层协议概述

HCI提供一套统一的方法来访问Bluetooth底层。如图所示:

从图上可以看出,Host Controller Interface(HCI) 就是用来沟通Host和Module。Host通常就是PC, Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle。
在Host这一端:application,SDP,L2cap等协议都是软件形式提出的(Bluez中是以kernel层程序)。在Module这一端:Link Manager, BB, 等协议都是硬件中firmware提供的。
而HCI则比较特殊,它一部分在软件中实现,用来给上层协议和程序提供访问接口(Bluez中,hci.c hci_usb.c,hci_sock.c等).另一部分也是在Firmware中实现,用来将软件部分的指令等用底层协议明白的方式传递给底层。
居于PC的上层程序与协议和居于Modules的下层协议之间通过HCI沟通,有4种不同形式的传输:Commands, Event, ACL Data, SCO/eSCO Data
HCI Command:
HCI Command是Host向Modules发送命令的一种方式。HCI Command Packet结构如下:

OpCode用来唯一标识HCI Command。它由2部分组成,10bit的Opcode Command. 6bit的Opcode Group。
HCI Event:
Modules向Host发送一些信息,使用HCI Event。Event Packet结构如下:

HCI Event分3种:Command complete Event, Command States Event,Command Subsequently Completend.
Command complete Event: 如果Host发送的Command可以立刻有结果,则会发送此类Event。也就是说,如果发送的Command只与本地Modules有关,不与remote设备打交道,则使用Command complete Event。例如:HCI_Read_Buffer_Size.
Command States Event:如果Host发送的Command不能立刻得知结果,则发送此类Event。Host发送的Command执行要与Remote设备打交道,则必然无法立刻得知结果,所以会发送Command States Event.例如:HCI Connect。
Command Subsequently Completend:Command延后完成Event。例如:连接已建立。如果Host发送的Command是与Remote device有关的,则会先发送Command States Event 。等动作真正完成了,再发送 Command Subsequently Completend。

BlueZ提供的HCI编程接口:提供HCI底层标准API和ioctl

L2CAP协议简介

Logical Link Control and Adaptation Protocol(L2CAP)逻辑连接控制和适配协议 (L2CAP) 为上层协议提供面向连接和无连接的数据服务,并提供多协议功能和分割重组操作。L2CAP 充许上层协议和应用软件传输和接收最大长度为 64K 的 L2CAP 数据包。
L2CAP基于通道(channel) 的概念。 通道 (Channel) 是位于基带 (baseband) 连接之上的逻辑连接。每个通道以多对一的方式绑定一个单一协议 (single protocol)。多个通道可以绑定同一个协议,但一个通道不可以绑定多个协议。 每个在通道里接收到的 L2CAP 数据包被传到相应的上层协议。 多个通道可共享同一个基带连接。
L2CAP处于Bluetooth协议栈的位置如下:

也就是说,所有L2CAP数据均通过HCI传输到Remote Device。且上层协议的数据,大都也通过L2CAP来传送。L2CAP也可以发送Command。例如连接,断连等等。

L2CAP编程方法:L2CAP提供标准socket的API来实现。

Bluetooth设备的状态

之前HCI编程时,是用 ioctl(HCIGETDEVINFO)得到某个Device Info(hci_dev_info).其中flags当时解释的很简单。其实它存放着Bluetooth Device(例如:USB Bluetooth Dongle)的当前状态:
其中,UP,Down状态表示此Device是否启动起来。可以使用ioctl(HCIDEVUP)等修改这些状态。
另外:就是Inquiry Scan, PAGE Scan这些状态:
Inquiry Scan状态表示设备可被inquiry. Page Scan状态表示设备可被连接。
#hciconfig hci0 iscan
#hciconfig hci0 pscan
或者:#hciconfig hci0 piscan
就可以设置为PSCAN或者iSCAN状态了。
编程则可以使用ioctl(HCISETSCAN) . dev_opt = SCAN_INQUIRY;dr.dev_opt = SCAN_PAGE;dr.dev_opt = SCAN_PAGE | SCAN_INQUIRY;
则可以inquiry或者connect了。

发表评论

7 − 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据