Bluetooth的一个很重要特性,就是所有的Bluetooth产品都无须实现全部的Bluetooth规范。为了更容易的保持Bluetooth设备之间的兼容,Bluetooth规范中定义了Profile。Profile定义了设备如何实现一种连接或者应用,你可以把Profile理解为连接层或者应用层协议。
(1)蓝牙主机控制器模块Bluetooth Host Controller作为蓝牙的底层,是典型的硬件实现,应用程序(或在蓝牙上添加的服务)不能直接控制。蓝牙的HCI有UART和USB两种,因为前者简洁效率高,所以以前者居多。框图如下:
(2)蓝牙主机模块允许应用程序通过蓝牙连接发送/接受数据,或者配置连接参数:
· RFCOMM允许应用程序将蓝牙连接模拟为串口进行操作。这样可以支持传统的协议。
· 逻辑连接控制和适配协议The Logical Link Control And Adaptation Protocol (L2CAP) 它用来控制多用户的连接,处理报文的分割和组合。这是应用程序的常用选择。
· 服务发现协议The Service Discovery Protocol (SDP)用来定位和描述蓝牙设备提供或者可用的服务。应用程序主要在设置和另外的蓝牙设备通信时使用它。
· 主机控制接口The Host Controller Interface (HCI)驱动包装了和硬件通信的高层模块。
(3)关于蓝牙profile:比如,如果一家公司希望它们的Bluetooth芯片支援所有的Bluetooth耳机,那么它只要支持HeadSet Profile即可,而无须考虑该芯片与其它Bluetooth设备的通讯与兼容性问题。如果你想购买Bluetooth产品,你应该了解你的应用需要哪些Profile来完成,并且确保你购买的Bluetooth产品支持这些Profile。
在所有的Profile中,有四种是基本的Profile,这些Profile会被其它的Profile使用。它们是:
GAP Profile: Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。
SDAP Profile: Service Discovery Application Profile,通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以及查询相关的信息。
SPP Profile: Serial Port Profile,模拟串口通讯。
GOEP Profile: Generic Object Exchange Profile,通用对象交换。这个Profile的名字有些费解,它定义的是数据的传输,包括同步,文件传输,或者推送其它的数据。你可以把它理解为内容无关的传输层协议,可以被任何应用用来传输自己定义的数据对象。
另外,Bluetooth还定义了9种应用(usage)Profile。
CTP Profile: Cordless Telephone Profile,无绳电话。
IP Profile: Intercom Profile,这是在两个设备之间建立语音连接,换句话说,把两个昂贵的兰牙设备变成廉价的对讲机。
HS Profile: HeadSet Profile,用于连接耳机。
DNP Profile: Dial-up Networking Profile,用于为PC提供拨号网络功能。
FP Profile: Fax Profile,传真功能。
LAP Profile: LAN Access Profile,使用PPP协议建立局域网。
OPP Profile: Object Push Profile,用于设备之间传输数据对象。
FTP Profile: File Transfer Profile,用于文件传输。
SP Profile: Synchronization Profile,用于不同的Bluetooth设备同步,保持数据的一致性。
A2DP: 全名是Advanced Audio Distribution Profile 蓝牙音频传输模型协定! A2DP是能够采用耳机内的芯片来堆栈数据,达到声音的高清晰度。有A2DP的耳机就是蓝牙立体声耳机。
(4)对于蓝牙测试的APK,一版需至少完成一下三个功能 :
A,双向搜索连接;
B,蓝牙通话、音乐;
C,双向传输文件;
===================================================================================================
转:http://www.amobbs.com/thread-5581223-1-1.html
在蓝牙中,常使用HFP/HSP/A2DP这几个协议连接蓝牙耳机,进行通话听音乐等操作,那它们之间有什么关系和区别呢?Android蓝牙菜单中对耳机设备的描述会分为手机音频和媒体音频,他们的含义、对应的蓝牙协议又是哪些呢?
(1)HFP(Hands-free Profile)和HSP(Headset Profile)都是为了实现蓝牙通话而制定,所实现的功能都和蓝牙通话相关。基本所有的蓝牙耳机、车载蓝牙都会支持这两个协议。
HSP仅实现了最基本的通话操作:接听电话、挂断电话、调节音量、声音在手机/蓝牙耳机之间切换。
HFP在功能上是对HSP的扩展,除了上述功能以外,还包括控制三方通话、来电拒接、耳机端来电显示等高级功能,不过实现的方式,如用于控制的AT CMD完全不一样。
在Android设计上并没有将上述两个协议分开显示,而是均表述为“手机音频”,在使用的时候优先连接HFP,只有在对方仅支持HSP或HFP连接失败的时候才会尝试HSP。
(2)而A2DP(Advanced Audio Distribution Profile)仅用于立体声音乐传输,如在音乐播放器中播放mp3时就会走A2DP。一般双耳的蓝牙耳机、车载蓝牙都支持A2DP,少数单耳的耳机也有可能会实现A2DP。和HSP/HFP相比,A2DP传输速度快、音质好,但实时性会略差(理论上,实际上用户也感觉不出来)。在Android中表述为“媒体音频”
===================================================================================================
关于TI的CC2540/2541的基础学习点
(1)整体
1,TI的蓝牙平台支持2种协议栈/应用配置:单一设备配置、网络处理器配置
2,协议栈最顶层2个通用profile:GAP 通用访问配置文件层 Generic Access Profile;GATT 通用属性配置文件层 Generic Attribute Profile
3,GAP:处理设备的接入方式及接入过程:①设备发现 ②链路建立 ③链路终止 ④启动安全功能 ⑤设备配置(主要是连接参数配置)。GATT:完成服务器与客户端之间通信的相关子过程
4,BLE支持40个信道的跳频机制,其中3个通道用于Advertise,剩下的用于数据通信。BLE目前一个数据包支持的最大字节数为20Byte,基本上都是几个字节的应用
5,LL层任务函数优先级 最高, 而应用程序函数的优先级最低
6,OSAL为每个任务分配了1个16位的Event,每一位代表一个事件,最高位代表SYS_EVENT_MSG,这个事件被OSAL系统保留
7,任务间通信,一般通过事件和消息进行,每当任务间有消息传递,都会触发SYS_EVENT_MSG事件,并且每次处理完事件后,都要清空标志位。
osal_set_event() OSAL.h中 该函数会直接调度一个事件
osal_start_timerEx() OSAL_Timers.h中 需要延时触发的事件,调用这个函数
8,Heap Manager(堆栈管理),函数osal_mem_alloc,给函数分配需要的字节数,osal_mem_free()用来释放内存。
(2)OSAL( 操作系统抽象层 Operate System Abstraction Layer )
1,GAP (通用访问配置文件层 Generic Access Profile ),连接过程:①设备发现 ②链路建立 ③链路终止 ④启动安全功能 ⑤设备配置(主要是连接参数配置)。GAP层总是工作在以下角色中的1种:
Broadcaster 广播员,表明我在,但是你们只能看到我,不可以连接我
Observer 观察者,看看谁在,我只观察,不连接
Peripheral 外设,我存在,谁想连我,我就连谁
Centeral 中心,看看谁在,工作在单层或多层的连接
2,连接过程: Peripheral向外广播->Centeral接收到向从机发送“Scan”命令->Peripheral以“ScanResp”命令回应->Centeral发送连接请求
3,Connect Interval:通信间隙,每个间隔1.25ms为基本单位,最小6单位7.5mS,最大3200单位4.0S。
4,Slave Latency:从机延时 表示Peripheral可以连续忽略的连接数,最大不能超过499个,最长不能超过32S。
5,Supervision Timeout 监管超时 2个成功连接事件之间的最大间隔。
6,Profile 一种规范 ; Service 一个服务 ; Characteristic 特征值 ; UUID 统一标识码(Service,Characteristic都需要),Centeral与Peripheral间的通信,均通过Characteristic实现
7,发送数据:主->从 Client调用GATT_WriteCharValue()函数发送(同事说可以双向);从->主 Service调用GATT_Notification()函数实现。
8,接收数据:从<-主 从机接收后,会产生1个GATT_Profile_Callback调用;
(3)低功耗部分
1,如何总是在PM1,osal_pwrmgr_device( PWRMGR_ALWAYS_ON );
2,如何进入PM2,osal_pwrmgr_device( PWRMGR_BATTERY );在空闲的时候就会进入到PM2模式
3,如何进入PM3,存在连接就断开连接,存在广播就停掉广播,并确认自己创建的所有定时任务都已关闭,则系统应该就会进入PM3模式,只能进行外部中断唤醒(如何进入PM3?)。
(4)常用的命令,功能,以及实现方法
1,切换电源模式:osal_pwrmgr_device( PWRMGR_ALWAYS_ON );osal_pwrmgr_device( PWRMGR_BATTERY );
2,Peripheral怎么主动断开与Centeral的连接: bStatus_t GAPRole_TerminateConnection();
3,怎么设置Peripheral的广播的超时时间:首先保证是限制类型的广播 即DEVDISC_MODE_LIMIT(永久广播是 DEVDISC_MODE_GENERAL ),在 simpleBLEPeripheral.c文件 static uint8 advertData[]数组中设置。当模式处于Limit模式时,广播超时的设置可通过设置宏 TGAP_LIM_ADV_TIME_OUT,不设置的话,默认超时时间是180S。
4,如何打开与关闭广播:uint8 initial_advertising_enable = TRUE/FALSE TRUE:打开广播 FALSE:关闭广播。GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof(uint8), &initial_advertising_enable );
5,设置发射功率的API: HCI_EXT_SetTxPowerCmd( HCI_EXT_TX_POWER_0_DBM );
设置接收灵敏度API: HCI_EXT_SetRxGainCmd(HCI_EXT_RX_GAIN_HIGH );
参考文章:http://blog.csdn.net/btooth/archive/2006/07/15/924542.aspx