android 通过usb 读取数据

android 通过usb 读取数据
标签: android
5769人阅读 评论(0) 收藏 举报
分类:
android(2)

          背景介绍:

                      老大忽然跟我说:今天你做一个东西,能确保我们的usb外设发送的数据能被接受到。

           然而,作为一个android零基础 的小白(初创公司真是身兼多职~。~),只能各种找资料,最后 ac了。


一、查找大概的代码:

在activity下开一个线程,传usbManager,代码如下:

  1. <span style="font-size:18px;">package com.example.administrator.acceptusbdata;  
  2.   
  3. import android.content.Context;  
  4. import android.hardware.usb.UsbDevice;  
  5. import android.hardware.usb.UsbManager;  
  6. import android.support.v7.app.AppCompatActivity;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9.   
  10. import java.util.HashMap;  
  11. import java.util.Iterator;  
  12.   
  13. public class MainActivity extends AppCompatActivity{  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         final String TAG = "onCreate";  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.activity_main);  
  20.   
  21.         UsbManager usbManager = (UsbManager)getSystemService(Context.USB_SERVICE); //getSystemService只能在activity下使用  
  22.         new Thread(new MyThread(1,usbManager)).start(); //启动线程  
  23.   
  24.   
  25.     }  
  26. }  
  27. </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>


另写的线程:

  1. package com.example.administrator.acceptusbdata;  
  2.   
  3. import android.content.Context;  
  4. import android.hardware.usb.UsbDevice;  
  5. import android.hardware.usb.UsbDeviceConnection;  
  6. import android.hardware.usb.UsbEndpoint;  
  7. import android.hardware.usb.UsbInterface;  
  8. import android.hardware.usb.UsbManager;  
  9. import android.hardware.usb.UsbRequest;  
  10. import android.util.Log;  
  11.   
  12. import java.nio.ByteBuffer;  
  13. import java.util.HashMap;  
  14. import java.util.Iterator;  
  15.   
  16. /**  
  17.  * Created by Administrator on 2016/9/28 0028.  
  18.  */  
  19. public class MyThread implements Runnable  {  
  20.     int count=1,number;  
  21.     UsbManager mUsbManager;  
  22.     public MyThread(int num,UsbManager usbManager)  
  23.     {  
  24.         number=num;  
  25.         System.out.println("创建线程"+number);  
  26.         mUsbManager = usbManager;  
  27.     }  
  28.     public void run() {  
  29.         while (true) {  
  30.             System.out.println("线程" + number + ":计数" + count);  
  31.             HashMap<String,UsbDevice> deviceHashMap = mUsbManager.getDeviceList();  
  32.             Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();  
  33.   
  34.             System.out.println("deviceHashMap.isEmpty()"+deviceHashMap.isEmpty());  
  35.   
  36.             while(iterator.hasNext()) {  
  37.                 UsbDevice usbDevice = iterator.next();  
  38.                 UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点  
  39.                 UsbEndpoint inEndpoint = usbInterface.getEndpoint(0);  //读数据节点  
  40.                 UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);  
  41.                 connection.claimInterface(usbInterface, true);  
  42.   
  43.                 //发送数据  
  44.                 byte[] byte2 = new byte[1024];  
  45.   
  46.                 //读取数据1   两种方法读取数据  
  47.                 int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, 3000);  
  48.                 System.out.println("ret");  
  49.                 Log.i("ret", "ret:" + ret);  
  50.                 Log.i("ret", "bat is ok  length:" + byte2.length);  
  51.                 for (Byte byte1 : byte2) {  
  52.                     Log.i("ret", "byte1 :" + byte1);  
  53.                 }  
  54.             }  
  55.         }  
  56.     }  
  57. }  
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


猜你喜欢

转载自blog.csdn.net/manshq163com/article/details/79447397