From 76407ef42394ff1046c508a106c0b51812df2a0f Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期三, 10 十二月 2025 18:12:53 +0800
Subject: [PATCH] 钥匙柜开门添加 指纹方式

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/usb/UsbController.java |  451 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 451 insertions(+), 0 deletions(-)

diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/usb/UsbController.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/usb/UsbController.java
new file mode 100644
index 0000000..8e3d4a6
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/usb/UsbController.java
@@ -0,0 +1,451 @@
+package com.doumee.keyCabinet.utils.usb;
+
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.hardware.usb.UsbConstants;
+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.os.SystemClock;
+import android.util.Log;
+import android.widget.Toast;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * Created by KMS on 2016/8/23.
+ */
+public class UsbController {
+    private final Context mApplicationContext;
+    private final UsbManager mUsbManager;
+    private final int VID;
+    private final int PID;
+    private int m_nEPInSize, m_nEPOutSize;
+
+    private byte[] m_abyTransferBuf;
+    private boolean m_bInit = false;
+    private UsbDeviceConnection m_usbConn = null;
+    private UsbInterface m_usbIf = null;
+    private UsbEndpoint m_epIN = null;
+    private UsbEndpoint m_epOUT = null;
+    private final IUsbConnState mConnectionHandler;
+
+    protected static final String ACTION_USB_PERMISSION = "ch.serverbox.android.USB";
+
+    /**
+     * Activity is needed for onResult
+     *
+     * @param parentActivity
+     */
+    public UsbController(Activity parentActivity, IUsbConnState connectionHandler, int vid, int pid){
+        mConnectionHandler = connectionHandler;
+        mApplicationContext = parentActivity.getApplicationContext();
+        mUsbManager = (UsbManager) mApplicationContext.getSystemService(Context.USB_SERVICE);
+        VID = vid;
+        PID = pid;
+        m_abyTransferBuf = new byte[512];
+        //init();
+    }
+
+    public void init(){
+        enumerate(new IPermissionListener() {
+            @Override
+            public void onPermissionDenied(UsbDevice d) {
+                UsbManager usbman = (UsbManager) mApplicationContext.getSystemService(Context.USB_SERVICE);
+                PendingIntent pi = PendingIntent.getBroadcast(mApplicationContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
+                mApplicationContext.registerReceiver(mPermissionReceiver, new IntentFilter(ACTION_USB_PERMISSION));
+                usbman.requestPermission(d, pi);
+            }
+        });
+    }
+
+    public void uninit(){
+        if (m_usbConn != null)
+        {
+            m_usbConn.releaseInterface(m_usbIf);
+            m_usbConn.close();
+            m_usbConn = null;
+            m_bInit = false;
+        }
+
+        //stop();
+    }
+
+    public void stop()
+    {
+        try{
+            mApplicationContext.unregisterReceiver(mPermissionReceiver);
+        }catch(IllegalArgumentException e){};//bravo
+    }
+
+    public boolean IsInit(){
+        return m_bInit;
+    }
+
+    private void enumerate(IPermissionListener listener) {
+        boolean bFound = false;
+        l("enumerating");
+        HashMap<String, UsbDevice> devlist = mUsbManager.getDeviceList();
+        Iterator<UsbDevice> deviter = devlist.values().iterator();
+
+        while (deviter.hasNext()) {
+            UsbDevice d = deviter.next();
+            l("Found device: " + String.format("%04X:%04X", d.getVendorId(), d.getProductId()));
+
+            Toast.makeText(mApplicationContext, "Found device: " + String.format("%04X:%04X", d.getVendorId(), d.getProductId()), Toast.LENGTH_SHORT).show();
+
+            if (d.getVendorId() == VID && d.getProductId() == PID) {
+                bFound = true;
+                l("Device under: " + d.getDeviceName());
+                if (!mUsbManager.hasPermission(d))
+                {
+                    Toast.makeText(mApplicationContext, "enumerate, hasPermission return false" , Toast.LENGTH_SHORT).show();
+                    listener.onPermissionDenied(d);
+                }
+                else{
+                    Toast.makeText(mApplicationContext, "enumerate, GetConnInerface start" , Toast.LENGTH_SHORT).show();
+                    //startHandler(d);
+                    GetConnInerface(d);
+                    //TestComm(d);
+                    return;
+                }
+                break;
+            }
+        }
+        if (bFound == false)
+        {
+            Toast.makeText(mApplicationContext, "no more devices found" , Toast.LENGTH_SHORT).show();
+            mConnectionHandler.onDeviceNotFound();
+        }
+    }
+
+    private class PermissionReceiver extends BroadcastReceiver {
+        private final IPermissionListener mPermissionListener;
+
+        public PermissionReceiver(IPermissionListener permissionListener) {
+            mPermissionListener = permissionListener;
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mApplicationContext.unregisterReceiver(this);
+            if (intent.getAction().equals(ACTION_USB_PERMISSION)) {
+                if (!intent.getBooleanExtra(
+                        UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
+                    mPermissionListener.onPermissionDenied((UsbDevice) intent
+                            .getParcelableExtra(UsbManager.EXTRA_DEVICE));
+
+                    mConnectionHandler.onUsbPermissionDenied();
+                } else {
+                    l("Permission granted");
+                    UsbDevice dev = (UsbDevice) intent
+                            .getParcelableExtra(UsbManager.EXTRA_DEVICE);
+                    if (dev != null) {
+                        if (dev.getVendorId() == VID
+                                && dev.getProductId() == PID) {
+                            //startHandler(dev);// has new thread
+                            GetConnInerface(dev);
+                            //TestComm(dev);
+                        }
+                    } else {
+                        mConnectionHandler.onDeviceNotFound();
+                    }
+                }
+            }
+        }
+    }
+
+    private void GetConnInerface(UsbDevice dev){
+        int n;
+
+        m_usbConn = mUsbManager.openDevice(dev);
+
+        n = dev.getInterfaceCount();
+
+        if (n <= 0)
+            return;
+        if(m_usbConn==null){
+            return;
+        }
+        if (!m_usbConn.claimInterface(dev.getInterface(0), true)) {
+            return;
+        }
+
+        m_usbIf = dev.getInterface(0);
+
+        n = m_usbIf.getEndpointCount();
+
+        if (n < 2)
+            return;
+
+        for (int i = 0; i < n; i++) {
+            if (m_usbIf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
+                if (m_usbIf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN)
+                    m_epIN = m_usbIf.getEndpoint(i);
+                else
+                    m_epOUT = m_usbIf.getEndpoint(i);
+            }
+        }
+
+        m_nEPInSize = m_epIN.getMaxPacketSize();
+        m_nEPOutSize = m_epOUT.getMaxPacketSize();
+
+        m_bInit = true;
+
+        //m_epOUT.getMaxPacketSize();
+
+        //Toast.makeText(mApplicationContext, "GetConnInerface OK, Out Max Size="+m_nEPOutSize+" In Max Size=" + m_nEPInSize, Toast.LENGTH_SHORT).show();
+        mConnectionHandler.onUsbConnected();
+    }
+
+    public boolean OperationInternal(byte[] pData, int nDataLen, int nTimeOut, boolean bRead)
+    {
+        byte[] w_abyTmp = new byte[31];
+        byte[] w_abyCSW = new byte[13];
+        boolean w_bRet;
+
+        Arrays.fill(w_abyTmp, (byte)0);
+        w_abyTmp[0] = 0x55;
+        w_abyTmp[1] = 0x53;
+        w_abyTmp[2] = 0x42;
+        w_abyTmp[3] = 0x43;
+        w_abyTmp[4] = 0x28;
+        w_abyTmp[5] = 0x2b;
+        w_abyTmp[6] = 0x18;
+        w_abyTmp[7] = (byte)0x89;
+        w_abyTmp[8] = (byte)(nDataLen & 0xFF);
+        w_abyTmp[9] = (byte)((nDataLen >> 8)& 0xFF);
+        w_abyTmp[10] = (byte)((nDataLen >> 16)& 0xFF);
+        w_abyTmp[11] = (byte)((nDataLen >> 24)& 0xFF);
+
+        if(bRead)
+            w_abyTmp[12] = (byte)0x80;
+        else
+            w_abyTmp[12] = 0x00;    //cCBWFlags
+
+        w_abyTmp[13] = 0x00;    //cCBWlun
+        w_abyTmp[14] = 0x0a;    //cCBWCBLength
+
+        w_abyTmp[15] = (byte)0xef;
+        if (bRead)
+            w_abyTmp[16] = (byte)0xff;
+        else
+            w_abyTmp[16] = (byte)0xfe;
+
+        // send 31bytes
+        w_bRet = UsbBulkSend(w_abyTmp, 31, nTimeOut);
+
+        if (!w_bRet)
+            return false;
+
+        // read or write real data
+        if (bRead)
+            w_bRet = UsbBulkReceive(pData, nDataLen, nTimeOut);
+        else
+            w_bRet = UsbBulkSend(pData, nDataLen, nTimeOut);
+
+        if (!w_bRet)
+            return false;
+
+        // receive csw
+        w_bRet = UsbBulkReceive(w_abyCSW, 13, nTimeOut);
+
+        return w_bRet;
+    }
+
+    public boolean UsbSCSIWrite(byte[] pCDB, int nCDBLen, byte[] pData, int nDataLen, int nTimeOut)
+    {
+        byte[] w_abyTmp = new byte[31];
+        byte[] w_abyCSW = new byte[13];
+        boolean w_bRet;
+
+        //Arrays.fill(w_abyTmp, (byte)0);
+        w_abyTmp[0] = 0x55;
+        w_abyTmp[1] = 0x53;
+        w_abyTmp[2] = 0x42;
+        w_abyTmp[3] = 0x43;
+        w_abyTmp[4] = 0x28;
+        w_abyTmp[5] = 0x2b;
+        w_abyTmp[6] = 0x18;
+        w_abyTmp[7] = (byte)0x89;
+        w_abyTmp[8] = 0x00;
+        w_abyTmp[9] = 0x00;
+        w_abyTmp[10] = 0x00;
+        w_abyTmp[11] = 0x00;
+        w_abyTmp[12] = 0x00;    //cCBWFlags
+        w_abyTmp[13] = 0x00;    //cCBWlun
+        w_abyTmp[14] = 0x0a;    //cCBWCBLength
+
+        System.arraycopy(pCDB, 0, w_abyTmp, 15, nCDBLen);
+        //System.arraycopy(pData, 0, w_abyTmp, 31, nDataLen);
+
+        w_bRet = UsbBulkSend(w_abyTmp, 31, nTimeOut);
+
+        if (!w_bRet)
+            return false;
+
+        w_bRet = UsbBulkSend(pData, nDataLen, nTimeOut);
+
+        if (!w_bRet)
+            return false;
+
+        // receive csw
+        w_bRet = UsbBulkReceive(w_abyCSW, 13, nTimeOut);
+
+        return w_bRet;
+    }
+
+    public boolean UsbSCSIRead(byte[] pCDB, int nCDBLen, byte[] pData, int nDataLen, int nTimeOut)
+    {
+        long    w_nTime;
+        byte[] w_abyTmp = new byte[31];
+        byte[] w_abyCSW = new byte[13];
+        boolean w_bRet;
+
+        //Arrays.fill(w_abyTmp, (byte)0);
+        w_abyTmp[0] = 0x55;
+        w_abyTmp[1] = 0x53;
+        w_abyTmp[2] = 0x42;
+        w_abyTmp[3] = 0x43;
+        w_abyTmp[4] = 0x28;
+        w_abyTmp[5] = 0x2b;
+        w_abyTmp[6] = 0x18;
+        w_abyTmp[7] = (byte)0x89;
+        w_abyTmp[8] = 0x00;
+        w_abyTmp[9] = 0x00;
+        w_abyTmp[10] = 0x00;
+        w_abyTmp[11] = 0x00;
+        w_abyTmp[12] = (byte)0x80;    //cCBWFlags
+        w_abyTmp[13] = 0x00;    //cCBWlun
+        w_abyTmp[14] = 0x0a;    //cCBWCBLength
+
+        System.arraycopy(pCDB, 0, w_abyTmp, 15, nCDBLen);
+
+        w_bRet = UsbBulkSend(w_abyTmp, 31, nTimeOut);
+
+        if (!w_bRet)
+            return false;
+
+        w_nTime = SystemClock.elapsedRealtime();
+
+        w_bRet = UsbBulkReceive(pData, nDataLen, nTimeOut);
+
+        w_nTime = SystemClock.elapsedRealtime() - w_nTime;
+
+        //Toast.makeText(mApplicationContext, "UsbSCSIRead, UsbBulkReceive Time : " + w_nTime , Toast.LENGTH_SHORT).show();
+
+        if (!w_bRet)
+            return false;
+
+        // receive csw
+        w_bRet = UsbBulkReceive(w_abyCSW, 13, nTimeOut);
+
+        return w_bRet;
+    }
+
+    private boolean UsbBulkSend(byte[] pBuf, int nLen, int nTimeOut)
+    {
+        int i, n, r, w_nRet;
+        //byte[] w_abyTmp = new byte[m_nEPOutSize];
+
+        n = nLen / m_nEPOutSize;
+        r = nLen % m_nEPOutSize;
+
+        for(i=0; i<n; i++)
+        {
+            System.arraycopy(pBuf, i*m_nEPOutSize, m_abyTransferBuf, 0, m_nEPOutSize);
+            if(m_usbConn==null){
+                return false;
+            }
+            w_nRet = m_usbConn.bulkTransfer(m_epOUT, m_abyTransferBuf, m_nEPOutSize, nTimeOut);
+
+            if (w_nRet != m_nEPOutSize)
+                return false;
+        }
+
+        if (r > 0)
+        {
+            System.arraycopy(pBuf, i*m_nEPOutSize, m_abyTransferBuf, 0, r);
+            if(m_usbConn==null){
+                return false;
+            }
+            w_nRet = m_usbConn.bulkTransfer(m_epOUT, m_abyTransferBuf, r, nTimeOut);
+
+            if (w_nRet != r)
+                return false;
+        }
+
+        return true;
+    }
+
+    private boolean UsbBulkReceive(byte[] pBuf, int nLen, int nTimeOut)
+    {
+        int i, n, r, w_nRet;
+        //byte[] w_abyTmp = new byte[m_nEPInSize];
+
+        //w_nRet = m_usbConn.bulkTransfer(m_epIN, pBuf, nLen, nTimeOut);
+
+        //if (w_nRet != nLen)
+        //    return false;
+
+        n = nLen / m_nEPInSize;
+        r = nLen % m_nEPInSize;
+
+        //Toast.makeText(mApplicationContext, "UsbBulkReceive, Buf Len = " + pBuf.length, Toast.LENGTH_SHORT).show();
+
+        for(i=0; i<n; i++)
+        {
+            if(m_usbConn==null){
+                return false;
+            }
+            w_nRet = m_usbConn.bulkTransfer(m_epIN, m_abyTransferBuf, m_nEPInSize, nTimeOut);
+
+            if (w_nRet != m_nEPInSize)
+                return false;
+
+            System.arraycopy(m_abyTransferBuf, 0, pBuf, i*m_nEPInSize, m_nEPInSize);
+        }
+
+        if (r > 0)
+        {
+            if(m_usbConn==null){
+                return false;
+            }
+            w_nRet = m_usbConn.bulkTransfer(m_epIN, m_abyTransferBuf, r, nTimeOut);
+
+            if (w_nRet != r)
+                return false;
+
+            System.arraycopy(m_abyTransferBuf, 0, pBuf, i*m_nEPInSize, r);
+        }
+
+        return true;
+    }
+
+    // END MAIN LOOP
+    private BroadcastReceiver mPermissionReceiver = new PermissionReceiver(
+            new IPermissionListener() {
+                @Override
+                public void onPermissionDenied(UsbDevice d) {
+                    l("Permission denied on " + d.getDeviceId());
+                }
+            });
+
+    private static interface IPermissionListener {
+        void onPermissionDenied(UsbDevice d);
+    }
+
+    public final static String TAG = "USBController";
+
+    private void l(Object msg) {
+        Log.d(TAG, ">==< " + msg.toString() + " >==<");
+    }
+}

--
Gitblit v1.9.3