[蓝牙]苹果设备蓝牙接入设计指南 - xp19870106

来源:互联网 发布:免费高级画图软件 编辑:程序博客网 时间:2024/04/29 02:55

本文介绍了针对硬件通过蓝牙传输来与苹果产品包括Mac,iPhone和iPod touch等交互的设计指南。为了能够与苹果产品兼容,现在和未来的设计当中,蓝牙计入都应该遵循本文中的规范。本文主要分为两个部分:通用需求描述了使用蓝牙接入的硬件设备设计应该遵循的通用蓝牙标准;苹果协议和开发者支持描述了苹果用来扩展标准蓝牙文件从而提升接入能力的协议。

通用需求

遵循蓝牙协议

任何能够与苹果产品兼容的蓝牙接入都必须支持Bluetooth Core Specification Version 2.1 +EDR或者更高的版本。该说明中包含了重要的安全特性Secure Simple Pairing和Extended Inquiry Response。

加强数据率

Enhanced Data Rate (EDR)特性在蓝牙2.0标准中被引入,用来提升蓝牙接入的通信效率。为了提供向后兼容性,蓝牙SIG将EDR设为可选特性。苹果强烈推荐尽可能使用EDR,原因如下:它提供了与Basic Data Rate (BDR)更高的数据速率;传输效率更高,单位时间内传送更多的字节;每个比特传输所消耗的电量更少;使用共享天线与WiFi更好的兼容,因为他能够为WiFi释放更多的使用事件;在多点配置的情况下能够提升性能。

低功耗的发现模式

低功耗是移动设备一个重要的方面,因此每个与苹果产品兼容的蓝牙接入都必须:支持并且请求蓝牙发现模式;能够接收发现模式的请求,支持蓝牙参数中所有有效的参数。不能够与苹果产品兼容的蓝牙接入也应该尽可能使用发现模式,尤其是当仅有少量数据或者没有数据被通过蓝牙连接传输的时候。除了低功耗的特点,发现模式还能够更好地与WiFi共享天线。

发现模式的参数是针对使用模型和蓝牙配置的,苹果产品期望蓝牙接入通过请求发现模式并配以合适的参数来完成使用。如果接入不能发送这样的请求,苹果产品可能会发送一个发现模式请求。当苹果产品发送了发现模式请求的时候,远程设备应该无条件接收该请求及其参数。如果他设置了发现模式参数,那么蓝牙接入应该设置发现的间隔不能超过第三方蓝牙基带连接的监控超时时间。这样可以使得蓝牙连接更加容易被接口使用。为了增强连接的健壮性,接入应该使用较短的发现间隔而不是多次的发现尝试。使用发现间隔为1秒或者更久的发现模式会使得被动设备打开一个大的连接窗口,当计算尝试次数的时候必须将他考虑进去。如果发现间隔小于1秒,那么多次发现尝试可以增强连接的健壮性,但是会增加电量的消耗。

角色和拓扑管理

每个与苹果设备兼容的蓝牙接入应该:能够接收从苹果设备发送的角色互换请求;当苹果设备拒绝角色互换的请求的时候继续保持连接。在蓝牙连接中通常会有一个主动设备和被动设备。主动设备可以有多个被动设备,因此可以构建微微网。主动设备还可以是其他主动设备的被动设备,创建一个分布网。这种情况下增加了连接的复杂性,因为设备必须在两个微微网进行切换浪费了带宽资源。因此管理蓝牙连接的拓扑结构对于最优化性能非常重要。苹果设备可以根据现有的拓扑结构请求一个角色互换,远程设备需要接收该请求。苹果设备也可以因为拓扑结构方面的原因拒绝一个角色互换的请求。当拓扑结构不理想的时候可能会降低音频的质量和用户的体验。

只有当苹果设备在保持多链接的情况下,如蓝牙或者WiFi,才会请求或者拒绝角色互换。因此,当没有原因使得苹果设备必须为主动方的时候会允许角色互换。对于接入设备的执行方式是一样的,只有当他有足够的成立的原因成为主动放的时候才会允许角色互换。当在拓扑结构中没有必要的时候,接入设备不应该总是默认请求成为主动放,如果后面为了维持多重连接,接入方需要成为主动放的时候,可以在那个时候请求成为主动方。

