首先,如果我们的应用程序想跟外设传输数据,先要透过iphone的操作系统,也就是iphoneOS,而最开始的认证过程也是在外设和iphoneOS之间发生的,苹果为这个过程提供了一颗认证芯片(这颗芯片的作用是用来让iphoneOS识别这个外设是经过苹果公司承认的,他的通信方式是I2C总线,而且每出一个产品苹果都会收几美元的认证费用,苹果用心何其毒也~~~)
          IphoneOS承认外设分两个步骤,识别和认证,我们先说说识别过程。
          识别过程是使用纯物理连接来实现的,在这个过程中iphone的30pin有三个引脚被用到,分别是Accessory Identify,Accessory Detect,Accessory Power,Accessory Identify接549k欧姆的电阻,告知iphoneOS使用串口通信,Accessory Detect直接接地,告知iphoneOS有外设插入,Accessory Power相当于iphoneOS的信号,待机时这个引脚没有输出,否则会有3.3V的电压输出。如果按照以上连接就完成了识别过程。
         下面开始认证过程,认证过程也叫IDPS过程,这些就牵扯到苹果指定的通信协议了,苹果给自己的通信协议起了一个名字叫Lingo,Lingo分好多种有音频的lingo还有显示遥控的lingo,而我们认证使用的lingo叫做General Lingo。可能大家这时有点晕,那我就给大家看一个iphone的命令包。
StartIDPS packet
Byte     Value    Comment
0            0XFF    Sync byte(required only for UART serial)
1            0X55    Start of packet(SOP)
2            0XNN    Length of packet payload
3            0X00    General Lingo
4            0X38    StartIDPS
5            0XNN    transID [bit 15:8] Transaction ID 
6            0XNN    transID [bit 7:0]
7            0XNN    校验
这是iphone的命令包,大家看到这个应该就明白了。开始IDPS过程首先要发送StartIDPS命令,这样,外设与iphoneOS之间的认证过程就开始了。其中咱们应用中EAAccessory关于一些外设的属性,都是在这个过程中外设发给操作系统的,具体还是大家加入苹果的mfi(made for ipod),拿到资料后,才能更明白。稍后我会将iphone串口通信的源码发出来。
 
MFI地址:http://developer.apple.com/programs/mfi/

以下部分转载自<iphone应用编程指南>

和配件进行通讯

在iPhone OS 3.0及之后的系统上,External Accessory框架(ExternalAccessory.framework)提供了一种管道机制,使应用程序可以和iPhone或iPod touch设备的配件进行通讯。通过这种管道,应用程序开发者可以将配件级别的功能集成到自己的程序中。

请注意:下面部分将向您展示iPhone应用程序如何连接配件。如果您有兴趣成为iPhone或iPod touch配件的开发者,可以在http://developer.apple.com网站上找到相应的信息。

为了使用External Accessory框架的接口,您必须将ExternalAccessory.framework加入到Xcode工程,并连接到相应的目标中。此外,还需要在相应的源代码文件的顶部包含一个#import <ExternalAccessory/ExternalAccessory.h>语句,才能访问该框架的类和头文件。有关如何为工程添加框架的更多信息,请参见Xcode工程管理指南中的工程中的文件部分;有关External Accessory框架中类的一般信息,请参见External Accessory框架参考

配件的基础

在和配件进行通讯之前,需要与配件的制造商紧密合作,理解配件提供的服务。制造商必须在配件的硬件中加入显式的支持,才能和iPhone OS进行通讯。作为这种支持的一部分,配件必须支持至少一种命令协议,也就是支持一种定制的通讯模式,使配件和应用程序之间可以进行数据传输。苹果并不维护一个协议的注册表,支持何种协议及是否使用其他制造商支持的定制或标准协议是由制造商自行决定的。

作为和配件制造商通讯的一部分,您必须找出给定的配件支持什么协议。为了避免名字空间发生冲突,协议的名称由反向的DNS字符串来指定,形式是com.apple.myProtocol。这使得每个配件制造商都可以根据自己的需要定义协议,以支持不同的配件产品线。

应用程序通过打开一个使用指定协议的会话来和配件进行通讯。打开会话的方法是创建一个EASession类的实例,该类中包含NSInputStreamNSOutputStream对象,可以和配件进行通讯。通过这些流对象,应用程序可以向配件发送未经加工的数据包,以及接收来自配件的类似数据包。因此,您必须按照期望的协议来理解每个数据包的格式。

声明应用程序支持的协议

能够和配件通讯的应用程序应该在其Info.plist文件中声明支持的协议,使系统知道在相应的配件接入时,该应用程序可以被启动。如果当前没有应用程序可以支持接入的配件,系统可以选择启动App Store并指向支持该设备的应用程序。

