You may delay, but time will not.

2月 03, 2010

iAP跟iPhone app的開發大小事

這幾天才把iAP (iPhone跟其accessory間的protoco)大致地搞定。也寫了個簡單的app在iPhone上,利用這個app可以控制跟iPhone連接的accessory的硬體。



這些動作在做demo的時候的確是滿簡單的。大概只花個一分鐘就可以demo完。不過卻花了我大概兩個月的時間去搞定iAP還有iPhone SDK的使用。但主要的時間是花在iAP這邊,因為手上沒有apple release的debug tool,所以中間封包傳遞時,每交換一次封包,我就得用人工的方式去確認寫的值及回傳的值是不是正確的。尤其中間iPhone在認證accessory時,accessory需要跟apple的認證晶片透過I2C溝通,取回認證碼,而這個認證碼的長度在幾百個byte甚至上千個byte時,這人工檢查實在是快搞死我 (哈 雖然這話是講給外行聽的 :p)。

在這開發的過程中,我已經儘量把iAP相關的code儘量寫得independent一點,希望在開發其它project時,可以直接拉過來做為library使用。但因為大部份時都花在驗證封包,所以有些地方還是很取巧沒考慮很週到,因此跟其它程式的關聯度個人是覺得還可以再低些。

再來是code size的問題,有幾個地方是有比較值得討論的地方。I2C的部份是用software完成的,所以這部份比較會增加到code size的大小。其它的部份是覺得對code size大小的幫助並不大。還有一個跟code size有關係的部份是,目前interrupt產生後,大部份的task都在interrupt中執行,如此不是一個很好的做法,但主要也是為了節省時間來賺取驗證封包的時間,也是不得不的法子。之後還是得改回loop execute的法子,雖然這會稍增加code size,但對系統來說仍是比較好的做法。可以目前8kb的code size快爆了,得先省一下。

接下來是iPhone app的部份。目前只用了很簡單的component來做demo之用。對於view及其controller還是覺得很霧裡看花。這裡是還可以改進的部份。這部份寫完真希望還有時間可以自已來寫個app。

41 則留言:

wiming 提到...

老實說看的霧煞煞,這是你的個人修業嗎?

allenC 提到...

不算吧 沒遇到困難的時候還滿好玩的 :p

林大寶 提到...

我男朋友也寫這些東西耶~~他是寫android的,你有空可不可以陪他討論一下阿 我覺得你一定很厲害

allenC 提到...

都可以啦 不過我都是亂摸的 :p

Justin.Huang 提到...

請問你用的iPhone是要jailbreak的嗎? 我以為要使用External Accessory framework來連接自己做的accessory需要註冊made for iPhone耶? 最近也在搞這個東西...

allenC 提到...

Hi Justin,
accessory那邊的程式的確是需要加入made for iPod才能看到相關的文件。而iPhone那邊的app我是也有加入ADC才能測試這app跟accessory的溝通是否正確,主要是因為要拿到bundleID。用jb的方式好像也行,不過我有用adc所以這邊就沒特別去研究了哩 :)

eric.libin@gmail.com 提到...

Hi,我也正在开发基于iPhone 3.0 UART的配件,可以交流一下除了需要iPhone SDK那些命令么?感激万分!

Unknown 提到...

您好,最近在研究external accessory framework。必须加入到MFI吗?

可是没有找到什么好的例子,能否给点意见呢?

allenC 提到...

Hi Eric,

在iPhone SDK中主要是使用external accessory framework這個framework做開發的 記得在ADC中也有份文件(不過我有點忘了)在講解如何以external accessory framework進行開發。

allenC 提到...

Hi Takujin,
如果只是單純使用external accessory framework,並不需要加入MFi。但是external accessory framework通常不能單獨使用,因為沒有對應利用iAP開發的accessory接在iPhone/iPod 30pins connector上的話,也看不出external accessory framework是否能夠順利運作。

shinren 提到...

你好
請問有能增測從30pin line in的audio的api嗎
找好久都找不到

