搜档网
当前位置:搜档网 › 由浅入深_蓝牙4.0BLE协议栈开发攻略大全(4)

由浅入深_蓝牙4.0BLE协议栈开发攻略大全(4)

本系列教程将结合TI推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程。教程共分为六部分,本文为第四部分:

第四部分知识点:

第十六节协议栈LED实验

第十七节协议栈LCD显示

第十八节协议栈UART实验

第十九节协议栈五向按键

第二十节协议栈Flash数据存储

有关TI 的CC254x芯片介绍,可点击下面链接查看:

主流蓝牙BLE控制芯片详解(1):TI CC2540

同系列资料推荐:

由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(1)

由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)

由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(3)

有关本文的工具下载,大家可以到以下这个地址:

朱兆祺ForARM

第十六节协议栈LED实验

TI的协议栈中在HAL层已经有了LED的驱动,我们只需要针对我们的开发板进行配置即可,我们的开发板有两个LED,分别对应P1.0和P1.1。这个在裸机开发的时候已经介绍了。

为了保持协议栈原有的代码不变,我们在BLE-CC254x-1.4.0\Components\hal\target 目录下新建一个文件夹,使它适应我们的开发板。

打开LED实验工程LEDExample,选择MT254xboard,并且在工程配置中要定义

HAL_LED=TRUE,下载到开发板运行,可以看到两个LED同时在闪烁。

那我们的实现代码在哪里呢?其实在协议栈中实现这个很简单,在启动事件中我们调用了一个HalLedSet函数,并且设置了两个LED同时闪烁。

就是这么简单,协议栈已经把其它事情做好了,只需要我们调用设置函数即可。设置的模式总共有5种。

#define HAL_LED_MODE_OFF 0x00 // 关闭LED

#define HAL_LED_MODE_ON 0x01 // 打开LED

#define HAL_LED_MODE_BLINK 0x02 // 闪烁一次

#define HAL_LED_MODE_FLASH 0x04 // 不断的闪烁,最多255次

#define HAL_LED_MODE_TOGGLE 0x08 // 翻转LED状态

为了适应不同的需求,我们可能需要更改LED的输出引脚,如图板级配置在

hal_board_cfg.h文件中。

这里我们的开发板只有两个LED,所以我们在这里根据开发板的实际情况修改相应的IO 口。

第十七节协议栈LCD显示实验

打开LCD12864的实验工程,一样的在工程配置中打开LCD,选择MT254xboard然后直接编译下载,我们可以看到LCD上已经有显示了。

这些显示来自哪里呢?

在初始化函数中可以看到图中的函数调用,这里是将字符串显示到LCD的第一行。

在事件回调函数中可以看到这里将本机地址显示到第二行,将字符串Initialized显示到第三行,但是为什么我们在第三行没有看到这行字符串呢?而显示的字符串是Advertising ,这是因为系统启动后运行非常快,在我们还没反应过来的时候已经进入了广播状态,并且将原来的字符串覆盖了,所以我们最后只能看到Advertising 了。

HalLcdWriteString是将第一个参数指向的字符串显示到第二个参数指定第几行中,例如我们需要在第5行显示系统启动信息,我们可以在启动事件中,添加如下代码。

这里我们来介绍一下Lcd驱动的实现,在Hal_lcd.h文件中申明了以下函数,这些函数的功能都有英文注释,这里我就不再累述了。

/*

* Initialize LCD Service

*/

extern void HalLcdInit(void);

/*

* Write a string to the LCD

extern void HalLcdWriteString ( char *str, uint8 option);

/*

* Write a value to the LCD

*/

extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option);

/*

* Write a value to the LCD

*/

extern void HalLcdWriteScreen( char *line1, char *line2 );

/*

* Write a string followed by a value to the LCD

*/

extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format,uint8 line );

/*

* Write a string followed by 2 values to the LCD

*/

extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line );

