uni-app基于nativejs实现USB-OTG通讯

1,监听USB拔出连接,判断是否含有权限

   const main = plus.android.runtimeMainActivity()
   const IntentFilter = plus.android.importClass('android.content.IntentFilter')
   const action = 'android.hardware.usb.action.USB_STATE'
   const deviceList = []
   let usbManager = null
   let connection = null
   let mUsbInterface = null
   let inEndpoint = null
   let outEndpoint = null

    var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
        onReceive: getReceive
    })
    var filter = new IntentFilter()
    filter.addAction(action)
    main.registerReceiver(receiver, filter)

function getReceive(context, intent) {
    var type = intent.getAction()
    if (type === action) {
        var connected = intent.getExtras()
        plus.android.importClass(connected)
        var isusb = connected.getBoolean('connected')
        const localUsbDevice = intent.getParcelableExtra('device')
        usbManager = context.getSystemService(Context.USB_SERVICE)
        const mDevices = usbManager.getDeviceList()
        const mPendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(
                'ACTION_USB_PERMISSION'), 0)
        const iterator = mDevices.values().iterator()
        while (iterator.hasNext()) {
            const usb = iterator.next()
            if (!usbManager.hasPermission(usb)) {
                uni.$emit('times', 'has not permission')
                // 获取权限弹框
                usbManager.requestPermission(usb, mPendingIntent)
            } else {
                uni.$emit('times', 'has permission')
            }
            deviceList.push(usb)
        }
    } 
}

2,获取权限后,打开设备实现连接

// 打开设备
function openDevice() {
    deviceList.forEach(usb => {
        mUsbInterface = getUsbInterface(usb) // usb.getInterface(0)
        if(!mUsbInterface) return
        const enu = enumerateEndPoint(mUsbInterface)
        if(!enu) return
        connection = usbManager.openDevice(usb)
        const bool = connection.claimInterface(mUsbInterface, true)
        uni.$emit('times', bool)
    })

}

function enumerateEndPoint(sInterface) {
    if (sInterface == null)
        return false;
    for (let i = 0; i < sInterface.getEndpointCount(); ++i) {
        const endPoint = sInterface.getEndpoint(i);
        if (endPoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK &&
            endPoint.getMaxPacketSize() == 0x20) {
            if (endPoint.getDirection() == UsbConstants.USB_DIR_IN) {
                inEndpoint = endPoint;
            } else {
                outEndpoint = endPoint;
            }
        }
    }
    return true;
}
// 获取连接接口
function getUsbInterface(paramUsbDevice) {
    if (connection != null) {
        if (mUsbInterface != null) {
            connection.releaseInterface(mUsbInterface);
            mUsbInterface = null;
        }
        connection.close();
        mUsbInterface = null;
    }
    if (paramUsbDevice == null)
        return null;
    for (let i = 0; i < paramUsbDevice.getInterfaceCount(); i++) {
        const intf = paramUsbDevice.getInterface(i);
        if (intf.getInterfaceClass() == 0xff &&
            intf.getInterfaceSubclass() == 0x01 &&
            intf.getInterfaceProtocol() == 0x02) {
            return intf;
        }
    }
    return null;
}

3,读写发送接受数据

function writeData(str) {
    if (connection === null) {
        openDevice()
        uni.$emit('times', '未连接')
        return
    }
    const sendBytes = str2Bytes('你是对的') 

    const out = connection.bulkTransfer(outEndpoint, sendBytes, sendBytes.length, 5000)
    uni.$emit('times', '发送' + out)
    const bytes = []
    const inn = connection.bulkTransfer(inEndpoint, bytes, bytes.length, 1000)
        uni.$emit('times', '接收,' + inn + ',' + bytes)
}

你可能感兴趣的:(uni-app基于nativejs实现USB-OTG通讯)