扩展的询问响应

所有与苹果兼容的蓝牙接入都应该在他的扩展的询问响应包中提供如下内容:设备的本地名称,完整的或者缩写;TX电量等级;iAP协议的Service Class UUID,如果设备拥有这个服务的话。在蓝牙发现过程中,苹果设备可以显示发现的蓝牙接入的名称。在2.1之前的标准中,苹果设备必须创建接入的连接然后发送Remote Name Rquest请求,这将会耗费电量、天线时间和用户时间。在蓝牙2.1标注中印尼如的扩展的请求响应特性,使得接入发送自己的本地名称和其他信息作为请求响应的一部分,因此可以增加发现过程的速度和效率。

安全简单配对

每个与苹果兼容的蓝牙接入都应该:使用安全简单配对;如果有显示和输入设备支持的话,使用数字比较方法。安全简单配对大大地增强了安全性,他是在2.1标准中引入的强制性安全特性。为了防止中间第三方的侵入,应该尽可能地使用数字比较方法。

描述

苹果的官方文档support.apple.com/kb/ht3647中提供了苹果产品支持的蓝牙描述的完整列表。蓝牙标准是开始设计与这些设备兼容的蓝牙接入的起始点。下面的部分添加了一个信息和要求到一些描述当中,可以帮助开发者实现最终的结果。

设备ID描述DID

每个与苹果设备兼容的蓝牙接入都必须:支持蓝牙设备ID描述,1.3版本或者更高;使用蓝牙SIG分配的Assigned Numbers文档中的公司标识作为他的Vendor ID值,也就是VID,如果生产商没有蓝牙SIG公司标识,那么蓝牙HID描述接入可能会使用USB Implementers Forum分配的VID;使用他的VID值来标识最终的产品生产商;使用版本值来唯一标识软件的版本;使用ProductID值唯一标识产品。Device ID描述使得苹果产品能够识别远程的蓝牙接入,该信息可以用来在与远程接入交互的时候连接蓝牙描述间的交替互操作。因此Device ID中的信息记录非常重要。

在车载设备的例子中,相同的车载设备可能会有两个不同的模型。理想情况下,这两个车载设备应该有不同的产品ID。但是,当他们拥有完全相同的硬件、软件和特性的时候拥有相同的ProductID也是可以允许的。如果他们有任何的不同,就都应该有不同的Product ID。

免提描述HFP

如果蓝牙接入支持蓝牙免提描述标准,那么应该是1.5或者更高的版本。远程接入可以使用蓝牙免提描述来支持电话的交互。为了提供最好的用户体验,远程接入通常支持如下特性,这些特性在蓝牙标准中是可选的。

远程音频音量控制:每个与苹果设备兼容的蓝牙接入且支持HFP的都应该:支持远程音频音量控制因此免提接入的音量可以通过苹果设备进行控制,如HFP标准1.5中的描述;通过AT+BRSF=命令在Supported Features位图中来设置远程音量控制位。在某些情况下可以方便用户通过苹果设备而不是远程接入来控制输出音量。音量控制同步在蓝牙HFP标准1.5版本中有描述。

事件报告指示器:所有与苹果设备兼容且支持HFP的蓝牙接入应该使用事件报告指示器而不比重复执行轮询。苹果设备支持HFP1.5版本中所有强制和可选额指示器,为了最小化不必要的的AT+CIND?命令进行状态轮询,远程接入应该支持事件报告指示器,来发送AT+CMER命令。然后苹果设备会在发现一个状态指示器变化的时候发送一个+CIEV事件。根据HFP标准,远程接入应该使用AT+CIND=?和AT+CIND?命令请求初始化状态。

声音识别激活:每个与苹果兼容且支持HFP的蓝牙接入都应该:支持声音识别激活;通过AT+BRSF=命令在SupportedFeature位图中设置声音识别激活位。苹果设备支持通过免提接入和iOS接入初始化的声音识别激活。

