環(huán)境:android 平板4.1 ,OTG線,串口轉(zhuǎn)usb線,開發(fā)板
-------------------------------------------------
任務(wù):使用平板發(fā)送指令給開發(fā)板,開發(fā)板接受后,比如開始打印、
即使用android host 來連接外設(shè)。
基礎(chǔ)知識:
做usb通信,首先要先弄清楚哪邊是HOST那邊是SLAVE。
比如你的android手機做host,要獲得slave,用UsbDevice表示slave
要是你的android手機做slave,要獲得host,用UsbAccessory表示host
以前沒有接觸過android USB Host編程。來到這個公司后,第一個任務(wù)就是寫一個android平板的usb host 的demo,和打印機,ic卡等通信。
一、說一下USB HOST的用處:
USB設(shè)備分為HOST(主設(shè)備)和SLAVE(從設(shè)備),只有當(dāng)一臺HOST與一臺SLAVE連接時才能實現(xiàn)數(shù)據(jù)的傳輸。android支持實現(xiàn)了android外設(shè)協(xié)議的USB硬件。Android外設(shè)和主機模式,在android3.1或者更高的平臺上直接支持。但是,對USB主機和外設(shè)模式的支持,最終還是要取決于設(shè)備的硬件,而不僅僅是看平臺的等級。
我上網(wǎng)搜了一下,早期的一些夏新的手機,以及htc的WM手機支持USB HOST功能,而現(xiàn)在的android手機中支持USB HOST的還很非常少,查到的支持USB HOST功能的手機有三星的I9250,HTC手機暫未發(fā)現(xiàn),現(xiàn)在測試使用的HTC T328w不支持USB HOST功能。所以,測試條件不太充分。
另外,USB HOST的主要用處,一般是android手機做HOST主設(shè)備,用來控制其他一些元器件,比如,單片機,鼠標(biāo),游戲手柄,數(shù)碼相機,等等。
說到手機的usb host 一般用OTG線連接usb外界設(shè)備,但是OTG是什么呢? 今天我才懂,慚愧啊,
這里在簡單說明下:OTG即On-The-Go,是近年來發(fā)展起來的技術(shù),主要應(yīng)用是讓不同的USB設(shè)備和移動設(shè)備之間連接,進行數(shù)據(jù)交換。主要應(yīng)用是在一些高端手機和平板上,在具有OTG功能的平板或手機上,我們可以連接各種USB設(shè)備,例如鼠標(biāo)、鍵盤、U盤等,這對于移動辦公來說還是有一定作用的。尤其是對U盤、讀卡器等設(shè)備的讀取,在身邊沒有電腦的情況就可利用移動設(shè)備直接使用這些設(shè)備。
連接無線鍵鼠,鼠標(biāo)移動尚算靈敏,但是部分輸入法使用鍵盤打字會出現(xiàn)嚴(yán)重的延遲,而且暫時還沒試出哪個輸入法支持USB鍵盤的中文輸入。
連接U盤,這個算比較常見的一個用途,效果不錯。
而很少把手機端當(dāng)做從設(shè)備,與電腦端通過USB HOST進行通信的。另外看到一個人說不能通過USB HOST方式與電腦實現(xiàn)通信:
二、通過socket方式進行連接
開始的時候看到一個例子說是通過USB HOST實現(xiàn)的PC與手機端進行連接,我根據(jù)查到的資料和自己的理解覺得大概是如下的意思:
1.基于socket編程方式,在android手機端和pc端進行連接傳輸數(shù)據(jù)。
2.連接時,需要通過adb forward方式進行端口轉(zhuǎn)發(fā),才能連接的上去。
3.需要用到broadcast來進行,在server端用adb shell 命令開啟android端的socket連接服務(wù)。
4.主要基于android.hardware.usb包下的UsbManager 類和UsbAccessory類。
5.然后就是一些IO操作,IO處理及關(guān)閉優(yōu)化。
最關(guān)鍵的兩點就是:
1)端口轉(zhuǎn)發(fā):
Runtime.getRuntime().exec(“adb forward tcp :12580 tcp:10086 ”);
在服務(wù)端監(jiān)聽10086端口。
2)在server端java程序中使用adb 命令啟動client端的service。
Runtime.getRuntime().exec(“adb shell am broadcast –a NotifyServiceStart”);
后來測試多次發(fā)現(xiàn),這個方式?jīng)]有用到USB HOST的方式,依然是socket通信,只不過是進行了一下端口轉(zhuǎn)發(fā)。
另外,關(guān)于socket通信時,寫的android程序在模擬器上可以與PC上的server端進行通信,而把程序裝到真機上時,就不能實現(xiàn)通信,這個問題的主要原因是PC端和手機上的無線網(wǎng)絡(luò)不在一個網(wǎng)段,無法進行連接。
三、串口通信,hid訪問
在網(wǎng)上查到一些關(guān)于USB HOST的開發(fā)都是基于基于android端與一些單片機進行串口通信的,串口轉(zhuǎn)usb
USB HID
是Human Interface Device的縮寫,由其名稱可以了解HID設(shè)備是直接與人交互的設(shè)備,例如鍵盤、鼠標(biāo)與游戲桿等。不過HID設(shè)備并不一定要有人機接口,只要符合HID類別規(guī)范的設(shè)備都是HID設(shè)備。
mini usb 以前的手機的usb那樣
micro usb 現(xiàn)在手機的usb口那樣
總結(jié):
串口通信才是本次完成任務(wù)的重點, 既然android的SDK里,在3.0以后,已經(jīng)有支持usb外設(shè),
所以我此次想法,先試試用java來,即SDK里的API來和usb外設(shè)通信。
其實SDK里的API實現(xiàn)也是在jni來ndk編程,網(wǎng)上還有一些c/c++的api,不懂如何。
usb HID模式 ,串口轉(zhuǎn)usb兩種,開始我以為要分開這兩種情況。
其實,usb相關(guān)的設(shè)備(無論是直接usb還是串口轉(zhuǎn)usb)都是可以和android host設(shè)備通信的。
最近在android平板上開發(fā)一個程序,可以通過mini Usb控制外部設(shè)備,外部設(shè)備接口是串口轉(zhuǎn)USB。平板和外部設(shè)備之間通過OTG線連接,設(shè)備由平板供電。
系統(tǒng)本意是想通過平板可以向設(shè)備發(fā)送串口指令。
在串口轉(zhuǎn)usb編寫程序,我可以連接到設(shè)備,也可以發(fā)送數(shù)據(jù),不是-1了,但是
數(shù)據(jù)都是錯的,原因后來發(fā)現(xiàn)是,在設(shè)置波特率的時候,沒有效果,為什么沒效果呢
因為串口轉(zhuǎn)usb線里有一個芯片, 不同型號的芯片,設(shè)置波特率的方式不同,即
mDeviceConnection.controlTransfer(0x40, 0x03, baud, index, null, 0, 0); // set
// baudrate
上面的方法的參數(shù)值不同。
糾結(jié)了好久,參考了國外的大哥寫的,才調(diào)通了FT的芯片。
在開發(fā)串口,還有一些串口的測試工具在附件里。