iOS MFi App端开发步骤

作者: 熊皮皮 | 来源:发表于2016-03-02 16:36 被阅读10133次

    本文为官方文档:About External Accessories及相关文档、个人开发调试过程的汇总。

    与附件设备通讯的App需设备支持的协议,这些协议由设备制造商维护,可是自定义或标准协议,标准协议可与其他设备通信,iOS不负责这些协议的维护。

    为防止命名空间冲突,推荐使用反DNS形式命名协议,如com.apple.myProtocolcom.dji.videocom.dji.protocolcom.dji.common

    1、编程步骤

    1.1、引入框架与头文件

    外部附件框架(ExternalAccessory.framework)为App与附件设备通信提供了桥梁。因此,在Xcode项目中,需要为每个与附件设备通信相关的项目添加ExternalAccessory.framework。

    下一步是引入头文件#import <ExternalAccessory/ExternalAccessory.h>

    1.2、声明App支持的协议

    不声明协议直接调用EA框架的类会崩溃。

    使用UISupportedExternalAccessoryProtocols键在Info.plist中声明支持的协议,值为数组,数组的元素为支持的协议,元素的顺序任意且不限数量。这些值只用于判断App与附件设备的通信能力。当App与设备通信时,具体通信协议由我们编程决定。

    当附件设备插入iOS设备时,系统才知道App可被新插入的设备启动。若当前已安装的App都没注册协议,则系统可能到App Store去搜索支持新设备声明的协议的App。

    UISupportedExternalAccessoryProtocols对应的值虽说可参考UISupportedExternalAccessoryProtocols,实际此链接并没给出有帮助的信息,《MFi Accessory Interface Specification for Apple Devices》也没给出所谓标准协议的字符串值。

    1.3、开始通信

    1. 创建EASession。此对象管理与附件设备交互的情况,它与底层系统工作,在设备上来回传输数据。一旦会话建立,数据通过NSInputStreamNSOutputStream的实例在App中传输。收发的数据包的格式由与附件设备通信的协议决定。

    2. 接收数据。使用自定义委托对象,监视NSInputStream实例可从附件设备接收数据。

    3. 发送数据。向NSOutputStream写入数据包即可发送至附件设备。

    1.4、一个读取外接设备的示例

    1、Info.plist中加入Supported external accessory protocols,值为com.apple.p1。这个只是令系统认为我们的应用有能力与外接设备沟通,这里使用Lightning USB Camera Adapter测试。

    2、读取外接设备信息代码

    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;
        });
    });
    

    运行结果为:

    manufacturer = Apple
    name = Apple USB Camera Adapter
    modelNumber = A1440
    serialNumber = 
    firmwareRevision = 1.0.0
    hardwareRevision = 1.0.0
    dockType = (null)
    

    1.5、与外接设备交互数据的示例

    如下代码展示与DXO One相机通信。

    1、在非UI线程中打开设备,否则可能导致程序崩溃。

    EAAccessoryManager *manager = [EAAccessoryManager sharedAccessoryManager];
    NSArray<EAAccessory *> *accessArr = [manager connectedAccessories];
    if (accessArr.first) {
      EASession *session = [[EASession alloc] initWithAccessory:accessArr.firstObject forProtocol:@"com.dxo.one.protocol"];
      if (!session) return;
      NSInputStream *inputStream = [session inputStream];
      if (!inputStream) {
        // LOG inputStream = null
      }
      inputStream.delegate = self;
      [inputStream open];
    }
    

    2、实现NSStreamDelegate协议

    - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
       // LOG stream & event code
        switch (eventCode) {
            case NSStreamEventNone:
                break;
            case NSStreamEventOpenCompleted:
                // 开始读取
                break;
            case NSStreamEventHasBytesAvailable:
                // 获取可读数据大小,读取流才有效。
                break;
            case NSStreamEventHasSpaceAvailable:
                // 获取可写空间大小,写入流才有效。
                break;
            case NSStreamEventErrorOccurred:
                // 出错处理
                break;
            case NSStreamEventEndEncountered:
                // 读取结束
                break;
        }
    }
    

    2、ExternalAccessory框架

    1、EAAccessory
    提供一个已连接的设备的信息,如制造商,固件版本等。

    2、EAAccessoryManager
    协调MFi设备与iOS设备之间的工作。

    3、EASession
    用来创建App与附件设备之间的通信通道。

    4、EAWiFiUnconfiguredAccessory
    提供未配置的MFI Wireless Accessory Configuration设备的信息给App。

    5、EAWiFiUnconfiguredAccessoryBrowser
    让App访问MFi Wireless Accessory Configuration进程。

    3、开发技巧

    Lightning接了设备则不能连接计算机,所以直观的做法是,将日志用UITextView显示出来。写成日志就得每次都拔掉设备,插上电脑,如此反复。

    另一个办法是,通过蓝牙测试传输协议,手机连接电脑,可单步调试。验证完再用Lightning连接设备联调。

    相关文章

      网友评论

      • 陈添:您好,我用苹果官方的OTG线把数码相机和iPhone进行连接
        然后用您的代码跑了一下
        发现获取不到连接的设备...
        这个会是什么原因呢?
      • 我是云峰小罗:本人维护了一个“MFi开发交流”的微信群,里面有iOS开发 、外设驱动、MFi认证等各类相关人员,大家相关交流,互帮互助。
        想进群的可以加本人微信:luoxub ,备注:MFi, 邀请进群。
      • PotterSun:请问在哪边能购买到lighting开发版(硬件),可以给一个地址吗,买一个试试看,对这个很感兴趣
      • S__L:这个可以实现http协议和外设通讯么?
      • 飞天舞桐:请问做成像网易云音乐在carPlay上的效果,也得需要去进行MFI认证吗?
      • ZQZ_f926:为什么我获取modelNumber是X90,能告诉我如何正确获取·?
      • d2587c509cae:自己做的App如何被连接的硬件启动呢?比如我智能硬件连插上ipad后就启动我的App。这个是怎么样的呢?
        d2587c509cae:@熊皮皮 希望大神能给个清晰的步骤和需要的东西。谢谢!因为第一次做,所以懂得不多。
        d2587c509cae:@熊皮皮 需要设置URL Schemes 吗?
        熊皮皮:@墓狱 给自己的app声明自定义的字符串,硬件按文档要求发指定信号
      • f0b5bd2b217f:iOSAPP和外接的设备可以通过苹果的lightning接口的数据线进行数据数据传输么?需要MFI认证么?
        S__L:您好!这个问题您解决了么?我最近也遇到了这样的问题,可以回复一下么?
      • FerrariM:大神应该是大疆的大神吧。因为国内可以拿到MFI认证的公司用手指头就能数过来。如果方便的话留个联系方式小弟有问题请教,公司打算也做这方面的开发,我也向公司解释过这个东西不是一般的公司能做到,但是没办法领导就是要看DEMO。。。。。 :joy:
      • xh_0129:有demo吗 官方EADemo Supported external accessory protocols 下边的协议是什么格式的?能给个参照吗 有标准协议吗
      • xh_0129:与附件设备通讯的App需设备支持的协议。。。。我们要连蓝牙音箱,这个协议是要找音箱制造商拿吗?
        熊皮皮:@xh_0129 你的协议字符串是什么内容?
        xh_0129:@熊皮皮 那为什么官方的EADemo搜索不到设备 你那边有demo吗 能给一份参考下
        熊皮皮:@xh_0129 蓝牙连接从MFi申请说明上看是不需要的
      • 再饿也不吃晚饭:请问下使用这个要认证mfi吗
        熊皮皮:@再饿也不吃晚饭 如果要做外接Lightning接口的设备,法律上是要申请MFi认证的。
      • yNSMGF:请问MFI能读取外部摄像头的实时视频吗?有没有这方面的资料啊?
        路飞梦想家:兄弟这个实现了吗,我和你的需求一样,我微信18896905976,希望得到你的帮助
        yNSMGF:@赖__82084788 谢谢你的回复,外部本身就是一个摄像头 我看到有不少外接wifi协议的实时外部视频 但是我这里的需求是走lightning接口,所以是有实时视频输出的。我想问的是 要怎么读取这个实时视频啊。有没有什么资料?谢谢
      • 云逸枫林:关于文件写入问题,不知道怎么获取设备的存储路径? 楼主可有相关的建议,感谢!
        另外,MFi的资料很少,楼主有什么好的参考资料么?
        f92d964e5385:@RanMeng 兄弟,用的哪家的三方?
        RanMeng:@wangzhibin 我当初就是卡在路径这里了,哎,最后还是用一个收费的三方搞定的
        YanHuo99:最近也在做外接优盘的文件操作,你的项目完成木有啊兄弟,关于路径,有没有好的思路???

      本文标题:iOS MFi App端开发步骤

      本文链接:https://www.haomeiwen.com/subject/ufmgkttx.html