• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

            路漫漫,長(zhǎng)修遠(yuǎn),我們不能沒有錢
            隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
            數(shù)據(jù)加載中……

            關(guān)于iphone accessory的理解

            轉(zhuǎn)載自cocoachina http://www.cocoachina.com

            首先,如果我們的應(yīng)用程序想跟外設(shè)傳輸數(shù)據(jù),先要透過iphone的操作系統(tǒng),也就是iphoneOS,而最開始的認(rèn)證過程也是在外設(shè)和iphoneOS之間發(fā)生的,蘋果為這個(gè)過程提供了一顆認(rèn)證芯片(這顆芯片的作用是用來讓iphoneOS識(shí)別這個(gè)外設(shè)是經(jīng)過蘋果公司承認(rèn)的,他的通信方式是I2C總線,而且每出一個(gè)產(chǎn)品蘋果都會(huì)收幾美元的認(rèn)證費(fèi)用,蘋果用心何其毒也~~~)
                      IphoneOS承認(rèn)外設(shè)分兩個(gè)步驟,識(shí)別和認(rèn)證,我們先說說識(shí)別過程。
                      識(shí)別過程是使用純物理連接來實(shí)現(xiàn)的,在這個(gè)過程中iphone的30pin有三個(gè)引腳被用到,分別是Accessory Identify,Accessory Detect,Accessory Power,Accessory Identify接549k歐姆的電阻,告知iphoneOS使用串口通信,Accessory Detect直接接地,告知iphoneOS有外設(shè)插入,Accessory Power相當(dāng)于iphoneOS的信號(hào),待機(jī)時(shí)這個(gè)引腳沒有輸出,否則會(huì)有3.3V的電壓輸出。如果按照以上連接就完成了識(shí)別過程。
                     下面開始認(rèn)證過程,認(rèn)證過程也叫IDPS過程,這些就牽扯到蘋果指定的通信協(xié)議了,蘋果給自己的通信協(xié)議起了一個(gè)名字叫Lingo,Lingo分好多種有音頻的lingo還有顯示遙控的lingo,而我們認(rèn)證使用的lingo叫做General Lingo。可能大家這時(shí)有點(diǎn)暈,那我就給大家看一個(gè)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    校驗(yàn)
            這是iphone的命令包,大家看到這個(gè)應(yīng)該就明白了。開始IDPS過程首先要發(fā)送StartIDPS命令,這樣,外設(shè)與iphoneOS之間的認(rèn)證過程就開始了。其中咱們應(yīng)用中EAAccessory關(guān)于一些外設(shè)的屬性,都是在這個(gè)過程中外設(shè)發(fā)給操作系統(tǒng)的,具體還是大家加入蘋果的mfi(made for ipod),拿到資料后,才能更明白。稍后我會(huì)將iphone串口通信的源碼發(fā)出來。

            MFI地址:http://developer.apple.com/programs/mfi/



            以下部分轉(zhuǎn)載自<iphone應(yīng)用編程指南>

            和配件進(jìn)行通訊

            在iPhone OS 3.0及之后的系統(tǒng)上,External Accessory框架(ExternalAccessory.framework)提供了一種管道機(jī)制,使應(yīng)用程序可以和iPhone或iPod touch設(shè)備的配件進(jìn)行通訊。通過這種管道,應(yīng)用程序開發(fā)者可以將配件級(jí)別的功能集成到自己的程序中。

            請(qǐng)注意:下面部分將向您展示iPhone應(yīng)用程序如何連接配件。如果您有興趣成為iPhone或iPod touch配件的開發(fā)者,可以在http://developer.apple.com網(wǎng)站上找到相應(yīng)的信息。

            為了使用External Accessory框架的接口,您必須將ExternalAccessory.framework加入到Xcode工程,并連接到相應(yīng)的目標(biāo)中。此外,還需要在相應(yīng)的源代碼文件的頂部包含一個(gè)#import <ExternalAccessory/ExternalAccessory.h>語(yǔ)句,才能訪問該框架的類和頭文件。有關(guān)如何為工程添加框架的更多信息,請(qǐng)參見Xcode工程管理指南中的工程中的文件部分;有關(guān)External Accessory框架中類的一般信息,請(qǐng)參見External Accessory框架參考


            配件的基礎(chǔ)

            在和配件進(jìn)行通訊之前,需要與配件的制造商緊密合作,理解配件提供的服務(wù)。制造商必須在配件的硬件中加入顯式的支持,才能和iPhone OS進(jìn)行通訊。作為這種支持的一部分,配件必須支持至少一種命令協(xié)議,也就是支持一種定制的通訊模式,使配件和應(yīng)用程序之間可以進(jìn)行數(shù)據(jù)傳輸。蘋果并不維護(hù)一個(gè)協(xié)議的注冊(cè)表,支持何種協(xié)議及是否使用其他制造商支持的定制或標(biāo)準(zhǔn)協(xié)議是由制造商自行決定的。

            作為和配件制造商通訊的一部分,您必須找出給定的配件支持什么協(xié)議。為了避免名字空間發(fā)生沖突,協(xié)議的名稱由反向的DNS字符串來指定,形式是com.apple.myProtocol。這使得每個(gè)配件制造商都可以根據(jù)自己的需要定義協(xié)議,以支持不同的配件產(chǎn)品線。

            應(yīng)用程序通過打開一個(gè)使用指定協(xié)議的會(huì)話來和配件進(jìn)行通訊。打開會(huì)話的方法是創(chuàng)建一個(gè)EASession類的實(shí)例,該類中包含NSInputStreamNSOutputStream對(duì)象,可以和配件進(jìn)行通訊。通過這些流對(duì)象,應(yīng)用程序可以向配件發(fā)送未經(jīng)加工的數(shù)據(jù)包,以及接收來自配件的類似數(shù)據(jù)包。因此,您必須按照期望的協(xié)議來理解每個(gè)數(shù)據(jù)包的格式。

            聲明應(yīng)用程序支持的協(xié)議

            能夠和配件通訊的應(yīng)用程序應(yīng)該在其Info.plist文件中聲明支持的協(xié)議,使系統(tǒng)知道在相應(yīng)的配件接入時(shí),該應(yīng)用程序可以被啟動(dòng)。如果當(dāng)前沒有應(yīng)用程序可以支持接入的配件,系統(tǒng)可以選擇啟動(dòng)App Store并指向支持該設(shè)備的應(yīng)用程序。

            為了聲明支持的協(xié)議,您必須在應(yīng)用程序的Info.plist文件中包含UISupportedExternalAccessoryProtocols鍵。該鍵包含一個(gè)字符串數(shù)組,用于標(biāo)識(shí)應(yīng)用程序支持的通訊協(xié)議。您的應(yīng)用程序可以在這個(gè)列表中以任意順序包含任意數(shù)量的協(xié)議。系統(tǒng)并不使用這個(gè)列表來確定應(yīng)用程序應(yīng)該選擇哪個(gè)協(xié)議,而只是用它來確定應(yīng)用程序是否能夠和相應(yīng)的配件進(jìn)行通訊。您的代碼需要在開始和配件進(jìn)行對(duì)話時(shí)選擇適當(dāng)?shù)耐ㄓ崊f(xié)議。

            在運(yùn)行時(shí)連接配件

            在配件接入系統(tǒng)并做好通訊準(zhǔn)備之前,通過External Accessory框架無法看到配件。當(dāng)配件變?yōu)榭梢姇r(shí),您的應(yīng)用程序就可以獲取相應(yīng)的配件對(duì)象,然后用其支持的一或多個(gè)協(xié)議打開會(huì)話。

            共享的EAAccessoryManager對(duì)象為應(yīng)用程序?qū)ふ遗c之通訊的配件提供主入口點(diǎn)。該類包含一個(gè)已經(jīng)接入的配件對(duì)象的數(shù)組,您可以對(duì)其進(jìn)行枚舉,看看是否存在應(yīng)用程序支持的配件。EAAccessory對(duì)象中的絕大多數(shù)信息(比如名稱、制造商、和型號(hào)信息)都只是用于顯示。如果您要確定應(yīng)用程序是否可以連接一個(gè)配件,必須看配件的協(xié)議,確認(rèn)應(yīng)用程序是否支持其中的某個(gè)協(xié)議。

            請(qǐng)注意:多個(gè)配件對(duì)象支持同一協(xié)議是可能的。如果發(fā)生這種情況,您的代碼必須負(fù)責(zé)選擇使用哪個(gè)配件對(duì)象。

            對(duì)于給定的配件對(duì)象,每次只能有一個(gè)指定協(xié)議的會(huì)話。EAAccessory對(duì)象的protocolStrings屬性包含一個(gè)字典,字典的鍵是配件支持的協(xié)議。如果您試圖用一個(gè)已經(jīng)在使用的協(xié)議創(chuàng)建會(huì)話,External Accessory框架就會(huì)產(chǎn)生錯(cuò)誤。

            程序清單8-1展示了如何檢查接入配件的列表并從中取得應(yīng)用程序支持的第一個(gè)配件。它為指定的協(xié)議創(chuàng)建一個(gè)會(huì)話,并對(duì)會(huì)話的輸入和輸出流進(jìn)行配置。在這個(gè)方法返回會(huì)話對(duì)象時(shí),已經(jīng)完成和配件的連接,并可以開始發(fā)送和接收數(shù)據(jù)了。


            程序清單8-1  創(chuàng)建和配件的通訊會(huì)話

            - (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;
            }

             

            在配置好輸入輸出流之后,最好一步就是處理和流相關(guān)的數(shù)據(jù)了。程序清單8-2展示了在委托方法中處理流事件的基本代碼結(jié)構(gòu)。清單中的方法可以響應(yīng)來自配件輸入輸出流的事件。當(dāng)配件向應(yīng)用程序發(fā)送數(shù)據(jù)時(shí),事件發(fā)生表示有數(shù)據(jù)可供讀取;類似地,當(dāng)配件準(zhǔn)備好接收應(yīng)用程序數(shù)據(jù)時(shí),也通過事件來表示(當(dāng)然,您并不一定要等到這個(gè)事件發(fā)生才向流寫出數(shù)據(jù),應(yīng)用程序也可以調(diào)用流的hasBytesAvailable方法來確認(rèn)配件是否還能夠接收數(shù)據(jù))。有關(guān)流及如何處理流事件的更多信息,請(qǐng)參見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;
                }
            }

             

            監(jiān)控與配件有關(guān)的事件

            當(dāng)配件接入或斷開時(shí),External Accessory框架都可以發(fā)送通告。但是這些通告并不自動(dòng)發(fā)送,如果您的應(yīng)用程序感興趣,必須調(diào)用EAAccessoryManager類的registerForLocalNotifications方法來顯式請(qǐng)求。當(dāng)配件接入、認(rèn)證、并準(zhǔn)備好和應(yīng)用程序進(jìn)行交互時(shí),框架可以發(fā)出一個(gè)EAAccessoryDidConnectNotification通告;而當(dāng)配件斷開時(shí),框架則可以發(fā)送一個(gè)EAAccessoryDidDisconnectNotification通告。您可以通過缺省的NSNotificationCenter來注冊(cè)接收這些通告。兩種通告都包含受影響的配件的信息。

            除了通過缺省的通告中心接收通告之外,當(dāng)前正在和配件進(jìn)行交互的應(yīng)用程序可以為相應(yīng)的EAAccessory對(duì)象分配一個(gè)委托,使它在發(fā)生變化的時(shí)候得到通知。委托對(duì)象必須遵循EAAccessoryDelegate協(xié)議,該協(xié)議目前包含名為accessoryDidDisconnect:的可選方法,您可以通過這個(gè)方法來接收配件斷開通告,而不需要事先配置通告觀察者。

            有關(guān)如何注冊(cè)接收通告的更多信息,請(qǐng)參見Cocoa通告編程主題



            posted on 2011-10-09 14:47 Khan 閱讀(3501) 評(píng)論(0)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺(tái)開發(fā)周邊技術(shù)

            狠狠综合久久综合中文88 | 99久久人妻无码精品系列蜜桃 | 伊人久久亚洲综合影院| 欧美va久久久噜噜噜久久| 亚洲国产精品一区二区三区久久| 久久精品综合网| 久久久久久久综合狠狠综合| 久久精品国产亚洲精品2020 | 久久久噜噜噜久久| 国产精品久久久99| 国内精品久久久久久不卡影院 | 一本色综合网久久| 久久综合久久综合亚洲| 国产精品久久久久影院嫩草| 成人免费网站久久久| 香蕉久久久久久狠狠色| 久久久久久久综合日本亚洲| 91精品国产综合久久四虎久久无码一级 | 久久综合88熟人妻| 欧美成a人片免费看久久| 久久精品国产精品青草app| 久久亚洲精品视频| 99久久夜色精品国产网站| 久久久久久国产精品美女| 亚洲一级Av无码毛片久久精品| 国产精品99精品久久免费| 77777亚洲午夜久久多人| 久久久久99精品成人片三人毛片 | 久久精品亚洲一区二区三区浴池 | 人妻丰满AV无码久久不卡 | 国产精品亚洲综合专区片高清久久久| 一本一本久久a久久综合精品蜜桃| 开心久久婷婷综合中文字幕| 亚洲国产成人久久综合碰碰动漫3d| 久久精品国产第一区二区三区| 亚洲乱码中文字幕久久孕妇黑人| 东京热TOKYO综合久久精品| 日产精品99久久久久久| 麻豆成人久久精品二区三区免费 | 99久久综合国产精品免费| 精品熟女少妇av免费久久|