1、前言
一般 iOS 开发者做 App 开发大部分时候都是通过 Http(s) 请求跟后台服务器打交道,做一些信息展示和用户交互。很少涉及到去跟外部硬件设备连接的开发。随着近年来车联网和物联网的兴起,智能家居和智能硬件的逐步火热,越来越多的 App 被开发出来,用来跟硬件设备进行来连接,获取硬件相关信息展示或者发送指令控制硬件来提供服务。本文就针对 iOS 的 App 如何跟外部设备进行连接通信这个问题进行讲解。
-
如下图所示,iOS App 连接外设的常用方式可以分为三大类:
2、通过网络端口通信
建立 Socket 使用 TCP/IP 协议族进行通信,天然支持多通道,想要几个通道就建几个 socket 就行了。
关于如何使用 Socket 进行 TCP、UDP,推荐 github 上的开源项目 CocoaAsyncSocket。
通过网络端口通信主要有三种方式:Wi-Fi 连接、USB 热点共享连接、NCM 连接。
2.1 Wi-Fi 连接
优点是:简单,不需要集成 MFi 芯片,只要对应的硬件有无线网卡,然后手机和硬件连接到同一个局域网中就可以使用 socket 通过网络协议通信了。
- 缺点也很明显:
- 无线连接信号容易受到干扰,不太稳定,容易断开。
- 如果硬件使用的场合没有公共 wifi,就需要手机自建热点共享,硬件进行热点接入,操作步骤较多,对用户来说学习使用成本较高,并且热点共享要求手机本身的数据移动网络是稳定的,在没有移动数据网络信号的地方,热点无法建立。
2.2 USB 热点共享连接
这个其实跟 Wi-Fi 中的热点共享非常类似,也不需要集成 MFI 芯片,区别就是 USB 线共享热点,走的是有线,不容易受到干扰,更稳定,而且 iPhone 可以边使用边充电;
缺点也是操作步骤比较复杂,需要先打开个人热点共享。
2.3 NCM 连接
就是把 USB 端口虚拟成标准的网络端口,然后手机和外设就能通过有线网络直连了,可以理解成手机和外设通过一跟网线连起来了,然后就可以用 socket 通过 TCP,UDP 进行通信了。
它的优点是:有线连接,非常稳定,带宽足够;也不依赖移动网络信号。
但是它的缺点就是:需要集成 MFi 芯片并进行 MFi 认证,有一定门槛。更变态的是这么好的一种方式,苹果只允许它自己的 CarPlay 使用,如果硬件使用 NCM 跟其他 App 通信,是不能通过 MFi 认证的。
3、通过 EAP 方式通信
EAP 全拼是 External Accessory Protocol,外部设备协议。这个是苹果推荐使用的外设连接方式。需要外设集成 MFi 芯片进行 MFi 认证。
手机端开发相对简单,只要集成 iOS 系统提供的一个框架 ExternalAccessory.framework,并且在 info.plist 中配置好协议字符串(Supported external accessory protocols)。
当 iOS 设备通过 USB 线或者蓝牙连接到对应硬件时,iOS 系统会把符合 MFi 认证要求的外设抽象成了一个流对象,App 通过指定的协议字符串来创建一个 EASession 类的实例来访问到该流对象,就能通过 NSInputStream 和 NSOutputStream 跟硬件件进行通信了。
它有两种模式,一种是叫 EASession 的模式,它带宽相对较低,但是允许同时通过多个协议字符串创建多个会话,也就是说直接支持多个通道;另外一种是 Native Transport 的模式,这种模式的优点是带宽足够大,理论值是 100MB 以上,但是不支持多通道,如果业务层需要支持多数据通道的话需要 App 自己进行通道的复用与拆分,并且 Native Transport 需要 iPhone 工作在 USB host 模式,硬件需要支持 USB 模式切换。
关于如何使用 EAP 跟外部设备进行通信,可以参考苹果官方的 demo 进行入门和学习。
4、通过 BLE 方式通信
BLE 即低功耗蓝牙,是 iOS7.0 以后才支持的连接方式。
它的优点是不需要集成 MFi 芯片做认证,功耗低。手机端开发也相对简单,集成 iOS 系统提供的 CoreBluetooth.framework 就行。缺点是:带宽很低,一般适合于只需要传输少量数据的场景。比如前两年非常火爆的各种所谓智能硬件,像智能水杯,智能体重计,运动手环等,都是采用这种连接方式。
关于 BLE 的具体使用见 iOS - Bluetooth 蓝牙。