苹果MFI bluetooth认证开发过程:iDevice和accessory

news/2024/11/8 0:39:01/

研究材料:

Accessory Interface Specification for Apple Devices.pdf

iPod+Authentication+Coprocessor+Spec+2.0C+R1

如果需要更详细的协议说明,可以下载MFI Accessory Firmware Specification PDF

(文档来自苹果授权方,如有侵权,请告知,本文不宜转载)


Accessory Interface Specification for Apple Devices.pdf

这个文档说明了苹果外设的认证过程、支持的认证模式、外设类型和通信协议,也可以通过查看MFI Accessory Firmware Specification文档了解更加详细的协议内容,比如iAP2的LINK建立过程如下图:



iPod+Authentication+Coprocessor+Spec+2.0C+R1.pdf

这个文档是苹果MFI认证芯片的datasheet,MFI芯片基于I2C通信接口,例如下图的I2C地址选择:



Accessory端如何做bluetooth的验证呢?

我们以一个场景来描述,比如MFI认证的蓝牙设备连接上支持iAP2的iOS设备之后,可以直接拉起一个APP程序到前台,那么我们该怎么做呢?

1、蓝牙设备的Service Discovery Protocal(SDP)必须要支持;

2、SDP的Maximum Transmission Unit(MTU)必须最少支持672bytes,这个可以看是否支持MTU协商;

3、不支持SDP消息记录分片;

4、Extended Inquiry Response(EIR)必须要被支持;

5、service UUID 0x00000000DECAFADEDECADEAFDECACAFE必须在SDP和EIR中被申明;

6、EIR设备名必须和Accessory设备的MFI认证时的IdentificationInformation的名字一致


以上是蓝牙部分需要满足的协议条件,然后接下来就是驱动认证芯片,并完成通过蓝牙通道做MFI认证,第一张图已经说明了验证的流程,如果想完成设备连接上后,直接打开某一个APP的功能,需要设备发送RequestAppLaunch消息到iOS设备上,通过Accessory Interface说明文档的26.3.1的RequestAppLaunch数据格式,我们知道需要携带一个参数AppBundleID,这个参数类型是utf8,e.g. com.kuili.applaunch,这里苹果推荐使用反DNS格式

(对于iAP2流程的link control session和seesion的开发过程这里忽略,官方例子)


支持MFI iAP2的手机端:

Info.plist中增加如下内容:

        <key>UISupportedExternalAccessoryProtocols</key><array><string>com.example.apple-samplecode.data</string><string>com.kuili.applaunch</string></array>
注意Info.plist中的一个字符串正是accessory设备通过RequestAppLaunch发送过来的AppBundleID

程序中需要引用外部附件框架:

ExternalAccessory.framework

开始通信:

创建一个EASession,数据通过NSInputStream和NSOutputStream读写流数据。

读取设备信息:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSMutableString *info = [[NSMutableString alloc] initWithCapacity:1024];EAAccessoryManager *manager = [EAAccessoryManager sharedAccessoryManager];NSArray<EAAccessory *> *accessArr = [manager connectedAccessories];for (EAAccessory *access in accessArr) {for (NSString *proStr in access.protocolStrings) {[info appendFormat:@"protocolString = %@\n", proStr];}[info appendFormat:@"\n"];[info appendFormat:@"manufacturer = %@\n", access.manufacturer];[info appendFormat:@"name = %@\n", access.name];[info appendFormat:@"modelNumber = %@\n", access.modelNumber];[info appendFormat:@"serialNumber = %@\n", access.serialNumber];[info appendFormat:@"firmwareRevision = %@\n", access.firmwareRevision];[info appendFormat:@"hardwareRevision = %@\n", access.hardwareRevision];[info appendFormat:@"dockType = %@\n", access.dockType];}dispatch_async(dispatch_get_main_queue(), ^{label.text = info;});
});

与外设通信:

EAAccessoryManager *manager = [EAAccessoryManager sharedAccessoryManager];
NSArray<EAAccessory *> *accessArr = [manager connectedAccessories];
if (accessArr.first) {EASession *session = [[EASession alloc] initWithAccessory:accessArr.firstObject forProtocol:@"com.kuili.applaunch"];if (!session) return;NSInputStream *inputStream = [session inputStream];if (!inputStream) {// LOG inputStream = null}inputStream.delegate = self;[inputStream open];
}
以上iOS代码片段引用了以下博客链接:http://www.jianshu.com/p/8f69c9c4e71e



http://www.ppmy.cn/news/665161.html

相关文章

MYSQL-UNION

语法: UNION 操作符用来合并两个 SELECT 语句的结果 SELECT statement UNION [DISTINCT | ALL] SELECT statement UNION 中的 SELECT 语句中的列数、列顺序必须相同 UNION是双目操作符,需要两个SELECT语句作为操作数,UNION后面可以接DISTINCT或者ALL 如果不写DISTINCT或者…

PostgreSQL 索引管理

文章目录 前言1. 主键1.1 MySQL innodb 中的主键1.2 PostgreSQL 中的主键 2. PG 索引类型2.1 B-tree 索引2.2 HASH 索引2.2 GiST 索引2.3 SP-GiST 索引2.4 GIN 索引2.5 BRIN 索引 3. 索引管理语法3.1 创建唯一索引3.2 多列索引3.3 函数索引3.4 部分索引3.5 覆盖索引3.6 查看索引…

Matlab 图片保存不带白边的方法

Matlab在用imshow或者plot显示图片的时候&#xff0c;经常有白边或是其他的东西。 如果使用saveas的化&#xff0c;这个白边会被存起来。 我们可以这样&#xff1a; imshow(strain_image,border,tight,initialmagnification,fit);set (gcf,Position,[0,0,500,500]);这样再使…

origin 去掉白边

当图片复制的过程中有白边时 一&#xff1a; 1、“Tools”菜单—“Options”选项&#xff0c;或者直接按ctrlU快捷键。 2、在弹出的面板中选择“Page”标签&#xff0c;在“Copy Page settings”下面有个“Margin”&#xff0c;默认是Page。我们从后面的下拉菜单中选择“Border…

html实现字体加边框及填充

text-stroke字体描边 text-fill-color字体填充 <head><meta charset"utf-8" /><title>字体显示</title><style type"text/css">.fontShow{font-size: 26px;text-stroke: 1px #2c9cf0; text-fill-color:#fff;font-weight: b…

css给文字加白边

html: <div class"three">GO</div> css: .three {font-size: 240px;font-weight: 1000;color: #ffcc54;text-shadow: -1px 0 rgba(255, 255, 255, 1), 0 1px rgba(255, 255, 255, 1), 1px 0 rgba(255, 255, 255, 1), 0 -1px rgba(255, 255, 255, 1);}

【Office】wps表格如何让后面的单元格随着下拉选项自动填充

vlookup函数的使用方法   “Lookup”的汉语意思是“查找”&#xff0c;在Excel中与“Lookup”相关的函数有三个&#xff1a;VLOOKUP、HLOOKUO和LOOKUP。下面介绍VLOOKUP函数的用法。Vlookup函数的作用为在表格的首列查找指定的数据&#xff0c;并返回指定的数据所在行中的指定…

扫描线填充算法(1)

参考网址&#xff1a;http://blog.csdn.net/orbit/article/details/7368996 http://wenku.baidu.com/view/4ee141347c1cfad6195fa7c9.html?fromsearch http://download.csdn.net/detail/xiaowei_cqu/4408894 扫描转换和区域填充这个问题是&#xff1a;怎样在离散的像素集上表示…