我是靠谱客的博主 甜甜抽屉,最近开发中收集的这篇文章主要介绍iOS APP跟外设连接的学习研究iOS APP跟外设连接的学习研究,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

iOS APP跟外设连接的学习研究

一、iOS连接外设的几种方式

iOS App连接外设的常用方式,可以分为三大类:

  • 通过网络端口,建立Socket使用TCP/IP协议进行通信,它主要有三种方式:

    1. wi-fi连接 优点是:简单,不需要集成MFi芯片。缺点:信号容易受到干扰,不太稳定,容易断开;如果硬件使用的场合没有公共wifi,就需要手机自建热点共享,硬件进行热点接入,操作步骤较多。
    2. USB热点共享 和WiFi连接类似,也不需要集成MFI芯片,区别就是USB线共享热点,走的是有线,不容易受到干扰,更稳定。
    3. NCM,就是把USB端口虚拟成标准的网络端口,然后手机和外设就能通过有线网络直连了。优点是:有线连接,非常稳定,带宽足够;也不依赖移动网络信号;但是它的缺点就是:需要集成MFI芯片并进行MFI认证

    关于如何使用Socket进行TCP、UDP连接,推荐github上的开源项目CocoaAsyncSocket https://github.com/robbiehanson/CocoaAsyncSocket

  • iOS App连接外部硬件的第二大类是EAP,全拼是External Accessory Protocol ,外部设备协议。这个是苹果推荐使用的外设连接方式。需要外设集成MFI芯片进行MFI认证。

  • 第三大类就是BLE,低功耗蓝牙,是iOS7.0以后才支持的连接方式。它的优点是不需要集成MFI芯片做认证,功耗低。缺点是:带宽很低,一般适合于只需要传输少量数据的场景。

二、ExternalAccessory框架

ExternalAccessory框架,就是可以用来和Lightning接口的硬件,或者蓝牙(2.1)设备进行连接、通讯的这么一个框架。该框架的主要功能,就是提供一个管道,让外围设备可以和基于iOS系统的设备进行通讯。

1.下面是ExternalAccessory框架中主要类的介绍:

  • EAAccessory:表示你连接的设备。
  • EAAccessoryManager:有一个重要的属性connectedAccessories,用来获取已经连接上手机的设备。
  • EASession:这个类主要用来建立通道,让App和设备可以进行数据的传输(发送和接收)
  • EAWiFiUnconfiguredAccessory: 提供未配置的MFI Wireless Accessory Configuration设备的信息给App。
  • EAWiFiUnconfiguredAccessoryBrowser: 让App访问MFi Wireless Accessory Configuration进程。
