android host usb

http://blog.csdn.net/androidlinuxg/article/details/17069173

还在百度Google导出搜索如何进行USB接口的HID进行开发吗?网站上很多文章并不完善,这方便的也介绍的不多,我看了很多资料,借助网上的一些代码,整理了以下信息,希望能给大家提供便捷

首先请大家仔细看看Google官方并不详细的SDK文档http://developer.android.com/guide/topics/connectivity/usb/host.html

Android系统3.1及以上版本才能支持USBHOST,这样我们才能连接HID设备进行通讯

项目新建完成之后,AndroidManifest.xml中加入以下代码

\

然后res下增加xml文件夹,新建device_filter.xml,并加入一下代码,这里是声明HID设备VID以及PID,注意是10进制

\\

下面就是java代码了,直接贴完整代码吧

 

001. /*
002. * Copyright (C) 2011 The Android Open Source Project
003. *
004. * Licensed under the Apache License, Version 2.0 (the "License");
005. * you may not use this file except in compliance with the License.
006. * You may obtain a copy of the License at
007. *
009. *
010. * Unless required by applicable law or agreed to in writing, software
011. * distributed under the License is distributed on an "AS IS" BASIS,
012. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013. * See the License for the specific language governing permissions and
014. * limitations under the License.
015. */
016.  
017. package com.android.missilelauncher;
018.  
019. import java.nio.ByteBuffer;
020. import java.util.ArrayList;
021. import java.util.Arrays;
022. import java.util.HashMap;
023. import java.util.Iterator;
024.  
025. import android.app.Activity;
026. import android.content.Context;
027. import android.content.Intent;
028. import android.hardware.Sensor;
029. import android.hardware.SensorEvent;
030. import android.hardware.SensorEventListener;
031. import android.hardware.SensorManager;
032. import android.hardware.usb.UsbConstants;
033. import android.hardware.usb.UsbDevice;
034. import android.hardware.usb.UsbDeviceConnection;
035. import android.hardware.usb.UsbEndpoint;
036. import android.hardware.usb.UsbInterface;
037. import android.hardware.usb.UsbManager;
038. import android.hardware.usb.UsbRequest;
039. import android.os.Bundle;
040. import android.util.Log;
041. import android.view.Gravity;
042. import android.view.View;
043. import android.view.View.OnClickListener;
044. import android.widget.ArrayAdapter;
045. import android.widget.Button;
046. import android.widget.ListView;
047. import android.widget.TextView;
048. import android.widget.Toast;
049.  
050. public class MissileLauncherActivity extends Activity {
051.  
052. private static final String TAG = "MissileLauncherActivity";
053.  
054. private Button btsend; // 发送按钮
055. private UsbManager manager; // USB管理器
056. private UsbDevice mUsbDevice; // 找到的USB设备
057. private ListView lsv1; // 显示USB信息的
058. private UsbInterface mInterface;
059. private UsbDeviceConnection mDeviceConnection;
060.  
061. @Override
062. public void onCreate(Bundle savedInstanceState) {
063. super.onCreate(savedInstanceState);
064.  
065. setContentView(R.layout.launcher);
066.  
067. btsend = (Button) findViewById(R.id.btsend);
068. btsend.setOnClickListener(btsendListener);
069.  
070. lsv1 = (ListView) findViewById(R.id.lsv1);
071.  
072. // 获取USB设备
073. manager = (UsbManager) getSystemService(Context.USB_SERVICE);
074. if (manager == null) {
075. return;
076. else {
077. Log.i(TAG, "usb设备:" + String.valueOf(manager.toString()));
078. }
079. HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
080. Log.i(TAG, "usb设备:" + String.valueOf(deviceList.size()));
081. Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
082. ArrayList<String> USBDeviceList = new ArrayList<String>(); // 存放USB设备的数量
083. while (deviceIterator.hasNext()) {
084. UsbDevice device = deviceIterator.next();
085.  
086. USBDeviceList.add(String.valueOf(device.getVendorId()));
087. USBDeviceList.add(String.valueOf(device.getProductId()));
088.  
089. // 在这里添加处理设备的代码
090. if (device.getVendorId() == 6790 && device.getProductId() == 57360) {
091. mUsbDevice = device;
092. Log.i(TAG, "找到设备");
093. }
094. }
095. // 创建一个ArrayAdapter
096. lsv1.setAdapter(new ArrayAdapter<String>(this,
097. android.R.layout.simple_list_item_1, USBDeviceList));
098. findIntfAndEpt();
099. }
100.  
101. // 寻找接口和分配结点
102. private void findIntfAndEpt() {
103. if (mUsbDevice == null) {
104. Log.i(TAG, "没有找到设备");
105. return;
106. }
107. for (int i = 0; i < mUsbDevice.getInterfaceCount();) {
108. // 获取设备接口,一般都是一个接口,你可以打印getInterfaceCount()方法查看接
109. // 口的个数,在这个接口上有两个端点,OUT 和 IN
110. UsbInterface intf = mUsbDevice.getInterface(i);
111. Log.d(TAG, i + " " + intf);
112. mInterface = intf;
113. break;
114. }
115.  
116. if (mInterface != null) {
117. UsbDeviceConnection connection = null;
118. // 判断是否有权限
119. if (manager.hasPermission(mUsbDevice)) {
120. // 打开设备,获取 UsbDeviceConnection 对象,连接设备,用于后面的通讯
121. connection = manager.openDevice(mUsbDevice);
122. if (connection == null) {
123. return;
124. }
125. if (connection.claimInterface(mInterface, true)) {
126. Log.i(TAG, "找到接口");
127. mDeviceConnection = connection;
128. // 用UsbDeviceConnection 与 UsbInterface 进行端点设置和通讯
129. getEndpoint(mDeviceConnection, mInterface);
130. else {
131. connection.close();
132. }
133. else {
134. Log.i(TAG, "没有权限");
135. }
136. else {
137. Log.i(TAG, "没有找到接口");
138. }
139. }
140.  
141. private UsbEndpoint epOut;
142. private UsbEndpoint epIn;
143.  
144. // 用UsbDeviceConnection 与 UsbInterface 进行端点设置和通讯
145. private void getEndpoint(UsbDeviceConnection connection, UsbInterface intf) {
146. if (intf.getEndpoint(1) != null) {
147. epOut = intf.getEndpoint(1);
148. }
149. if (intf.getEndpoint(0) != null) {
150. epIn = intf.getEndpoint(0);
151. }
152. }
153.  
154. private byte[] Sendbytes; // 发送信息字节
155. private byte[] Receiveytes; // 接收信息字节
156. private OnClickListener btsendListener = new OnClickListener() {
157. int ret = -100;
158.  
159. @Override
160. public void onClick(View v) {
161. String testString = "010A";
162. //String testString = "C783CC30";
163. byte[] bt = clsPublic.HexString2Bytes(testString);
164.  
165. Sendbytes = Arrays.copyOf(bt, bt.length);
166.  
167. // 1,发送准备命令
168. ret = mDeviceConnection.bulkTransfer(epOut, Sendbytes,
169. Sendbytes.length, 5000);
170. Log.i(TAG, "已经发送!");
171.  
172. // 2,接收发送成功信息
173. Receiveytes = new byte[32];
174. ret = mDeviceConnection.bulkTransfer(epIn, Receiveytes,
175. Receiveytes.length, 10000);
176. Log.i(TAG, "接收返回值:" + String.valueOf(ret));
177. if (ret != 32) {
178. DisplayToast("接收返回值" + String.valueOf(ret));
179. return;
180. else {
181. // 查看返回值
182. DisplayToast(clsPublic.Bytes2HexString(Receiveytes));
183. Log.i(TAG, clsPublic.Bytes2HexString(Receiveytes));
184. }
185. }
186. };
187.  
188. public void DisplayToast(CharSequence str) {
189. Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG);
190. // 设置Toast显示的位置
191. toast.setGravity(Gravity.TOP, 0200);
192. // 显示Toast
193. toast.show();
194. }
195.  
196. }
      
   

步骤五:我在步骤四的代码中包含有个类clsPublic,这个类是用来转换十六进制和字符串的,一般来说大家也不需要,但是考虑代码完整性,我也贴上来。这个类和MainActivity是在同一个包名下的文件clsPublic.java。

 

package com.example.usbmanager;
       
public class clsPublic {
    // 整数到字节数组转换
     public static byte[] int2bytes(int n) {
     byte[] ab = new byte[4];
     ab[0] = (byte) (0xff & n);
     ab[1] = (byte) ((0xff00 & n) >> 8);
     ab[2] = (byte) ((0xff0000 & n) >> 16);
     ab[3] = (byte) ((0xff000000 & n) >> 24);
     return ab;
     }
       
     // 字节数组到整数的转换
     public static int bytes2int(byte b[]) {
     int s = 0;
     s = ((((b[0] & 0xff) << 8 | (b[1] & 0xff)) << 8) | (b[2] & 0xff)) << 8
     | (b[3] & 0xff);
     return s;
     }
       
     // 字节转换到字符
     public static char byte2char(byte b) {
     return (char) b;
     }
       
     private final static byte[] hex = "0123456789ABCDEF".getBytes();
       
     private static int parse(char c) {
     if (c >= 'a')
     return (c - 'a' + 10) & 0x0f;
     if (c >= 'A')
     return (c - 'A' + 10) & 0x0f;
     return (c - '0') & 0x0f;
     }
       
     // 从字节数组到十六进制字符串转换
     public static String Bytes2HexString(byte[] b) {
     byte[] buff = new byte[2 * b.length];
     for (int i = 0; i < b.length; i++) {
     buff[2 * i] = hex[(b[i] >> 4) & 0x0f];
     buff[2 * i + 1] = hex[b[i] & 0x0f];
     }
     return new String(buff);
     }
       
     // 从十六进制字符串到字节数组转换
     public static byte[] HexString2Bytes(String hexstr) {
     byte[] b = new byte[hexstr.length() / 2];
     int j = 0;
     for (int i = 0; i < b.length; i++) {
     char c0 = hexstr.charAt(j++);
     char c1 = hexstr.charAt(j++);
     b[i] = (byte) ((parse(c0) << 4) | parse(c1));
     }
     return b;
     }
}

步骤六:

          制作完成软件后,安装到设备上,或者直接用Eclipse调试运行。然后插入USB-HID设备,幸运的话,你会看到系统弹出一个打开方式的提示(我的设备是这样的,其他设备不知道是什么结果)。

转载于:https://www.cnblogs.com/I-L-o-v-e-z-h-o-u/p/4476445.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值