精华内容
下载资源
问答
  • 蓝牙协议

    千次阅读 2016-12-06 22:18:28
    Android Bluetooth蓝牙开发\蓝牙协议\蓝牙通信例子_Android支持蓝牙4.0版本_BLE开发 一、Android Bluetooth现状 在android官网可以了解到android4.2新增了部分新功能,但是对于BT熟悉的...

    Android Bluetooth蓝牙开发\蓝牙协议\蓝牙通信例子_Android支持蓝牙4.0版本_BLE开发



    一、Android Bluetooth现状


    在android官网可以了解到android4.2新增了部分新功能,但是对于BT熟悉的人或许开始头疼了,那就是Android4.2引入了一个新的蓝牙协议栈针。谷歌和Broadcom之间的合作,开发新的蓝牙协议栈,取代了基于堆栈的Bluez。因此市场上出现了老设备的兼容问题,很多蓝牙设备在android4.2手机上不能使用。

    New Bluetooth stack

    Android 4.2 introduces a new Bluetooth stack optimized for use with Android devices. The new Bluetooth stack developed in collaboration between Google and Broadcom replaces the stack based on BlueZ and provides improved compatibility and reliability

    (1)Android2.2版 支持的蓝牙核心版本是Bluetooth 2.0 + EDR。

    (2)Android 的蓝牙 使用了BlueZ协议栈,但只实现了Handset/Handfree和A2DP/AVRCP等Profile。

    (一些常用的Profile(如HID/DUN/SPP/OPP/FTP/PAN等)在现在的Android2.2版中并没有实现。需要自己在Android中实现Profile)。

    (3)目前版本(Android2.2) 只支持 绑定设备(bonded devices)之间通信,而不支持ad-hoc网络通信。

    (4)目前版本(Android2.2) emulator(仿真器、模拟器)不支持蓝牙的调试,只能通过LOG和BlueZ带的工具来调试。

    (5)Android2.0 API level5 之后的版本才支持Bluetooth。

    (6)Android 的Bluetooth通信API是BlueZ 的RFCOMM的封装。

    RfcommSocket 在 API level7 之后的版本才提供Bluetooth 的通信

    RfcommSocket 使用JAVA 的IputStream 和OutputStream对象

    二、Android Bluetooth 架构

    1、面向库的架构视图

    clip_image001

    2、面向进程的架构视图

    clip_image002

    LinuxKernel层:

    bluez协议栈、uart驱动, h4协议, hci,l2cap, sco, rfcomm

    Library层:

    libbluedroid.so 等

    Framework层:

    实现了Headset /Handsfree 和 A2DP/AVRCP profile,但其实现方式不同Handset/Handfree是直接 在bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,大大降低了实现的难度。

     

    三、 BlueZ介绍

    (详见http://www.bluez.org/):

    BlueZ 是Linux OS开放的bluetooth 协议栈主要包括IBM公司的BlueDrekar, Nokia公司的Affix, Axis公司的OpenBT和官方的协议栈BlueZ.

    Bluetooth协议栈BlueZ分为两部分:内核代码和用户态程序及工具集。

    内核代码:由BlueZ核心协议和驱动程序组 成;Bluetooth协议实现在内核源代码 /net/bluetooth中。包括hci,l2cap,hid,rfcomm,sco,SDP,BNEP等协议的实现。驱动程序放在 /driver/bluetooth中,包含Linux kernel对各种接口的Bluetooth device的驱动。例如:USB接口,串口等。

    用户态程序及工具集:包括应用程序接口和BlueZ工具集。BlueZ提供函数库以及应用程序接口,便于程序员开发bluetooth应用程序。BlueZ utils是主要工具集,实现对bluetooth设备的初始化和控制。

    四、几个术语:

    HFP(Hands-free Profile)耳机模式:

    让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支持。

    HSP(Handset Profile)耳机模式

    用于支持蓝牙耳机与移动电话之间使用

    HID() 人机接口设备配置文件

    HID 配置文件定义了 Bluetooth HID(如键盘、指向设备、游戏设备及远程监视设备)使用的协议、程序及功能

    拨号网络配置文件 (DUN)

    DUN 提供了通过 Bluetooth 无线技术接入 Internet 和其它拨号服务的标准。最常见的情况是在手机上拨号,从膝上型计算机以无线方式接入 Internet。

    个人局域网配置文件 (PAN)

    PAN 描述了两个或更多个 Bluetooth 设备如何构成一个即时网络,以及如何使用同一机制通过网络接入点接入远程网络。配置文件角色包括网络接入点、组即时网络及个人局域网用户。

    SDP( Service Discovery Protocol )服务发现协议

    提供应用程序在蓝牙环境中发现哪个服务可用和决定那些可用服务的特征。

    GAP(Generic Access Profile)通用访问应用

    一般访问应用规范定义了蓝牙设备如何发现和建立与其他设备的安全(或不安全)连接。它处理一些一般模式的业务(如询问、命名和搜索)和一些安全性问题(如担保),同时还处理一些有关连接的业务(如链路建立、信道和连接建立)。GAP规定的是一些一般性的运行任务。因此,它具有强制性,并作为所有其它蓝牙应用规范的基础。


    三、蓝牙协议栈


    蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作。互操作的远端设备需要使用相同的协议栈,不同的应用需要不同的协议栈。但是,所有的应用都要使用蓝牙技术规范中的数据链路层和物理层。

    完整的蓝牙协议栈如图1所示,不是任何应用都必须使用全部协议,而是可以只使用其中的一列或多列。图1显示了所有协议之间的相互关系,但这种关系在某些应用中是有变化的。

    clip_image001

    蓝牙协议体系中的协议

    蓝牙协议体系中的协议按SIG的关注程度分为四层:

      1. 核心协议:BaseBand、LMP、L2CAP、SDP;
      2. 电缆替代协议:RFCOMM;
      3. 电话传送控制协议:TCS-Binary、AT命令集;
      4. 选用协议:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、WAE。

    除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口。在图1中,HCI位于L2CAP的下层,但HCI也可位于L2CAP上层。

    蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。

    1.蓝牙核心协议

    基带协议

    基带和链路控制层确保微微网内各蓝牙设备单元之间由射频构成的物理连接。蓝牙的射频系统是一个跳频系统,其任一分组在指定时隙、指定频率上发送。它使用查询和分页进程同步不同设备间的发送频率和时钟,为基带数据分组提供了两种物理连接方式,即面向连接(SCO)和无连接(ACL),而且,在同一射频上可实现多路数据传送。ACL适用于数据分组,SCO适用于话音以及话音与数据的组合,所有的话音和数据分组都附有不同级别的前向纠错(FEC)或循环冗余校验(CRC),而且可进行加密。此外,对于不同数据类型(包括连接管理信息和控制信息)都分配一个特殊通道。

    可使用各种用户模式在蓝牙设备间传送话音,面向连接的话音分组只需经过基带传输,而不到达L2CAP。话音模式在蓝牙系统内相对简单,只需开通话音连接就可传送话音。

    连接管理协议(LMP)

    该协议负责各蓝牙设备间连接的建立。它通过连接的发起、交换、核实,进行身份认证和加密,通过协商确定基带数据分组大小。它还控制无线设备的电源模式和工作周期,以及微微网内设备单元的连接状态。

    逻辑链路控制和适配协议(L2CAP)

    该协议是基带的上层协议,可以认为它与LMP并行工作,它们的区别在于,当业务数据不经过LMP时,L2CAP为上层提供服务。L2CAP向上层提供面向连接的和无连接的数据服务,它采用了多路技术、分割和重组技术、群提取技术。L2CAP允许高层协议以64k字节长度收发数据分组。虽然基带协议提供了SCO和ACL两种连接类型,但L2CAP只支持ACL。

        ·服务发现协议(SDP)

    发现服务在蓝牙技术框架中起着至关紧要的作用,它是所有用户模式的基础。使用SDP可以查询到设备信息和服务类型,从而在蓝牙设备间建立相应的连接。

    2.电缆替代协议(RFCOMM)

    RFCOMM是基于ETSI-07.10规范的串行线仿真协议。它在蓝牙基带协议上仿真RS-232控制和数据信号,为使用串行线传送机制的上层协议(如OBEX)提供服务。

    3.电话控制协议

    二元电话控制协议(TCS-Binary或TCSBIN)

    该协议是面向比特的协议,它定义了蓝牙设备间建立语音和数据呼叫的控制信令,定义了处理蓝牙TCS设备群的移动管理进程。基于ITU TQ.931建议的TCSBinary被指定为蓝牙的二元电话控制协议规范。

    AT命令集电话控制协议

           SIG定义了控制多用户模式下移动电话和调制解调器的AT命令集,该AT命令集基于ITU TV.250建议和GSM07.07,它还可以用于传真业务。

    4.选用协议

    点对点协议(PPP)

    在蓝牙技术中,PPP位于RFCOMM上层,完成点对点的连接。

    TCP/UDP/IP

    该协议是由互联网工程任务组制定,广泛应用于互联网通信的协议。在蓝牙设备中,使用这些协议是为了与互联网相连接的设备进行通信。

    对象交换协议(OBEX)

           IrOBEX(简写为OBEX)是由红外数据协会(IrDA)制定的会话层协议,它采用简单的和自发的方式交换目标。OBEX是一种类似于HTTP的协议,它假设传输层是可靠的,采用客户机/服务器模式,独立于传输机制和传输应用程序接口(API)。

    电子名片交换格式(vCard)、电子日历及日程交换格式(vCal)都是开放性规范,它们都没有定义传输机制,而只是定义了数据传输格式。SIG采用vCard/vCal规范,是为了进一步促进个人信息交换。

    无线应用协议(WAP)

    该协议是由无线应用协议论坛制定的,它融合了各种广域无线网络技术,其目的是将互联网内容和电话传送的业务传送到数字蜂窝电话和其他无线终端上。

    用户模式及协议栈

           1.文件传输模式

    文件传输模式提供两终端间的数据通信功能,可传输后缀为.xls、.ppt、.wav、.jpg和.doc的文件(但并不限于这几种),以及完整的文件夹、目录或多媒体数据流等,提供远端文件夹浏览功能。文件传输协议栈如图2所示。

    clip_image002

           2.因特网网桥模式

    这种用户模式可通过手机或无线调制解调器向PC提供拨号入网和收发传真的功能,而不必与PC有物理上的连接。拨号上网需要两列协议栈(不包括SDP),如图3所示。AT命令集用来控制移动电话或调制解调器以及传送其他业务数据的协议栈。传真采用类似协议栈,但不使用PPP及基于PPP的其他网络协议,而由应用软件利用RFCOMM直接发送。

    clip_image003

           3.局域网访问模式

    该用户模式下,多功能数据终端(DTs)经局域网访问点(LAP)无线接入局域网,然后,DTs的操作与通过拨号方式接入局域网的设备的操作一样,其协议栈如图4所示。

    clip_image004

           4.同步模式

    同步用户模式提供设备到设备的个人资料管理(PIM)的同步更新功能,其典型应用如电话簿、日历、通知和记录等。它要求PC、蜂窝电话和个人数字助理(PDA)在传输和处理名片、日历及任务通知时,使用通用的协议和格式。其协议栈如图5所示,其中同步应用模块代表红外移动通信(IrMC)客户机或服务器。

    clip_image005

           5.一机三用电话模式

    手持电话机有三种使用方法:第一,接入公用电话网,作为普通电话使用;第二,作为不计费的内部电话使用;第三,作为蜂窝移动电话使用。无线电话和内部电话使用相同的协议栈;语音数据流直接与基带协议接口,不经过L2CAP层,如图6所示。

    clip_image006

           6.头戴式设备模式

    使用该模式,用户打电话时可自由移动。通过无线连接,头戴式设备通常作为蜂窝电话、无线电话或PC的音频输入输出设备。头戴式设备协议栈如图7所示,语音数据流不经过L2CAP层而直接接入基带协议层。头戴式设备必须能收发并处理AT命令。

    clip_image007

    完整的协议栈包括蓝牙专用协议(如连接管理协议LMP和逻辑链路控制应用协议L2CAP)以及非专用协议(如对象交换协议OBEX和用户数据报协议UDP)。设计协议和协议栈的主要原则是尽可能利用现有的各种高层协议,保证现有协议与蓝牙技术的融合以及各种应用之间的互操作,充分利用兼容蓝牙技术规范的软硬件系统。蓝牙技术规范的开放性保证了设备制造商可以自由地选用其专用协议或习惯使用的公共协议,在蓝牙技术规范基础上开发新的应用。



    Android蓝牙系统分为四个层次,内核层、BlueZ库、BlueTooth的适配库、BlueTooth的JNI部分、Java框架层、应用层。下面先来分析Android的蓝牙协议栈。

    Android的蓝牙协议栈采用BlueZ来实现,BlueZ分为两部分:内核代码和用户态程序及工具集。

    内核代码主要由BlueZ核心协议和驱动程序组成;蓝牙协议实现在内核源代码net/bluetooth中,驱动程序位于内核源代码目录 driver/bluetooth中。用户态程序及工具集主要包括应用程序接口和BlueZ工具集,位于Android源代码目录externel /bluetooth(注:Android版本不一样,有的在externel/bluez目录下)中。

    1、蓝牙协议栈

    蓝牙协议栈的体系结构由底层硬件模块、中间协议层和高端应用层三部分组成。


    一、底层硬件模块

    组成:

    链路管理协议(Link ManagerProtocol,LMP);

    基带(Base Band,BB);

    射频(Radio Frequency,RF)。

    功能:

    射频(RF)通过2.4GHz的ISM频段实现数据流的过滤和传输。

    基带(BB)提供两种不同的物理链路,即同步面向连接链路(Synchronous Connection Oriented,SCO)和异步无连接链路(AsynchronousConnection Less,ACL),负责跳频和蓝牙数据,及信息帧的传输,且对所有类型的数据包提供不同层次的前向纠错码(Frequency Error Correction,FEC)或循环冗余度差错校验(CyclicRedundancy Check,CRC)。

    链路管理协议(LMP)负责两个或多个设备链路的建立和拆除,及链路的安全和控制,如鉴权和加密、控制和协商基带包的大小等,它为上层软件模块提供了不同的访问入口。

    主机控制器接口(HostController Interface,HCI)是蓝牙协议中软硬件之间的接口,提供了一个调用下层BB、LMP、状态和控制寄存器等硬件的统一命令,上下两个模块接口之间的消息和数据的传递必须通过HCI的解释才能进行。

    二、中间协议层

    组成:

    逻辑链路控制和适配协议(LogicalLink Control and Adaptation Protocol,L2CAP);

    服务发现协议(ServiceDiscovery Protocol,SDP);

    串口仿真协议(或称线缆替换协议RFCOMM);

    二进制电话控制协议(TelephonyControlprotocol Spectocol,TCS)。

    功能:

    L2CAP位于基带(BB)之上,向上层提供面向连接的和无连接的数据服务,它主要完成数据的拆装、服务质量控制、协议的复用、分组的分割和重组,及组提取等功能。

    SDP是一个基于客户/服务器结构的协议,它工作在L2CAP层之上,为上层应用程序提供一种机制来发现可用的服务及其属性,服务的属性包括服务的类型及该服务所需的机制或协议信息。

    RFCOMM是一个仿真有线链路的无线数据仿真协议,符合ETSI标准的TS07.10串口仿真协议,它在蓝牙基带上仿真RS-232的控制和数据信号,为原先使用串行连接的上层业务提供传送能力。

    TCS定义了用于蓝牙设备之间建立语音和数据呼叫的控制信令(Call Control Signalling),并负责处理蓝牙设备组的移动管理过程。

    三、高端应用层

    组成:

    点对点协议(Point-to-PointProtocol,PPP);

    传输控制协议/网络层协议(TCP/IP);

    用户数据包协议(UserDatagram Protocol,UDP);

    对象交换协议(ObjectExchang Protocol,OBEX);

    无线应用协议(WirelessApplication Protocol,WAP);

    无线应用环境(WirelessApplication Environment,WAE);

    功能:

    PPP定义了串行点对点链路应当如何传输因特网协议数据,主要用于LAN接入、拨号网络及传真等应用规范。

    TCP/IP、UDP定义了因特网与网络相关的通信及其他类型计算机设备和外围设备之间的通信。

    OBEX支持设备间的数据交换,采用客户/服务器模式提供与HTTP(超文本传输协议)相同的基本功能。可用于交换的电子商务卡、个人日程表、消息和便条等格式。

    WAP用于在数字蜂窝电话和其他小型无线设备上实现因特网业务,支持移动电话浏览网页、收取电子邮件和其他基于因特网的协议。

    WAE提供用于WAP电话和个人数字助理(PersonalDigital Assistant,PDA)所需的各种应用软件。

    2、android与蓝牙协议栈的关系

    蓝牙系统的核心是BlueZ,因此JNI和上层都围绕跟BlueZ的沟通进行。JNI和android应用层,跟BlueZ沟通的主要手段是D- BUS,这是一套被广泛采用的IPC通信机制,跟Android框架使用的Binder类似。BlueZ以D-BUS为基础,给其他部分提供主要接口。



    四、蓝牙各种版本区别


     蓝牙目前暂时共有四个版本 V1.1/1.2/2.0/2.1。以通讯距离来在不同版本可再分为 Class A(1)/Class B(2)

         1)蓝牙目前暂时共有四个版本 V1.1/1.2/2.0/2.1

      
      2)以通讯距离来在不同版本可再分为 Class A(1)/Class B(2)

      
      3)版本的区别

             1.1为最早期版本,传输率约在748~810kpbs8,因是早期设计,容易受到同频率之产品所干扰下影响通讯质量。

      
      1.2 同样是只有 748~810kpbs 的传输率,但在加上了(改善 Software)抗干扰跳频功能。(太深入之技术理论不再详述!)

       
       4)通讯距离版本

      
      a)Class A 是用在大功率/远距离的蓝芽产品上,但因成本高和耗电量大,不适合作个人通讯产品之用(手机/蓝牙耳机/蓝牙 Dongle 等等),故多用在部份商业特殊用途上,通讯距离大约在 80~100M 距离之间。

      
      b)Class B 是目前最流行的制式,通讯距离大约在 8~30M 之间,视乎产品的设计而定,多用于手机内/蓝牙耳机/蓝牙 Dongle 的个人通讯产品上,耗电量和体积较细,方便携带。

      
      5)无论 1.1/1.2 版本的蓝牙产品,本身基本是可以支持 Stereo 音效的传输要求,但只能够作(单工)方式工作,加上音带频率响应不太足够,并未算是最好之 Stereo 传输工具。

      
      6)版本 2.0  1.2 的改良提升版,传输率约在 1.8Mpbs~2.1Mpbs,可以有(双工)的工作方式。即一面作语音通讯,同时亦可以传输档案/高质素图片,台湾有部份蓝牙 Dongle 已经有在市面发售,但在手机内有支持蓝牙 2.0 版本则是很少。蓝牙耳机能够真正使用的亦不多,部份蓝牙产品自称是 2.0 版本,但仍然要利用外加配件才能达到。 2.0 版本当然也支持 Stereo 运作。

      
      7)稍后蓝牙 2.0 版本的芯片,是有机会加入了 Stereo 译码芯片,则连 A2DPAdvanced Audio Distribution Profile)也可以不需要了。

     

    蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。其数据速率为1Mbps。采用时分双工传输方案实现全双工传输

    低耗电蓝牙相关规范

      

    技术规范 典型的蓝牙 低耗电的蓝牙
    无线电频率 2.4 GHz 2.4 GHz
    距离 10米 10米
    空中数据速率 1-3 Mb/s 1 Mb/s
    应用吞吐量 0.7-2.1 Mb/s 0.2 Mb/s
    Nodes/Active slaves 7-16,777,184 无限
    安全 64/128-bit及用户自定义的应用层 128-bitAES及用户自定义的应用层
    鲁棒性 自动适应快速跳频,FEC,快速 ACK 自动适应快速跳频
    延迟(非连接状态)

    发送数据的总时间 100 m/s <6 m/s
    政府监管 全球 全球
    认证机构 蓝牙技术联盟(Bluetooth SIG) 蓝牙技术联盟(Bluetooth SIG)
    语音能力 没有
    网络拓扑 分散网 Star-bus
    耗电量 1(作为参考) 0.01至0.5(视符使用情况)
    Peak current consumption <30 mA <15 mA (最高运行时为15 mA)
    Service discovery
    简介概念
    主要用途 手机,游戏机,耳机,stereo audio streaming, 
    汽车和PC等
    手机,游戏机,PC,表,体育和健身,医疗保健, 
    汽车,家用电子,自动化和工业等

    虽然制造商对各种设备实施的特定用户接口因设备而异,但首次连接两个设备的一些基本步骤是相同的。用户应保持在安全环境下进行配对。

      设备充电

      如果设备是新的 Bluetooth 设备,确保在进行连接或打开前已充电。尤其是 Bluetooth 耳机,使用前必须充电。

      设备开机

      打开需要配对设备的电源。对于某些设备,如 Bluetooth 无线耳机,设备开机的同时即启动配对过程。

      开启 Bluetooth 功能

      在您收到设备时,该设备的 Bluetooth 功能可能已经开启,也可能尚未开启。对于多数计算机,用户需要从控制面板或系统首选项中开启 Bluetooth 射频功能。

      将设备设置为可见

      作为安全措施,某些设备可将 Bluetooth 功能设置为关闭、隐藏或可见。尝试连接设备时,用户应将设备设置为可见,这样才能为彼此所发现。完成设备配对后,如果用户担心设备会被其它设备发现,可以将设备设置为隐藏。

      将两个设备设为连接模式

      两个设备都充好电后,打开设备电源并开启 Bluetooth 功能,每个设备都需要初始化通信会话。通常,在两个设备之间连接时,一个设备会作为“主机”,而另一个设备则作为“访客”。主机设备是具有用户界面的设备,多数连接设置都将从此进行。一个设备可以是另一个设备的主机,也可以作为其它设备的访客。例如,手机与无线耳机配对时,该手机就是主机。但是,手机与膝上型计算机配对时,膝上型计算机就是主机。

      输入密码

      设备彼此发现对方后,用户将被要求在一个或两个设备中输入密码。某些情况下,如连接无线耳机时,密码是由制造商为耳机指定的固定密码。此时,用户需要在主机设备中输入此指定的密码。用户可在用户手册中找到此密码。在其它情况下,用户可输入他/她自己的密码。在这些情况下,用户将在两个设备中输入密码各一次。强烈建议用户为一次配对过程设定 8 位字母数字字符密码。输入密码后,设备将彼此验证并完成建立信任连接。

      删除或断开与信任设备的连接

      用户应何时删除或断开与信任设备的连接?如果您的其中一个 Bluetooth 设备丢失或被偷,您应取消以前与该设备配对的所有设备的配对设置。

      如何取消配对或删除信任设备?对于手机或计算机之类设备,用户应进入设备的连接设置,然后查找信任设备列表。用户随后便能选择添加新设备或删除信任设备。突出显示需要删除的设备,然后按删除按钮。键盘或鼠标之类设备只有一个按钮或开关作为用户接口,因此每次只能连接到一个设备。要删除其原来的信任设备,只需将鼠标或键盘连接到新设备。

    展开全文
  • 蓝牙协议样板

    2018-05-24 15:07:52
    血压计蓝牙协议样本,血压计蓝牙协议样本,血压计蓝牙协议样本,血压计蓝牙协议样本,血压计蓝牙协议样本,血压计蓝牙协议样本,血压计蓝牙协议样本
  • 蓝牙:蓝牙协议

    万次阅读 多人点赞 2019-03-14 09:46:25
    蓝牙协议学习整理(一)蓝牙的概述 转自: https://blog.csdn.net/guoxiaolongonly/article/details/78414870 传送门:(一)蓝牙的概述(二)蓝牙协议规范(射频、基带链路控制、链路管理)(三)蓝牙协议规范...

    蓝牙协议学习整理(一)蓝牙的概述

     

    转自: https://blog.csdn.net/guoxiaolongonly/article/details/78414870

    传送门: 
    (一)蓝牙的概述 
    (二)蓝牙协议规范(射频、基带链路控制、链路管理) 
    (三)蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM) 
    (四)蓝牙协议规范(irOBEX、BNEP、AVDTP、AVCTP)

    引用自xubin的博客

     

    第一章 蓝牙的概述

    一、蓝牙版本信息

    蓝牙共有六个版本1.1/1.2/2.0/2.1/3.0/4.0

    1、1.1版本

    传输率约在748~810kb/s,因是早期设计,容易受到同频率之产品所干扰下影响通讯质量。

    2、1.2版本

    同样是只有748~810kb/s 的传输率,但在加上了(改善 Software)抗干扰跳频功能。

    3、2.0+EDR版本

    是1.2的改良提升版,传输率约在1.8M/s~2.1M/s,开始支持双工模式——即一面作语音通讯,同时亦可以传输档案/高质素图片,2.0 版本当然也支持 Stereo 运作。

    应用最为广泛的是Bluetooth2.0+EDR标准,该标准在2004年已经推出,支持Bluetooth 2.0+EDR标准的产品也于2006年大量出现。虽然Bluetooth 2.0+EDR标准在技术上作了大量的改进,但从1.X标准延续下来的配置流程复杂和设备功耗较大的问题依然存在。

    4、2.1版本

    更佳的省电效果:蓝牙2.1版加入了SniffSubrating的功能,透过设定在2个装置之间互相确认讯号的发送间隔来达到节省功耗的目的。

    5、3.0+HS版本

    2009年4月21日,蓝牙技术联盟(Bluetooth SIG)正式颁布了新一代标准规范”Bluetooth Core Specification Version 3.0 High Speed”(蓝牙核心规范3.0版 ),蓝牙3.0的核心是”GenericAlternate MAC/PHY”(AMP),这是一种全新的交替射频技术,允许蓝牙协议栈针对任一任务动态地选择正确射频。最初被期望用于新规范的技术包括802.11以及UMB,但是新规范中取消了UMB的应用。

    6、4.0 版本

    蓝牙4.0包括三个子规范,即传统蓝牙技术、高速蓝牙和新的蓝牙低功耗技术。蓝牙 4.0的改进之处主要体现在三个方面,电池续航时间、节能和设备种类上。拥有低成本,跨厂商互操作性,3毫秒低延迟、100米以上超长距离、AES-128加密等诸多特色此外,蓝牙4.0的有效传输距离也有所提升。3.0版本的蓝牙的有效传输距离为10米(约 32英尺),而蓝牙4.0的有效传输距离最高可达到100米(约328英尺)。

    7、典型蓝牙与BLE蓝牙对比

    蓝牙与BLE对比

    二、蓝牙的技术特点

    简单地说,蓝牙是一种短程宽带无线电技术,是实现语音和数据无线传输的全球开放性标准。它使用跳频扩谱(FHSS)、时分多址(TDMA)、码分多址(CDMA)等先进技术,在小范围内建立多种通信与信息系统之间的信息传输。

    1、Bluetooth的主要技术特点:

    (1)、工作频段 :2.4GHz的工科医(ISM)频段,无需申请许可证。大多数国家使用79个频点,载频为(2402+k)MHz(k=0,1, 2…78),载频间隔1MHz。采用TDD时分双工方式。 
    (2)、传输速率:1Mb/s(V2.0以上版本) 
    (3)、调试方式:BT=0.5的GFSK调制,调制指数为0.28-0.35。 
    (4)、采用跳频技术:跳频速率为1600跳/秒,在建链时(包括寻呼和查询)提高为3200跳/秒。蓝牙通过快跳频和短分组技术减少同频干扰,保证传输的可靠性。 
    (5)、语音调制方式:连续可变斜率增量调制(CVSD,ContinuousVariable Slope Delta Modulation),抗衰落性强,即使误码率达到4%,话音质量也可接受。 
    (6)、支持电路交换和分组交换业务:蓝牙支持实时的同步定向联接(SCO链路)和非实时的异步不定向联接(ACL链路),前者主要传送语音等实时性强的信息,后者以数据包为主。语音和数据可以单独或同时传输。蓝牙支持一个异步数据通道,或三个并发的同步话音通道,或同时传送异步数据和同步话音的通道。每个话音通道支持64kbps的同步话音;异步通道支持723.2/57.6kbps的非对称双工通信或433.9kbps的对称全双工通信。 
    (7)、支持点对点及点对多点通信:蓝牙设备按特定方式可组成两种网络:微微网(Piconet)和分布式网络(Scatternet),其中微微网的建立由两台设备的连接开始,最多可由八台设备组成。在一个微微网中,只有一台为主设备(Master),其它均为从设备(Slave),不同的主从设备对可以采用不同的链接方式,在一次通信中,链接方式也可以任意改变。几个相互独立的微微网以特定方式链接在一起便构成了分布式网络。所有的蓝牙设备都是对等的,所以在蓝牙中没有基站的概念。 
    (8)、工作距离:蓝牙设备分为三个功率等级,分别是:100mW(20dBm)、2.5mW(4dBm)和1mW(0dBm),相应的有效工作范围为:100米、10米和1米。

    三、Bluetooth的系统构成

    构成

    1、无线射频单元(Radio):

    负责数据和语音的发送和接收,特点是短距离、低功耗。蓝牙天线一般体积小、重量轻,属于微带天线。

    2、基带或链路控制单元(LinkController):

    进行射频信号与数字或语音信号的相互转化,实现基带协议和其它的底层连接规程。

    3、链路管理单元(LinkManager):

    负责管理蓝牙设备之间的通信,实现链路的建立、验证、链路配置等操作。

    4、蓝牙软件协议实现:

    如上图紫色部分,这个后面我们做详细说明。 
    这里写图片描述

    四、蓝牙协议规范

    传输协议、中介协议、应用协议;

    1、传输协议

    负责蓝牙设备间,互相确认对方的位置,以及建立和管理蓝牙设备间的物理链路;

    • 底层传输协议:蓝牙射频(Radio)部分、基带链路管理控制器(Baseband&Link Controller)、链路管理协议(Link ManagerProtocol LMP)。负责语言、数据无线传输的物理实现以及蓝牙设备间的联网组网。

    • 高层传输协议:逻辑链路控制与适配器(LogicalLink Control and Adaptation Protocol)L2CAP 、主机控制接口(HostControl Interface,HCI)。为高层应用屏蔽了跳频序列选择等底层传输操作,为高层程序提供有效、有利于实现数据分组格式。

    2、中介协议

    为高层应用协议或者程序,在蓝牙逻辑链路上工作提供必要的支持,为应用提供不同标准接口。

    • 串口仿真协议:RFCOMM、服务发现协议:SDP、互操作协议IrDA、网络访问协议:PPP、IP、TCP、UDP、电话控制协议:TCS、AT指令集。

    这里写图片描述

    3、应用协议

    蓝牙协议栈之上的应用软件和所涉及到的协议,如:拨号上网、语言功能的应用程序。

    蓝牙的应用框架如下:

    1. 通用应用类框架:查询、建立连接服务等;
    2. 蓝牙电话应用类框架:电话控制、语言;
    3. 蓝牙连网应用类框架:网络应用相关;
    4. 对象交互服务类框架:IrDA、OBEX;
    5. 蓝牙音视频控制类框架。

    五、硬件接口

    一般蓝牙芯片通过UART、USB、SDIO、I2S、PcCard和主控芯片通信。如下图所示,通过UART和主控芯片通信。 
    这里写图片描述

     

    第二章 蓝牙协议规范(射频、基带链路控制、链路管理)


    蓝牙协议是蓝牙设备间交换信息所应该遵守的规则。与开放系统互联(OSI)模型一样,蓝牙技术的协议体系也采用了分层结构,从底层到高层形成了蓝牙协议栈,各层协议定义了所完成的功能和使用数据分组格式,以保证蓝牙产品间的互操作性。

    一、射频协议
    射频位置如上图红色部分。

    1、工作频率
    蓝牙工作在2.4GHz ISM频段上,蓝牙采用跳频扩谱技术主动的避免工作频段受干扰(微波炉的工作频率也是2.4GHz)。 


    地理位置    ISM频段范围    射频信道频率
    中国、美国、欧洲    2400.0~2483.5MHz    F=(2402+k)MHz,k在0、1、……78中随机取值
    法国    2446.5~2483.5MHz    F=(2454+k)MHz,k在0、1、……22中随机取值
    日本    2471.0~2497.0MHz    F=(2473+k)MHz,k在0、1、……22中随机取值
    西班牙    2445.0~2475.0MHz    F=(2449+k)MHz,k在0、1、……22中随机取值
    我国的蓝牙频率在2.402GHz~2.483GHz,蓝牙每个频道的宽度为1MHz,为了减少带外辐射的干扰,保留上、下保护为3.5MHz和2MHz,79个跳频点中至少75个伪随机码跳动,30S内任何一个频点使用时长不能超过0.4S。

    2、跳频技术、发射功率、时隙
    (1)、发射功率:蓝牙发射功率分三级:一级功率100mW(20dBm);二级功率2.5mW(4dBm);三级功率1mW(0dBm); 
    (2)、物理信道:蓝牙物理信道有伪随机序列控制的79个跳频点构成,不同跳频序列代表不同的信道。 


    (3)、时隙:蓝牙跳频速率为1600次/s,每个时间为625uS(1S/1600)称为一个时隙; 


    二、基带与链路控制协议


    蓝牙发送数据时,基带部分将来自高层的数据进行信道编码,向下发给射频进行发送;接收数据时,将解调恢复空中数据并上传给基带,基带进行信道编码传送给上层。

    作用:跳频选择、蓝牙编址、链路类型、信道编码、收发规则、信道控制、音频规范、安全设置。

    1、蓝牙分组编码为小端模式;
    2、蓝牙地址
    **BD_ADDR:**BluetoothDevice Address;
    **LAP:**LowerAddress Part 低地址部分;
    UAP: UpperAddress Part 高地址部分;
    NAP: Non-significantAddress Part 无效地址部分。


    3、蓝牙时钟

    每个蓝牙设备都有一个独立运行的内部系统时钟,称为本地时钟(Local Clock),决定定时器的收发跳频。为了与其他设备同步,本地时钟要加一个偏移量(offset),提供给其他设备同步。

    蓝牙基带四个关键周期:312.5uS、625uS、1.25mS、1.28S。

    CLKN:本地时钟:
    CLKE:预计时钟,扫描寻呼过程中用到;
    CLK:设备实际运行的时钟频率。

    CLKE、CLK由CLKN加上一个偏移量得到的。

    4、蓝牙物理链路:
    通信设备间物理层的数据连接通道就是物理链路。

    ACL(Asynchronous Connectionless)异步无连接链路;对时间要求不敏感的数据通信,如文件数据、控制信令等。

    SCO(Synochronous Connection Oriented)同步面向连接链路;对时间比较敏感的通信,如:语音;最多只支持3条SCO链路,不支持重传。

    ACL用于数据传输;

    5、蓝牙基带分组:
    基带分组至少包括:接入码、分组头、有效载荷;
    1


    (1)、接入码用于同步、直流、载频泄漏偏置补偿标识; 
    (2)、分组头包含链路信息,确保纠正较多的错误。 
    分组类型如下:

    分组类别    Type(b3b2b1b0)    时隙    SCO    ACL
    链路控制分组    0000    1    NULL    NULL
    0001    POLL    POLL
    0010    FHS    FHS
    0011    DM1    DM1
    单时隙分组    0100    1    未定义    NULL
    0101    HV1
    0110    HV2
    0111    HV3
    1000    DV
    1001    NULL    AUX1
    3时隙分组    1010    3    未定义    DM3
    1011    DH3
    1100    未定义
    1101
    5时隙分组    1010    5    未定义    DM5
    1111
    ACL分组形式为:D(M|H)(1|3|5),D代表数据分组,M代表用2/3比例的FEC的中等速率分组;H代表不使用纠错码的高速率分组;1、3、5分别代表分组所占用的时隙数目; 
    DM1、DM3、DM5、DH1、DH3、DH5

    SCO分组形式为:HV(1|2|3)。HV代表高质量语言分组,1、2、3有效载荷所采用的纠错码方法。1为1/3比例FEC,设备2个时隙发送一个单时隙分组;2为2/3比例FEC,设备4个时隙发送一个单时隙分组;3为不使用纠错码,设备6个时隙发送一个单时隙分组

    HV1、HV2、HV3

    ALC 分组:

    类型    有效载荷头/字节    用户有效载荷/字节    FEC    CRC    对称最大速率/kbps    非对称速率/kbps
    前向    后向
    DM1    1    0~17    2/3    有    108.8    108.8    108.8
    DH1    1    0~27    无    有    172.8    172.8    172.8
    DM3    2    0~121    2/3    有    258.1    387.2    54.4
    DH3    2    0~183    无    有    390.4    585.6    86.4
    DM5    2    0~224    2/3    有    286.7    477.8    36.3
    MH5    2    0~339    无    有    433.9    723.2    57.6
    AUX1    1    0~29    无    无    185.6    185.6    185.6
    SCO分组:

    类型    有效载荷头/字节    用户有效载荷/字节    FEC    CRC    有效载荷长度    同步速率/kbps    占用Tsco数目/语言长度
    HV1    无    10    1/3        240位    64    2/1.25ms
    HV2    20    2/3    4/2.5ms
    HV3    30    无    6/3.75ms
    DV    1D    10+(0-9)D    2/3D    有D    64+57.6D    
    注释:D 只对数据段有用,DV分组包含数据段,也包含语言段。
    1
    (3)、有效载荷 分语言有效载荷、数据有效载荷。

    6、蓝牙的逻辑信道
    链路控制信道:LinkControl LC
    链路管理信道:Link Manage LM
    用户异步数据信道:User AsynchronizationUA
    用户同步数据信道:UserSynchronization US
    用户等时数据信道:UserIsochronous UI UI
    7、蓝牙的收发规则
     
    上图为RX缓存。 
     
    上图为TX缓存。 
    新分组到达时,ACL链路的RX缓存器要流量控制,SCO数据不需要流量控制;

    8、蓝牙基带信道和网络控制
    (1)、链路控制器状态: 
    待机、连接 
    寻呼page、寻呼扫描pagescan、查询inquiry、查询扫描inquiry scan、主设备相应Master Response、从设备相应Slave Response、查询相应inquiry response 
    (2) 、连接状态 
    激活模式active、呼吸模式sniff、保持模式hold、休眠模式park。 
    (3)、待机状态 
    待机状态是蓝牙设备缺省低功耗状态,此状态下本地时钟以低精度运行。蓝牙从待机转入寻呼扫描状态,对其他寻呼进行响应成为从设备;也可以从待机状态进入查询扫描状态,完成一个完整的寻呼,成为主设备。

    9、接入过程
    注释: 
    IAC Inquiry AccessCode 查询接入码; 
    GIAC:通用查询接入码 DIAC:专用查询接入码; 
    DAC:DeviceAccess Code 设备接入码; 
    LAP: 
    建立连接,必须使用查询、寻呼;查询过程使用IAC,发现覆盖区域内的设备、设备的地址及其时钟;连接过程使用DAC,建立连接的设备处理寻呼过程,成为主设备。

    (1)、查询过程 
    蓝牙设备通过查询来发现通信范围内的其他蓝牙设备。查询信息分为GIAC、DIAC两种。查询发起设备收集所有相应设备的地址、时钟信息。 
    一设备进入查询状态去发现其他设备,查询状态下连续不断的在不同频点发送查询消息。查询的跳频序列有GIAC的LAP导出。 
    一设备想被其他设备发现,就要周期性进入 查询扫描状态,以便相应查询消息。如:我们选择设备多长时间可见,其实就是 进入查询扫描状态。 
    A、查询扫描 
    查询扫描状态下,接收设备扫描接入码的时间长度,足以完成对16个频率的扫描。扫描区间长度Twindow inquiry scan。扫描在同一个频率上进行,查询过程用32跳专用查询跳频序列,此序列有通用查询的地址决定,相位有本地时钟决定,每隔1.28S变化一次。 
    B、查询 
    与寻呼类似,TX用查询跳频序列、RX用查询相应跳频序列。 
    C、查询相应 
    从设备响应查询操作。每个设备都有自己的时钟,使用查询序列相位相同的几率比较小。为了避免多个设备在同一查询跳频信道同时激活,从设备查询响应规定:从设备收到查询消息,产生0-1023只觉得额一个随机数,锁定当时相位输入值进行跳频选择,从设备此后的RAND时隙中返回到连接或者待机状态。

    (2)、寻呼扫描 
    DAC:DeviceAccess Code 设备接入码 
    寻呼扫描状态下的设备扫描窗口Twindowpage scan内监听自己的DAC。监听只在一个跳频点进行。Twindow page scan足够覆盖16个寻呼扫描频点。 
    寻呼扫描状态,扫描在同一个频率上进行,持续1.28S,在选择另一个不同频率。

    SR模式    Tpage scan    寻呼次数Npage
    R0    连续    >=1
    R1    <=1.28S    >=128
    R2    <=2.56S    >=256
    预留    –    –
    (3)、寻呼 
    主设备使用寻呼发起一个主—从设备连接,通过在不同的跳频点上重复发送从设备DAC来扑捉从设备,从设备在寻呼扫描状态被唤醒,接收寻呼。 
    (4)、寻呼相应过程

    三、链路管理器
     
    如上图红色部分,负责完成设备:功率管理、链路质量管理、链路控制管理、数据分组管理、链路安全管理。

    1、链路管理协议数据单元
    蓝牙链路管理器接收到高层的控制信息后,不是向自身的基带部分分发控制信息,就是与另一台设备的链路管理器进行协商管理。这些控制信息封装在链路管理协议数据单元LMP_PDU中,由ACL分组的有效载荷携带。

    2、链路管理器协议规范
    (1)、设备功率管理 
    RSSI保持模式、呼吸模式、休眠模式。 
    (2)、链路质量管理 QoSQuality of Service 
    A、ACL链路。 
    B、SCO链路。 
    (3)、链路控制管理 
    设备寻呼模式、设备角色转换、时钟计时设置、信息交换:版本信息、支持特性、设备名称;建立连接、链路释放。 
    (4)、数据分组管理

    第二章 蓝牙协议规范(射频、基带链路控制、链路管理)


    蓝牙协议是蓝牙设备间交换信息所应该遵守的规则。与开放系统互联(OSI)模型一样,蓝牙技术的协议体系也采用了分层结构,从底层到高层形成了蓝牙协议栈,各层协议定义了所完成的功能和使用数据分组格式,以保证蓝牙产品间的互操作性。

    一、射频协议
    射频位置如上图红色部分。

    1、工作频率
    蓝牙工作在2.4GHz ISM频段上,蓝牙采用跳频扩谱技术主动的避免工作频段受干扰(微波炉的工作频率也是2.4GHz)。 


    地理位置    ISM频段范围    射频信道频率
    中国、美国、欧洲    2400.0~2483.5MHz    F=(2402+k)MHz,k在0、1、……78中随机取值
    法国    2446.5~2483.5MHz    F=(2454+k)MHz,k在0、1、……22中随机取值
    日本    2471.0~2497.0MHz    F=(2473+k)MHz,k在0、1、……22中随机取值
    西班牙    2445.0~2475.0MHz    F=(2449+k)MHz,k在0、1、……22中随机取值
    我国的蓝牙频率在2.402GHz~2.483GHz,蓝牙每个频道的宽度为1MHz,为了减少带外辐射的干扰,保留上、下保护为3.5MHz和2MHz,79个跳频点中至少75个伪随机码跳动,30S内任何一个频点使用时长不能超过0.4S。

    2、跳频技术、发射功率、时隙
    (1)、发射功率:蓝牙发射功率分三级:一级功率100mW(20dBm);二级功率2.5mW(4dBm);三级功率1mW(0dBm); 
    (2)、物理信道:蓝牙物理信道有伪随机序列控制的79个跳频点构成,不同跳频序列代表不同的信道。 


    (3)、时隙:蓝牙跳频速率为1600次/s,每个时间为625uS(1S/1600)称为一个时隙; 


    二、基带与链路控制协议


    蓝牙发送数据时,基带部分将来自高层的数据进行信道编码,向下发给射频进行发送;接收数据时,将解调恢复空中数据并上传给基带,基带进行信道编码传送给上层。

    作用:跳频选择、蓝牙编址、链路类型、信道编码、收发规则、信道控制、音频规范、安全设置。

    1、蓝牙分组编码为小端模式;
    2、蓝牙地址
    **BD_ADDR:**BluetoothDevice Address;
    **LAP:**LowerAddress Part 低地址部分;
    UAP: UpperAddress Part 高地址部分;
    NAP: Non-significantAddress Part 无效地址部分。


    3、蓝牙时钟

    每个蓝牙设备都有一个独立运行的内部系统时钟,称为本地时钟(Local Clock),决定定时器的收发跳频。为了与其他设备同步,本地时钟要加一个偏移量(offset),提供给其他设备同步。

    蓝牙基带四个关键周期:312.5uS、625uS、1.25mS、1.28S。

    CLKN:本地时钟:
    CLKE:预计时钟,扫描寻呼过程中用到;
    CLK:设备实际运行的时钟频率。

    CLKE、CLK由CLKN加上一个偏移量得到的。

    4、蓝牙物理链路:
    通信设备间物理层的数据连接通道就是物理链路。

    ACL(Asynchronous Connectionless)异步无连接链路;对时间要求不敏感的数据通信,如文件数据、控制信令等。

    SCO(Synochronous Connection Oriented)同步面向连接链路;对时间比较敏感的通信,如:语音;最多只支持3条SCO链路,不支持重传。

    ACL用于数据传输;

    5、蓝牙基带分组:
    基带分组至少包括:接入码、分组头、有效载荷;
    1


    (1)、接入码用于同步、直流、载频泄漏偏置补偿标识; 
    (2)、分组头包含链路信息,确保纠正较多的错误。 
    分组类型如下:

    分组类别    Type(b3b2b1b0)    时隙    SCO    ACL
    链路控制分组    0000    1    NULL    NULL
    0001    POLL    POLL
    0010    FHS    FHS
    0011    DM1    DM1
    单时隙分组    0100    1    未定义    NULL
    0101    HV1
    0110    HV2
    0111    HV3
    1000    DV
    1001    NULL    AUX1
    3时隙分组    1010    3    未定义    DM3
    1011    DH3
    1100    未定义
    1101
    5时隙分组    1010    5    未定义    DM5
    1111
    ACL分组形式为:D(M|H)(1|3|5),D代表数据分组,M代表用2/3比例的FEC的中等速率分组;H代表不使用纠错码的高速率分组;1、3、5分别代表分组所占用的时隙数目; 
    DM1、DM3、DM5、DH1、DH3、DH5

    SCO分组形式为:HV(1|2|3)。HV代表高质量语言分组,1、2、3有效载荷所采用的纠错码方法。1为1/3比例FEC,设备2个时隙发送一个单时隙分组;2为2/3比例FEC,设备4个时隙发送一个单时隙分组;3为不使用纠错码,设备6个时隙发送一个单时隙分组

    HV1、HV2、HV3

    ALC 分组:

    类型    有效载荷头/字节    用户有效载荷/字节    FEC    CRC    对称最大速率/kbps    非对称速率/kbps
    前向    后向
    DM1    1    0~17    2/3    有    108.8    108.8    108.8
    DH1    1    0~27    无    有    172.8    172.8    172.8
    DM3    2    0~121    2/3    有    258.1    387.2    54.4
    DH3    2    0~183    无    有    390.4    585.6    86.4
    DM5    2    0~224    2/3    有    286.7    477.8    36.3
    MH5    2    0~339    无    有    433.9    723.2    57.6
    AUX1    1    0~29    无    无    185.6    185.6    185.6
    SCO分组:

    类型    有效载荷头/字节    用户有效载荷/字节    FEC    CRC    有效载荷长度    同步速率/kbps    占用Tsco数目/语言长度
    HV1    无    10    1/3        240位    64    2/1.25ms
    HV2    20    2/3    4/2.5ms
    HV3    30    无    6/3.75ms
    DV    1D    10+(0-9)D    2/3D    有D    64+57.6D    
    注释:D 只对数据段有用,DV分组包含数据段,也包含语言段。
    1
    (3)、有效载荷 分语言有效载荷、数据有效载荷。

    6、蓝牙的逻辑信道
    链路控制信道:LinkControl LC
    链路管理信道:Link Manage LM
    用户异步数据信道:User AsynchronizationUA
    用户同步数据信道:UserSynchronization US
    用户等时数据信道:UserIsochronous UI UI
    7、蓝牙的收发规则
     
    上图为RX缓存。 
     
    上图为TX缓存。 
    新分组到达时,ACL链路的RX缓存器要流量控制,SCO数据不需要流量控制;

    8、蓝牙基带信道和网络控制
    (1)、链路控制器状态: 
    待机、连接 
    寻呼page、寻呼扫描pagescan、查询inquiry、查询扫描inquiry scan、主设备相应Master Response、从设备相应Slave Response、查询相应inquiry response 
    (2) 、连接状态 
    激活模式active、呼吸模式sniff、保持模式hold、休眠模式park。 
    (3)、待机状态 
    待机状态是蓝牙设备缺省低功耗状态,此状态下本地时钟以低精度运行。蓝牙从待机转入寻呼扫描状态,对其他寻呼进行响应成为从设备;也可以从待机状态进入查询扫描状态,完成一个完整的寻呼,成为主设备。

    9、接入过程
    注释: 
    IAC Inquiry AccessCode 查询接入码; 
    GIAC:通用查询接入码 DIAC:专用查询接入码; 
    DAC:DeviceAccess Code 设备接入码; 
    LAP: 
    建立连接,必须使用查询、寻呼;查询过程使用IAC,发现覆盖区域内的设备、设备的地址及其时钟;连接过程使用DAC,建立连接的设备处理寻呼过程,成为主设备。

    (1)、查询过程 
    蓝牙设备通过查询来发现通信范围内的其他蓝牙设备。查询信息分为GIAC、DIAC两种。查询发起设备收集所有相应设备的地址、时钟信息。 
    一设备进入查询状态去发现其他设备,查询状态下连续不断的在不同频点发送查询消息。查询的跳频序列有GIAC的LAP导出。 
    一设备想被其他设备发现,就要周期性进入 查询扫描状态,以便相应查询消息。如:我们选择设备多长时间可见,其实就是 进入查询扫描状态。 
    A、查询扫描 
    查询扫描状态下,接收设备扫描接入码的时间长度,足以完成对16个频率的扫描。扫描区间长度Twindow inquiry scan。扫描在同一个频率上进行,查询过程用32跳专用查询跳频序列,此序列有通用查询的地址决定,相位有本地时钟决定,每隔1.28S变化一次。 
    B、查询 
    与寻呼类似,TX用查询跳频序列、RX用查询相应跳频序列。 
    C、查询相应 
    从设备响应查询操作。每个设备都有自己的时钟,使用查询序列相位相同的几率比较小。为了避免多个设备在同一查询跳频信道同时激活,从设备查询响应规定:从设备收到查询消息,产生0-1023只觉得额一个随机数,锁定当时相位输入值进行跳频选择,从设备此后的RAND时隙中返回到连接或者待机状态。

    (2)、寻呼扫描 
    DAC:DeviceAccess Code 设备接入码 
    寻呼扫描状态下的设备扫描窗口Twindowpage scan内监听自己的DAC。监听只在一个跳频点进行。Twindow page scan足够覆盖16个寻呼扫描频点。 
    寻呼扫描状态,扫描在同一个频率上进行,持续1.28S,在选择另一个不同频率。

    SR模式    Tpage scan    寻呼次数Npage
    R0    连续    >=1
    R1    <=1.28S    >=128
    R2    <=2.56S    >=256
    预留    –    –
    (3)、寻呼 
    主设备使用寻呼发起一个主—从设备连接,通过在不同的跳频点上重复发送从设备DAC来扑捉从设备,从设备在寻呼扫描状态被唤醒,接收寻呼。 
    (4)、寻呼相应过程

    三、链路管理器
     
    如上图红色部分,负责完成设备:功率管理、链路质量管理、链路控制管理、数据分组管理、链路安全管理。

    1、链路管理协议数据单元
    蓝牙链路管理器接收到高层的控制信息后,不是向自身的基带部分分发控制信息,就是与另一台设备的链路管理器进行协商管理。这些控制信息封装在链路管理协议数据单元LMP_PDU中,由ACL分组的有效载荷携带。

    2、链路管理器协议规范
    (1)、设备功率管理 
    RSSI保持模式、呼吸模式、休眠模式。 
    (2)、链路质量管理 QoSQuality of Service 
    A、ACL链路。 
    B、SCO链路。 
    (3)、链路控制管理 
    设备寻呼模式、设备角色转换、时钟计时设置、信息交换:版本信息、支持特性、设备名称;建立连接、链路释放。 
    (4)、数据分组管理
    --------------------- 

    第三章 蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)
    一、主机控制接口协议 HCI
    蓝牙主机-主机控模型 


    蓝牙软件协议栈堆的数据传输过程: 


    1、蓝牙控制器接口数据分组:
    指令分组、事件分组、数据分组

    (1)、指令分组 


    如:Accpet Connection Request

    Opcode为:0x0409
    参数长度为: 07
    参数中蓝牙地址为:00:0d:fd:5f:16:9f
    角色为:从设备 0x01
    大端数据模式

    指令为:09 04 07 9f 16 5f fd 0d 00 01
    (2)、事件分组 


     
    如上图:

    Opcode :0x0409
    状态: 0x00
    总长度: 4字节
    命令状态:0x0f
    (3)、数据分组 
    ACL 数据分组

    连接句柄(12bit)    PB(2bit)    BC(2bit)    数据长度(16bit)
    数据…………
    注:PB  Packet_Boundary  BC Broadcast Flag
    1
    SCO 数据分组

    连接句柄(12bit)    PB(2bit)    BC(2bit)    数据长度(16bit)
    数据…………
    (4)、RS232分组指示器:

    HCI 分组类型    RS232分组指示器
    HCI指令分组    0x01
    HCI ACL数据分组    0x02
    HCI SCO数据分组    0x03
    HCI事件分组    0x04
    HCI错误消息分组    0x05
    HCI协商分组    0x06
    2、HCI控制命令
    (1)、链路控制指令

    命令    OCF    概述
    Inquiry    0x0001    蓝牙设备进入查询模式,搜索临近设备
    Inquiry Cancel    0x0002    退出查询模式
    Periodic Inquiry Mode    0x0003    蓝牙设备在指定周期内自动查询
    Exit Periodic Inquiry Mode    0x0004    退出自动查询模式
    Create Connection    0x0005    按指定蓝牙设备的BD_ADDR创建ACL链路
    Disconnect    0x0006    终止现有连接
    Add SCO Connection    0x0007    利用连接句柄参数指定的ACL连接创建SCO
    Cancel Create Connection    0x0008    
    Accept Connection Request    0x0009    接收新的呼入连接请求
    Reject Connection Request    0x000A    拒绝新的呼入连接请求
    Link Key Request Reply    0x000B    应答从主机控制器发出的链路密钥请求事件,并指定存储在主机上的链路密钥做为与BD_ADDR指定的蓝牙设备进行连接使用的链路密钥请求事件
    Link Key Request Negative Reply    0x000C    如果主机上没有存储链路密钥,作为与BD_ADDR指定的蓝牙设备进行连接使用的链路密钥,就应答从主机控制器发出的链路密钥请求事件
    PIN Code Request Reply    0x000D    应答从主机控制器发出的PIN请求事件,并指定用于连接的PIN
    PIN Code Request Negative Reply    0x000E    当主机不能指定连接的PIN时,应回答从机控制器发出的PIN请求事件
    Change Connection Packet Type    0x000F    改变正在建立连接的分组类型
    Authentication Request    0x0011    指定连接句柄关联的两个蓝牙设备之间建立身份鉴权
    Set Connection Encryption    0x0013    建立取消连接加密
    Change Connection Link Key    0x0015    强制关联了连接句柄的两个设备建立连接,并生成一个新的链路密钥
    Master Link Key    0x0017    强制关联了连接句柄的两个设备利用主设备时链路密钥或常规密钥
    Remote Name Request    0x0019    获取远端设备的名称
    Cancel Remote Name Request        
    Read Remote Supported Features    0x001B    请求远端设备所支持的特性列表
    Read Remote Extended Features        
    Read Remote Version Information    0x001D    从远端设备读取版本信息
    Read Clock Offset    0x001F    读取远端的时钟信息
    (2)、链路策略指令

    命令    OCF    简介
    Hold Mode    0x0001    改变LM状态和本地及远程设备为主模式的LM位置
    Sniff Mode    0x0003    改变LM状态和本地及远程设备为呼吸模式的LM位置
    Exit Sniff Mode    0x0004    结束连接句柄在当前呼吸模式里的呼吸模式
    Park State    0x0005    改变LM状态和本地及远程设备为休眠模式的LM位置
    Exit Park State    0x0006    切换从休眠模式返回到激活模式的蓝牙设备
    QoS Setup    0x0007    指出连接句柄的服务质量参数
    Role Discovery    0x0009    蓝牙设备连接后确定自己的主从角色
    Switch Role    0x000B    角色互换
    Read Link Policy Settings    0x000C    为指定连接句柄读链路策略设置。链路策略设置允许主机控制器指定用于连接句柄的LM连接模式
    Write Link Policy Settings    0x000D    为指定连接句柄写链路策略设置。链路策略设置允许主机控制器指定用于连接句柄的LM连接模式
    Read Default Link Policy Settings    0x000E    
    Write Default Link Policy Settings    0x000F    
    Flow Specification    0X0010    
    (3)、主机控制器与基带指令

    Set Event Mark    0x0001    使能主机过滤HCI产生的事件
    Reset    0x0003    复位蓝牙控制器、链路管理器、基带链路管理器
    Set Event Filter    0x0005    使能主机指定不同事件过滤
    Flush    0x0008    针对指定的蓝牙句柄,放弃所有作为当前待传输数据,甚至当前是属于多个在主机控制器里的L2CAP指令的数据块
    Read PIN Type    0x0009    主机读取指定主机的PIN类型是可变的还是固定的
    Write PIN Type    0x000A    主机写入指定主机的PIN类型是可变的还是固定的
    Create New Unit Key    0x000B    创建新的单一密钥
    Read Stored Link Key    0x000D    读取存放在蓝牙控制器中的单个或者多个密钥
    Write Stored Link Key    0x0011    写入存放在蓝牙控制器中的单个或者多个密钥
    Delete Stored Link Key    0x0012    删除存放在蓝牙控制器中的单个或者多个密钥
    Write Local Name    0x0013    修改蓝牙设备名称
    Read Local Name    0x0014    读取蓝牙设备名称
    Read Connection Accept Timeout    0x0015    读连接识别超时参数值,定时器终止后蓝牙硬件自动拒绝连接
    Write Connection Accept Timeout    0x0016    写连接识别超时参数值,定时器终止后蓝牙硬件自动拒绝连接
    Read Page Timeout    0x0017    读寻呼超时参数值,本地设备返回连接失败前,该值是允许蓝牙硬件定义等待远程设备连接申请时间
    Write Page Timeout    0x0018    写寻呼超时参数值,本地设备返回连接失败前,该值是允许蓝牙硬件定义等待远程设备连接申请时间
    Read Scan Enable    0x0019    写出扫描允许参数值—用来控制蓝牙设备周期性查询
    Write Scan Enable    0x001A    读出扫描允许参数值—用来控制蓝牙设备周期性查询
    Read Page Scan Activity    0x001B    读寻呼扫描间隔、寻呼扫描区间参数
    Write Page Scan Activity    0x001C    写寻呼扫描间隔、寻呼扫描区间参数
    Read Inquiry Scan Activity    0x001D    读查询扫描间隔、查询扫描区间参数
    Write Inquiry Scan Activity    0x001E    写查询扫描间隔、查询扫描区间参数
    Read Authentication Enable    0x001F    读取鉴权允许参数—控制蓝牙设备是否对每个连接进行鉴权
    Write Authentication Enable    0x0020    写取鉴权允许参数—控制蓝牙设备是否对每个连接进行鉴权
    Read Encryption Mode    0x0021    读加密模式数值—控制蓝牙设备是否对每个连接进行加密
    Write Encryption Mode    0x0022    写加密模式数值—控制蓝牙设备是否对每个连接进行加密
    Read Class Of Device    0x0023    读取设备类型参数值,用于区别设备能力
    Write Class Of Device    0x0024    写设备类型参数值,用于区别设备能力
    Read Voice Setting    0x0025    读取语音设置参数值,控制语音连接的各种设置
    Write Voice Setting    0x0026    写语音设置参数值,控制语音连接的各种设置
    Read Automatic Flush Timeout    0x0027    对指定句柄,读取刷新超时值
    Write Automatic Flush Timeout    0x0028    对指定句柄,写入刷新超时值
    Read Num Broadcast Retransmissions    0x0029    读取设备的广播重复发送次数,重复发送提高广播消息的可靠性
    Write Num Broadcast Retransmissions    0x002A    写入设备的广播重复发送次数,重复发送提高广播消息的可靠性
    Read Hold Mode Activity    0x002B    读取Hold Mode Activity的参数值,用来确定Hold挂起的时间
    Write Hold Mode Activity    0x002C    写入Hold Mode Activity的参数值,用来确定Hold挂起的时间
    Read Transmit Power Level    0x002D    对指定句柄,读取传输功率的参数值
    Read Synchronous Flow Control Enable    0x002E    读取SCO流量控制设置。通过使用该设置,主机控制器决定是否主机控制器发送与SCO连接句柄相关的完成分组事件的数量
    Write Synchronous Flow Control Enable    0x002F    读写入SCO流量控制设置。通过使用该设置,主机控制器决定是否主机控制器发送与SCO连接句柄相关的完成分组事件的数量
    Set Host Controller To Host Flow Control    0x0031    主机控制器的打开、关闭,主机控制器到主机的流量控制
    Host Buffer Size    0x0033    主机通知主机控制器自己的ACL、SCO数据缓冲区大小。主机控制器分段传输数据,而数据不会超出这个范围
    Host Number Of Completed Packets    0x0035    当主机对于任何连接的句柄准备接受较多的HCI指令时,该指令用于通过主机指出主机控制器
    Read Link Supervision Timeout    0x0036    读取连接管理超时参数。主从蓝牙设备用该参数监视链路丢失情况
    Write Link Supervision Timeout    0x0037    写入连接管理超时参数。主从蓝牙设备用该参数监视链路丢失情况
    Read Number of Supported IAC    0x0038    读取查询扫描期间本地蓝牙扫描的查询识别码(ICA)的数值
    Read Current IAC LAP    0x0039    读取创建在查询扫描期间本地蓝牙设备正同时扫描的蓝牙识别码的LAP
    Write Current IAC LAP    0x003A    写入创建在查询扫描期间本地蓝牙设备正同时扫描的蓝牙识别码的LAP
    Read Page Scan Period Mode    0x003B    读取本地蓝牙设备的强制寻呼扫描区间模式
    Write Page Scan Period Mode    0x003C    写入本地蓝牙设备的强制寻呼扫描区间模式
    Read Page Scan Mode    0x003D    读取本地蓝牙设备的默认寻呼扫描区间模式
    Write Page Scan Mode    0x003E    写入本地蓝牙设备的默认寻呼扫描区间模式
    (4)、信息指令参数

    Read Local Version Information    0x0001    读取本地蓝牙版本信息
    Read Local Supported Features    0x0003    读取本地蓝牙设备特征表
    Read Local Extended Features    0x0004    
    Read Buffer Size    0x0005    返回HCI缓冲容量。缓冲容量用于传输缓冲数据
    Read Country Code [Deprecated]    0x0007    读取国家代码状态参数值
    Read BD ADDR    0x0009    读取BD_ADDR的参数值
    (5)、状态指令参数

    Read Failed Contact Count    0x0001    读取对于其他设备特殊连接的Failed Contact Count参数值。Failed Contact Count记录在刷新时终止及当前正在传输的L2CAP数据指令被自动刷新后,主单元或从单元不能连续响应事件次数
    Reset Failed Contact Count    0x0002    复位时对于其他设备的连接的Failed Contact Count的参数值。Failed Contact Count记录在刷新时终止及当前正在传输的L2CAP数据指令被自动刷新后,主单元或从单元不能连续响应事件次数
    Get Link Quality    0x0003    读取指定连接句柄的Link Quality的值
    Read RSSI    0x0005    读取对于其他蓝牙设备连接句柄的接收信号强度指示
    Read AFH Channel Map    0x0007    
    Read BD Clock    0x0009    
    (6)、测试指令

    Read Loopback Mode    0x0001    读取主机端控制器会送模式的设置值。回送模式设置可以确定信息发送路径
    Write Loopback Mode    0x0002    写入主机控制器会送模式的设置值。回送模式设置可以确定信息发送路径
    Enable Device Under Test Mode    0x0003    允许本地蓝牙设备模块通过LMP测试指令接入测试模式。当主机要求本地设备作为待测试设备,实现蓝牙测试模式文件中规定测试场景,则发送该指令
    (7)、错误代码

    错误代码    错误含义    错误代码    错误含义
    0x01    位置HCI指令    0x14    由于另一端引起连接中断:资源限制
    0x02    不能连接    0x15    由于另一端引起连接中断:关机
    0x03    硬件故障    0x16    本机中断连接
    0x04    寻呼超时    0x17    重复尝试
    0x05    身份验证失败    0x18    不允许匹配
    0x06    键丢失    0x19    未知LMP PDU
    0x07    存储器已满    0x1A    不支持远端特性
    0x08    连接超时    0x1B    拒绝SCO补偿
    0x09    最大连接数    0x1C    拒绝SCO间歇模式
    0x0A    连接到设备A的最大SCO连接数    0x1D    拒绝SCO无线模式
    0x0B    ACL连接已存在    0x1E    非法链路管理参数
    0x0C    指令非法    0x1F    未特别指明错误
    0x0D    由于资源有限,主机被拒绝    0x20    不支持链路管理器协议参数
    0x0E    由于安全原因,主机被拒绝    0x21    不允许角色改变
    0x0F    由于远端设备单连接设备,主机拒绝    0x22    链路管理响应超时
    0x10    主机超时    0x23    链路管理错误处理事务冲突
    0x11    不支持特性或参数值    0x24    不允许LMP PDU
    0x12    非法主机控制接口指令    0x25~0xFF    保留
    0x13    由于另一端引起连接中断:用户中断连接        
    二、逻辑链路控制与适配协议 L2CAP
    L2CAP位于基带之上,将基带的数据分组转换为便于高层应用的数据分组格式,并提供协议复用和服务质量交换等功能。L2CAP只支持ACL数据传输,不支持SCO数据。

    L2CAP本身不提供加强信道可靠性和保证数据完整性的机制,其信道的可靠性依靠基带提供。

    1、协议复用:
    底层传输协议没有提供对高层协议的复用机制,因而L2CAP支持高层协议复用,L2CAP层可以区分其上的SDP、RFCOMM、TCS等。

    2、分段重组:
    L2CAP层帮助实现基带的短PDU和高层的长PDU相互传输,L2CAP本身不完成任何PDU的分段重组,具体的分段重组有低层和高层来完成。

    3、服务质量
    Qualityof Serivce 信息的交换:蓝牙建立连接的过程中,L2CAP允许交互蓝牙所期望的服务质量,建立完成后,通过监视资源的使用情况,来保证服务质量。

    4、组抽象:
    L2CAP忽略地址组概念,他只关心数据。 
    L2CAP信道有三种类型: 
    **A、面向连接信道:**Connection-OrientedCO,用于两个设备之间的数据通信。 
    **B、无连接信道:**Connection-LessCL,用来向一组设备广播方式传输数据。CID为固定值:0x0002。 
    **C、信令信道:**Signaling,用于创建CO通道,可以通过协商改变CO信道的特性。 
    CL信道的L2CAP_PDU

    长度(2bytes)    信道ID(0x0002)    PSM(最小为2bytes)    有效载荷
    PSM为 协议/服务复用器Protocol/Service Multiplexer,一般为SDP、RFCOMM、TCS等中介协议复用。小于0x1000的值,0x0001对应SDP,0x0003对应RFCOMM、0x0005对应TCS。

    (1)、蓝牙逻辑链路控制与适配协议信令: 
    L2CAP的信令通道的CID为0x0001 
    信令指令分组:

    长度(2byte)    CID(0x0001)    指令1    指令2    ……………    指令n
    L2CAP 分组头部分    
    信令指令格式:

    代码(1byte)    标识符(1byte)    长度(2byte)    数据
    信令指令头


    如上图所示,一条L2CAP信令,1为L2CAP分组头,2为信令指令头,3为数据部分。 
    L2CAP: 
    Role:Master 
    Address:11 
    PDULength: 6 //指令的长度,值为06 00 
    ChannelID: 0x0001 (Signaling)//L2CAP的信令通道,值为01 00 
    Code:Information request//信息请求,值为0a 
    Identifier:1//标识符,值为01 
    CommandLength: 2//命令长度,值为02 00 
    InfoType:Extended features supported//02 00 
    所以这条指令完整的为: 
    06 00 01 00 0a 01 02 00 02 00

    信令的其他操作如下: 


    L2CAP信令指令码:

    Code    Description    
    0x00    RESERVED    保留
    0x01    Command reject    拒绝命令
    0x02    Connection request    连接请求
    0x03    Connection response    连接响应
    0x04    Configure request    配置请求
    0x05    Configure response    配置响应
    0x06    Disconnection request    断开请求
    0x07    Disconnection response    断开响应
    0x08    Echo request    
    0x09    Echo response    
    0x0A    Information request    信息请求
    0x0B    Information response    信息响应
    1)、连接请求Connection_Request Code=0x02

    代码(0x02)    标识符(1字节)    长度(2字节)    PSM(2字节)    源CID(2字节)
    例如:SDP 连接请求

    如上红框所示:

    代码(0x02)    标识符(1字节)    长度(2字节)    PSM(2字节)    源CID(2字节)
    0x02    3    4    SDP    0x0040
    2)、连接相应Connection_Response Code=0x03

    代码(0x03)    标识符    长度    目标CID    源CID    结果    状态
    例如:SDP请求响应 
     
    如上面红框所示:

    代码(0x03)    标识符    长度    目标CID    源CID    结果    状态
    0x03    3    8    0x0040    0x0040    0x0000    
    (2)、MTU MAXIMUMTRANSMISSION UNIT最大传输单元

     
    MTU最大传输单元,L2CAP应用必须支持最小为48字节的MTU,默认值为672 
    (3)、QoS 服务质量

    三、服务发现协议SDP
    SDP两种服务发现模式: 
    1)、服务搜索:查询具有特定服务属性的服务; 
    2)、服务浏览:简单的浏览全部可用服务。

    1 、PDU 格式:(协议数据单元)
    PDU ID(1byte)    Transaction ID(2byte)    参数长度(2byte)    参数1    ……    参数N
    Header    
    不同PDU ID实现SDP的不同功能,概述如下表格:

    Value    Parameter Descirption    
    0x00    Reserved    保留
    0x01    SDP_ErrorResponse    错误响应
    0x02    SDP_ServiceSearchRequest    服务搜索请求
    0x03    SDP_ServiceSearchResponse    服务搜索响应
    0x04    SDP_ServiceAttributeRequest    服务属性请求
    0x05    SDP_ServiceAttributeResponse    服务属性响应
    0x06    SDP_ServiceSearchAttributeRequest    服务搜索属性请求
    0x07    SDP_ServiceSearchAttributeResponse    服务搜索属性响应
    0x08-0xff    Reserved    保留
    2、服务记录表
    SDP的服务记录表对每一个服务进行描述,每条记录包含服务句柄、一组服务属性: 


    Service Record Attributes:服务记录;
    Service Record Handle 服务句柄;


    四、串口仿真协议 RFCOMM

    为建立在串口之上的传统应用提供环境接口,使他们可以做比较少协议改动就可以在蓝牙无线通信无线链路上工作。多路串口仿真是RFCOMM的重要功能,通过多路复用器(multiplexer),一条L2CAP链路可以同时 多个串行应用。 
    两台设备间的串口仿真: 


    RFCOMM 两个蓝牙设备之间可以支持多达60多路仿真串口。

    RFCOMM帧类型如下:

    SABM    异步平衡模式设置指令
    UA    未加编号的确认响应
    DM    断开连接模式响应
    DISC    断开连接指令
    UIH    带头校验的未编号信息命令和响应

     

    展开全文
  • 蓝牙协议

    2018-07-12 20:10:25
    蓝牙协议栈原理和结构,蓝牙协议栈原理和结构,蓝牙协议栈原理和结构,蓝牙协议栈原理和结构。
  • 蓝牙协议规范说明

    2017-05-02 11:27:17
    蓝牙协议
  • 蓝牙协议 英文版 正在寻找中文版 找到后再传上来
  • 蓝牙协议5.0

    2018-06-17 16:20:03
    蓝牙协议5.0
  • 主要介绍下蓝牙协议栈开发板跑传统蓝牙串口协议SPP AT指令以及上位机操作步骤,以及原理 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些...

    零. 概述

    主要介绍下蓝牙协议栈开发板跑传统蓝牙串口协议SPP AT指令以及上位机操作步骤,以及原理

    一. 声明

    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等

    第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。

    第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)

    第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    -------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    蓝牙学习目录https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

    --------------------------------------------------------------------------------------------------------------------------

    二. STM32蓝牙协议栈封装使用AT command实现串口协议SPP的通信

    使用步骤操作如下:

    步骤 1)准备好代码,从github下载下来最新的代码(在上面有介绍Github连接)

    步骤 2)连接好硬件(把模组插好,ST-LINK接上,TYPE-C debug先接上,按下按钮可以看到蓝色电源等亮起)

    步骤 3)打开Keil工程文件夹下的project\stm32f10x_bb_csr8x11_bt\stm32f10x_bb_csr8x11.uvprojx,配置SPP使能(在bt_config.h把PROFILE_SPP_ENABLE定义为1)

    步骤4)编译下载

    此部分注意几点:

    • 下载需要ST-LINK驱动,我已经放在下载资料中的软件工具文件夹中
    • STM32 F1的pack要有,我已经放在软件工具文件夹中的MDK下,没有没安装过要安装下,名字如下:

       

    • 下载的debug要选ST-LINK

         

    • 下载的时候要勾选Use micro lib

         

    步骤6)打开串口工具(我用的是XCOM),然后做初始化动作,在发送串口敲BT_START,点击发送,出来以下log就证明初始化通过了,接下来我们就准备开始测试SPP注意一点:不能勾选发送新行,否则会解析错误)

    步骤6)使用手机的SPP软件(在3-软件工具\bt_spp_apk)来连接我们的开发板,连接成功如图,然后敲SPP_SEND就可以发送固定字符串(在代码中写死,你可以随便来修改),然后apk发送的数据我们也可以通过开发板接受到了

    三.STM32蓝牙协议栈使用上位机实现串口协议SPP的通信

    上位机的使用前4步跟AT一样,我们我们就直接来讲第五步。

    打开我们工程源码1-BLUETOOTH\mcu_bt_tool\mcu_bt_tool\mcu_bt_tool\bin\Debug中的mcu_bt_tool.exe,当然你也可以直接用VS2010打开工程

    步骤5)打开上位机,开启串口,开启蓝牙功能

    步骤6)进入蓝牙串口界面,连接上后连接状态跟连接地址以及空间都会可用,界面简单易用,没啥不懂的

    另外:使用上位机的时候注意几点:

    ① mcu_bt_tool.exe你如果想把可执行文件拿到别的路径单独执行,那么必须要把Newtonsoft.Json.dll跟exe放在同一个路径下,因为上位机是跟STM32用json沟通的

    ② 因为目前搜索是开启的EIR,带RSSI的,所以他会重复性上来同一个设备,我没做根据同一个蓝牙地址做显示过滤,如果有兴趣的人可以加上这一块

    四. 串口工具AT command以及上位机实现搜索的原理

    https://blog.csdn.net/XiaoXiaoPengBo/article/details/108414679

    原理在以上链接的第四小节

     

     

    展开全文
  • 蓝牙协议大全

    2018-09-20 17:38:55
    很全的蓝牙协议,包含目前所有的核心协议(最新到5.0)以及常用profile协议。
  • 蓝牙学习丛书(蓝牙4.0BLE开发完全手册+蓝牙核心技术及应用+蓝牙协议的学习+蓝牙协议及其源代码分析),蓝牙入门资料整理,欢迎下载
  • 蓝牙协议源代码 蓝牙协议源代码 蓝牙协议源代码
  • 《蓝牙4.0BLE开发完全手册》+《蓝牙核心技术及应用》+《蓝牙协议的学习》+《蓝牙协议及其源代码分析》
  • 蓝牙协议介绍

    2018-05-23 10:38:04
    蓝牙协议介绍,对蓝牙的开发做一个大致介绍,文件版本为pdf
  • 蓝牙协议.docx

    2019-06-05 09:10:09
    基本蓝牙协议描述,包括了所有的蓝牙协议的基本描述。希望有用
  • 主要介绍下蓝牙协议栈开发板跑传统蓝牙搜索AT指令以及上位机操作步骤,以及原理 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,...

    零. 概述

    主要介绍下蓝牙协议栈开发板跑传统蓝牙搜索AT指令以及上位机操作步骤,以及原理

    一. 声明

    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等

    第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。

    第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)

    第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    -------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    蓝牙学习目录https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

    --------------------------------------------------------------------------------------------------------------------------

    演示视频点击我(!!!!!!!!!!!!!!!!)

    二. STM32蓝牙协议栈封装使用AT command实现搜索

    使用步骤操作如下:

    步骤 1)准备好代码,从github下载下来最新的代码(在上面有介绍Github连接)

    步骤 2)连接好硬件(把模组插好,ST-LINK接上,TYPE-C debug先接上,按下按钮可以看到蓝色电源等亮起)

    步骤 3)打开Keil工程文件夹下的project\stm32f10x_bb_csr8x11_bt\stm32f10x_bb_csr8x11.uvprojx,然后编译下载

    此部分注意几点:

    • 下载需要ST-LINK驱动,我已经放在下载资料中的软件工具文件夹中
    • STM32 F1的pack要有,我已经放在软件工具文件夹中的MDK下,没有没安装过要安装下,名字如下:

       

    • 下载的debug要选ST-LINK

         

    • 下载的时候要勾选Use micro lib

         

    步骤4)打开串口工具(我用的是XCOM),然后做初始化动作,在发送串口敲BT_START,点击发送,出来以下log就证明初始化通过了,我们就可以来进行搜索动作了注意一点:不能勾选发送新行,否则会解析错误

    步骤5)然后敲BT_INQUIRY就能搜索到设备了

    三.使用我们自己写的上位机来实现搜索

    步骤跟AT的1)2)3)一样,我们从第四步开始讲解

    打开我们工程源码1-BLUETOOTH\mcu_bt_tool\mcu_bt_tool\mcu_bt_tool\bin\Debug中的mcu_bt_tool.exe,当然你也可以直接用VS2010打开工程

    步骤 1)打开串口

    步骤 2)点击蓝牙开启按钮(此步骤跟AT 命令BT_START一样的效果,就是实现蓝牙初始化)

    步骤 3) 等待初始化完成点击搜索按钮,你就发现可以搜索到蓝牙了

    另外:使用上位机的时候注意几点:

    ① mcu_bt_tool.exe你如果想把可执行文件拿到别的路径单独执行,那么必须要把Newtonsoft.Json.dll跟exe放在同一个路径下,因为上位机是跟STM32用json沟通的

    ② 因为目前搜索是开启的EIR,带RSSI的,所以他会重复性上来同一个设备,我没做根据同一个蓝牙地址做显示过滤,如果有兴趣的人可以加上这一块

    四. 串口工具AT command以及上位机实现搜索的原理

    步骤 1)Type C uart debug口的tx,rx初始化

    /******************************************************************************
     * func name   : hw_uart_debug_init
     * para        : baud_rate(IN)  --> Baud rate of uart1
     * return      : hw_uart_debug_init result
     * description : Initialization of USART1.PA9->TX PA10->RX
    ******************************************************************************/
    uint8_t hw_uart_debug_init(uint32_t baud_rate)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
    
        /* Enable RCC clock for USART1,GPIOA,DMA1 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    
        /* Initialization GPIOA9 GPIOA10 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
        /* Data format :1:8:1, no parity check, no hardware flow control */
        USART_InitStructure.USART_BaudRate = baud_rate;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    
        /* Enable USART interrupts, mainly for idle interrupts */
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=DEBUG_PREE_PRIO;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = DEBUG_SUB_PRIO;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    
        /* Initializes USART1 to enable USART, USART idle interrupts and USART RX DMA */
        USART_Init(USART1, &USART_InitStructure);
        USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
        USART_Cmd(USART1, ENABLE);
    
        /* Initializes DMA and enables it */
        DMA_DeInit(DMA1_Channel5);
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)uart1_rev_buffer;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = UART1_MAX_REV;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
    
        DMA_Cmd(DMA1_Channel5, ENABLE);
    
        return HW_ERR_OK;
    
    }
    

    可以看到TX我们就是普通的实现发送,RX我们用串口空闲中断+DMA的方式来实现接受串口工具以及上位机的发送指令,然后串口中断的实现原理是这样:

    /******************************************************************************
     * func name   : USART1_IRQHandler
     * para        : NULL
     * return      : NULL
     * description : Interrupt handler for usart1
    ******************************************************************************/
    void USART1_IRQHandler(void)
    {
    
        if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
        {
            /* Without this, the interrupt cannot be cleared and continues into the interrupt */
            USART_ReceiveData(USART1);
            uart1_rev_len =UART1_MAX_REV-DMA_GetCurrDataCounter(DMA1_Channel5);
    
            if(uart1_rev_len != 0)
            {
                /* Call the parse function */
    		shell_parse(uart1_rev_buffer);
                hw_memset(uart1_rev_buffer,0,sizeof(uart1_rev_buffer));
            }
            /* Clear the interrupt and reset DMA */
            USART_ClearITPendingBit(USART1,USART_IT_IDLE);
            uart1_dma_enable(DMA1_Channel5);
        }
    }
    

    步骤2)收到串口工具或者上位机的解析函数如下:

    uint8_t shell_parse(uint8_t *shell_string)
    {
        uint8_t result = HW_ERR_OK;
    
    
        cJSON* parse_json = cJSON_Parse((const char *)shell_string);
        uint8_t* func_value = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"FUNC"))->valuestring;
        uint8_t* operate_value = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"OPERATE"))->valuestring;
        uint8_t* para1 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM1"))->valuestring;
        uint8_t* para2 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM2"))->valuestring;
        uint8_t* para3 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM3"))->valuestring;
        uint8_t* para4 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM4"))->valuestring;
        uint8_t* para5 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM5"))->valuestring;
        uint8_t* para6 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM6"))->valuestring;
    
        if(hw_strcmp((const char *)func_value,"BT") == 0)
        {
            result = shell_json_parse(operate_value,para1,para2,para3,para4,para5,para6);
        }
        else
        {
            result = shell_at_cmd_parse(shell_string);
        }
    
        cJSON_Delete(parse_json);
        return result;
    
    }

    在这里我们分两种方式来解析:①AT command(串口工具采用这种方式) ②Json(上位机采用这种方式),如果解析不是我们定义的json格式,那么就自动转变为AT指令的解析

    步骤3)AT command解析执行BT_START,以及BT_INQUIRY

    uint8_t shell_at_cmd_parse(uint8_t *shell_string)
    {
    
        if(hw_strcmp("BT_START",(const char*)shell_string) == 0)
        {
            HW_DEBUG("SHELL:operate bt start\n");
            bt_start(&bt_app_cb);
            return HW_ERR_OK;
        }
    
        ........
    
    
        if(hw_strcmp("BT_INQUIRY",(const char*)shell_string) == 0)
        {
            HW_DEBUG("SHELL:operate bt inquiry\n");
            bt_start_inquiry(0x30,HCI_INQUIRY_MAX_DEV);
            return HW_ERR_OK;
        }
    }

    步骤4)接受上位机json指令解析

    uint8_t shell_json_parse(uint8_t *operate_value,
                             uint8_t *para1,uint8_t *para2,uint8_t *para3,
                             uint8_t *para4,uint8_t *para5,uint8_t *para6)
    {
        if(hw_strcmp((const char *)operate_value,"BT_START") == 0)
        {
            HW_DEBUG("UART PARSE DEBUG:operate BT_START\n");
            bt_start(&bt_app_cb);
            operate_stauts_oled_show("BT",operate_value,"SUCCESS",0,0,0,0,0,0);
            return HW_ERR_OK;
        }
    
        .....
    
    
        if(hw_strcmp((const char *)operate_value,"BT_START_INQUIRY") == 0)
        {
            HW_DEBUG("UART PARSE DEBUG:operate BT_INQUIRY\n");
            bt_start_inquiry(0x30,HCI_INQUIRY_MAX_DEV);
            return HW_ERR_OK;
        }
    }

    以上步骤3)4)其中bt_start以及bt_start_inquiry就是协议栈函数了,这样就实现了AT command或者json上位机跟蓝牙协议栈的对接。

    展开全文
  • 主要介绍下用Linux ubuntu虚拟机外接我们的蓝牙扩展版跑蓝牙协议栈的初始化以及搜索演示 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些...
  • 蓝牙协议pdf

    2016-01-15 22:30:35
    和网络相关的蓝牙协议,主要是和网络协同方面的协议。
  • 蓝牙协议栈体系

    2014-12-16 14:55:25
    蓝牙协议栈体系 蓝牙底层协议 蓝牙中间层协议 蓝牙高层协议
  • 蓝牙协议4.2

    热门讨论 2014-12-28 21:51:13
    蓝牙协议4.2,12月份出的,英文版,没有中文。
  • 手把手教你蓝牙协议栈入门

    千人学习 2020-07-16 09:03:50
    本课程定位是:引领想学习蓝牙协议栈的学生或者从事蓝牙,但是对蓝牙没有一个系统概念的工程师快速入门 课程是多年从事蓝牙经验总结出来的,希望能让你看完有一种醍醐灌顶的感觉。 不要在摸着石头过河了·学习完这些...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,084
精华内容 2,833
关键字:

蓝牙协议