2.设备的连接
设备的连接、断开,都是系统自动完成的。EAAccessoryManager类中有一个属性connectedAccessories(一个array),里面就已经包含了所有已经连接的外围设备(EAAccessory对象)。比如设备名称、制造厂商、硬件型号、固件型号等等信息,都可以在EAAccessory对象中拿得到。
1.1 监听设备的断开和链接状态 — 注册通知
调用EAAccessoryManager的方法registerForLocalNotifications。
// 注册通告
[[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];

// 监听EAAccessoryDidConnectNotification通告(有硬件连接就会回调Block)
[[NSNotificationCenter defaultCenter] addObserverForName:EAAccessoryDidConnectNotification
                                              object:nil
                                               queue:nil
                                          usingBlock:^(NSNotification * _Nonnull note) {

                                              // 从已经连接的外设中查找我们的设备(根据协议名称来查找)

}];

[[NSNotificationCenter defaultCenter] addObserverForName:EAAccessoryDidDisconnectNotification
                                              object:nil
                                               queue:nil
                                          usingBlock:^(NSNotification * _Nonnull note) {
                                              // Do something what you want
}];


此外,除了注册通知,框架还提供了Delegate的回调方式,遵守EAAccessoryDelegate协议,并实现accessoryDidDisconnect:这个方法。

1.2 识别硬件
设备连接之后,需要通过「协议」来识别硬件的身份,协议本质上就是一个字符串,一个由反向域名组成的字符串,例如om.apple.myProtocol。而这个协议(字符串)的定义,是由硬件的生产厂商定义的,所以App开发人员,要和厂商沟通拿到这部分的资料。我们需要进行如下操作:
  1. #import <ExternalAccessory/ExternalAccessory.h>

  2. 使用UISupportedExternalAccessoryProtocols键在Info.plist中声明支持的协议,值为数组,数组的元素为支持的协议,元素的顺序任意且不限数量。 如下是官方文档中对UISupportedExternalAccessoryProtocols的介绍:

     UISupportedExternalAccessoryProtocols (Array - iOS) Specifies the protocols that your app supports and can use to communicate with external accessory hardware. Each item in the array is a string listing the name of a supported communications protocol. Your app can include any number of protocols in this list and the protocols can be in any order. The system does not use this list to determine which protocol your app should choose; it uses it only to determine if your app is capable of communicating with the accessory. It is up to your code to choose an appropriate communications protocol when it begins talking to the accessory.This key is supported in iOS 3.0 and later. For more information about communicating with external accessories, see External Accessory Programming Topics.

  3. 在delegate中遍历所有已经连接的设备

    - (void)accessoryDidConnect:(NSNotification *)notification{
    
        NSArray *connectedAccessories = [[EAAccessoryManager sharedAccessoryManager] connectedAccessories];
    
        for(EAAccessory *accessory in connectedAccessories){
    
            protocolString = accessory.protocolStrings;//协议
            manufacturer = accessory.manufacturer;//制造商
            name = accessory.name;//名字
            firmwareRevision = accessory.firmwareRevision;//固件型号
    
        }
    }

    或者在通告Block回调中,NSNotification * _Nonnull note这个参数,包含了EAAccessory对象,我们也可以直接通过EAAccessoryKey这个key拿到EAAccessory对象。

1.3 传输数据

创建EASession、打开输入、输出通道。 App和外围设备通讯、数据传输,靠的是NSInputStream和NSOutputStream对象,而这两个对象是EASession的两个属性。所以我们要创建EASession对象。

- (BOOL)openSession {
    // 根据已经连接的EAAccessory对象和这个协议(反向域名字符串)来创建EASession对象,并打开输入、输出通道
    self.session = [[EASession alloc] initWithAccessory:self.accessory forProtocol:protocolString];
    if(self.session != nil) {
        // open input stream
        self.session.inputStream.delegate = self;
        [self.session.inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
        [self.session.inputStream open];
        // open output stream
        self.session.outputStream.delegate = self;
        [self.session.outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
        [self.session.outputStream open];
    }
    else {
        NSLog(@"Failed to create session");
    }
    return (nil != self.session);

}

注意上面遵守的NSStreamDelegate协议,这里就是利用delegate回调来监听input stream和output stream的数据。

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
     switch (eventCode) {
         case NSStreamEventNone:
             break;
         case NSStreamEventOpenCompleted:
             break;
         case NSStreamEventHasBytesAvailable:
             //NSLog(@"Input stream is ready");
             // 接收到硬件数据了,根据指令定义对数据进行解析。
             [self readFromDevice];
             break;
         case NSStreamEventHasSpaceAvailable:
             //NSLog(@"Output stream is ready");
             // 可以发送数据给硬件了
             [self writeToDevice];
             break;
         case NSStreamEventErrorOccurred:
             break;
         case NSStreamEventEndEncountered:
             break;
         default:
             break;
     }
 }

  • HasBytesAvailable:表示stream中有数据需要读取(硬件发送了数据给App)
  • HasSpaceAvailable:表示stream中可以接收数据的写入(App发送了数据给硬件)

三、carplay

苹果carplay官方文档  https://developer.apple.com/design/human-interface-guidelines/carplay/overview/introduction/ 目前只支持Audio Apps,Automaker Apps,Messaging and VoIP Apps三类APP,iOS 12会支持导航类APP。

最后

以上就是甜甜抽屉为你收集整理的iOS APP跟外设连接的学习研究iOS APP跟外设连接的学习研究的全部内容,希望文章能够帮你解决iOS APP跟外设连接的学习研究iOS APP跟外设连接的学习研究所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部