iOS MFi App端开发步骤


字数1157  阅读1807  评论5 

本文为官方文档: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连接设备联调。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值