Android USB Host 와 HID 통신
refer to :http://www.usb.org/developers/defined_class
전단 시간 에 HID 의 하드웨어 를 만 들 려 면 안 드 로 이 드 와 통신 해 야 합 니 다. 인터넷 에서 한 바퀴 검색 하면 수확 이 적지 않 습 니 다.
비교적 좋 은 글 은: Android USB Host 와 HID 통신
Android Service USB HOST 통신 생 성
그 중에서 코드 부분 에 주의해 야 할 부분 이 있 습 니 다. 여기에 설명 하 겠 습 니 다.
/**
* USB HOST HID
* @author IVAN
*
*/
public class MainActivity extends Activity {
private static final String TAG = "USB_HOST";
private UsbManager myUsbManager;
private UsbDevice myUsbDevice;
private UsbInterface myInterface;
private UsbDeviceConnection myDeviceConnection;
private final int VendorID = 8457; // ID
private final int ProductID = 30264;
private TextView info;
private UsbEndpoint epOut;
private UsbEndpoint epIn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
info = (TextView) findViewById(R.id.info);
// UsbManager
myUsbManager = (UsbManager) getSystemService(USB_SERVICE);
enumerateDevice();
findInterface();
openDevice();
assignEndpoint();
}
/**
* ,IN | OUT, ; 1 OUT ,0 IN,
*/
//USB_ENDPOINT_XFER_BULK /* #define USB_ENDPOINT_XFER_CONTROL 0 -- 제어 전송 #define USB_ENDPOINT_XFER_ISOC 1 -- 등 시 전송 #define USB_ENDPOINT_XFER_BULK 2 -- 블록 전송 #define USB_ENDPOINT_XFER_INT 3 -- 전송 중단 * */
private void assignEndpoint() {
if (my Interface! = null) {/ 많은 사람들 이 각종 게시판 에서 왜 잘못 보 고 했 느 냐 고 물 었 다.
//여기 코드 가 바 뀌 었 어 요. 자기 하드웨어 속성 으로 판단 하 세 요.
for (int i = 0; i < myInterface.getEndpointCount(); i++) {
UsbEndpoint ep = myInterface.getEndpoint(i);
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT) { if (ep.getDirection() == UsbConstants.USB_DIR_OUT) { epOut = ep;
} else {
epIn = ep;
} } } }
Log.d(TAG, getString(R.string.text));
}
/**
*
*/
private void openDevice() {
if (myInterface != null) {
UsbDeviceConnection conn = null;
// open ; , ,
if (myUsbManager.hasPermission(myUsbDevice)) {
conn = myUsbManager.openDevice(myUsbDevice);
}
if (conn == null) {
return;
}
if (conn.claimInterface(myInterface, true)) {
myDeviceConnection = conn; // android HID
Log.d(TAG, " ");
} else {
conn.close();
}
}
}
/**
*
*/
private void findInterface() {
if (myUsbDevice != null) {
Log.d(TAG, "interfaceCounts : " + myUsbDevice.getInterfaceCount());
for (int i = 0; i < myUsbDevice.getInterfaceCount(); i++) {
UsbInterface intf = myUsbDevice.getInterface(i);
// ,
if (intf.getInterfaceClass() == 8
&& intf.getInterfaceSubclass() == 6
&& intf.getInterfaceProtocol() == 80) {
myInterface = intf;
Log.d(TAG, " ");
}
break;
}
}
}
/**
*
*/
private void enumerateDevice() {
if (myUsbManager == null)
return;
HashMap deviceList = myUsbManager.getDeviceList();
if (!deviceList.isEmpty()) { // deviceList
StringBuffer sb = new StringBuffer();
for (UsbDevice device : deviceList.values()) {
sb.append(device.toString());
sb.append("
");
info.setText(sb);
//
Log.d(TAG, "DeviceInfo: " + device.getVendorId() + " , "
+ device.getProductId());
//
if (device.getVendorId() == VendorID
&& device.getProductId() == ProductID) {
myUsbDevice = device;
Log.d(TAG, " ");
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
데이터 가 져 오 는 코드:
ncount = myDeviceConnection.bulkTransfer(epIn, buffer, buffer.length,
100);
데이터 읽 기 길 이 를 주의 하 십시오. 이것 은 일부 하드웨어 에 있어 서 매우 중요 합 니 다. 어떤 하드웨어 는 작 거나 크 면 즉시 다운 되 거나 계속 되 돌아 오 거나 - 1
이 데이터 의 길 이 는 하드웨어 속성 에 따라
int inMax = epin. getMaxPacketSize () 를 통 해 얻 을 수 있 는 방법 이 있 습 니 다.
windows 아래 hid 프로그램 을 통 해 장치 의 데이터 길 이 를 탐지 하 는 방법 도 있다.
하드웨어 를 읽 지 못 하 는 문제 에 대해 저 는 다음 과 같은 방법 이 도움 이 되 지 않 을 것 이 라 고 생각 합 니 다. 하드웨어 가 지원 하지 않 거나 안 드 로 이 드 4.0 이상 에는 다음 과 같은 파일 정보 가 포 함 된 것 같 습 니 다.
android. hardware. usb. host. xml 파일 을 / system / etc / permissions 에 넣 고 두 번 째 는 같은 디 렉 터 리 에 있 는 handheld core hardware. xml 에 한 마디 를 추가 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.