回音取消和噪声削弱:当在免提蓝牙接入的时候设置回音取消和噪声削弱的时候,应该通过发送AT+NREC命令来关闭苹果设备上的回音取消和噪声削弱,在Hands-Free描述标准1.5中有详细介绍。苹果产品支持回音取消和噪声消除,这些特性是默认激活的。如果免提接入也需要进行回音消除和噪声削弱的话,就应该关闭苹果设备上的这两个功能。这样可以避免因为双重音频处理而产生的不必要的音频质量损毁

同频带铃声:每个与苹果兼容且支持HFP的蓝牙接入都应该支持同频带铃声,在蓝牙Hands-Free描述标准1.5中有进行描述。如果用户在苹果设备商设置了铃声,那么在免提接入设备中应该具有相同的铃声。

同步连接:每个与苹果兼容且支持HFP的蓝牙接入都应该:支持eSCO参数,设置S2和S3且节诶受请求中的这些参数;当设置同步连接的时候请求额SCO参数设置S2或者S3,注意eSCO参数设置S1不应该被请求;在SCO/eSCO连接建立后的40ms内调整音频。eSCO包类型提供了包的重新传送,传统的SCO包不可以被重新传送。这样就增强了音频的质量和用户体验。eSCO包类型2-EV3和3-EV3提供了包之间的更多事件,可以增加WiFi性能,允许其他的蓝牙同时接入。

宽带讲话:每个与苹果兼容且支持HFP的蓝牙接入都应该支持宽带降火连接,在蓝牙Hands-Free Profile标准1.6中有描述。如果支持宽带讲话,那么就应该支持T2连接参数设置。所有运行iOS5或者更高版本的iOS设备都支持宽带讲话。

短信获取描述MAP

每个与苹果兼容且支持iMAP的蓝牙接入应该满足:满足消息通知,在蓝牙Message Access Profile标准1.0版本中有描述;当连接建立的时候立即注册通知,在在蓝牙Message Access Profile标准1.0版本中有描述;不在创建者VCARD中显示TEL属性,在蓝牙Message Access Profile标准1.0版本中有描述;不提供用来发送信息的用户界面,iOS设备不支持使用MAP发送消息。所有运行iOS6或者更高版本的iOS设备都支持MAP。

视频音频远程控制描述AVRCP

为了支持音频/视频远程控制描述,与苹果兼容的蓝牙接入需要支持如下的按钮和操作:

支持的按钮:所有与苹果兼容且支持AVRCP的蓝牙接入都应该使用不同的按钮命令来播放或者暂停,而不是切换播放或者暂停状态

支持的操作:苹果产品通过Pass Through命令支持如下operation_IDs:Play;Stop;Pause;Fast Forward;Rewind;Forward;Backward;

重复和随机模式:所有iOS设备在AVRCP目标的角色下都支持重复和随机模式。一个AVRCP控制器可能会使用SetPlayerApplicationSettingValue来设置iOS设备的值,然后使用GetPlayerApplicationSettingValue读取该值,在蓝牙AVRCP标准1.4版本中有描述

通知:所有与苹果设备兼容且支持AVRCP描述的蓝牙接入都应该注册通知且不需要重复执行轮询来获取苹果产品的状态。所有iOS设备在AVRCP目标角色下都支持通知的注册,在AVRCP标准1.4版本中有描述。命令RegisterNotification和GetPlayStatus支持一下通知:EVENT_PLAYBACK_STATUS_CHANGED;EVENT_TRACK_CHANGED;EVENT_NOW_PLAYING_CONTENT_CHANGED;EVENT_AVAILABLE_PLAYERS_CHANGED; 
EVENT_ADDRESSED_PLAYER_CHANGED;EVENT_VOLUME_CHANGED

音量控制:所有与苹果设备兼容且支持AVRCP描述的蓝牙接入都应该支持Absolute Volume,在蓝牙AVRCP标准1.4中有描述。每个iOS设备在AVRCP控制器角色下都支持音量控制

