頭痛,看似簡單卻不簡單...

iPad + Bluetooth Barcode Scanner
本想科技那麼發達,藍芽條碼機就像藍牙鍵盤一樣,底層早都整好了,這應該是小事一樁啦!拿到條碼機後簡單測試一下,恩,藍芽連線,逼一下,條碼內容就進到記事本,搞定!

接著搞程式,最偷懶就是用一個文字框去收資料,POS屆的先輩用VB或Delphi都是用這招,神經病才去Hook底層事件(八成連什麼Hook都不知道吧)。文字方塊測試果然一下就搞定了,接著就是使用在畫面某處藏一個看不到的文字方塊的奇技,搭配每次進到畫面就自動Focus他的淫巧搞定。

問題來了,iPad判斷只要有外接輸入裝置,就不顯示虛擬鍵盤,所以接條碼機時鍵盤出不來,這樣就不能編輯產品,所以我找方法把鍵盤硬Hack出來,沒想到拖出來的鍵盤切換語言時有一定的機率造成Crash,由於是內建虛擬鍵盤,技術上一時沒辦法解,所以只好改採意識解...「無視」。放棄顯示虛擬鍵盤,反正要編輯時就自己把條碼機關閉連線。

接著又發現另一問題,條碼機資料不是一次一起進來,而是逐字母進來,因此無法掌握掃完的時機點,好在我留意到在記事本每次少都會帶一個換行,因此我假設他最後會觸發Return Key,這點靠Delegate很快就解決了。最後把藍芽關掉測試,才有發現另一個問題,因為沒了藍芽,前面寫的隱藏文字框的機制就會導致沒事就開啓虛擬鍵盤。

雖然我只要把文字框秀出來,讓使用者每次要掃條碼就要去點一下他要掃進的文字框,而不是強制在背景預設鎖定以自動接收所有掃描事件,但是這樣操作麻煩,而且UI會很醜(這點我最難接受),所以此方案不可行。好吧,為了原則,接下來是最可怕的了...

要想在背景處理所有來自藍芽條碼機的事件,最根本的解法還是Hook,不過那是視窗程式的說法,基本上,就是在藍牙資料傳輸層,或者在資料輸入事件處理層的地方去監聽並過濾所有事件,並針對符合的資訊作出相應的處理。

這可以很難寫,也可以很簡單,基本上就是要靠當初寫底層的人的修為,佛心來著的就是安排好主機制,但是留縫隙讓後繼者可以稍微干預一下客制化處理。黑心點就是「卡敖隆吼立夏」,想改就整塊換掉自己做。不管哪一種,第一步都是要K海量資料。從哪開始呢?

  1. 先要簡單瞭解藍芽的運作原理,得知傳輸機制及各Profile大概的關係。這點不太難,看一下Wiki很快就會瞭解到,大概會相關的有SDP跟HID兩個Profile要認識,估計這都底層有API做好好的,所以應該不會需要自己實作Protocol。
  2. 接著找一下相關的Spec,大致看一下流程,順便查一些論壇看看別人的整合經驗做參考,有時候可以找到不少實用的關鍵字,避免繞遠路。這種時候不用分平台,任何平台任何語言都可以參考,畢竟Protocol是共通的,有時候比對不同平台的實作異同之處,可以更快速地掌握規格的核心(兩者的交集處就是Protocol)。
  3. 有了基本的認識後,再來找Apple提供的Solution,會比較能掌握各種資訊的用途。當然運氣不會那麼好,一下就找到需要的資料,特別是Apple的Develop平台文件根本就是沒在整理,不像早期的MSDN那樣有系統。(現在的MSDN也是挺亂)
  4. 找Apple Solution的過程得順便搭配一些Q&A,看看他人遇到類似的問題,其他高手提供的資訊。像Stack Overflow內的問答,都很有幫助。重點是要不厭其煩地去看提問內容及解決方案,而且有時候自己需要的資訊不見得在最佳解中。因為有Google搜尋的關係,通常很快就能找到許多關鍵字可以進一步去挖,這時候就有點要靠直覺了(通常都會猜錯...= =)。
  5. 接著重復讀文件,看影片,測範例,昏睡,讀文件(循環)... 直到某個摩門特,多半就會找到答案了(放棄也是答案之一)。

我一開始找到的是2012年的CoreBluetooth的簡報,當時是發佈IOS6,但我的目標平台是IOS5,所以稍微看了一下CoreBluetooth的API文件,確認是從IOS5開始支援才進一步繼續測試下去,順便也大致瀏覽一下有哪些API可用。還好有影片,從影片中發現果然佛心來的,整個架構簡化得乾乾好,不過看來HID的Profile的通訊要自己實作了,寫測試程式時,發現UUID似乎是預先定義好的,所以又回頭找了一下CBUUID及藍芽服務UUID等相關定義。結果在iPad上測試時,居然出現「不支援」的狀態,仔細看文件,才發現Bluetooth LE沒有支援到iPad 2(暈),然後又想到,以Low Engery的架構,應該不適用條碼的情況,姑且試了一下有支援的iPhone4S,恩,可以執行,但果然找不到指定裝置,儘管可能是因為UUID格式有錯,或其它因素,不過iPad2的支援性是致命問題,因此只好放棄了。

既然早在iPad發明之前就已經有Bluetooth,應該也有舊版的Bluetooth API可用才是,於是又開始找資料,最後找到這篇「Introduction to Bluetooth Device Access Guide」,根據裡面的描述,提到可以雖然可以自己實作,但是如果是HID相關的話,有被整合在HID-Class Device Manager底下,透過該Manager,也可以客制化一些行為(果然還是佛心啊!)。不過相關文件是以USB為主,範例好像也是給OSX用的,所以IOS支援不支援還是未知數。

目前還在K這些資料延伸出去的各種文件,而後面多做的這堆事,只不過是為了不想讓使用者每次去點文字框才能掃條碼,只為了簡化一個步驟,距離卻是意料之外的遙遠。但是這就是操作體驗程度上的差別。

一個禮拜前我根本也不知道藍牙怎麼運作的,到現在儘管依舊不是專家,但是至少知道解決問題的方向。對目前工作而言,那就足夠了。從這裡面我想記錄幾件事情:

  1. 首先當然是這一路上找到的資料,都在上方連結中,方便日後我或其他人參考。
  2. 如果有客戶接觸到這篇文章,那麼多少可以了解一個看似簡單的整合,究竟包含多少工作,特別是針對未知的領域(對開發者而言是未知),研究佔用的時間絕對是多數,且很可能沒有答案。
  3. 有些工程師會在第一階段停下腳步,文字框不好用又能怎樣,我不懂硬體,他有沒有提供SDK,這在我能力範圍之外。坦白說,文字框那種東西,找個小學生來他也會,如果只會這樣,那就要好好想想世界的遼闊,因為那些你買來覺得好用的App,也都是工程師寫出來的。
  4. 有些工程師會在Google不到Sample Code的時候停下腳步,當閱讀文件,看規格書,閱讀英文是門檻時,你該考慮好好去跨越這點,或者換個工作了。
  5. 有些工程師會從頭到尾K規格K很久,有時候對於未知的領域,先大致瀏覽文件,然後參考一下別人的問題,不要設限,會更快找到答案。
  6. 有些工程師覺得這樣做是繞遠路,只要這樣那樣,就能解決了。

    如果你這樣想的話,請趕快來信到 drgarbage@gmail.com 我需要你的幫助。 XD
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 派大星 的頭像
    派大星

    派大星練功房

    派大星 發表在 痞客邦 留言(0) 人氣()