/*

* Write a percentage bar to the LCD

extern void HalLcdDisplayPercentBar( char *title, uint8 value );

协议栈中很多地方都调用了这些函数,我们如果要使我们的硬件能够兼容协议栈,被协议栈使用,就需要实现这些函数的定义,当然,为了适应我们的开发板,我已经实现了这些函数,实现都在hal_lcd.c中。

第十八节协议栈UART实验

协议栈中已经用了串口的驱动,我们要做的只是对串口进行初始化,然后就可以进行串口数据的收发了。

用使用串口,第一步,需要打开使能串口功能,通过配置工程来实现,这里注意,我们现在不使用USB的CDC类来实现串口,所以HAL_UART_USB=FALSE。

HAL_UART=TRUE

HAL_UART_USB=FALSE

要使用串口必须先初始化相应的串口,那该如何初始化呢?在Hal_uart.h文件中我们可以看到如下函数。

uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config);

这个函数就是用来初始化串口的,这个函数有两个参数,第一个指定串口号,第二个是串口的配置参数。我们来看看这个结构体的定义:

typedef struct

{

bool configured; // 配置与否

uint8 baudRate; // 波特率

bool flowControl; // 流控制

uint16 flowControlThreshold;

uint8 idleTimeout; // 空闲时间

halUARTBufControl_t rx; // 接收

halUARTBufControl_t tx; // 发送

bool intEnable; // 中断使能

uint32 rxChRvdTime; // 接收数据时间

halUARTCBack_t callBackFunc; // 回调函数

}halUARTCfg_t;

这个结构体成员很多,但是我们在使用串口的时候并不需要使用所有的成员。

void Serial_Init(void)

{

halUARTCfg_t SerialCfg = {0};

SerialCfg.baudRate = HAL_UART_BR_115200; // 波特率

SerialCfg.flowControl = HAL_UART_FLOW_OFF; // 流控制

SerialCfg.callBackFunc = SerialCb; // 回调函数

SerialCfg.intEnable = TRUE;

SerialCfg.configured = TRUE;

HalLcdWriteString(“Open Uart0”, HAL_LCD_LINE_5 ); // 在第5行显示启动信息

HalUARTOpen(HAL_UART_PORT_0, &SerialCfg);

HalUARTWrite(HAL_UART_PORT_0,“Hello MT254xBoard\r\n”, osal_strlen(“Hello MT254xBoard\r\n”));

}

在串口回调函数中我们只做一件事,将串口接收到的数据显示到LCD中并且原样的从串口输出。回调函数的实现如下:

static void SerialCb( uint8 port, uint8 events )

{

uint8 RxBuf[64]={0};

if((events & HAL_UART_TX_EMPTY)||( events & HAL_UART_TX_FULL )) // 发送区满或者空

{

return;

}

uint16 usRxBufLen = Hal_UART_RxBufLen(HAL_UART_PORT_0); // 读取接收据量

usRxBufLen = MIN(64,usRxBufLen);

uint16 readLen = HalUARTRead(HAL_UART_PORT_0, RxBuf, usRxBufLen);

HalUARTWrite(HAL_UART_PORT_0, RxBuf, usRxBufLen);

}

实验现象,从实验现象中可以看到,一开始在串口中输出了一个标志字符串,然后我们通过串口发送了0123456789,然后数据原样的从串口输出了,这和我们预期的结果是一样的。

但是我们发现LCD上的显示和我们预期的不一样,LCD上只显示了6789,前面的数据并没有显示,这是怎么一回事呢?进行单步调试可以发现,我们发送一次数据,回调函数被回调了两次,第一次回调只接受到了012345,第二次回调接收到了6789,而在LCD上的显示第二次覆盖了第一次的显示,所以我们会看到这种现象,解决的办法,我们需要定义一个数据帧的时间间隔,当接收数据的间隔超过了此间隔就认为接收结束。

下面我们改写接收处理,我们在接收到数据后开启定时器,定时5ms这样,当接收间隔大于5ms后,我们就可以在定时事件中处理串口接收到的数据。

static void SerialCb( uint8 port, uint8 events )

{

if((events & HAL_UART_TX_EMPTY)||( events & HAL_UART_TX_FULL )) // 发送区满或者空

{

return;

}

uint16 usRxBufLen = Hal_UART_RxBufLen(HAL_UART_PORT_0); // 读取接收据量

if(usRxBufLen)

{

usRxBufLen = MIN(128,usRxBufLen);

uint16 readLen = HalUARTRead(HAL_UART_PORT_0, &SerialRxBuf[RxIndex],usRxBufLen); // 读取数据到缓冲区

RxIndex += readLen;

readLen %= 128;

osal_start_timerEx(simpleBLEPeripheral_TaskID, UART_EVENT, 5); // 启动定时器

}

}

事件处理代码:

if ( events & UART_EVENT )

{

HalLcdWriteString((char*)SerialRxBuf, HAL_LCD_LINE_6 ); // 在第5行显示启动信息

HalUARTWrite(HAL_UART_PORT_0, SerialRxBuf, osal_strlen(SerialRxBuf));

osal_memset(SerialRxBuf, 0, 128);

return (events ^ UART_EVENT);

}

经过这样的处理后,可以发现我们刚刚的问题已经解决了。

到这里串口已经可以正常使用了,为了更加方便的使用串口,我在这里添加一个函数实现标准C中printf,这样更有利于我们输出。

int SerialPrintf(const char*fmt,。。。)

{

uint32 ulLen;

va_list ap;

char *pBuf = (char*)osal_mem_alloc(PRINT_BUF_LEN); // 开辟缓冲区

va_start(ap, fmt);

ulLen = vsprintf(pBuf, fmt, ap); // 用虚拟打印函数实现

va_end(ap);

HalUARTWrite(HAL_UART_PORT_0,(uint8*)pBuf, ulLen); // 从串口0输出osal_mem_free(pBuf); // 释放内存空间

return ulLen;

}

我们可以像使用C标准中的printf来使用这个函数,例如我们将LCD的输出全部导向串口的输出,在HalLcdWriteString的实现中添加串口输出代码,如下图:

重新编译并且烧录后可以看到LCD的输出和串口的输出是一样的了。

第十九节协议栈五向按键

和前面几个一样,按键的驱动在协议栈中也已经有了,我们只需要做一些小的修改,使它适应我们的开发板即可。

1. 修改工程配置,使能按键功能。

2. 在我们的工程中要使用按键功能,仅仅打开配置选项是不够的。因为协议栈代码默认只有MINIDK开发板才有按键。

从这里可以看到(类似的地方有很多),如果要使能按键功能还需要定义CC2540_MINIDK,但是阅读整个协议栈你会发现,定义 CC2540_MINIDK后还会打开其它的功能,而那些功能

并不是我们想要的,所以在这里我们使用另外一种方法来实现。我们定义我们的开发板也能使用按键功能,所以在工程配置中添加MT254xboard=TRUE,然后在按键功能有宏开关的地方加入这个条件。具体位置参见代码。

按下相应的按键后可以看到串口输出相应的按键值。五向按键的工作原理在裸机开发的时候已经讲过了,在协议栈中已经有相应的驱动代码了,无需我们编写,只需要按照实际情况改写即可。例如我们的开发板每个按键对应的电压值和原来的值并不一样,所以我们这里改写了每个按键值的电压范围。

uint8 halGetJoyKeyInput(void)

{

蓝牙协议栈详解

1.概述: 蓝牙协议规范遵循开放系统互连参考模型(OSI/RM),从低到高地定义了蓝牙 协议堆栈的各个层次。 SIG所定义的蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现 互操作。互操作的远端设备需要使用相同的协议栈,不同的应用需要不同的协议栈。但是,所有的应用都要使用蓝牙技术规范中的数据链路层和物理层。 2.完整的蓝牙协议栈 完整的蓝牙协议栈如图1所示,不是任何应用都必须使用全部协议,而是可以只使用其中的一列或多列。图1显示了所有协议之间的相互关系,但这种关系在某些应用中是有变化的。 蓝牙协议体系中的协议 蓝牙协议体系中的协议按SIG的关注程度分为四层: 核心协议:BaseBand、LMP、L2CAP、SDP; 电缆替代协议:RFCOMM; 电话传送控制协议:TCS-Binary、AT命令集; 选用协议:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、WAE。 除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口。在图1中,HCI位于L2CAP 的下层,但HCI也可位于L2CAP上层。

蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。3.蓝牙核心协议介绍 1)基带协议 基带和链路控制层确保微微网内各蓝牙设备单元之间由射频构成的物理连接。蓝牙的射频系统是一个跳频系统,其任一分组在指定时隙、指定频率上发送。它使用查询和分页进程同步不同设备间的发送频率和时钟,为基带数据分组提供了两种物理连接方式,即面向连接(SCO)和无连接(ACL),而且,在同一射频上可实现多路数据传送。ACL适用于数据分组,SCO适用于话音以及话音与数据的组合,所有的话音和数据分组都附有不同级别的前向纠错(FEC)或循环冗余校验(CRC),而且可进行加密。此外,对于不同数据类型(包括连接管理信息和控制信息)都分配一个特殊通道。 可使用各种用户模式在蓝牙设备间传送话音,面向连接的话音分组只需经过基带传输,而不到达L2CAP。话音模式在蓝牙系统内相对简单,只需开通话音连接就可传送话音。 2)连接管理协议(LMP) 该协议负责各蓝牙设备间连接的建立。它通过连接的发起、交换、核实,进行身份认证和加密,通过协商确定基带数据分组大小。它还控制无线设备的电源模式和工作周期,以及微微网内设备单元的连接状态。 3)逻辑链路控制和适配协议(L2CAP) 该协议是基带的上层协议,可以认为它与LMP并行工作,它们的区别在于,当业务数据不经过LMP时,L2CAP为上层提供服务。L2CAP向上层提供面向连接的和无连接的数据服务,它采用了多路技术、分割和重组技术、群提取技术。L2CAP 允许高层协议以64k字节长度收发数据分组。虽然基带协议提供了SCO和ACL两种连接类型,但L2CAP只支持ACL。 4)服务发现协议(SDP)

蓝牙协议栈BlueZ的移植与开发

蓝牙协议栈BlueZ的移植与开发* 欧阳鑫 于红岩 吕杨 (昆明理工大学信息工程与自动化学院,昆明,650051) 摘要:蓝牙技术是当前国内外科技界和产业界研究开发的热点技术,其应用范围包括手机、PDA、信息家电设备等领域,蓝牙技术在嵌入式系统上必将得到广泛的应用。而要在嵌入式系统上提供蓝牙开发支持,蓝牙协议栈的移植是关键。本文分析了蓝牙协议栈BlueZ体系结构,详细介绍了在S3C2410开发板上移植BlueZ的步骤,建立了嵌入式蓝牙应用开发平台,并提出了用BlueZ 开发蓝牙应用程序的思路。 关键字:蓝牙技术;蓝牙协议栈BlueZ;移植;S3C2410;Linux 中图分类号:TP368.1 文献标识码:A BlueZ Porting and Programming Ou Yangxin,Yu Hongyan,Lv Yang (College of Information Engineering and Automation,Kunming University of Science and Technology,Kunming 650051,China) Abstract: Bluetooth technology is the focused on by the domestic and overseas research institutes. This technology is widely used in mobile phone, PDA, and Information Appliance devices. In the future,bluetooth technology will be widely used in embedded system. Built some bluetooth applications on embedded system,the key technology is porting bluetooth protocol suites to platform. In this paper,we study the BlueZ architecture,describe the steps of Porting BlueZ to S3C2410 Platform in detail,and build the embedded bluetooth application programming platform. In the end, we also give the idea of bluetooth programming. Keywords: bluetooth technology,bluetooth protocol suites BlueZ,porting, S3C2410, Linux 1引言 蓝牙技术是一项低价格、低功耗的射频技术,它能使蓝牙设备实现近距离无线通信。由于蓝牙技术有广泛的应用前景,它已成为当前国内外科技界和产业界研究开发的热点技术。Linux 操作系统的开放的蓝牙协议栈主要包括IBM公司的BlueDrekar,Nokia公司的Affix, Axis公司的OpenBT和官方协议栈BlueZ[1]。BlueZ是公布在Internet上的免费蓝牙协议栈,由于它结构简单,应用方便,具有灵活、高效和模块化的特点且具有较强的兼容性,因此BlueZ已经成为Linux操作系统下的官方的蓝牙协议栈。 S3C2410x是三星公司推出的一款高性价比32位的RISC处理器,内含一个由ARM公司设计的ARM920T核,具有低功耗高性能的特点,适用于对价格及功耗敏感的场合。本文使用的S3C2410开发板主要包含以下部件:S3C2410x芯片,32MB Nor Flash,64MB SDRAM,IIC存储器接口,LCD控制器,UART接口,一个USB(Host)接口。 利用S3C2410开发板上的USB接口,可以外扩蓝牙适配器,但S3C2410开发板上没有实现蓝牙设备驱动。本文对蓝牙协议栈BlueZ进行分析,移植BlueZ到开发板上实现蓝牙设备驱动,提出了使用BlueZ开发蓝牙应用程序的基本思路。 *基金项目:云南省自然科学基金项目(2004F0024M)。

由浅入深,蓝牙4.0BLE协议栈开发攻略大全

本系列教程将结合TI推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程。教程共分为六部分,本文为第五部分: 第五部分知识点: 第二十一节 DHT11温湿度传感器 第二十二节蓝牙协议栈之从机通讯 第二十三节蓝牙协议栈主从一体之主机通讯 第二十四节 OAD空中升级 第二十五节 SBL串口升级 有关TI 的CC254x芯片介绍,可点击下面链接查看: 主流蓝牙BLE控制芯片详解(1):TI CC2540 同系列资料推荐: 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(1) 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2) 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(3) 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(4) 有关本文的工具下载,大家可以到以下这个地址: 朱兆祺ForARM 第二十一节 DHT11温湿度传感器 DHT11简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相

连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为给类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封装,连接方便。 技术参数 供电电压: 3.3~5.5V DC 输出:单总线数字信号 测量范围:湿度20-90%RH,温度0~50℃ 测量精度:湿度+-5%RH,温度+-2℃ 分辨率:湿度1%RH,温度1℃ 互换性:可完全互换, 长期稳定性: < ±1%RH/年 DHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由 5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。DHT11 的数据格式为:8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和。其中校验和数据为前四个字节相加。传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。例如,某次从 DHT11 读到的数据如图所示: 协议栈DHT11测试

PC端微软蓝牙协议栈的安装

PC端微软蓝牙协议栈的安装 利用https://www.sodocs.net/doc/0510188832.html,2005平台和C# 语言编写蓝牙信息系统(包括蓝牙文件传输和蓝牙信息广播)需要微软蓝牙协议栈(MS Stack)的支持。下面就PC端如何安装微软蓝牙协议栈进行操作说明。 1、将USB的蓝牙适配器(BlueTooth Dongle)插入到USB接口中。Windows XP 等系统会提示发现新的硬件。点击取消按钮。如下图所示 2、右键点击桌面上我的电脑,选择属性,进入系统属性对话框,选择硬件,点击设备管理器,将会出现下图所示:

选择详细项,从下拉框中选择Hardware Ids,如下图所示:

4、找到C:\Windows\inf\bth.inf目录下文件,打开bth.inf文件,找到如下所示行: ;------------- Device section - Start ----------------------- [ALPS.NT.5.1] ALPS Integrated Bluetooth Device= BthUsb, USB\Vid_044e&Pid_3005 Alps Bluetooth USB Adapter= BthUsb, USB\Vid_044e&Pid_3006 [Belkin.NT.5.1] Belkin Bluetooth Adapter= BthUsb, USB\Vid_050d&Pid_0081 Belkin Bluetooth Adapter= BthUsb, USB\Vid_050d&Pid_0084 5、在Belkin Bluetooth Adapter= BthUsb, USB\Vid_050d&Pid_0084后在增加一行如下面所示即可。 ;------------- Device section - Start ----------------------- [ALPS.NT.5.1] ALPS Integrated Bluetooth Device= BthUsb, USB\Vid_044e&Pid_3005 Alps Bluetooth USB Adapter= BthUsb, USB\Vid_044e&Pid_3006 [Belkin.NT.5.1] Belkin Bluetooth Adapter= BthUsb, USB\Vid_050d&Pid_0081 Belkin Bluetooth Adapter= BthUsb, USB\Vid_050d&Pid_0084 Belkin Bluetooth Adapter= BthUsb, USB\Vid_050d&Pid_0012 6、保存文件和关闭文件。 7、再在设备管理器中卸载未知的USB device(即刚才的蓝牙设备)。 8、从USB接口拔出USB蓝牙适配器,然后再将USB蓝牙适配器插入USB接口。 9、Windows XP 等系统会提示发现新的硬件,但这一次我们选择“No, not this time”,选择下一步按钮,如下图所示:

蓝牙音频传输协议

蓝牙音频传输协议 篇一:蓝牙通信协议 蓝牙通信协议(适合于蓝牙开发工程师) 蓝牙协议栈 ----蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作。互操作的远端设备需要使用相同的协议栈,不同的应用需要不同的协议栈。但是,所有的应用都要使用蓝牙技术规范中的数据链路层和物理层。 ----完整的蓝牙协议栈如图1所示,不是任何应用都必须使用全部协议,而是可以只使用其中的一列或多列。图1显示了所有协议之间的相互关系,但这种关系在某些应用中是有变化的。 ----完整的协议栈包括蓝牙专用协议(如连接管理协议LMP和逻辑链路控制应用协议L2CAP)以及非专用协议(如对象交换协议OBEX和用户数据报协议UDP)。设计协议和协议栈的主要原则是尽可能利用现有的各种高层协议,保证现有协议与蓝牙技术的融合以及各种应用之间的互操作,充分利用兼容蓝牙技术规范的软硬件系统。蓝牙技术规范的开放性保证了设备制造商可以自由地选用其专用协议或习惯 1 使用的公共协议,在蓝牙技术规范基础上开发新的应用。 蓝牙协议体系中的协议 ----蓝牙协议体系中的协议按SIG的关注程度分为四层: 核心协议:BaseBand、LMP、L2CAP、SDP; 电缆替代协议:RFCOMM; 电话传送控制协议:TCS-Binary、AT命令集; 选用协议:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、WAE。

----除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制 器、连接管理器、硬件状态和控制寄存器提供命令接口。在图1中,HCI位于 L2CAP的下层,但HCI也可位于L2CAP上层。 ----蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。 ----1(蓝牙核心协议 -?基带协议 ----基带和链路控制层确保微微网内各蓝牙设备单元之间由射频构成的物理连接。蓝牙的射频系统是一个跳频系统,其任一分组在指定时隙、指定频率上发送。 2 它使用查询和分页进程同步不同设备间的发送频率和时钟,为基带数据分组提供了两种物理连接方式,即面向连接(SCO)和无连接(ACL),而且,在同一射频上可实现多路数据传送。ACL适用于数据分组,SCO适用于话音以及话音与数据的组合,所有的话音和数据分组都附有不同级别的前向纠错(FEC)或循环冗余校验(CRC),而且可进行加密。此外,对于不同数据类型(包括连接管理信息和控制信息)都分配一个特殊通道。 ----可使用各种用户模式在蓝牙设备间传送话音,面向连接的话音分组只需经过基带传输,而不到达L2CAP。话音模式在蓝牙系统内相对简单,只需开通话音连接就可传送话音。 ---?连接管理协议(LMP) ----该协议负责各蓝牙设备间连接的建立。它通过连接的发起、交换、核实,进行身份认证和加密,通过协商确定基带数据分组大小。它还控制无线设备的电源模式和工作周期,以及微微网内设备单元的连接状态。

蓝牙4.0协议栈按键流程分析

在介绍蓝牙按键流程分析之前,我们需要了解一个概念,那就是就是OSAL。什么是OSAL呢? 可能大伙对于OS是比较了解的,学了计算机的搞过OS的也基本接触过,简单来说就是一个操作系统抽象层,可以理解为运行在CC2540 上的操作系统,说操作系统还不能算,TI的OSAL只实现了任务切换和消息机制。并且把协议栈的代码、硬件处理的代码,用户程序的代码等分别放到了OSAL 层的不同任务处理函数中去了,各任务函数之间通过消息机制、同一个任务之间通过事件的的方式来通信。 什么是EVENT 事件? OSAL 为每个任务函数分配了一个16 位的事件变量,每一位代表一个事件,最高位为0x8000 表示为系统事件SYS_EVENT_MSG。其余的15 位留给用户自定义需要的事件。通常事件由定时 器启动,比如一秒后我要点亮LED2,这就需要发送一个点亮LED2 的事件,然后等待定时器1s后溢出,于是启动点亮LED2事件,事件会调用相应的hal 层API点亮LED2。 什么是MSG 消息 MSG 是比EVENT 事件更具体并且可以携带数据的一种通信方式,MSG 的标记是按数值,而不是按位。比如0x01 和0x02 是两个不同的消息,但对于事件0x03 则是0x01 事件和0x02 事件的组合。MSG 收发使用osal_msg_send()和osal_msg_receive();当调用osal_msg_send()发送一个msg 的同时会在EVENT 列表中触发一个message ready event。(请注意最后一句话,这句话点出了为什么按键时间的触发为何会导致系统事件也接受到了) 现在以SimpleBLEPeripheral 为例说明按键流程 在SimpleBLEPeripheral 任务初始化函数中有这样一条代码: // Register for all key events - This app will handle all key events RegisterForKeys( simpleBLEPeripheral_TaskID ); 这个函数来自OnBoard.c 源文件中 /********************************************************************* * Keyboard Register function * * The keyboard handler is setup to send all keyboard changes to * one task (if a task is registered). * * If a task registers, it will get all the keys. You can change this * to register for individual keys. *********************************************************************/ uint8 RegisterForKeys( uint8 task_id ) { // Allow only the first task if ( registeredKeysTaskID == NO_TASK_ID ) {

智能手环开发方案--蓝牙通讯协议

智能手环开发方案--蓝牙通讯协议 深圳智能手环方案公司《酷点网络》定制手环方案,本文档针对手环显示,控制的需求说明。 1.1 编写目的 本协议针对智能手环显示,控制的需求说明,供开发人员,测试人员,美工参考。 1.3 项目术语 数据库字段全为小写 1.4 参考资料 1.4.1 手机端app和手环蓝牙模块通讯协议采用10Byte数据传输,1Byte校验码,1Byte 1.4.1 数据校验方式:Byte10=(Byte1+Byte2+Byte3+Byte4+Byte5+Byte6+Byte7+Byte8+Byte9)&0xFF 2 系统需求 2.1任务概述 1,睡眠追踪记录 2,运动步数追踪记录 3,手机来电提示。 4,手机短信提示。 5,定时定点提醒 6,手机APP设置手环时间。 2.2 功能描述 2.2.1 睡眠追踪记录 1,手环蓝牙模块1分钟检测到Sensor数据变化在某一区间(代表不运动)时开始进行记录时间A,直到Sensor数据开始变化(1分钟内都在大范围变化)时结束,时间为B。 B-A 的时间间隔就为此次睡眠时间。此时将数据上报给手机端App。

3,读取历史睡眠记录数 4,接受历史睡眠记录数 2.2.2,运动步数追踪记录 1,计步模式两种 1,按目标计步 2,随意走动即计步统计 2,数据保存 1,如果到23:59分目标还未完成,保存目标记步,且自动切换到随意模式。 2.2.4 定时提醒 手机到手环蓝牙芯片 1秒震动

2.2.5 手机设置手环时间,日期,星期设置 1,日期年月日 4Byte,数据位的前4个Byte表示,高位为年低位为日。 eg: 2014 - 10 -31 数据位表示为:0x 14 0E 0A 1F 20: 0x14 14: 0x0E 10: 0x0A 31: 0x1F 2,时间2Byte ,数据为的后2个Byte表示高位为小时,低位为分钟,eg:15:56 数据表示为:0x 0F 38 3, 秒 1 Byte eg: 30 秒数据表示为 0x 1E 5,星期几 1Byte eg: 星期1 ,0x 01 范围:0x 01 到 0x07 2.2.6,设置闹钟时间。

原理解析之蓝牙协议栈和语音网关3

◆蓝牙耳机的工作原理 下面重点讲述下蓝牙耳机的工作原理: 关于音频流的蓝牙传输可以通过两个方式: 1) 通过PCM接口来传送 2)通过模拟UART来传送 下面分别来讲述: 1)通过PCM接口来传送 通过音频播放器(eg: Media Player)来打开音频文件,调用Audio驱动,音频文件通过解码后,由PCM输出到Host端蓝牙模块的PCM输入端,接着,经过蓝牙模块的处理后,由RF 无线模块发送给Client 端蓝牙设备. Client 端蓝牙设备经由无线接收模块后,滤波,稳压,经微处理芯片处理后,直接由Speaker播放. 2)通过模拟UART来传送 通过设置注册表【HKEY_LOCAL_MACHINE\Services\BTAGSVC】 IsEnabled =1 使得系统引导时自动加载语音网关(AG)服务. 首先,通过手动配置建立Host端蓝牙设备与Client端蓝牙设备ACL链接(面向无连接的异步链路),接着在Applicaiton或Audio Driver中调用 IOCTL_AG_OPEN_AUDIO,重新建立Host端蓝牙设备与Client端蓝牙设备SCO链接(面向连接的同步链路),接着AG自动发送waveOutMessage((HWAVEOUT)i, WODM_BT_SCO_AUDIO_CONTROL, 0, TRUE); 从而建立了Audio至蓝牙芯片之间的通道,也即,实现了音频流到蓝牙模块的传送. 然后,经由主机端蓝牙模块将音频流打包经由RF模块发送出去. 客户端蓝牙耳机接收到无线音频包后,滤波,稳压,经微处理芯片处理后,由PCM传送给音频编解码器芯片,最后,由Speaker播放. 下面这段段码是建立Host端蓝牙设备与Client端蓝牙设备SCO链路 1.HANDLE h = CreateFile(L"BAG0:",0,0,NULL,OPEN_EXISTING,0,NULL); 2.if (INVALID_HANDLE_VALUE == h) { 3. wprintf(L"Error calling CreateFile on Audio Gateway.\r\n"); 4.return 0; 5. } 6.

百度智能手环蓝牙私有通信协议

智能手环蓝牙私有通信协议文档 百度在线网络技术(北京)有限公司 (版权所有,翻版必究)

目录 前言 (5) 1名词解释与约定 (6) 1.1名词解释 (6) 1.1.1设备 (6) 1.1.2手机 (6) 1.2约定 (6) 1.2.1协议栈字节序 (6) 1.2.2 L2 层V-length注意项 (6) 2协议结构介绍 (6) 2.1协议栈结构图 (6) 2.2 L0(UART Profile) (7) 2.2.1模块图 (7) 2.2.2协议层功能描述 (7) 2.3 L1(Transport layer) (8) 2.3.1协议层功能描述 (8) 2.3.2协议层数据包结构 (8) 2.3.3 L1版本号 (9) 2.4 L2(Application layer) (9) 2.4.1协议层数据包结构 (9) 3 L2 command详解 (9) 3.1 Command 列表 (9) 3.2固件升级命令(command id 0x01) (10) 3.2.1 L2 版本号 (10) 3.2.2固件升级命令key列表 (10) 3.2.3进入固件升级模式请求key (10) 3.2.4进入固件升级模式返回key (10) 3.3设置命令(command id 0x02) (11) 3.3.1 L2 版本号 (11) 3.3.2设置命令key列表 (11) 3.3.3时间设置key (11) 3.3.4闹钟设置key (12) 3.3.5获取设备闹钟列表请求key (12) 3.3.6获取设备闹钟列表返回key (12) 3.3.7用户profile设置key (13) 3.3.8防丢设置key (13) 3.3.9计步目标设定 (13) 3.3.10久坐提醒设置key (14) 3.3.11左右手key (14) 3.3.12 手机操作系统设置 (14) 3.3.13 来电通知电话列表设置 (15) 3.3.14 来电通知开关 (15) 3.4绑定命令(command id 0x03) (15)