浏览:所有与苹果设备兼容且支持AVRCP描述中浏览(在控制器角色下)的蓝牙接入应该:不要索引或者缓存基于连接的整个库,iOS设备可能会包含大量的多媒体条目,每个都会在层次中呈现多次;当浏览某个文件夹的时候,不要获取所有的条目,仅仅获取显示给用户的条目,可以提前获取一些条目来提高对用户界面的响应速度;不要重排条目;不要假设UID是静态定义的,尤其是在根目录下,文件夹的顺序和UID以及里面的多媒体条目可能在将来的版本中发生变化;在接收到EVENT_UIDS_CHANGED通知后发送SetBrowsedPlayer命令;不要假设传递给PlayItem命令哪个UID,多媒体播放器就会播放那个UID。现阶段只有内置的Music应用支持浏览,当在播放器之间切换的时候,EVENT_AVAILABLE_PLAYERS_CHANGED和EVENT_ADDRESSED_PLAYER_CHANGED通知会被生成。UI就会需要查看被列出来的播放器的特性比特位来决定是否可以使用它进行浏览。所有运行iOS6或者更高版本的iOS设备都支持AVRCP浏览。

iOS应用元数据:运行在iOS设备上的音频软件可能会使用iOS MediaPlayer Framework API来提供当前音频流的元数据。iOS设备使用AVRCP向接入点提供这些元数据。

高级音频分布描述A2DP

所有与苹果设备兼容且支持Advanced Audio Distribution Profile A2DP的蓝牙接入都应该满足A2DP1.2标准中描述的需求。

子带编解码器SubBand Codec (SBC):砸啊唉A2DP描述中定义的SBC编解码器标准信息元素可以被应用于苹果产品,他们如下:

Sampling Frequency(44,100 Hz);Channel Mode(Stereo);Block Length(16);Subbands(8);Allocation Method(Loudness);Bitpool range(2 to 53. Bluetooth accessories for Apple products should support 53)

MPEG 2/4 AAC 编解码器:iOS设备支持非强制性的MPEG-2/4 AAC编解码器,在A2DP 1.2版本的描述中有定义。接入点应该使用AAC编解码器附加到SBC中,因为在码率固定的情况下他提供了更高的音频质量。下面给出了苹果实现的MPEG-2/4 AAC编解码器的实现,当有冲突的时候,以A2DP描述为准。MPEG 2/4 AAC编解码器的标准信息元素在A2DP描述中有定义,可以应用在iOS设备中的元素如下:Object Type(MPEG-2 AAC LC);Sampling Frequency(44,100 Hz);Channels(2);Bit rate(264,630 bps);VBR(0)。 
iOS设备中的AAC音频流包的结构如下:L2CAP Header;AVDTP Header;MPEG-4 LATM AudioMuxElement;MPEG-4 AAC Audio Payload。AAC Media Paylod Format,在A2DP中被描述,使用LATM进行格式化,LATM在IETF RFC 3016中定义的。下面的关键点适用于上面提到的音频流包中的结构域:每个iOS设备的AAC流通道的A2CAP MTU值建议是885字节;AVDTP Header作为RFC 3016的RTP头,也是在Audio/Video Distribution Transport Protocol中定义的头;AudioMuxElement与RFC 3016中的RTP payload相同,muxConfigPresent是AudioMuxElement的参数,设置为1(in-band模式下),在RFC 3016中,推荐每个AVDTP包中只有一个AudioMuxElement;音频负载使用MPEG-4编码。

音频路由

  这部分描述接入点如何区分来自iOS设备的不同的音频内容,以及如何使用这些信息来决定播放行为。接入点可以根据两种不同的蓝牙描述接收来自iOS设备的音频数据:使用eSCO通道的HFP和ACL通道的A2DP。iOS根据如何使用音频内容来选择通道。用来双向通信的音频路径通常使用HFP来创建来发送音频数据。音乐和类似的内容使用A2DP路由。如果没有定义的路由,音频播放将会默认为iOS设备。

HDF音频数据接收

大部分通过HFP路由发送的音频内容都是需要双向通信的。使用HFP的情况包括蜂窝通话,FaceTime以及语音邮件等。对于任何通过HFP路由接收的音频内容,都需要接入点的听筒和话筒专心与蓝牙连接,不能在处理其他的音频内容。

A2DP音频数据接收

通过A2DP描述传输的音频内容可以大致分为两类:音乐、视频或者游戏等应用中的音频内容;系统生成的音频,如警告和通知等。

区别系统声音的音频内容:类似音乐的内容可以通过添加AVRCP 1.3或更新版本的描述的支持来与系统声音进行区别。AVRCP描述允许接入点通过通知识别iOS设备的音频播放状态。当iOS设备开始通过A2DP通道对播放的音频内容播放的时候,一个AVRCP通知EVENT_PLAYBACK_STATUS_CHANGED被发送来标识播放状态的改变。这表示通过A2DP描述的音频内容为音乐。当iOS设备通过A2DP通道播放系统声音的时候,一个i额AVRCP通知会被发送。

A2DP音频路由行为:在使用A2DP通道的时候,接入点应该根据音频的内容来调整音频路由行为。如果音频数据包含音乐,那么接入点的听筒需要专心处理通过蓝牙接入传入的音频数据,其他任何的音频播放都需要停止。如果音频内容为系统声音,那么接入点可以在需要的时候放弃音频。如果接入点正在播放不同源输入的音频,那么系统声音数据可以与现在播放的音轨混合,并不需要强制停止已经正在设备商播放的音频。

蓝牙低功耗

蓝牙4.0标准引入了蓝牙低功耗,一种针对有限电池资源的蓝牙接入的无线技术。如果支持蓝牙低功耗的话,接入点需要支持下面的这些特性。

角色

蓝牙接入需要实现蓝牙4.0标准中定义的外围角色

广告通道

蓝牙接入需要在所有三个广告通道中针对每个广告事件进行广告

广告PDU

蓝牙接入需要使用如下广告PDU中的一个:ADV_IND;ADV_NOCONN_IND;ADV_SCAN_IND。其中ADV_DIRECT_IND不推荐使用。

广告数据

由蓝牙接入发送的广告信息应该至少包含蓝牙4.0标准中包含的如下信息:Flags;TX Power Level;Local Name;Services。如果需要降低电量消耗或者并不是所有的广告数据都适合放入到广告PDU中的时候,接入点可能将Local Name和TX Power Level数据方知道SCAN_RSP PDU中。需要注意的是根据它的状态,苹果产品可能不会总是执行激活扫描。主要的服务应该总是放在广告PDU中进行广告。次要的服务不应该进行广告。对于接入点不重要的服务信息可能会因为广告PDU中的空间不足而被忽略。广告数据和SCAN_RSP PDU中的扫描响应数据应该遵循蓝牙4.0标准中的格式。

广告间隔

  蓝牙接入的广告间隔应该慎重考虑,因为他会影响到发现和连接的性能。对于低功耗的接入,电池资源也应该被考虑在内。为了能够被苹果产品发现,蓝牙接入应该首先使用推荐的广告间隔20ms,并持续至少30秒。如果在这30秒内没有被发现,那么接入点可能会选择节省电池电量然后增加广告间隔,苹果推荐使用如下依次延长的事件间隔来发现蓝牙接入点:645 ms;768 ms;961 ms;1065 ms;1294 ms

连接参数

蓝牙接入负责用来LE连接的连接参数。接入点需要请求合适的连接参数来在合适的时候发送一个L2CAP连接参数跟新请求。如果他没有符合如下规则,那么连接参数请求可能会被拒绝:Interval Max * (Slave Latency + 1) ≤ 2 seconds;Interval Min ≥ 20 ms;Interval Min + 20 ms ≤ Interval Max;Slave Latency ≤ 4;connSupervisionTimeout ≤ 6 seconds以及Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout。苹果设备不会读取或者使用Peripheral Preferred Connection Parameters特性中的参数。

隐私

蓝牙接入应该在任何情况下都能够满足Resovable Private Address。因为私隐方面的考虑,苹果设备将会使用蓝牙4.0标准中定义的随机设备地址。

授权

蓝牙接入不需要请求特殊的授权,如配对、认证或加密等来发现服务和特性。只有在获取特性值或者描述值的时候可能会需要特殊的授权。

配对

蓝牙接入不应该请求配对。如果处于安全考虑,接入点需要与Central建立绑定关系,外围可以使用Insufficient Authentication错误码在必要的时候拒绝ATT请求。因此苹果设备可能会需要按照既定的安流程程来执行过程。配对可能会需要基于苹果产品的用户认证。

服务

通用接入描述服务:蓝牙接入应该实现按照蓝牙标准4.0中的Device Name特性

通用属性描述服务:只有当接入有能力在生命周期内更改他的服务的时候,该接入点才需要实现Service Changed特性。苹果产品可以使用Service Changed服务特性来决定它是否可以使用之前读取的或者缓存的来自设备的信息。

设备信息服务:蓝牙接入应该实现设备信息服务。服务的UUID不应该包含在广告数据当中。如下的特性需要被支持:Manufacturer Name String;Model Number String;Firmware Revision String;Software Revision String

GATT服务器

  在iOS6中,应用可能会将对于蓝牙接入可用的服务和特性共享到GATT服务器,下面的部分应用于这种情况。iOS设备实现了GAP Service Changed特性,因为数据库内容可能随时会改变。因此蓝牙接入需要支持Characteristic Value Indication来接收该通知,从而验证数据库的缓存。蓝牙接入应该最小化使用ATT/GATT请求和命令,而且仅发送必要的数据。例如,当搜索特定的服务的时候不要使用GATT Discover All Services,而是使用Discover Primary Service By Service UUID。更少的时间意味着更低的电量消耗和更好的性能。蓝牙接入应该足够健壮能够处理任何类型的错误。配对和读写特性值可能会因为拥有该服务的应用不在前台运行且没有在后台授权运行而发生错误。如果使用了ATT Prepare Write Request,所有属性队列将会包含在同一个GATT Service中。

苹果协议和开发者支持

本章描述了可以帮助你开发苹果兼容的蓝牙接入设备的设计的资源,以及除了标准的蓝牙描述之外的扩展功能的描述;

苹果蓝牙开发邮件列表

关于苹果产品的蓝牙接入的问题和评论可以发送到苹果的蓝牙开发邮件列表,bluetooth-dev@lists.apple.com,为了成为该邮件列表的一员,访问lists.apple.com/mailman/listinfo/bluetooth-dev。苹果蓝牙开发团队的工程师会查看该邮件列表并且回答你提出的问题。

iPod接入协议

第三方的接入可以使用iPod接入协议iAP来获取iOS设备的高级功能。其中的一个特性就是与第三方iOS应用通过iOS External Accessory Framework安全通信。为了将iPA考虑进蓝牙接入的设计中,开发者必须是Apple MFi认证项目的一员,同时将特定的MFi硬件设计考虑在内。

耳机电池层级指标

任何免提的蓝牙耳机都可以在iOS设备的状态栏中显示一个用来标识他电池电量的图标。这个特性被所有的iOS设备所支持,包括iPhone、iPod和iPad。耳机的蓝牙知识通过两个iOS蓝牙HFP AT命令:HFP Command AT+XAPL

HFP命令AT+XAPL

  • 描述:允许通过耳机自定义AT命令
  • 发起者:耳机
  • 格式:AT+XAPL=[vendorID]-[productID]-[version],[features]
  • 参数:
    • vendorID: 标识生产商的vendor ID的十六进制表示,但是没有0x前缀
    • productID: 标识生产生的product ID的十六进制表示,但是没有0x前缀
    • version: 软件的版本
    • features: 用10进制标识的位标识:
      • 1 = 耳机支持电池电量报告
      • 2 = 耳机暂停或者正在充电
      • 其他值保留
  • 例子: AT+XAPL=ABCD-1234-0100,3
  • 响应: +XAPL=iPhone,[features]

HFP命令AT+IPHONEACCEV

  • 描述:报告耳机的状态变更
  • 发起者:耳机
  • 格式:AT+IPHONEACCEV=[Number of key/value pairs ],[key1 ],[val1 ],[key2 ],[val2 ],...
  • 参数:
    • Number of key/value pairs : 接下来参数的数量
    • key: 被报告状态变化的类型
      • 1 = 电量等级
      • 2 = 暂停状态
    • val: 更改的值
      • Battery events:0-9之间数字的字符串 A string value between '0' and '9'.
      • Dock state: 0 = undocked, 1 = docked.
  • Example: AT+IPHONEACCEV=1,1,3
0 0
原创粉丝点击