为了声明支持的协议,您必须在应用程序的Info.plist文件中包含UISupportedExternalAccessoryProtocols键。该键包含一个字符串数组,用于标识应用程序支持的通讯协议。您的应用程序可以在这个列表中以任意顺序包含任意数量的协议。系统并不使用这个列表来确定应用程序应该选择哪个协议,而只是用它来确定应用程序是否能够和相应的配件进行通讯。您的代码需要在开始和配件进行对话时选择适当的通讯协议。

在运行时连接配件

在配件接入系统并做好通讯准备之前,通过External Accessory框架无法看到配件。当配件变为可见时,您的应用程序就可以获取相应的配件对象,然后用其支持的一或多个协议打开会话。

共享的EAAccessoryManager对象为应用程序寻找与之通讯的配件提供主入口点。该类包含一个已经接入的配件对象的数组,您可以对其进行枚举,看看是否存在应用程序支持的配件。EAAccessory对象中的绝大多数信息(比如名称、制造商、和型号信息)都只是用于显示。如果您要确定应用程序是否可以连接一个配件,必须看配件的协议,确认应用程序是否支持其中的某个协议。

请注意:多个配件对象支持同一协议是可能的。如果发生这种情况,您的代码必须负责选择使用哪个配件对象。

对于给定的配件对象,每次只能有一个指定协议的会话。EAAccessory对象的protocolStrings属性包含一个字典,字典的键是配件支持的协议。如果您试图用一个已经在使用的协议创建会话,External Accessory框架就会产生错误。

程序清单8-1展示了如何检查接入配件的列表并从中取得应用程序支持的第一个配件。它为指定的协议创建一个会话,并对会话的输入和输出流进行配置。在这个方法返回会话对象时,已经完成和配件的连接,并可以开始发送和接收数据了。

程序清单8-1  创建和配件的通讯会话