蓝牙4.0BLE学习之协议栈

在线学习好工作https://www.sodocs.net/doc/0510188832.html,/ 蓝牙4.0BLE学习之协议栈 蓝牙4.0BLE协议栈介绍 问题:什么是BLE协议栈?BLE协议栈与BLE协议的关系? 顾名思义,人类之间需要一种语言才能沟通,机器之间,电子之间也有一个标准,也就是作为通讯标准,也就是通讯协议。 协议:定义了一系列通讯标准,通讯双方都按照这一标准,进行数据通讯。 协议栈:协议的具体实现形式,实现的函数库,固件库。 把个个协议集合到了一起,以函数库的形式实现,并用这些给用户提供一些应用层的API接口,用户可以进行一些调度。 问题:如何使用BLE协议栈进行开发? 三个步骤: 1.不需要具体了解BLE协议栈的具体复杂的过程,只需要知道它的数据从哪里来,需要到哪里去就行了。 2.根据BLE协议栈调用它里面的函数,实现自己的一些功能。 3.可以自己编写一些函数,实现自己需要特定的功能。 协议结构图

第一层:physicallayer(物理层) 信道带宽提供2M,提供三个广播信道1M。 第二层:link layer(链路层) 执行一些基带协议,底层的数据包管理协议。 第三层:host controller interface (主机控制接口层) 提供主机与控制层的通讯方式,以及命令格式,重用蓝牙标准,比如一些串口,USB等等。 第四层:L2CAP(逻辑链路于适配器协议层) 为它上层提供数据业务,提供端到端的逻辑数据通信。 第五层:security manager(SM)安全管理层 层与层之间会有通信,它是建立数据交换安全方面的数据知识。 第六层:attribute protocol(ATT)通用接入层 定义了一些通用接口,供应用层和底层之间的调用,比如你要调底层的硬件模块的东西,就需要这个层的底层的驱动模块去实现它的一些功能,所以它会同时封装一些API的函数设置。

