【简单封装】Android实现USB转232通讯

旧方式参考

封装类:PzHelpUSB

class PzHelpUSB implements SerialInputOutputManager.Listener {
    private static final String TAG = "PzHelpUSB";

    Context                  context;
    UsbSerialPort            usbSerialPort = null;
    SerialInputOutputManager usbIoManager;

    int productID, vendorID;
    String usbDataString         = "";
    String DIALOG_USB_PERMISSION = "com.example.usbtest.GRANT_USB";

    OnUsbDataListener onUsbDataListener;

    public PzHelpUSB(Context context, int productID, int vendorID, onUsbDataListener onUsbDataListener) {
        this.context = context;
        this.productID = productID;
        this.vendorID = vendorID;
        this.onUsbDataListener = onUsbDataListener;
    }

    /**
     * 启动并连接USB通讯
     *
     * @return 是否成功
     */
    boolean connectToDefineEquipment() {
        UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
        List<UsbSerialDriver> drivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager);
        if (drivers.isEmpty()) {
            Log.d(TAG, "run: drivers.isEmpty()!");
            return false;
        }
        List<UsbSerialPort> ports = new ArrayList<>();
        for (UsbSerialDriver driver : drivers) {
            ports.addAll(driver.getPorts());
        }
        if (ports.isEmpty()) {
            Log.d(TAG, "run: ports.isEmpty()!");
            return false;
        }
        for (UsbSerialPort port : ports) {
            UsbDevice usbDevice = port.getDriver().getDevice();
            if (usbDevice.getProductId() == productID && usbDevice.getVendorId() == vendorID) {
                if (usbManager.hasPermission(usbDevice)) {
                    try {
                        usbSerialPort = port;
                        usbSerialPort.open(usbManager.openDevice(usbSerialPort.getDriver().getDevice()));
                        usbSerialPort.setParameters(19200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
                        usbIoManager = new SerialInputOutputManager(usbSerialPort, this);
                        Executors.newSingleThreadExecutor().submit(usbIoManager);
                        return true;
                    } catch (IOException e) {
                        e.printStackTrace();
                        close();
                        return false;
                    }
                } else {
                    //弹出权限申请窗口
                    PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(DIALOG_USB_PERMISSION), 0);
                    usbManager.requestPermission(usbDevice, usbPermissionIntent);
                }
                break;
            }
        }
        return false;
    }

    /**
     * 关闭USB通讯
     */
    public void close() {
        if (usbIoManager != null) {
            usbIoManager.stop();
        }
        usbIoManager = null;
        if (usbSerialPort != null) {
            try {
                usbSerialPort.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            usbSerialPort = null;
        }
    }

    /**
     * 接收到数据
     * @param data USB数据
     */
    @Override
    public void onNewData(byte[] data) {
        try {
            usbDataString += new String(data, "GBK");
            if (usbDataString.length() >= 30) {
                int star = usbDataString.indexOf("<d>");
                if (star != -1) {
                    usbDataString = usbDataString.substring(star);
                    int end = usbDataString.indexOf("</d>");
                    if (end != -1) {
                        onUsbDataListener.onReceive(usbDataString);
                    }
                }
                usbDataString = "";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onRunError(Exception e) {
        e.printStackTrace();
    }

    /**
     * 初始化广播
     */
    void registerReceiver() {
        IntentFilter usbDeviceStateFilter = new IntentFilter();
        usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        usbDeviceStateFilter.addAction(DIALOG_USB_PERMISSION);
        context.registerReceiver(broadcastReceiver, usbDeviceStateFilter);
    }

    /**
     * 关闭广播
     */
    void unregisterReceiver() {
        context.unregisterReceiver(broadcastReceiver);
    }

    /**
     * 广播处理
     */
    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
                Log.d(TAG, "onReceive: USB插入");
                connectToDefineEquipment();
            }
            if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) {
                Log.d(TAG, "onReceive: USB拔出");
                close();
            }
            if (DIALOG_USB_PERMISSION.equals(intent.getAction())) {
                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    Log.d(TAG, "onReceive: 用户允许了TEMPER_PERMISSION权限");
                    connectToDefineEquipment();
                } else {
                    Log.d(TAG, "onReceive: 用户取消了TEMPER_PERMISSION权限");
                }
            }
        }
    };

    /**
     * 回调接口
     */
    interface OnUsbDataListener {
        void onReceive(String response);
    }
}

其他配置

  • 在你的build.gradle(project)中添加
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
  • 添加依赖
dependencies {
    implementation 'com.github.mik3y:usb-serial-for-android:3.3.0'
}
  • 添加权限
<uses-feature android:name="android.hardware.usb.host" />
  • res/xml/下添加 device_filter.xml,这一步相当于加一个给过滤器用的资源列表,如果没有识别需求(比如插入自动获取权限等)可以不加。
<resource>
	<usb-device product-id="29987" vendor-id="6790" />
	<usb-device product-id="21795" vendor-id="6790" />
	<usb-device product-id="21778" vendor-id="6790" />
	
	//补充
	<usb-device vendor-id="1024" product-id="50010"/>
	<usb-device vendor-id="1024" product-id="24577"/>
	<usb-device vendor-id="6790" product-id="29987"/>
	<usb-device vendor-id="1027" product-id="24577"/>
</resource>
  • 如果想要在设备插入后便获取权限,则需要在AndroidManifest中补全以下代码
<uses-feature android:name="android.hardware.usb.host" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateAlwaysHidden|adjustPan" android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <meta-data
            android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
            android:resource="@xml/device_filter" />
    </activity>
</application>

使用

... ...
PzHelpUSB usb = new PzHelpUSB(this, USB_PRODUCT_ID, USB_VENDOR_ID, this);
usb.connectToDefineEquipment();
... ...
@Override
public void onReceive(String response) {
	//处理接收到的数据
}

@Override
protected void onStart() {
    super.onStart();
    usb.registerReceiver();
}

@Override
protected void onStop() {
    usb.unregisterReceiver();
    super.onStop();
}

@Override
protected void onDestroy() {
    usb.close();
    super.onDestroy();
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值