USB掃碼槍獲取資料流的實現方式

2021-10-09 15:37:53 字數 3957 閱讀 9717

otg介面轉換器(或者自帶usb介面的裝置(大頭))

usb掃碼槍(支援usb虛擬串列埠)

安卓裝置

串列埠方式

usb方式

在掃碼槍連線機器的時候,當掃碼槍掃瞄到內容時,獲取掃瞄到的內容。

連線掃碼槍,因為資料肯定是以位元組流的方式傳送的,那麼我們只需獲取到輸入的位元組流,自己處理成需要的內容就可以了。

需要經過以下幾個步驟:

步驟一:整合谷歌原生serial_port包,這個自己看上面教程了。

的類,這個類的作用是尋找咱們安卓裝置上連線的串列埠裝置(包括掃碼槍),具體獲取掃碼槍串列埠位址的思路:獲取未插入掃碼槍時所有裝置的串列埠位址------》獲取插入掃碼槍時所有裝置的串列埠位址

case r.id.btn_print://獲取所有串列埠裝置位址,mfinder就是serialportfinder

stringbuffer stringbuffer = new stringbuffer();

for (string str:mfinder.getalldevicespath())

mtvmessage.settext(stringbuffer.tostring());

break;

步驟三:連線裝置:

private string mserialpath = "/dev/ttyusb0" ;//物理串列埠位址,這個就是咱們步驟二找到的位址了,這是我的裝置的位址,你的自己找去

private int baudrate = 9600;//波特率,這個是可以掃碼槍自己設定的,看說明書

private serialport mserialport;

private inputstream minputstream;

@override

protected int getcontentview()

@override

protected void initview()

private void initserialport() catch (exception e)

}

步驟四:獲取資料流,這時候步驟三,我們開啟了乙個執行緒讀取掃碼槍的資料流,這時候我寫了乙個死迴圈,輪詢掃碼槍傳送的內容,執行緒**如下

private inputstream minputstream;  

/** * 讀串列埠線程

*/private class readthread extends thread catch (unsupportedencodingexception e)

}});

}thread.sleep(300);//你自己可以設定睡眠時間,這個睡眠時間可以會影響識別速度,那麼就可以叫使用者加錢,你懂我意思吧。

} catch (exception e) }}

}

嗯,到了這一步,大功告成了。

注意:串列埠方式實現的話相容性不好,因為遇到部分安卓裝置直接閹割了這部分功能,所以我才會研究usb方式的。

該種方式好處在於不需要整合serial_port包,但是裡面一些類理解比較靈性,usb方式需要經過以下幾個步驟:

步驟一:尋找需要連線的devices裝置,這裡的話有兩種場景

1.usb掃碼槍一直插在安卓裝置上,我們需要在程式啟動的時候自動找到並且連線

2.usb掃碼槍在熱拔插的情況下,我們需要在插入的時候連線

貼**:

private usbmanager mmanager;

//查詢已連線的裝置

usbdevice finddevices()

hashmapmmap = mmanager.getdevicelist();

for (usbdevice device : mmap.values())

}return null;

}

這是basescanner,這個類名我覺得不夠準確,它是用來記錄需要支援的裝置的資訊的,包含裝置的判斷方法:

public class basescanner

public static boolean iss5920(usbdevice usbdevice)

}

第二種usb掃碼槍熱拔插連線方式,這時候我們採用的是廣播監聽的方式,因為裝置撥叉都會有廣播傳送,這條廣播包含的資訊包含乙個usbdevices物件(也就是掃碼槍),我們需要動態註冊拔,插兩條廣播,靜態註冊不生效,**如下:

//這是廣播類,因為我的掃瞄是寫在乙個service中,所以把連線的裝置交給service處理就可以

public class usbbroadcastreceiver extends broadcastreceiver

}else if(usbmanager.action_usb_device_attached.equals(action))

}}

我是在程式啟動的時候就註冊了這個廣播如下:

private usbbroadcastreceiver musbreceiver;

@override

public void oncreate()

@override

public void onterminate()

private void registbroadcast() }

步驟二,連線裝置,這邊我把所有都寫注釋裡面:

private usbdevice mdevide;

private usbdeviceconnection mconnect;

private static final string action_usb_permission = "com.android.example.usb_permission";

private static usbconnectmanager minstance;

private scannerlistener mlistener;

private usbmanager mmanager;

private usbendpoint musbendpointin;

private usbinte***ce musbinte***ce;

private thread mreadingthread;

public void connetdevice(usbdevice device, context context)

mconnect = mmanager.opendevice(mdevide);//開啟裝置

musbinte***ce = device.getinte***ce(0);//獲取資料的介面.這個可以理解成裝置有多少個線頭子

musbendpointin = musbinte***ce.getendpoint(0);//獲取裝置的輸出流向,輸入或者輸出因為usb掃碼槍只有乙個輸出項,所以直接選擇0

if (mconnect.claiminte***ce(musbinte***ce, true)) else

} catch (exception e)

}

步驟三,獲取輸入的流,並解析成需要的內容,**如下:

ok啦,usb模式的也完成了。

有疑問或者有建議的膀友可以**:497438697  我是群裡的 杭州-大魔王,有艾特必應。

祝大家新年快樂,萬事亨通!!!

//開執行緒讀取資料

private void startreading()

mreadingthread = new thread(new runnable()

} catch (unsupportedencodingexception e) }}

}}

});mreadingthread.start();

}

USB掃碼槍獲取資料流的實現方式

otg介面轉換器 或者自帶usb介面的裝置 大頭 usb掃碼槍 支援usb虛擬串列埠 安卓裝置 串列埠方式 usb方式 在掃碼槍連線機器的時候,當掃碼槍掃瞄到內容時,獲取掃瞄到的內容。連線掃碼槍,因為資料肯定是以位元組流的方式傳送的,那麼我們只需獲取到輸入的位元組流,自己處理成需要的內容就可以了。需...

js 條碼槍掃瞄 js獲取USB掃碼槍資料

前言找了很多相關的教程不太好用,汲取各家之長總結精簡了一下 原理掃碼槍掃瞄到的條形碼每一位會觸發一次onkeydown事件 比如掃瞄條碼位 1234567890 的條形碼,會連續執行10次onkeydown事件 條碼掃瞄到最後一位,會直接觸發enter 支援vue data else if e.wh...

js讀取usb掃碼槍資料

條碼掃瞄器其實就是一種輸入裝置,跟鍵盤一樣。在控制台列印掃瞄過程,可以看出,掃瞄過程就像是在鍵盤上敲擊相應的鍵,keycode和鍵盤是一一對應的,只是輸入速度 間隔時間 比物理鍵盤輸入要快得多。我們可以通過監聽輸入間隔時間,來判斷到底是鍵盤輸入還是掃瞄輸入。掃碼槍輸入的時間間隔一般在10毫秒以內,物...