- (EASession *)openSessionForProtocol:(NSString *)protocolString{
    NSArray *accessories = [[EAAccessoryManager sharedAccessoryManager]
                                   connectedAccessories];
    EAAccessory *accessory = nil;
    EASession *session = nil;
 
    for (EAAccessory *obj in accessories) {
        if ([[obj protocolStrings] containsObject:protocolString]) {
            accessory = obj;
            break;
        }
    }
 
    if (accessory) {
        session = [[EASession alloc] initWithAccessory:accessory
                                 forProtocol:protocolString];
        if (session) {
            [[session inputStream] setDelegate:self];
            [[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                     forMode:NSDefaultRunLoopMode];
            [[session inputStream] open];
            [[session outputStream] setDelegate:self];
            [[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                     forMode:NSDefaultRunLoopMode];
            [[session outputStream] open];
            [session autorelease];
        }
    }
    return session;
}
 

在配置好输入输出流之后,最好一步就是处理和流相关的数据了。程序清单8-2展示了在委托方法中处理流事件的基本代码结构。清单中的方法可以响应来自配件输入输出流的事件。当配件向应用程序发送数据时,事件发生表示有数据可供读取;类似地,当配件准备好接收应用程序数据时,也通过事件来表示(当然,您并不一定要等到这个事件发生才向流写出数据,应用程序也可以调用流的hasBytesAvailable方法来确认配件是否还能够接收数据)。有关流及如何处理流事件的更多信息,请参见Cocoa流编程指南

程序清单8-2  处理流事件

// Handle communications from the streams.
- (void)stream:(NSStream*)theStream handleEvent:(NSStreamEvent)streamEvent{
    switch (streamEvent){
        case NSStreamHasBytesAvailable:
            // Process the incoming stream data.
            break;
 
        case NSStreamEventHasSpaceAvailable:
            // Send the next queued command.
            break;
 
        default:
            break;
    }
}
 

监控与配件有关的事件

当配件接入或断开时,External Accessory框架都可以发送通告。但是这些通告并不自动发送,如果您的应用程序感兴趣,必须调用EAAccessoryManager类的registerForLocalNotifications方法来显式请求。当配件接入、认证、并准备好和应用程序进行交互时,框架可以发出一个EAAccessoryDidConnectNotification通告;而当配件断开时,框架则可以发送一个EAAccessoryDidDisconnectNotification通告。您可以通过缺省的NSNotificationCenter来注册接收这些通告。两种通告都包含受影响的配件的信息。

除了通过缺省的通告中心接收通告之外,当前正在和配件进行交互的应用程序可以为相应的EAAccessory对象分配一个委托,使它在发生变化的时候得到通知。委托对象必须遵循EAAccessoryDelegate协议,该协议目前包含名为accessoryDidDisconnect:的可选方法,您可以通过这个方法来接收配件断开通告,而不需要事先配置通告观察者。

有关如何注册接收通告的更多信息,请参见Cocoa通告编程主题

iOS 设备和外部配件的通讯的更多相关文章

  1. iOS开发--通过MultipeerConnectivity完成蓝牙通讯

    iOS开发–通过MultipeerConnectivity完成蓝牙通讯 iOS蓝牙通讯的三种方式: GameKit.framework:iOS7之前的蓝牙通讯框架,从iOS7开始过期,但是目前已经被淘 ...

  2. iOS开发的另类神器:libimobiledevice开源包【类似android adb 方便获取iOS设备信息】

    简介 libimobiledevice又称libiphone,是一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备.由于苹果官方并不支持Linux系统,但是Linux上 ...

  3. IOS设备 UIDevice 获取操作系统 版本 电量 临近手机触发消息检测 (真机亲测可用)

    - (void)viewDidLoad { [super viewDidLoad]; // 操作系统 NSString * osName =[[UIDevice currentDevice]syste ...

  4. 使用Safari远程调试iOS设备网页

    最近在做HTML 5游戏时,发布到手机上访问网页总是莫名其妙出现问题,苦于没有remote debug功能一直没有查找到问题. 这边博客详细介绍了iOS, Android, Windows Phone ...

  5. 使用Fiddler对Android或者iOS设备进行抓包

    1.PC端Fiddler配置 Tools->HTTPS->选中“Decrpt HTTPS traffic”,“Ignore server certificate errors” Tools ...

  6. 借助91助手,将ibook中的pdf文件拷贝至其它的pdf阅读器中(ios设备无需越狱)

    有时候在使用ios自带的ibook阅读pdf文件的时候,会发现ibook有些功能并不是那么方便.最近我就遇到了一例,我想在ibook中放一本比较大的pdf书,页数有几百吧,pdf文件本身每一章节都是有 ...

  7. iOS设备的尺寸

    iOS设备的尺寸有两种统计单位:像素和点,对于程序员来说,只需要记住点即可. 常见的iOS设备的尺寸(点) 分辨率(点) 设备 分辨率(像素) 320*480 4.4s 320*480(4) 640* ...

  8. 【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?

    本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架(相关推荐:APP被苹果A ...

  9. 不通过App Store,在iOS设备上直接安装应用程序(转)

    今天在iOS设备上安装天翼云存储app,在safari上直接打开http://cloud.189.cn/wap/index.jsp,点击“点击免费安装”,如下图: 神奇的事情发生了,设备上直接下载ap ...

随机推荐

  1. Android-adb相关

    最近做android开发遇到无法通过usb链接设备的情况,通过wifi连接设备调试也颇为方便 1.android 要root , 下载终端app  比如 BetterTerminal 2.通过以下命令 ...

  2. 【转】 iOS如何实现表格的折叠效果?

    原文 :  http://blog.csdn.net/youcanping2008/article/details/9202167 一.实现原理:就是在点击表格组头视图的时候,如果该表格视图的组展开了 ...

  3. ios 改变状态栏颜色

    http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7 stackoverfl ...

  4. 32.Spring-对象依赖.md

    [toc] 1.对象依赖的分类 Spring中,给对象属性赋值的方法: 构造函数 Set方法 p命名空间 自动装配 注解 1.1构造函数 构造方法通过配置文件中constructor-arg标签实现, ...

  5. Linux CentOS6.4下Mysql数据库的安装与配置

    一.mysql简介 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库,咱 ...

  6. ajax+XMLHttpRequest里的FormData实现图片异步上传

    发这篇博客的时候我是自己在研究这个XMLHttpRequest请求,在别人的博客上面知道XMLHttpRequest新加了一个FormData的东西,好像现在APP请求后台也有用这种方式的吧. 别的不 ...

  7. js中callee与caller的区别

    callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数首先我们来写个阶成函数:function chen(x){if (x<=1) {return 1;} else ...

  8. js 判断url的?后参数是否包含某个字符串

    function GetQueryString(name){    var reg=eval("/"+name+"/g");   var r = window. ...

  9. ASP.NET程序从IIS6移植到IIS7时出现500.22错误

    最可能的原因:  •    此应用程序在 system.web/httpModules 节中定义配置.  可尝试的操作:  •    将配置迁移到 system.webServer/modules 节 ...

  10. C语言结构体占用空间内存大小解析

    结构体的数据类型的有点我们就不啰嗦了,直接来看相同数据结构体的几种书写的格式吧. 格式一: 01.struct tagPhone 02.{ 03.     char   A; 04.     int  ...