allenC 提到...

Hi Shinren,
在iPhone SDK這塊,我不是很熟悉。歹勢,可能比較沒辨幫到你。

MarkTsai 提到...

請問你有加入MFi program?加入需要具備什麼資格?加入能取得那些資料?

allenC 提到...

Hi Mark,

如果是要implement iAP的話,一定得加入MFi,如此才能夠拿到相關的文件去實做。加入MFi,主要是為了取得iAP的specificaiton,如此才能實做iAP。至於要如何加入這點我不是很清楚,因為主要是我前公司的人去負責這部份的接洽。基本上你可以看一下這個鏈結,裡頭有相關的資訊。http://developer.apple.com/programs/mfi/

希望有幫到你 :)

MarkTsai 提到...

感謝你的回答,再問幾個觀念問題,若PC僅透過USB cable連接iPhone, pc可以模擬成Accessory嗎?iAP over USB 和iAP over Bluetooth都需要authentication CP ?

allenC 提到...

Hi Mark,

其實應該是說看你要用到那個command,不過似乎都要做到authentification,才能做到一些比較基本的動作。所以簡單的來說不管是透過那個interface,應該都需要用到apple的那個CP。另外,你提出來的這個idea,我之前是沒這樣想過,不過iPhone/iPod要認到accessory,是靠著30 pin connector上的一隻腳接的電阻來判斷accessory是啥裝置,而且也同時需要其它腳位的電位高低來讓iPhone/iPod做一些相關的判斷,如此才能故identification跟authentification。所以要用USB接電腦來模擬的話,是可行的,不過30pin connector其它一些腳位也要用相對應的電路做同步的控制才行,這點比較麻煩。

Unknown 提到...
作者已經移除這則留言。
Unknown 提到...

不好意思請問一下!
”iAP開發的accessory”是指什麼?
如果先不談認證問題
用USB介面傳輸,那accessory不是只要支援USB收發功能就可以?

allenC 提到...

哈囉 帥儀你好,

看到你的問題,才發現沒解釋的很好。iAP是iPhone/iPod周邊跟iPhone/iPod溝通用的protocol。透過iAP,iPhone的軟體可以跟此週邊做溝通,進而達到用軟體控制週邊的作用。因此有實作iAP的accessory連上iPhone/iPod後,就可以讓iPhone控制。而這個protocol的command可以透過USB、UART、Bluetooth來傳遞。因為USB跟UART本來就包在iPhone/iPod的30 pin cable上,所以command可以直接透過這兩個介面傳遞,另藍芽記得沒錯的話,則要先經過藍芽配對、連線的步驟後,再用spp的方式來做指令的交換,這部份因為後來沒時間在前公司實作,所以就沒那麼清楚。希望有回答到你的問題 :)

Unknown 提到...

萬分感謝你的熱心回應!
因為我想做的是,和外部做USB資料通訊,並不需要利用軟體控制周邊設備,只要能和外部
設備收發USB訊號即可!
我目前手邊關於這方面的資料都是Apple官方的文件,
例如:External Accessory Framework Reference、External Accessory Programming Topics......等等
看完後,大概也只有一些基礎的觀念,對於要寫出收發USB訊號的APP還很遙遠!
目前不知道該如何是好!不知道您可以給我一點意見嗎?或是提供一些相關的資訊給我!
PS.目前還未加入MFI!

allenC 提到...

帥儀你好,
你對External Accessory Framework的使用上有點錯誤喔 它這個framework雖然可以去access USB,但是也要有有implement iAP over USB的accessory有插上iPhone,你才能在用External Accessory Framework看到那台accessory,然後iPhone的程式才能用USB對這台accessory做讀寫。並不是用了External Accessory Framework就可以對USB做讀寫。相信你在External Accessory Programming Topics也有看到它需要先去device pool裡頭撈到某台device才行,為啥撈得到哩,就是這台device有接上iPhone且它有通過iAP的identification/authentification才會出現在device pool裡頭

Unknown 提到...

