iphone 配件通信
2014-08-13 09:01
190 查看
在iPhoneOS3.0及之后的系统上,ExternalAccessory框架
touch设备的配件进行通讯。通过这种管道,应用程序开发者可以将配件级别的功能集成到自己的程序中。
请注意:下面部分将向您展示iPhone应用程序如何连接配件。如果您有兴趣成为iPhone或iPodtouch配件的开发者,可以在http://developer.apple.com网站上找到相应的信息。
为了使用ExternalAccessory框架的接口,您必须将Xcode工程管理指南中的工程中的文件部分;有关External
Accessory框架中类的一般信息,请参见External
Accessory框架参考。
在和配件进行通讯之前,需要与配件的制造商紧密合作,理解配件提供的服务。制造商必须在配件的硬件中加入显式的支持,才能和iPhoneOS进行通讯。作为这种支持的一部分,配件必须支持至少一种命令协议,也就是支持一种定制的通讯模式,使配件和应用程序之间可以进行数据传输。苹果并不维护一个协议的注册表,支持何种协议及是否使用其他制造商支持的定制或标准协议是由制造商自行决定的。
作为和配件制造商通讯的一部分,您必须找出给定的配件支持什么协议。为了避免名字空间发生冲突,协议的名称由反向的DNS字符串来指定,形式是
应用程序通过打开一个使用指定协议的会话来和配件进行通讯。打开会话的方法是创建一个
能够和配件通讯的应用程序应该在其
为了声明支持的协议,您必须在应用程序的数组,用于标识应用程序支持的通讯协议。您的应用程序可以在这个列表中以任意顺序包含任意数量的协议。系统并不使用这个列表来确定应用程序应该选择哪个协议,而只是用它来确定应用程序是否能够和相应的配件进行通讯。您的代码需要在开始和配件进行对话时选择适当的通讯协议。
在配件接入系统并做好通讯准备之前,通过ExternalAccessory框架无法看到配件。当配件变为可见时,您的应用程序就可以获取相应的配件对象,然后用其支持的一或多个协议打开会话。
共享的枚举,看看是否存在应用程序支持的配件。
请注意:多个配件对象支持同一协议是可能的。如果发生这种情况,您的代码必须负责选择使用哪个配件对象。
对于给定的配件对象,每次只能有一个指定协议的会话。字典,字典的键是配件支持的协议。如果您试图用一个已经在使用的协议创建会话,External
Accessory框架就会产生错误。
程序清单8-1展示了如何检查接入配件的列表并从中取得应用程序支持的第一个配件。它为指定的协议创建一个会话,并对会话的输入和输出流进行配置。在这个方法返回会话对象时,已经完成和配件的连接,并可以开始发送和接收数据了。
程序清单8-1 创建和配件的通讯会话
在配置好输入输出流之后,最好一步就是处理和流相关的数据了。程序清单8-2展示了在委托方法中处理流事件的基本代码结构。清单中的方法可以响应来自配件输入输出流的事件。当配件向应用程序发送数据时,事件发生表示有数据可供读取;类似地,当配件准备好接收应用程序数据时,也通过事件来表示(当然,您并不一定要等到这个事件发生才向流写出数据,应用程序也可以调用流的Cocoa流编程指南。
程序清单8-2 处理流事件
当配件接入或断开时,ExternalAccessory框架都可以发送通告。但是这些通告并不自动发送,如果您的应用程序感兴趣,必须调用EAAccessoryManager类的registerForLocalNotifications方法来显式请求。当配件接入、认证、并准备好和应用程序进行交互时,框架可以发出一个
除了通过缺省的通告中心接收通告之外,当前正在和配件进行交互的应用程序可以为相应的委托,使它在发生变化的时候得到通知。委托对象必须遵循协议,该协议目前包含名为
有关如何注册接收通告的更多信息,请参见Cocoa通告编程主题。
(ExternalAccessory.framework)提供了一种管道机制,使应用程序可以和iPhone或iPod
touch设备的配件进行通讯。通过这种管道,应用程序开发者可以将配件级别的功能集成到自己的程序中。
请注意:下面部分将向您展示iPhone应用程序如何连接配件。如果您有兴趣成为iPhone或iPodtouch配件的开发者,可以在
为了使用ExternalAccessory框架的接口,您必须将
ExternalAccessory.framework加入到Xcode工程,并连接到相应的目标中。此外,还需要在相应的源代码文件的顶部包含一个
#import <ExternalAccessory/ExternalAccessory.h>语句,才能访问该框架的类和头文件。有关如何为工程添加框架的更多信息,请参见
Accessory框架中类的一般信息,请参见External
Accessory框架参考。
配件的基础
在和配件进行通讯之前,需要与配件的制造商紧密合作,理解配件提供的服务。制造商必须在配件的硬件中加入显式的支持,才能和iPhoneOS进行通讯。作为这种支持的一部分,配件必须支持至少一种命令协议,也就是支持一种定制的通讯模式,使配件和应用程序之间可以进行数据传输。苹果并不维护一个协议的注册表,支持何种协议及是否使用其他制造商支持的定制或标准协议是由制造商自行决定的。作为和配件制造商通讯的一部分,您必须找出给定的配件支持什么协议。为了避免名字空间发生冲突,协议的名称由反向的DNS字符串来指定,形式是
com.apple.myProtocol。这使得每个配件制造商都可以根据自己的需要定义协议,以支持不同的配件产品线。
应用程序通过打开一个使用指定协议的会话来和配件进行通讯。打开会话的方法是创建一个
类的实例,该类中包含EASession
和NSInputStream
对象,可以和配件进行通讯。通过这些流对象,应用程序可以向配件发送未经加工的数据包,以及接收来自配件的类似数据包。因此,您必须按照期望的协议来理解每个数据包的格式。NSOutputStream
声明应用程序支持的协议
能够和配件通讯的应用程序应该在其Info.plist文件中声明支持的协议,使系统知道在相应的配件接入时,该应用程序可以被启动。如果当前没有应用程序可以支持接入的配件,系统可以选择启动AppStore并指向支持该设备的应用程序。
为了声明支持的协议,您必须在应用程序的
Info.plist文件中包含
UISupportedExternalAccessoryProtocols键。该键包含一个字符串
在运行时连接配件
在配件接入系统并做好通讯准备之前,通过ExternalAccessory框架无法看到配件。当配件变为可见时,您的应用程序就可以获取相应的配件对象,然后用其支持的一或多个协议打开会话。共享的
对象为应用程序寻找与之通讯的配件提供主入口点。该类包含一个已经接入的配件对象的数组,您可以对其进行EAAccessoryManager
对象中的绝大多数信息(比如名称、制造商、和型号信息)都只是用于显示。如果您要确定应用程序是否可以连接一个配件,必须看配件的协议,确认应用程序是否支持其中的某个协议。EAAccessory
请注意:多个配件对象支持同一协议是可能的。如果发生这种情况,您的代码必须负责选择使用哪个配件对象。
对于给定的配件对象,每次只能有一个指定协议的会话。
EAAccessory对象的
属性包含一个protocolStrings
Accessory框架就会产生错误。
程序清单8-1展示了如何检查接入配件的列表并从中取得应用程序支持的第一个配件。它为指定的协议创建一个会话,并对会话的输入和输出流进行配置。在这个方法返回会话对象时,已经完成和配件的连接,并可以开始发送和接收数据了。
程序清单8-1 创建和配件的通讯会话
-(EASession*)openSessionForProtocol:(NSString*)protocolString |
{ |
NSArray*accessories=[[EAAccessoryManagersharedAccessoryManager] |
connectedAccessories]; |
EAAccessory*accessory=nil; |
EASession*session=nil; |
for(EAAccessory*objinaccessories) |
{ |
if([[objprotocolStrings]containsObject:protocolString]) |
{ |
accessory=obj; |
break; |
} |
} |
if(accessory) |
{ |
session=[[EASessionalloc]initWithAccessory:accessory |
forProtocol:protocolString]; |
if(session) |
{ |
[[sessioninputStream]setDelegate:self]; |
[[sessioninputStream]scheduleInRunLoop:[NSRunLoopcurrentRunLoop] |
forMode:NSDefaultRunLoopMode]; |
[[sessioninputStream]open]; |
[[sessionoutputStream]setDelegate:self]; |
[[sessionoutputStream]scheduleInRunLoop:[NSRunLoopcurrentRunLoop] |
forMode:NSDefaultRunLoopMode]; |
[[sessionoutputStream]open]; |
[sessionautorelease]; |
} |
} |
returnsession; |
} |
方法来确认配件是否还能够接收数据)。有关流及如何处理流事件的更多信息,请参见hasBytesAvailable
程序清单8-2 处理流事件
//Handlecommunicationsfromthestreams. |
-(void)stream:(NSStream*)theStreamhandleEvent:(NSStreamEvent)streamEvent |
{ |
switch(streamEvent) |
{ |
caseNSStreamHasBytesAvailable: |
//Processtheincomingstreamdata. |
break; |
caseNSStreamEventHasSpaceAvailable: |
//Sendthenextqueuedcommand. |
break; |
default: |
break; |
} |
} |
监控与配件有关的事件
当配件接入或断开时,ExternalAccessory框架都可以发送通告;而当配件断开时,框架则可以发送一个EAAccessoryDidConnectNotification
通告。您可以通过缺省的EAAccessoryDidDisconnectNotification
来注册接收这些通告。两种通告都包含受影响的配件的信息。NSNotificationCenter
除了通过缺省的通告中心接收通告之外,当前正在和配件进行交互的应用程序可以为相应的
EAAccessory对象分配一个
EAAccessoryDelegate
的可选方法,您可以通过这个方法来接收配件断开通告,而不需要事先配置通告观察者。accessoryDidDisconnect:
有关如何注册接收通告的更多信息,请参见
相关文章推荐
- linux设备如何通过USB网络共享与手机通信(包含安卓手机以及iphone)
- iPhone和ESFramework通信的Demo
- iphone ios 消息通信机制NSNotificationCenter
- iphone消息通信机制NSNotificationCenter
- 基于REST协议实现iPhone和Google App Engine之间的通信
- iPhone通过usb与windows实现通信
- iphone ios 消息通信机制NSNotificationCenter
- iphone socket通信 ~
- 容量提升16.5% 新iPhone电池配件曝光
- Apple Watch(手表)与iPhone(iOS App)通信原理
- iOS 设备与其配件间的通信
- Qt for ios开发:iPhone锁屏后解锁,发现软件无法与服务器通信
- iphone守护进程和前台进程之间的通信-前台应用发信息给后台的守护进程
- iPhone开发之—守护进程和前台进程之间的通信-前台应用发信息给后台的守护进程
- PC与iPhone间的通信方式(草)
- iPhone 掌握蓝牙通信编程
- iPhone旋转式摄影配件:集广角、长焦及鱼眼镜头于一身
- iphone和http服务器的通信(详细)
- 嵌入式linux和iphone实现无线网卡点对点通信
- Ituns与iphone的通信协议usbmuxd解析