您的位置:首页 > 移动开发 > Android开发

android 通过usb 读取数据

2016-09-30 16:03 351 查看
android 通过usb 读取数据 标签: android 2016年09月30日 16:03:18 5769人阅读 评论(0) 收藏 举报

分类: android(2)



作者同类文章 X 版权声明:本文为博主原创文章,未经博主允许不得转载。           背景介绍:
                      老大忽然跟我说:今天你做一个东西,能确保我们的usb外设发送的数据能被接受到。
           然而,作为一个android零基础 的小白(初创公司真是身兼多职~。~),只能各种找资料,最后 ac了。

一、查找大概的代码:
在activity下开一个线程,传usbManager,代码如下:

[html] view plain copy print?<span style="font-size:18px;">package com.example.administrator.acceptusbdata;  
  
import android.content.Context;  
import android.hardware.usb.UsbDevice;  
import android.hardware.usb.UsbManager;  
import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.util.Log;  
  
import java.util.HashMap;  
import java.util.Iterator;  
  
public class MainActivity extends AppCompatActivity{  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        final String TAG = "onCreate";  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        UsbManager usbManager = (UsbManager)getSystemService(Context.USB_SERVICE); //getSystemService只能在activity下使用  
        new Thread(new MyThread(1,usbManager)).start(); //启动线程  
  
  
    }  
}  
</span>  
<span style="font-size:18px;">package com.example.administrator.acceptusbdata;

import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.HashMap;
import java.util.Iterator;

public class MainActivity extends AppCompatActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
final String TAG = "onCreate";
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

UsbManager usbManager = (UsbManager)getSystemService(Context.USB_SERVICE); //getSystemService只能在activity下使用
new Thread(new MyThread(1,usbManager)).start(); //启动线程

}
}
</span>


另写的线程:
[html] view plain copy print?package com.example.administrator.acceptusbdata;  
  
import android.content.Context;  
import android.hardware.usb.UsbDevice;  
import android.hardware.usb.UsbDeviceConnection;  
import android.hardware.usb.UsbEndpoint;  
import android.hardware.usb.UsbInterface;  
import android.hardware.usb.UsbManager;  
import android.hardware.usb.UsbRequest;  
import android.util.Log;  
  
import java.nio.ByteBuffer;  
import java.util.HashMap;  
import java.util.Iterator;  
  
/**  
 * Created by Administrator on 2016/9/28 0028.  
 */  
public class MyThread implements Runnable  {  
    int count=1,number;  
    UsbManager mUsbManager;  
    public MyThread(int num,UsbManager usbManager)  
    {  
        number=num;  
        System.out.println("创建线程"+number);  
        mUsbManager = usbManager;  
    }  
    public void run() {  
        while (true) {  
            System.out.println("线程" + number + ":计数" + count);  
            HashMap<String,UsbDevice> deviceHashMap = mUsbManager.getDeviceList();  
            Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();  
  
            System.out.println("deviceHashMap.isEmpty()"+deviceHashMap.isEmpty());  
  
            while(iterator.hasNext()) {  
                UsbDevice usbDevice = iterator.next();  
                UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点  
                UsbEndpoint inEndpoint = usbInterface.getEndpoint(0);  //读数据节点  
                UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);  
                connection.claimInterface(usbInterface, true);  
  
                //发送数据  
                byte[] byte2 = new byte[1024];  
  
                //读取数据1   两种方法读取数据  
                int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, 3000);  
                System.out.println("ret");  
                Log.i("ret", "ret:" + ret);  
                Log.i("ret", "bat is ok  length:" + byte2.length);  
                for (Byte byte1 : byte2) {  
                    Log.i("ret", "byte1 :" + byte1);  
                }  
            }  
        }  
    }  
}  
package com.example.administrator.acceptusbdata;

import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbRequest;
import android.util.Log;

import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Iterator;

/**
* Created by Administrator on 2016/9/28 0028.
*/
public class MyThread implements Runnable  {
int count=1,number;
UsbManager mUsbManager;
public MyThread(int num,UsbManager usbManager)
{
number=num;
System.out.println("创建线程"+number);
mUsbManager = usbManager;
}
public void run() {
while (true) {
System.out.println("线程" + number + ":计数" + count);
HashMap<String,UsbDevice> deviceHashMap = mUsbManager.getDeviceList();
Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();

System.out.println("deviceHashMap.isEmpty()"+deviceHashMap.isEmpty());

while(iterator.hasNext()) {
UsbDevice usbDevice = iterator.next();
UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点
UsbEndpoint inEndpoint = usbInterface.getEndpoint(0);  //读数据节点
UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);
connection.claimInterface(usbInterface, true);

//发送数据
byte[] byte2 = new byte[1024];

//读取数据1   两种方法读取数据
int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, 3000);
System.out.println("ret");
Log.i("ret", "ret:" + ret);
Log.i("ret", "bat is ok  length:" + byte2.length);
for (Byte byte1 : byte2) {
Log.i("ret", "byte1 :" + byte1);
}
}
}
}
}

参考链接:http://blog.csdn.net/centralperk/article/details/9312401




二、getDeviceList()搜索不到设备
     在以上基础下,遇到一个问题:getDeviceList()搜索不到设备:
     然后参考链接中的方法解决了,不过其中push文件到android设备、编辑andoird文件等操作 都是同事帮着完成的~毕竟android小白。。

三、系统签名
     当时装上后报错说权限不够,同事帮给app签名后就ok了。

至此就能搜索到设备了。但是接受数据还有问题,后面发现是byte数组开小了,usb外设是直接发一个包过来的,包的size 比数组大就直接不存进去(而不是覆盖存入),改了byte数组大小就success了。

最后附上两个参考链接,帮助理解api:
http://home.bdqn.cn/thread-67074-1-1.html

https://developer.android.com/reference/android/hardware/usb/package-summary.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: