知识点滴 - 什么是iAP2 (上)

      最后更新:2022-08-03 13:53:31 手机定位技术交流文章

      前言

      iAP2协议是苹果的MFi技术之一,是一个非常完整的经典通信协议,两个设备使用彼此的数据包进行通信,考虑到通信的完整性、准确性和效率。

      作为数据包通信学习, 这是一个非常好的例子.

      正文

      附件可以使用iAP2协议访问高级设备的功能,其中一个功能是通过iOS外部附件框架安全地与第三方iOS应用程序进行通信。

      iOS External Accessory Framework:

      About External Accessories

      在Accessory Interface Specification R39.pdf中,第57章,是关于iAP2的协议描述。

      57. iAP2

      iAP2是iAP1的完全替代者,不向后兼容(backward compatible)。

      iAP缩写表示的是Interface Accessory Protocol.

      57.1 iAP2 Connection

      一个iAP2连接是由一个iAP2传输通道(iAP2 Link)和一个或多个iAP2会话组成。

      57.2 iAP Link

      每个iAP2连接始于连接与设备之间的通道,通过支持的传输。连接协议提供了与传输无关的机制,用于一个或多个iAP2对话中的数据包的可靠和有序释放。该协议也可以根据每个连接配置,在任何特定传输模式或附件使用中,它可以被优化为最佳性能。这些 议定书 旨在 实现 下列 目标 :

      -接收数据包的ACK确认。

      -重新传输需要在序列中重新发送未确认的包。

      - 明确 和 有效 地 支持 iAP 2 会议 。

      支持iAP2传输模式:

      - Bluetooth

      - UART

      - USB Device Mode

      - USB Host Mode

      - Apple Lightning Audio

      支持上面这些传输方式的设备,都可以和配件建立iAP2的连接。一些传输方式对不同的功能会更加合适,所以在配件设计过程中,选择合适的传输方式是最优先的事。

      57.2.1 Packet Structure

      每个通信数据包应以一个固定大小的9字节的头开始,包括校验和。头后面数据是一个可选的可变长度的数据有效载荷。头部和有效载荷都有各自的校验和。如果没有有效载荷数据,就没有有效载荷校验和。

      Table 57-1 iAP2 Link Packet Structure

      Start of Packet MSB (0xFF)

      Start of Packet LSB (0x5A)

      Packet Length MSB

      Packet Length LSB

      Control Byte

      Packet Sequence Number

      Packet Acknowledgement Number

      Session Identifier

      Header Checksum

      Payload Data

      Payload Checksum

      57.2.1.1 Start of Packet

      每个iAP2连结包的第一个两个字母总是FF5A。 如果这些字符在传输流中被检测,那么附件和设备应该尝试分析以后的字符作为有效的数据包。

      57.2.1.2 Packet Length

      接下来的两个字符串代表由字符串统一的数据包长度,它总是由一个未签署的16位端口整数表示。没有有效载荷数据的链接包具有固定的9字节长度(从包开始到头检查和)。否则,数据包长度是从数据包开始到最后一个字节的有效负载数据,包括有效的负荷检查和检查。例如,带一个单字节有效载荷数据的链接包,它的数据包长度为11字节。数据包的最大有效负载数据大小为65525字节;带有这样的有效负载的数据包的包长为65535字节。

      57.2.1.3 Control Byte

      控制字段的位置指示在包中存在的东西。

      -SYN、EAK和RST是相互排斥的。

      - ACK bit 可以与SYN bit 结合。

      - EAK位总是与ACK位一起设置。

      - RST比特永远不会与其他比特一起设置。

      -SLP比特永远不会与其他比特一起设置。

      -所有未分配的位数应该设置为0。

      当任何SYN、EAK或RST位子设置时,iAP2对话有效负载不能发生。相反,与iAP2会议有效负载的链接包总是设置为ACK位子。

      Table 57-2 iAP2 Link Control Byte Bits

      Bit

      Name

      Meaning

      7

      SYN

      Link Synchronization Payload is present

      6

      ACK

      Packet Acknowledgement Number is valid, and iAP2 Session Payload may be present

      5

      EAK

      Extended Acknowledgement Payload is present

      4

      RST

      Link Reset

      3

      SLP

      Device Sleep

      下面的内容将会使用这些描述表示带有某种control byte的link packet。

      57.2.1.4 Packet Sequence Number

      每个链接包包含一个包序列数,仅用于识别传输中的包。当首次创建链路时,设备和附件在发送第一个SYN/SYN+ACK包之前应随机选择一个初始序列数。每次发送数据包时,都会使用iAP2对话或链式同步有效负载数据,序列号都会增加1,否则,在发送包时,序列数将不会增加。先前发送的包的重新传输应保持相同的包序列数。序列数在达到255时返回0。The sequence number wraps back to 0 upon reaching 255.

      注意: 设备和配件应使用自己的包装序列编号.

      57.2.1.5 Packet Acknowledgement Number

      只有当控制字节中的ACK位被设置时,数据包确认号码才有意义。如果没有设置ACK,则发送方应将数据包确认号设置为0,而接收方应将其忽略。

      如果设置了ACK,这个数据包是接收者对数据包的响应,以确认,包含的数据包确认编号指示第一个接收数据包的数目被接受的顺序。例如,如果附件接收的数据包的序列数为1、2、3和5,然后在下一个数据包中由附件发送的数据包确认号码是3,因为5不是按顺序收到的。

      57.2.1.6 Session Identifier

      会话标识符只有在控制字节中的ACK位被设置且存在iAP2会话有效载荷时才有意义。如果满足这两个条件,会话标识符将是一个非零数字,指定iAP2连接中的一个特定会话。否则,会话标识符应被设置为0。

      57.2.1.7 Header Checksum

      头部校验和的计算方法是将以下所有数据包的字节相加。如果报头校验和的值与根据校验和计算的值不一致,接收方应从下一个检测到的数据包开始序列重新开始数据包解析工作。

      · Start of Packet MSB

      · Start of Packet LSB

      · Packet Length MSB

      · Packet Length LSB

      · Control Byte

      · Packet Sequence Number

      · Packet Acknowledgement Number

      · Session Identifier

      57.2.1.8 Payload Data

      这一部分是可选的,它的存在应与控制字节中的位的状态相匹配。可能的最大有效载荷大小为65,525字节。

      57.2.1.9 Payload Checksum

      只有当有效的负载数据存在时,有效载荷检查节点将出现。如果存在有效的负载数据,检查了所有有效的负载数据的字符。如果有效负荷校正和内负荷值不匹配根据校正和计算的值,接收器应该从下一个检测到的包中启动序列,重新启动包分析。

      57.2.1.10 Checksum Calculation

      iAP2使用的检查和字节为每个发送的包计算。目的是确保所有检查(未签名)和检查(未签名)字符的完整性,忽略任何未签名的8位溢出,等于0x00。这允许快速的方法验证数据包的正确传输。校正的计算方法是采用最小有效(未签名8位)的检查字段,然后取补码。

      下面是代码示例:

      uint8_t

      checksum_calculation(uint8_t *buffer, uint16_t start, uint16_t length)

      {

      uint16_t i;

      uint8_t sum = 0;

      for (i = start; i < (start + length); i++) {

      sum += buffer[i];

      }

      return (uint8_t)(0x100 - sum); /* 2's complement */

      }

      57.2.2 Link Synchronization Payload

      关于包头后面的负载数据:链路同步有效载荷(Link Synchronization Payload / LSP)用于建立链路,并在设备和接入点之间同步包序号。它还包含可协商的链接参数。

      Table 57-3 Link Synchronization Payload (Version 1)

      Link Version (0x01)

      Maximum Number of Outstanding Packets

      Maximum Received Packet Length MSB

      Maximum Received Packet Length LSB

      Retransmission Timeout MSB

      Retransmission Timeout LSB

      Cumulative Acknowledgement Timeout MSB

      Cumulative Acknowledgement Timeout LSB

      Maximum Number of Retransmissions

      Maximum Cumulative Acknowledgements

      iAP2 Session 1: Session Identifier

      iAP2 Session 1: Session Type

      iAP2 Session 1: Session Version

      iAP2 Session N: Session Identifier

      iAP2 Session N: Session Type

      iAP2 Session N: Session Version

      57.2.2.1 Link Version

      -正在创建的链接的版本。 所有包的有效负载可能因链路的不同版本而有所不同。

      -当前链式版本的唯一有效值是1。

      这是可商议的参数。

      - 附件和设备应同意相同的价值.

      57.2.2.2 Maximum Number of Outstanding Packets

      - 可以不接收对方的ACK发送的未完成包的最大数目

      -有效值为1至127。

      -这不是可商议的参数。

      - 附件和设备可以展示和用于不同的价值。

      -附件发送的包数不应超过设备建议的最大未解决包数,而不需等待设备的确认,反之亦然。

      57.2.2.3 Maximum Received Packet Length

      - 可以处理在字节单位内的最大可能的封筒长度。

      -有效值为24到65535。

      -这不是可商议的参数。

      - 附件和设备可以展示和用于不同的价值。

      57.2.2.4 Retransmission Timeout

      -在未接收ACK的情况下检索的包的超时时间,单位为毫秒。 该值应设置接近链路传输上的包的传输时间。

      -有效值范围从20毫秒到65535毫秒。

      这是可商议的参数。

      - 配件和设备应同意相同的价值.

      57.2.2.5 Cumulative Acknowledgement Timeout

      - 超时值以毫秒计,在没有收到新的数据包时发送ACK数据确认包。

      - 有效值为10毫秒,超过重新传输的时间的一半.

      这是可商议的参数。

      - 配件和设备应同意相同的价值.

      57.2.2.6 Maximum Number of Retransmissions

      - 在链路被认为是断开之前尝试的最大数据包重传数量。

      -有效值为1至30。

      这是可商议的参数。

      - 配件和设备应同意相同的价值.

      57.2.2.7 Maximum Cumulative Acknowledgements

      - 接收序列内最大数量的包时, 发送ACK确认包.

      - 有效值为 0 至 127 或 未处理的包的最大数目, 以较低的值为准.

      这是可商议的参数。

      - 配件和设备应同意相同的价值.

      57.2.2.8 ZeroACK/ZeroRetransmit Link Configurations

      从iOS8开始,附件可以选择进行ZeroACK/ZeroRetransmit链配置,而不期待重传的数据包或数据包确认。建议使用的条件是,地下输送有自己的可靠的输送机制,而且配件可以充分利用这些机制。这种iAP2连接方法,可用的传输层是USB主机模式、USB设备模式和蓝牙RFCOMM传输。

      设备仍将使用包序列数来检测丢失的链接包,并重新安装iAP2链接。

      如果在典型的使用过程中包常常丢失,附件不应使用这样的链接配置,并且应准备在重新配置时重新创建链接,而不丢失状态或影响用户功能。

      - 当设备检测丢失的包时,它将RST发送到附件,并与附件的SYN包重新启动链层咨询。

      - 当附件使用数据包序列号检测到一个丢弃的数据包时,附件应发送一个SYN数据包以重新启动链路协商

      为了与零响应/零重传输的链配置进行谈判,应设置下列可谈判的链参数为0:

      - 重传超时

      - 累计确认超时

      - 最大重传次数

      -最大累积确认数

      一些设备和/或iOS版本可能拒绝尝试谈判零ACK/零继电器链接配置。如果附件声称与这些设备/iOS版本兼容,则应保留协商带有确认和重传的链接的能力。附件应发送SYN数据包,而不是SYN+ACK,更新参数以继续协商.

      附件应管理其iAP2通讯,来解决在链路层缺乏流量控制(flow control)的情况。例如,在开始文件传输前,请发送 StopMediaLibraryUpdate,以暂停MediaLibraryUpdate消息,酌情恢复其他活动。同样的预防措施适用于外部配件协议消息。

      Accessories shall account for the lack of flow control at the link layer by  managing their iAP2 session traffic.

      57.2.2.9 iAP2 Sessions

      -附件将使用iAP2来与设备进行通信。

      -会话标识符是每个定义的会话的唯一标识符。0不是有效的会话标识符。

      - 会议类型和版本应该有效.

      这是可商议的参数。

      - 配件和设备应同意相同的价值.

      57.2.3 iAP2 Session Payload

      在后部指定了iAP2会话有效负载。 只要存在iAP2对话有效负载,控制节点中的ACK位数应设置。

      57.2.4 Extended Acknowledgement Payload

      Extended Acknowledgement Payload用于确认不按顺序收到的数据包。

      有效负荷具有下列属性:

      - 在控制字符中应该设置EAK和ACK的位数。

      -包确认编号包含连续接收的最后一个包的序列编号。

      - 有效负载数据部分包含一个或多个未被接收的包的序列数目,它们不是这些包的确认。 确认将在下一个数据包中单独发送,并在ACK字段中指定相应的数目。

      Table 57-4 EAK Packet Payload (Link v1)

      1st Out of Sequence Acknowledgement Number

      Nth Out of Sequence Acknowledgement Number

      57.2.5 Reset

      控制节点中的RST比特被设备用来重新定位连接。 这个链接包没有有效负载,只能由设备发送。

      57.2.6 Sleep

      本节仅适用于集成以下Lightning连接器的配件:

      · Lightning (C78-USBH)

      · Lightning (C79-USBH)

      · Lightning (C79-UART)

      · Lightning (C79-LA)

      · Lightning (C78-STROBE-USBH)

      · Lightning (C78-STROBE-UART)

      · Lightning (C78-STROBE-LA)

      控制字符串中的SLP位由设备用来表示它即将进入睡眠状态。 这个链接包没有有效负载,只能由设备发送。

      一旦处于睡眠状态,设备将停止提供辅助电源,如果设备进入睡眠状态,它将再次开始提供辅助电源。

      如果附件能够悬挂和恢复链层,附件在安装电源恢复后,应等待500毫秒,然后重新启动链子。在这段时间内,附件可从设备接收ACK信号,信号是链层的恢复信号,它也用于同步序列数(设备发出的最后一个包的序列数)和ACK数(设备接收的最后一个包的序列数)。

      如果附件不能停止和恢复链层,附件应该在恢复电源后80毫秒后再启动链层。

      57.2.7 Operation

      57.2.7.1 Record

      所有链路实现都应该将下列变量存储在链路的特定记录中,这些变量将在下面的章节中说明iAP2链路操作。

      Table 57-5 iAP2 Link Operation Record Variables

      Variable

      Description

      SentACKTimer

      A timer keeping track of the elapsed time (ms) since the last ACK packet was sent

      NextSentPSN

      The Packet Sequence Number of the next packet to be sent

      OldestSentUnacknowledgedPSN

      The Packet Sequence Number of the oldest unacknowledged packet

      InitialSentPSN

      The Packet Sequence Number used for the very first packet sent

      LastReceivedInSequencePSN

      The Packet Sequence Number of the last packet received correctly and in sequence

      InitialReceivedPSN

      The Packet Sequence Number of the very first packet received

      ReceivedOutOfSequencePSNs[n]

      An array of Packet Sequence Numbers received and acknowledged out of sequence

      57.2.7.2 Initialization

      一旦传输连接已建立,附件应验证设备支持iAP2,并在设备收到响应之前以1Hz(每秒)发送以下序列:

      FF 55 02 00 EE 10.

      如果设备支持iAP2,附件将收到相同的字符序列。

      如果设备只支持iAP1,附件将收到下列数据序列:

      55 04 00 02 04 EE 08

      55 02 00 00 FE

      FF 55 04 00 02 04 EE 08

      FF 55 02 00 00 FE

      如果附件接收上述数据序列之一,必须向设备发送下列字符串,以表示不兼容:

      FF 55 0E 00 13 FF FF FF FF FF FF FF FF FF FF FF FF EB

      设备应将响应归还给设备作为最终响应,不允许重新传输或重新测试。

      57.2.7.3 Synchronization

      该链路的一个显著特点是,它支持在任何类型的传输上自动协商传输参数。 这使得链路可以根据设备和附件的能力扩展。 链路初始化有三个主要目的:

      -确定可以接受设备和配件的链式配置参数。

      -搜索配置参数中的错误。

      - 如果不能达成协议, 终止链接.

      当基础传输连接建立时,iAP协议也兼容,就会启动一个链接。这时,设备首先发送SYN数据包,内部链路同步数据负载包含链路所需的参数,并随机生成数据包序列数目.该设备将响应SYN+ACK数据包,确认从附件中接收的SYN包,其所希望的连接参数和它随机生成的包序数。

      如果设备和配件为所有可商定的连接参数都具有相同的值,附件应从设备发送最后的SYN+ACK包,人们认为这种联系已经建立。否则,SYN+ACK包将继续交换,最多10次,直到所有可商议的连接参数都达成协议为止。如果10次交换没有就可商定的连接参数达成协议,该设备将停止对附件发送的任何其他数据包的响应。

      有时,设备无法立即响应从配件接收的SYN包。附件可以重新发送相同的有效负载数据和相同的包序列数的SYN包。附件可每秒继续这样做,直到设备发送SYN+ACK响应,确认先前发送的包的序列编号。一旦收到设备的响应,附件应忽略与相同的包序数的随后输入的SYN+ACK包。

      如果设备的最后链包含了同步有效的负载数据中无效的非合意数据,设备将发送一个RST数据包重新定位链。

      在同步过程中,假定以下默认链路配置参数,直到同步完成之前,以下默认链路配置参数。

      在同步过程中,假设在同步完成之前使用下列默认链路配置参数:

      Table 57-6 Default link parameters during synchronization

      Parameter

      Default Value

      Maximum Number of Outstanding Packets

      1

      Maximum Received Packet Length

      128 bytes

      Retransmission Timeout

      1000 ms

      Cumulative Ack Timeout

      10 ms

      Maximum Number of Retransmissions

      30

      Maximum Cumulative Acknowledgements

      0

      下面的表列出了使用iAP2协议的传输模式中推荐的一些链接配置参数。

      这些值只是作为开发的初始值,针对某个特定配件使用的话,需要经过相应的核实才行。

      Table 57-7 Recommended link parameters for USB Host Mode transport (Full Speed)

      Parameter

      Recommended Value

      Maximum Number of Outstanding Packets

      5

      Maximum Received Packet Length

      4096 bytes

      Retransmission Timeout

      2000 ms

      Cumulative Ack Timeout

      22 ms

      Maximum Number of Retransmissions

      30

      Maximum Cumulative Acknowledgements

      3

      Table 57-8 Recommended link parameters for USB Device Mode transport (Full  Speed)

      这个和上面一样。

      Table 57-9 Recommended link parameters for Bluetooth transport

      Parameter

      Recommended Value

      Maximum Number of Outstanding Packets

      5

      Maximum Received Packet Length

      2048 bytes

      Retransmission Timeout

      1500 ms

      Cumulative Ack Timeout

      73 ms

      Maximum Number of Retransmissions

      30

      Maximum Cumulative Acknowledgements

      3

      Table 57-10 Recommended link parameters for 115.2 kbps UART transport

      Parameter

      Recommended Value

      Maximum Number of Outstanding Packets

      4

      Maximum Received Packet Length

      256 bytes

      Retransmission Timeout

      1000 ms

      Cumulative Ack Timeout

      133 ms

      Maximum Number of Retransmissions

      30

      Maximum Cumulative Acknowledgements

      2

      57.2.7.4 Acknowledgements

      为了确保有效运送包裹,链路协议还使用接收确认和重新传输的包。每个具有有效负载数据和SYN数据包的数据包被接收器接受,接收器需要响应ACK.返回的ACK包不需要另一方再次返回ACK.损坏的包被丢弃了,不需要回复ACK。若收件人在重新发送时未在规定的期限内确认该包,发送者将重新发送包.

      数据包确认有两种类型(ACK)。利用累积验证来验证一个序列中的所有数据包,指定匹配上次发送的数据包的顺序的数据包。扩展确认允许接收者确认未订购的数据包。使用确认类型仅取决于数据包到达的顺序。在可能的情况下,链式实现应采用累积确认,并且只在未序列的方式接收包时使用扩展确认。

      一旦收到一个或多个未订购数据包,接收器应立即生成并发送扩展确认。

      如果相应的ACK在传输中丢失,相同的有效负载数据可能被接收到多个次,在这种情况下,接收器应重新发送有效负载数据的ACK。

      57.2.7.5 Retransmissions

      数据包在底部传输时可能会丢失或损坏,这些数据包可能会被丢弃。 如果上述数据包的返回ACK机制要求接收器正确接收有效数据包,则返回ACK数据包。

      为了检测丢失数据包,发送者应该为每个发送的数据包设置重新传输超时.该计时器的时间由协商决定。当收到一个包的确认时,该包的调度器已被取消。如计时器在收到确认之前届满,则数据包被重传,定时器被重新启动。传输的最大时间,在连接同步期间进行协商确定。

      57.2.7.6 Flow Control

      iAP2链采用流程控制机制,根据收到的未确认数据包数目,链路配置参数中未解决包的最大数目.当创建链接时,参数由双方指定,它还应根据分配给每个链接的缓冲器的数量和大小设置。一旦设定,当连接时,参数保持不变。

      链采用串行编号窗口的概念,可接受的数据包的序列数目。窗口的左边是最后确认的数据包序列数,加上1。窗口的右边等于最后序列中确认的包的数量,增加到未解决的包的最大数量。链路传送器发送数据包,直到最大数量未处理的包到达接收机。一旦达到限制,发送者只收到一个确认包,发送新的包。

      当接收数据包时,数据包序列数落入窗口,它就被确认。分两种情况。如果包序列数等于左边(即是下一个预期的包序列数),通过累积确认(ACK)确认包,并接受窗口的左边和右边增加一个。如果接收的数据包的序列编号在窗口中,但不在序列内,这是通过扩展确认(EAK)证实的。窗口不作调整,并记录收到的不一致的数据包。接收的链 packet 序列数字应在窗口外丢弃;并表明链子不稳定,可能需要重置。

      当发件人收到延长确认(EAK)时,发送者不应在接收窗口外发送数据包。如果一个包没有被确认,但所有后续数据包都收到并确认,这可能发生。此请求将将窗口的左边修正为未识别数据包的序列数。当其他包被发送时,下一个包序列数将接近并最终超过右边。这时,不再发送数据包,直到未确认的数据包被确认。

      57.2.7.7 Reset

      设备可以随时向附件发送RST数据包。 接收RST数据包后,附件应在接收RST数据包后1秒内向设备发送SYN数据包,然后同步处理。

      Fittings应终止底部传输连接,然后再重新连接。如果UART传输处于主动模式,只有手动切断才能重新连接到与设备匹配的闪电连接器。当必须重连时,它表明,协商中设置的链接参数是不合理的,这通常不应该发生。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/31412.html

          热门文章

          文章分类