nRF51822芯片上的BLE蓝牙协议栈

nRF51822芯片上的BLE蓝牙协议栈 本文介绍了在nRF51822芯片上使用S110 SoftDevice协议栈构建一个最小的BLE应用的过程。 1初始化介绍 有一些初始化函数通常在执行一个BLE应用之前调用,下面的表格中列出了这些初始化调用函数,在后面将对它们进行详细的介绍。 大部分采用数据结构的形式作为输入参数,这些数据结构包含一系列的配置和选项信息,阅读代码中的注释能更好地理解它们。 在广播开始之后,你就进入了main函数中的for循环。 2 协议栈S110 SoftDevice 为了使用独特的射频特性,你必须使能S110 SoftDevice协议栈。见《S110 nRF51822 SoftDevice Specification》(S110 nRF51822 SoftDevice协议栈说明书)中对硬件资源的详细需求。 3 广播 用于广播的数据结构如下: ble_gap.h 中ble_gap_conn_sec_mode_t ble_advdata.h 中ble_advdata_t

注意:传递给sd_ble_gap_device_name_set()的安全模式仅适于设备本身的名字。 广播参数(ble_gap_adv_params_t)必须通过sd_ble_gap_adv_start()来传递: 4 连接参数 SDK提供了一个名为ble_conn_params的模块用于管理连接参数更新,它通过SoftDevice API进行处理,包括请求的时间和第一次请求被拒绝再发送一个新的请求。 在初始化结构体ble_conn_params_init_t中,定义了更新过程的有关参数,例如,是否开始连接,什么开始写入一个特定的CCCD,是否使用连接参数,发送更新请求的延时等等。 在初始化函数ble_conn_params_init()中,使用封装了初始化连接参数(ble_gap_conn_params_t)的结构体ble_conn_params_init_t作为输入参数进行连接参数初始化。 ble_conn_params SDK模块确保与主机(集中器)的连接参数相适应,如果不适应,外围设备将要求更改连接参数,超过设定的更新次数都没有更新成功后,它就会断开连接或者根据设置返回一个事件到应用层。 5 服务 服务可以通过sd_ble_gatts_service_add()进行添加,最好不要在应用层代码中建立服务,而是在一个单独的文件中建立服务。一个服务不是主服务就是次服务,但是在通常实际的应用中大部分使用主服务。变量service_uuid就是你想用于服务的UUID。变量service_handle是一个输出变量,当创建一个服务的时候将会返回一个唯一的句柄值,这个句柄可以在以后用于识别不同的服务。 6 特性 特性可以通过sd_ble_gatts_characteristic_add()函数进行添加,它有4个参数。为了代码清晰,这个函数应该只能出现在服务文件中,而不能出现在应用层中。 第1个参数是特性要加入的服务的句柄,第2个参数是特性的结构体,它是一个全局变量,它包含了特性可能用到的性质(读,写,通知等)。第3个参数是值属性的描述,它包含了它的UUID,长度和初始值。第4个参数是返回的特性和描述符的唯一句柄,这个句柄可以在以后用于识别不同的特性。例如,在写事件中用于识别哪一个特性被写入。

