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