感謝你的耐心糾正! 不勝感激!
我有找到iphone的開發板所以accessory這部分不用擔心implement iAP over USB的問題
這個開發板必須要加入MFI才可購買,可是查了MFI計畫才發現,MFI好像是給公司申請的!

30pins connector要加入MFI才有控制接腳的相關技術文件對吧?!
因為我只是研究用不像公司是要開發產品,所以MFI計畫應該是無法申請成功。
如果MFI計畫沒辦法申請就意味著我沒辦法去使用30pins connector傳輸資料?!
這樣我就只剩下無線傳輸(WiFi、藍芽)可以選擇?!
不知道我這樣想對嗎?還是說要用無線傳輸也需要加入Apple的某個會員之類的?

不好意思,一直打擾你!

allenC 提到...

哈囉 帥儀,
不加入MFi的話 什麼資料都拿不到 其它的傳輸方式也沒辨法 當初公司在申請的時候我沒參與 不大清楚是怎樣的方式。但我認為你還是先去丟丟看application 搞不好就申請過了 這樣研究起來也方便

Unknown 提到...
作者已經移除這則留言。
Unknown 提到...

OK!我會去申請看看!非常感謝你的幫忙!謝謝!!!

匿名 提到...

Hi,版主你好:
最近在研究Apple的Accessory,突然剛看到你的部落格,有一些問題想請教
1. 申請加入MFi需要付費嗎? 怎麼收費?
2. 與iProdcuct(iPod, iPhone, iPad, etc)溝通的那顆AC,它是什麼系列的MCU?有特定要跟Apple買嗎?
3. 只要有iAP的規格,就能實作與iProduct的溝通嗎? 還是一定套用某SDK?或是某library?

allenC 提到...

Hi,

1. 申請跟付費我就不清楚了 歹勢 XD
2. 那顆IC只能跟apple買,只有它有出 XD
3. 只要有spec. 就可以實作出iAP。但你得加入Mfi才拿得到spec。因為要拿到spec有簽NDA,所以跟別人也拿不到。之前有跟Microchip的人聊過,他們家已經有SDK。TI的話那時候還沒有(那時候是2009年底),現在不知道。我那時候是用TI的MSP430實作的。

Unknown 提到...

Hi.. 您好

我是在一家公司專門負責申請MFi的人,
我們公司想要做iphone上面可以看電視,可是遲遲找不出方法,請問您有沒有任何的idea? 電視的內容目前是設定在CMMB。

目前MFi申請通過。

Unknown 提到...

Allen您好,
小弟網上查資料剛好看到您也有開發過Apple Accessory Authentication的經驗
小弟目前也剛嘗試作這方面的東西
現在遇到問題,不知道方不方便跟您請教一下

目前我們公司也有跟Apple買了貴三三的CP chip
我現在的StartIDPS到EndIDPS的流程都跑完了
現在開始要跟CP拿Accessory Certificate Data透過RetDevAuthenticationInfo 這組command回報給iPhone,但是這邊出了問題
1: 我從CP的0x30讀回Certificate的資料長度是0x03B1, 我就從0x31的位置一次讀0x03B1的長度資料,我發現裡面只有前面17byte有資料後面東是0x00,
2: 我常是把這些資料分段丟回iPhone, 依照spec他說每丟一個section,要等iPhone回ACK才能繼續丟下一個sction, 可是我等半天也沒看到Ack...Orz...反而是iPhone一直跟我下GetAuthenticationInfo幾次後直接回AckDevAuthenticationInfo說認證失敗

我在這卡了好久T__T

Unknown 提到...

更正一下我的問題XD
現在看起來CP回我的Accessory Certificate Data都好了
但是因為Data超過500bytes
所以要切section
請問這邊再回RetDevAuthenticationInfo的時候可以用small packet format的command格式回iPhone, 還是說要用Large packet format,

另外就是只要單筆不大於500bytes就好,是說我要200切一個section也行嗎?

allenC 提到...