蓝牙协议栈的原理和结构

蓝牙协议栈的原理和结构 蓝牙,这个已经不是什么新鲜的技术了,相信大多数人都是了解的。那么对于这方面,我们可以在嵌入式操作中进行一下实现。在蓝牙系统中,为了支持不同应用,需要使用多个协议,这些协议按层次组合在一起,构成了蓝牙协议栈。蓝牙协议栈是蓝牙技术的核心组成部分,它能使设备之间互相定位并建立连接,通过这个连接,设备间能通过各种各样的应用程序进行交互和数据交换。 1、蓝牙协议栈体系结构 蓝牙协议栈体系结构为分层结构,具体如图所示 蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作。互操作的远端设备需要使用相同的协议栈,不同的应用需要不同的协议栈。并不是任何应用都必须使用全部协议,而是可以只使用其中的一层或多层。但是,所有的应用都要使用蓝牙技术规范中的数据链路层和物理层。

设计蓝牙协议栈的主要原则是尽可能地利用现有的各种高层协议,保证现有协议与蓝牙技术的融合以及各种应用之间的互通性以及充分利用兼容蓝牙技术规范的软硬件系统。蓝牙技术规范的的开放性保证了设备制造商可自由地选用其专利协议或常用的公共协议,在蓝牙技术规范基础上开发新的应用。蓝牙技术规范包括Core和Profiles两大部分。Core是蓝牙的核心,主要定义蓝牙的技术细节;Profiles部分定义了在蓝牙的各种应用中的协议栈组成,并定义了相应的实现协议栈。 按照各层协议在整个蓝牙协议体系中所处的位置,蓝牙协议可分为底层协议、中间层协议和高层协议三大类。 2、蓝牙底层协议 蓝牙底层协议实现蓝牙信息数据流的传输链路,是蓝牙协议体系的基础,它包括射频协议、基带协议和链路管理协议。 (1)射频协议(Radio Frequency Protoc01) 蓝牙射频协议处于蓝牙协议栈的最底层,主要包括频段与信道安排、发射机特性和接收机特性等,用于规范物理层无线传输技术,实现空中数据的收发。蓝牙工作在2.4GHz ISM 频段,此频段在大多数国家无须申须运营许可,使得蓝牙设备可工作于任何不同的地区。 信道安排上,系统采用跳频扩频技术,抗干扰能力强、保密性好。蓝牙SIG制定了两套跳频方案,其一是分配79个跳频信道,每个频道的带宽为1MHz,其二是23信道的分配方案,1.2版本以后的蓝牙规范目前已经不再推荐使用第二套方案。 (2)基带协议,S((Base Band Protoc01) 基带层在蓝牙协议栈中位于蓝牙射频层之上,同射频层一起构成了蓝牙的物理层。 基带层的主要功能包括:链路控制,比如承载链路连接和功率控制这类链路级路由;管理物理链路,SCO链路和ACL链路;定义基带分组格式和分组类型,其中SCO分组有HVl、HV2、HV3和DV等类型,而ACL分组有DMl、DHl、DM3、DH3、DM5、DH5、AUXl 等类型;流量控制,通过STOP和GO指令来实现;采用13比例前向纠错码、23比例前向纠错码以及数据的自动重复请求ARQ(Automatic Repeat Request)方案实现纠错功能;另外还有处理数据包、寻呼、查询接入和查询蓝牙设备等功能。

低功耗蓝牙协议栈全面解答

低功耗蓝牙协议栈全面解答 协议栈框架 一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝牙协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提。在深入BLE协议栈各个组成部分之前,蓝牙模块厂家-云里物里科技带大家先看一下BLE协议栈整体架构。 如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后还需要提供一个与此芯片配套的BLE协议栈,最后在协议栈上开发自己的应用。可以看出BLE协议栈是连接芯片和应用的桥梁,是实现整个BLE应用的关键。那BLE协议栈具体包含哪些功能呢?简单来说,BLE协议栈主要用来对你的应用数据进行层层封包,以生成一个满足BLE协议的空中数据包,也就是说,把应用数据包裹在一系列的帧头(header)和帧尾(tail)中。具体来说,BLE协议栈主要由如下几部分组成:

PHY层(Physical layer物理层)。PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。PHY层做得好不好,直接决定整个BLE芯片的功耗,灵敏度以及selectivity等射频指标。 LL层(Link Layer链路层)。LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。像Nordic的BLE协议栈能同时支持20个link(连接),就是LL层的功劳。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL 层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP 或者ATT。 HCI(Host controller interface)。HCI是可选的(具体请参考文章:三种蓝牙架构实现方案(蓝牙协议栈方案),HCI主要用于2颗芯片实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。 GAP层(Generic access profile)。GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。 L2CAP层(Logic link control and adaptation protocol)。L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。 SMP(Secure manager protocol)。SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。 ATT(Attribute protocol)。简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。Attribute 除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT 层。 GATT(Generic attribute profile)。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE 协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。

A2DP协议 中文图文解析

随着蓝牙技术在电子产品中的日益普及,蓝牙音频设备也层出不穷,其中具有免提功能的蓝牙耳机和蓝牙音频网关的应用是最典型的例子。但免提单元与音频网关进行音频传输建立起来的SCO连接,仅能支持64Kb/s电信级语音质量的音频流,这也就限制了蓝牙音频质 量的提高,同时也影响了蓝牙的娱乐消费市场。为了满足人们对高质量音频的需求,进一步扩大蓝牙产品市场,蓝牙特殊兴趣小组SIG组织,在蓝牙 1.1规范的应用框架基础上又单独提出了高级音频分发框架(Advanced Audio Distribution Profile,A2DP)。该框架利 用了在L2CAP层建立起来的ACL异步无连接链路来传输高质量的单声道或者立体声音频数据,有效负载的传输速率可以达到300~400Kb/s。 A2DP框架概述 在娱乐消费市场中,A2DP实例化应用就是用音乐播放器把音频数据 通过ACL连接发送到耳机或者音箱上。目前的框架规范中,并不支持同步的一点对多点的广播式音频分发,而对于点对点音频的分发,又存在着两种不同的角色,一个是信源设备(SRC),这种设备作为发 起者将数字音频流发送到Piconet网中;另一个是信宿设备,是接收信源发出的音频流的设备。如果蓝牙音乐播放器是信源设备,那么与之交互的蓝牙耳机就是信宿设备,信源和信宿的区别就在于,它是发起者还是接收者。下面对该框架所涉及的具体协议和其依赖框架进行分析。 1 A2DP应用框架

在典型的蓝牙音频相关框架的整体结构中,A2DP框架所处的位置如图1所示。 服务发现应用框架(SDAP)所提供的功能,是向其他蓝牙设备提供自身所具备的服务,并且能够使用远程设备所提供的服务和功能。在实际应用中,几乎所有框架都支持服务发现协议(SDP)。蓝牙音频视频遥控应用框架(AVRCP)实现了蓝牙设备之间的遥控功能,例如,音乐播放器的前进、后退、停止、播放等控制信令的传输。免提功能头戴式设备应用框架(HFP/HSP),最主要的应用就是实现了蓝牙耳机的免提功能和某些蓝牙设备的音频网关功能。 高级音频分发框架(A2DP)依赖于通用音频视频分发框架(GAVDP),GAVDP定义了设置音频和视频流传输的步骤,而A2DP则进一步定义了音频流传输的参数和步骤细节。 在实际应用中,逻辑链路控制适配层协议(L2CAP)要求比较高的可靠性,基带的广播数据分组将被禁止使用,因此,L2CAP层并不支持可靠的多点传输信道,这也就是A2DP框架不支持多点广播式音频分发的主要原因之一。而对于面向高层协议的开发和应用者,L2CAP层协议是透明的,因此这里对A2DP轻型框架具体实现的相关描述,也仅限于L2CAP层以上,A2DP相关的协议及框架如AVDTP、GAVDP等协议模块的设计。

蓝牙通信协议

蓝牙通信协议(适合于蓝牙开发工程师) 蓝牙协议栈 ----蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作。互操作的远端设备需要使用相同的协议栈,不同的应用需要不同的协议栈。但是,所有的应用都要使用蓝牙技术规范中的数据链路层和物理层。 ----完整的蓝牙协议栈如图1所示,不是任何应用都必须使用全部协议,而是可以只使用其中的一列或多列。图1显示了所有协议之间的相互关系,但这种关系在某些应用中是有变化的。 ----完整的协议栈包括蓝牙专用协议(如连接管理协议LMP和逻辑链路控制应用协议L2CAP)以及非专用协议(如对象交换协议OBEX和用户数据报协议UDP)。设计协议和协议栈的主要原则是尽可能利用现有的各种高层协议,保证现有协议与蓝牙技术的融合以及各种应用之间的互操作,充分利用兼容蓝牙技术规范的软硬件系统。蓝牙技术规范的开放性保证了设备制造商可以自由地选用其专用协议或习惯使用的公共协议,在蓝牙技术规范基础上开发新的应用。 蓝牙协议体系中的协议 ----蓝牙协议体系中的协议按SIG的关注程度分为四层: 核心协议:BaseBand、LMP、L2CAP、SDP; 电缆替代协议:RFCOMM; 电话传送控制协议:TCS-Binary、AT命令集; 选用协议:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、WAE。 ----除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口。在图1中,HCI位于L2CAP 的下层,但HCI也可位于L2CAP上层。 ----蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。 ----1.蓝牙核心协议 -·基带协议 ----基带和链路控制层确保微微网内各蓝牙设备单元之间由射频构成的物理连接。蓝牙的射频系统是一个跳频系统,其任一分组在指定时隙、指定频率上发送。

蓝牙协议栈移植

蓝牙协议栈移植 目录 第一步:下载文件 (1) 第二步:配置内核支持Bluetooth (2) 第三步:交叉编译蓝牙协议栈库文件 (3) 第四步:移植到arm板 (4) 硬件平台:S3C6410开发板 Linux内核:linux-3.0.1 作者:孙怀亚 说明:这是一个6410+usb蓝牙移植过程! 在做下面的过程中,我认为你是有个有点嵌入式开发经验的人,并且交叉编译器已经安装完毕,内核源码已经可以编译通过运行等!特别要强调,usb总线驱动一定要是好的。 如有需要请联系:sunhuaiya@https://www.sodocs.net/doc/0510188832.html, 第一步:下载文件 bluez-lib-3.36.tar.gz expat-2.0.1.tar.gz dbus-1.2.16.tar.gz glib-2.22.4.tar.bz2 libusb-0.1.12.tar.gz bluez-utils-3.36.tar.gz(哥花钱下载的!肯爹的官网没下载下来!)

第二步:配置内核支持Bluetooth make menuconfig [*] Networking support ---> <*> Bluetooth subsystem support ---> //蓝牙子系统必须选择 <*> L2CAP protocol suppor //逻辑链路控制和适配协议。 <*> SCO links support //蓝牙语音和耳机支持 <*> RFCOMM protocol suppor //面向流的传输协议,支持拨号网络等[*] RFCOMM TTY support // <*> BNEP protocol support //蓝牙网络封装协议,自组网支持 [*] Multicast filter support //蓝牙多播,支持支持BNEP [*] Protocol filter support //蓝牙多播,支持支持支持BNEP <*> HIDP protocol support //基本支持协议 Bluetooth device drivers ---> <*> HCI USB driver //USB蓝牙模块支持 <*>HCI UART driver //基于串口,CF卡或PCMCIA的蓝牙 <*> HCI BlueFRITZ! USB driver <*> HCI VHCI (Virtual HCI device) driver

相关主题