Hello James,
不好意思 那麼久才回你信 搞不好你也找出方法了。我的想法是ext. device可以是衛星訊號的接收器,頭裡也做好Decoder。我記得30pins connector中有audio跟video的訊號線。透過iAP做好identification跟authentification後,iPod/iPhone就可以吃進av訊號了。

allenC 提到...

Googlegood你好,回得有點慢。可能你已經解決了。你應該也試過了,其實只要不超過500bytes就行了。

Unknown 提到...

版主別這麼說
感謝您抽空留言
目前這部分確實解決了
奇怪的是我是照著Spec
但是RetDevAuthentication的packet format裡面沒有Trans ID的欄位
所以我回傳的format也沒加
後來我自行添加兩個TransID欄位上去就解決
真是神奇,是Spec錯還是我漏看了什麼O_o

不過我現在是拿到iPhone傳來的GetDevAuthenticationSignature
也拿到了20bytes的challenge data

我現在把Challenge Length (00 14)寫到CP的0x20位置
再把iPhone給的challenge data寫到 CP的0x21位置
接著在0x10的位置寫入0x01讓CP開始產生Signature data
但是我一直去讀0x10一直沒有得到完成的狀態

不知道版主有沒有什麼建議
另外版主有另外的聯絡方式可以讓小弟跟您連絡嗎^^"

Bryan 提到...

Dear AllenC

先謝謝你, 你的分享相當有用, 有個問題想請教你, 你在上面的討論有提到 "另藍芽記得沒錯的話,則要先經過藍芽配對、連線的步驟後,再用spp的方式來做指令的交換", 我目前在進行的專案有類似的需求,(在iphone上寫軟體經由藍芽介面送command給我們開發的藍芽模組)

想請問的是, 如果我的藍芽硬體上了apple AC也通過MFI, 但我在apple的網站上 http://support.apple.com/kb/ht3647, 看到他目前只支援 (HFP 1.5),(PBAP),(A2DP),(AVRCP),(PAN),(HID)六種profile,並無SPP. 而我這邊最需要的是SPP profile, 不知道是否即時通過了MFI, 在跟iphone連接的時候還是無法傳遞data. 或者說無法以可以傳遞data(SPP)的profile來連接.iphone,以及是否能用其他profile (如HID)的方式連接,然後再試著讓App送指令給藍芽模組 不知道你有沒有類似的經驗或了解.

swenson 提到...

版主你好, 我有找到一個solution完美的讓Iphone跟外部硬體作連結,現在市面上應用的還不多,不過應該會有越來越多相關的應用, 小弟不才, 遇到很多的困難. 不知是否可以當面詳談請益? 我人在台中. 有沒有聯繫方式呢? 我的信箱是lzn168@gmail.com

歐, 對了, 你照片穿的那件T shirt, 我也有一件.

allenC 提到...

googlegood你好,這麼久了 你的問題應該已經解決了。是啊沒錯,可以自已切section就可以了 XD
Bryan你好。我之前沒有做過這樣的implementation,不過就我所知CSR taiwan這邊是有這樣的solution,他們應該會有比較深入的了解。有需要的話我可以給你他們台灣這邊的FAE的聯絡方式。
swenson你好,這個已經是在前公司的東西了 XD 所以很多東西應該都還回去了,可以的話可以在這邊提問題,如果我還記得的話會盡力回覆的,謝謝

Unknown 提到...

你好,我們也有些iAP的問題不知道方不方便和您用email來聯絡?

Elton 提到...

你好~~
方便和你用email聯絡嗎~~
我們也正在開發iap相關的產品

Unknown 提到...

Dear allenC
Are you interested to take a part-time job?
I have a device to iphone case
http://case.518.com.tw/casepage-detail-9963.html
If you are interested at it
please contact with me
Thanks

allenC 提到...

Hi Tony and Elton,

I have no much time for this. Sorry. ><

Reinhard 提到...

不好意思~想請教您是否有開發IPHONE周邊accessory套件的公司聯絡人員相關資料嗎?