com.HXcordova.iMateHxDevice.java Source code

Java tutorial

Introduction

Here is the source code for com.HXcordova.iMateHxDevice.java

Source

package com.HXcordova;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaArgs;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Base64;
import android.util.Log;

import com.hxsmart.iMateSDK.HXiMateSDK;
import com.hxsmart.imateinterface.BluetoothThread;
import com.hxsmart.imateinterface.IcCardData;
import com.hxsmart.imateinterface.IdInformationData;
import com.hxsmart.imateinterface.MagCardData;
import com.hxsmart.imateinterface.UtilTools;
import com.hxsmart.imateinterface.pbochighsdk.PbocCardData;
import com.ivsign.android.IDCReader.IDCReaderSDK;

public class iMateHxDevice extends CordovaPlugin {

    private HXiMateSDK iMate;
    private CallbackContext callbackContext;

    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        iMate = HXiMateSDK.getInstance(cordova.getActivity().getApplicationContext());
        iMate.DisableCheckTactics(true);//??
        super.initialize(cordova, webView);
    }

    @Override
    public boolean execute(String action, CordovaArgs args, CallbackContext mCallbackContext) throws JSONException {

        System.out.println("exec !!!!!!!" + action);

        //?
        if (!iMate.deviceIsConnecting()) {
            mCallbackContext.error("iMate!");
            return true;
        }
        //?
        if (iMate.deviceIsWorking()) {
            mCallbackContext.error(",??????");
            return true;
        }

        JSONArray jsonarrayTmp = null;
        JSONObject jsonTmp = null;
        try {
            jsonarrayTmp = new JSONArray(args.getString(0));// [{},{},{},...]
            jsonTmp = jsonarrayTmp.getJSONObject(0);
        } catch (JSONException e) {
            Log.i("zbh", "??JSONArray,new JSONObject(args.getString(0))?");
            jsonTmp = new JSONObject(args.getString(0));
        }

        final JSONArray jsonarray = jsonarrayTmp;
        final JSONObject json = jsonTmp;

        callbackContext = mCallbackContext;
        //
        if ("updateTactic".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "Id;startTime;endTime;longitude;latitude;range;canUse")) {
                callbackContext
                        .error("Id;startTime;endTime;longitude;latitude;range;canUse??");
                return true;
            }

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {

                    JSONObject jsontmp = new JSONObject();
                    final ArrayList<String> arraylist = new ArrayList<String>();
                    try {

                        for (int i = 0; i < jsonarray.length(); i++) {
                            jsontmp = jsonarray.getJSONObject(i);
                            StringBuilder sb = new StringBuilder("");
                            sb.append(jsontmp.getString("Id"));
                            sb.append(";");
                            sb.append(jsontmp.getString("startTime"));
                            sb.append(";");
                            sb.append(jsontmp.getString("endTime"));
                            sb.append(";");
                            sb.append(jsontmp.getString("longitude"));
                            sb.append(";");
                            sb.append(jsontmp.getString("latitude"));
                            sb.append(";");
                            sb.append(jsontmp.getString("range"));
                            sb.append(";");
                            sb.append(jsontmp.getString("canUse"));
                            arraylist.add(sb.toString());
                        }
                    } catch (JSONException e) {
                        callbackContext.error(e.getMessage());
                        return;
                    }

                    int ret = iMate.updateTactics(arraylist);
                    if (ret == 0) {
                        callbackContext.success("?");
                    } else {
                        callbackContext.error("");
                    }
                }
            });

            //?
        } else if ("getTactics".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    ArrayList<String> arraylist = iMate.getTactics();
                    if (arraylist != null) {
                        JSONArray JsonArray = new JSONArray();
                        for (String string : arraylist) {
                            String[] allKEYs = string.split(";");
                            JSONObject jsonObject = new JSONObject();
                            try {
                                jsonObject.put("Id", allKEYs[0]);
                                jsonObject.put("startTime", allKEYs[1]);
                                jsonObject.put("endTime", allKEYs[2]);
                                jsonObject.put("longitude", allKEYs[3]);
                                jsonObject.put("latitude", allKEYs[4]);
                                jsonObject.put("range", allKEYs[5]);
                                jsonObject.put("canUse", allKEYs[6]);
                                JsonArray.put(jsonObject);
                            } catch (JSONException e) {
                                callbackContext.error(e.getMessage());
                                return;
                            }
                        }
                        callbackContext.success(JsonArray);
                    } else {
                        callbackContext.error(iMate.getErrorString());
                    }
                }
            });

            //??:??,?
        } else if ("getDeviceInfo".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    String SN = iMate.deviceSerialNumber();
                    String termId = iMate.TermID();
                    if (SN == null || termId == null)
                        callbackContext.error("??");
                    else
                        callbackContext.success(
                                "{" + "\"DeviceSN\":\"" + SN + "\"" + "\"termID\":\"" + termId + "\"" + "}");
                }
            });

            //?
        } else if ("subDeviceTest".equalsIgnoreCase(action)) {
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {

                    int ret = iMate.deviceTest(0xFF);
                    if (ret == 0)
                        callbackContext.success("?");
                    else if (ret == 0x01)
                        callbackContext.error("??");
                    else if (ret == 0x02)
                        callbackContext.error("?");
                }
            });

            //??
        } else if ("cancel".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    iMate.cancel();
                    callbackContext.success();
                }
            });

            //?   
        } else if ("buzzer".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    iMate.buzzer();
                    callbackContext.success();
                }
            });

            //??socket   
        } else if ("isConnectTest".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    if (iMate.deviceIsConnecting())
                        callbackContext.success("");
                    else
                        callbackContext.error("");
                }
            });

            //??
        } else if ("waitAllCard".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "timeout")) {
                callbackContext.error("timeout?");
                return true;
            }
            final int timeout = json.getInt("timeout");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {

                    byte[] ret = iMate.waitEvent(0xff, timeout);
                    if (ret == null) {
                        callbackContext.error(iMate.getErrorString());
                    } else {

                        // 
                        String Event;
                        if (ret[0] == 0x01) {
                            // ???
                            Event = "???";
                            Log.i("zbh", new String(ret, 1, 141));
                            String track2 = new String(ret, 1, 37);
                            String track3 = new String(ret, 38, 104);
                            String[] tmpStrings = track2.split("=");
                            callbackContext.success("{" + "\"Event\":\"" + Event + "\"" + "\"track2\":\"" + track2
                                    + "\"" + "\"track3\":\"" + track3 + "\"" + "\"cardNo\":\"" + tmpStrings[0]
                                    + "\"" + "}");
                            return;
                        } else if (ret[0] == 0x02) {
                            Event = "IC?";
                            int length = ret.length - 1;
                            byte[] bytes = new byte[length];
                            System.arraycopy(ret, 1, bytes, 0, length);
                            String ATR = BluetoothThread.bytesToHexString(bytes, length);

                            callbackContext
                                    .success("{" + "\"Event\":\"" + Event + "\"" + "\"ATR\":\"" + ATR + "\"" + "}");
                            return;
                        } else {
                            Event = "?";
                            int length = ret.length - 1;
                            byte[] bytes = new byte[length];
                            System.arraycopy(ret, 1, bytes, 0, length);
                            String ATR = BluetoothThread.bytesToHexString(bytes, length);
                            callbackContext
                                    .success("{" + "\"Event\":\"" + Event + "\"" + "\"ATR\":\"" + ATR + "\"" + "}");
                            return;
                        }
                    }
                }
            });

            //?
        } else if ("readID".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "timeout")) {
                callbackContext.error("timeout?");
                return true;
            }
            final int timeout = json.getInt("timeout");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {

                    IdInformationData idInfo = new IdInformationData();
                    int ret = iMate.readIdInformation(idInfo, timeout);
                    Log.i("zbh", ":" + ret);
                    if (ret == 0) {
                        ret = IDCReaderSDK.decodingPictureData(BluetoothThread.WLTLIB_DIR, idInfo.getPictureData());
                        String message = null;
                        switch (ret) {
                        case 0:
                            String photodata = readIdBmpAndToBASE64(
                                    BluetoothThread.WLTLIB_DIR + File.separator + "zp.bmp");
                            if (photodata != null) {
                                String birthday = idInfo.getBirthdayYearString() + "."
                                        + idInfo.getBirthdayMonthString() + "." + idInfo.getBirthdayDayString();
                                message = "{" + "\"name\":\"" + idInfo.getNameString() + "\"" + "\"sex\":\""
                                        + idInfo.getSexString() + "\"" + "\"nation\":\"" + idInfo.getNationString()
                                        + "\"" + "\"birthday\":\"" + birthday + "\"" + "\"address\":\""
                                        + idInfo.getAddressString() + "\"" + "\"idNumber\":\""
                                        + idInfo.getIdNumberString() + "\"" + "\"issuser\":\""
                                        + idInfo.getIssuerString() + "\"" + "\"validdate\":\""
                                        + idInfo.getValidDateString() + "\"" + "\"photoBase64Data\":\"" + photodata
                                        + "\"" + "}";
                                callbackContext.success(message);
                                return;
                            }
                            message = "?base64";
                            break;
                        case 1:
                            message = "???wltlibDirectory?base.dat";
                            break;
                        case 2:
                            message = "?license.lic";
                            break;
                        case 3:
                            message = "?";
                            break;
                        }
                        callbackContext.error(message);
                    } else if (ret == 2) {
                        callbackContext.error(idInfo.getErrorString());
                    } else if (ret == 1) {
                        callbackContext.error("");
                    } else if (ret == -1) {
                        callbackContext.error("?");
                    } else if (ret == -9) {
                        callbackContext.error("???");
                    }
                }
            });

            //???(?)
        } else if ("readMsgCard".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "timeout")) {
                callbackContext.error("timeout?");
                return true;
            }
            final int timeout = json.getInt("timeout");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    MagCardData cardData = new MagCardData();
                    int ret = iMate.swipeCard(cardData, timeout);
                    if (ret != 0) {
                        String errMsg = "";
                        if (ret == 1)
                            errMsg = "";
                        else if (ret == 2)
                            errMsg = cardData.getErrorString();
                        else if (ret == -1)
                            errMsg = "?";
                        else if (ret == -9)
                            errMsg = "???";
                        else
                            errMsg = ":[" + ret + "]";
                        callbackContext.error(errMsg);
                        return;
                    }

                    if (cardData.getCardNoString() == null || cardData.getCardNoString().length() == 0) {
                        callbackContext.error("?????");
                        return;
                    }
                    if (cardData.getTrack2String() == null || cardData.getTrack2String().length() == 0) {
                        callbackContext.error("????");
                        return;
                    }

                    callbackContext.success("{" + "\"cardNo\":\"" + cardData.getCardNoString() + "\""
                            + "\"track2\":\"" + cardData.getTrack2String() + "\"" + "\"track3\":\""
                            + cardData.getTrack3String() + "\"" + "}");
                }
            });

            //IC?
        } else if ("readICCard".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "timeout")) {
                callbackContext.error("timeout?");
                return true;
            }
            final int timeout = json.getInt("timeout");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    IcCardData icCardInfo = new IcCardData();
                    int ret = iMate.readIcCard(icCardInfo, timeout);
                    if (ret != 0) {
                        String errMsg = "";
                        if (ret == 1)
                            errMsg = "";
                        else if (ret == 2)
                            errMsg = icCardInfo.getErrorString();
                        else if (ret == -1)
                            errMsg = "?";
                        else if (ret == -9)
                            errMsg = "???";
                        else
                            errMsg = ":[" + ret + "]";
                        callbackContext.error(errMsg);
                        return;
                    }

                    callbackContext.success("{" + "\"cardNo\":\"" + icCardInfo.getCardNoString().replace("f", "")
                            + "\"" + "\"track2\":\"" + icCardInfo.getTrack2String() + "\"" + "\"PanSN\":\""
                            + icCardInfo.getPanSequenceNoString() + "\"" + "\"expireDate\":\""
                            + icCardInfo.getExpireDateString() + "\"" + "\"holderName\":\""
                            + icCardInfo.getHolderNameString() + "\"" + "\"holderID\":\""
                            + icCardInfo.getHolderIdString() + "\"" + "}");
                }
            });

            //RF?
        } else if ("readRFCard".equalsIgnoreCase(action)) {
            if (!JsonObjectHasKeys(json, "timeout")) {
                callbackContext.error("timeout?");
                return true;
            }
            final int timeout = json.getInt("timeout");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    IcCardData icCardInfo = new IcCardData();
                    int ret = iMate.readRfCard(icCardInfo, timeout);
                    if (ret != 0) {
                        String errMsg = "";
                        if (ret == 1)
                            errMsg = "";
                        else if (ret == 2)
                            errMsg = icCardInfo.getErrorString();
                        else if (ret == -1)
                            errMsg = "?";
                        else if (ret == -9)
                            errMsg = "???";
                        else
                            errMsg = ":[" + ret + "]";
                        callbackContext.error(errMsg);
                        return;
                    }

                    callbackContext.success("{" + "\"cardNo\":\"" + icCardInfo.getCardNoString().replace("f", "")
                            + "\"" + "\"track2\":\"" + icCardInfo.getTrack2String() + "\"" + "\"PanSN\":\""
                            + icCardInfo.getPanSequenceNoString() + "\"" + "\"expireDate\":\""
                            + icCardInfo.getExpireDateString() + "\"" + "\"holderName\":\""
                            + icCardInfo.getHolderNameString() + "\"" + "\"holderID\":\""
                            + icCardInfo.getHolderIdString() + "\"" + "}");

                }
            });

            //?55
        } else if ("readICCardField55".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "timeout;slot")) {
                callbackContext.error("timeout;slot??");
                return true;
            }
            final int timeout = json.getInt("timeout");
            final int slot = json.getInt("slot");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    PbocCardData pbocCardData = new PbocCardData();
                    int ret = iMate.readIC_Card_55Field(slot, pbocCardData, timeout);
                    if (ret != 0) {
                        String errMsg = "";
                        if (ret == -2)
                            errMsg = iMate.getErrorString();
                        else if (ret == -1)
                            errMsg = "?";
                        else if (ret == -9)
                            errMsg = "???";
                        else
                            errMsg = getPbocHighError(ret) + "[" + ret + "]";
                        callbackContext.error(errMsg);
                        return;
                    }

                    callbackContext.success(
                            "{" + "\"cardNo\":\"" + pbocCardData.pan + "\"" + "\"track2\":\"" + pbocCardData.track2
                                    + "\"" + "\"PanSN\":\"" + pbocCardData.panSeqNo + "\"" + "\"field55\":\""
                                    + pbocCardData.field55 + "\"" + "\"holderName\":\"" + pbocCardData.holderName
                                    + "\"" + "\"extInfo\":\"" + pbocCardData.extInfo + "\"" + "}");

                }
            });

            //?ARPC
        } else if ("verifyARPC_RunScript".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "script")) {
                callbackContext.error("script?");
                return true;
            }
            final String Script = json.getString("script");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    String newField55 = new String();
                    int ret = iMate.verifyARPC_RunScript(Script, newField55);
                    if (ret != 0) {
                        String errMsg = getPbocHighError(ret) + "[" + ret + "]";
                        callbackContext.error(errMsg);
                        return;
                    }

                    callbackContext.success("{" + "\"newField55\":\"" + newField55 + "\"" + "}");
                }
            });

            //???
        } else if ("getFingerprintFeature".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "FingerprintModel;FeatureDataType")) {
                callbackContext.error("FingerprintModel;FeatureDataType??");
                return true;
            }
            final int theFingerprintModel = json.getInt("FingerprintModel");
            final int DataType = json.getInt("FeatureDataType");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {

                    iMate.FingerPrint_setFingerprintModel(theFingerprintModel);
                    iMate.FingerPrint_setFeatureDataType(DataType);
                    String Feature = iMate.FingerPrint_GetFeature();
                    if (Feature == null)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success("{" + "\"FingerprintData\":\"" + Feature + "\"" + "}");
                }
            });

            //? ??
        } else if ("FingerPrint_Cancel".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    iMate.FingerPrint_Cancel();
                    callbackContext.success();
                }
            });

            //?
        } else if ("Pinpad_setPinpadModel".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "PinpadModel")) {
                callbackContext.error("PinpadModel?");
                return true;
            }
            final int thePinpadModel = json.getInt("PinpadModel");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    iMate.Pinpad_setPinpadModel(thePinpadModel);
                    callbackContext.success();
                }
            });

            //?
        } else if ("Pinpad_PowerOn".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    int ret = iMate.Pinpad_PowerOn();
                    if (ret == 0)
                        callbackContext.success();
                    else
                        callbackContext.error(iMate.getErrorString());
                }
            });

            //???
        } else if ("Pinpad_Cancel".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    iMate.Pinpad_Cancel();
                    callbackContext.success();
                }
            });

            //????
        } else if ("Pinpad_getSerialNo".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    String PinpadSN = iMate.Pinpad_getSerialNo();
                    if (PinpadSN == null)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success("{" + "\"PinpadSN\":\"" + PinpadSN + "\"" + "}");
                }
            });

            //?   
        } else if ("Pinpad_DownloadMasterKey".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "algorithm;masterIndex;masterKey")) {
                callbackContext.error("algorithm;masterIndex;masterKey??");
                return true;
            }
            final int algorithm = json.getInt("algorithm");
            final int masterIndex = json.getInt("masterIndex");
            String masterKeyStr = json.getString("masterKey");
            final byte[] masterKey = UtilTools.HexString2Bytes(masterKeyStr);
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    int ret = iMate.Pinpad_DownloadMasterKey(algorithm, masterIndex, masterKey, masterKey.length);
                    if (ret != 0)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success();
                }
            });

            //   
        } else if ("Pinpad_DownloadWorkingKey".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "algorithm;masterIndex;workingIndex;workingKey")) {
                callbackContext.error("algorithm;masterIndex;workingIndex;workingKey??");
                return true;
            }

            final int algorithm = json.getInt("algorithm");
            final int masterIndex = json.getInt("masterIndex");
            final int workingIndex = json.getInt("workingIndex");
            String workingKeyStr = json.getString("workingKey");
            final byte[] workingKey = UtilTools.HexString2Bytes(workingKeyStr);
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    int ret = iMate.Pinpad_DownloadWorkingKey(algorithm, masterIndex, workingIndex, workingKey,
                            workingKey.length);
                    if (ret != 0)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success();
                }
            });

            //   
        } else if ("Pinpad_UpdateMasterKey".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "algorithm;masterIndex;masterKey")) {
                callbackContext.error("algorithm;masterIndex;masterKey??");
                return true;
            }

            final int algorithm = json.getInt("algorithm");
            final int masterIndex = json.getInt("masterIndex");
            String masterKeyStr = json.getString("masterKey");
            final byte[] masterKey = UtilTools.HexString2Bytes(masterKeyStr);
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    int ret = iMate.Pinpad_UpdateMasterKey(algorithm, masterIndex, masterKey, masterKey.length);
                    if (ret != 0)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success();
                }
            });

            //MAC   
        } else if ("Pinpad_DownloadMACKey".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "algorithm;masterIndex;MackeyIndex;MacKey")) {
                callbackContext.error("algorithm;masterIndex;MackeyIndex;MacKey??");
                return true;
            }

            final int algorithm = json.getInt("algorithm");
            final int masterIndex = json.getInt("masterIndex");
            final int MackeyIndex = json.getInt("MackeyIndex");
            String MacKeyStr = json.getString("MacKey");
            final byte[] MacKey = UtilTools.HexString2Bytes(MacKeyStr);
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    int ret = iMate.Pinpad_DownloadMACKey(algorithm, masterIndex, MackeyIndex, MacKey,
                            MacKey.length);
                    if (ret != 0)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success();
                }
            });

            //??   
        } else if ("Pinpad_getPin".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "algorithm;masterIndex;workingIndex;cardNo;pinLength;timeout")) {
                callbackContext
                        .error("algorithm;masterIndex;workingIndex;cardNo;pinLength;timeout??");
                return true;
            }

            final int algorithm = json.getInt("algorithm");
            final int masterIndex = json.getInt("masterIndex");
            final int workingIndex = json.getInt("workingIndex");
            final String cardNo = json.getString("cardNo");
            final int pinLength = json.getInt("pinLength");
            final int timeout = json.getInt("timeout");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    String pin = iMate.Pinpad_getPin(algorithm, true, masterIndex, workingIndex, cardNo, pinLength,
                            timeout);
                    if (pin == null)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success("{" + "\"Pin\":\"" + pin + "\"" + "}");
                }
            });

            //??
        } else if ("Pinpad_getPlainPin".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "pinLength;timeout")) {
                callbackContext.error("pinLength;timeout??");
                return true;
            }

            final int pinLength = json.getInt("pinLength");
            final int timeout = json.getInt("timeout");
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    String PlainPin = iMate.Pinpad_getPlainPin(pinLength, timeout);
                    if (PlainPin == null)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success("{" + "\"PlainPin\":\"" + PlainPin + "\"" + "}");
                }
            });

            //
        } else if ("Pinpad_Encrypt".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "algorithm;masterIndex;workingIndex;cryptoMode;data")) {
                callbackContext.error("algorithm;masterIndex;workingIndex;cryptoMode;data??");
                return true;
            }

            final int algorithm = json.getInt("algorithm");
            final int masterIndex = json.getInt("masterIndex");
            final int workingIndex = json.getInt("workingIndex");
            final int cryptoMode = json.getInt("cryptoMode");
            String dataStr = json.getString("data");
            final byte[] data = UtilTools.HexString2Bytes(dataStr);

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    byte[] resultBytes = iMate.Pinpad_Encrypt(algorithm, cryptoMode, masterIndex, workingIndex,
                            data, data.length);

                    if (resultBytes == null)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success(
                                "{" + "\"outData\":\"" + UtilTools.Bytes2HexString(resultBytes) + "\"" + "}");
                }
            });

            //Mac
        } else if ("Pinpad_Mac".equalsIgnoreCase(action)) {

            if (!JsonObjectHasKeys(json, "algorithm;masterIndex;macIndex;data")) {
                callbackContext.error("algorithm;masterIndex;macIndex;data??");
                return true;
            }

            final int algorithm = json.getInt("algorithm");
            final int masterIndex = json.getInt("masterIndex");
            final int macIndex = json.getInt("macIndex");
            String dataStr = json.getString("data");
            final byte[] data = dataStr.getBytes();// UTF-8

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    byte[] resultBytes = iMate.Pinpad_Mac(algorithm, masterIndex, macIndex, data, data.length);

                    if (resultBytes == null)
                        callbackContext.error(iMate.getErrorString());
                    else
                        callbackContext.success(
                                "{" + "\"outData\":\"" + UtilTools.Bytes2HexString(resultBytes) + "\"" + "}");
                }
            });

            //??
        } else if ("Pinpad_PowerOff".equalsIgnoreCase(action)) {

            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    int ret = iMate.Pinpad_PowerOff();
                    if (ret == 0)
                        callbackContext.success();
                    else
                        callbackContext.error(iMate.getErrorString());
                }
            });

        } else if ("OpenBluetoothSocket".equalsIgnoreCase(action)) {
            iMate.resumeThread();
            callbackContext.success();
        } else if ("CloseBluetoothSocket".equalsIgnoreCase(action)) {
            iMate.pauseThread();
            callbackContext.success();
        } else if ("startSearchBLE".equalsIgnoreCase(action)) {
            callbackContext.success();
        } else if ("stopSearchBLE".equalsIgnoreCase(action)) {
            callbackContext.success();
        } else if ("bindDevice".equalsIgnoreCase(action)) {
            callbackContext.success();
        }

        //pboc ??
        return true;
    }

    public String readIdBmpAndToBASE64(String fileName) {
        String res = null;
        try {
            FileInputStream fin = new FileInputStream(fileName);
            int length = fin.available();
            byte[] buffer = new byte[length];
            fin.read(buffer);
            res = (Base64.encodeToString(buffer, Base64.NO_WRAP)).replace("\n", "");
            fin.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }

    public boolean JsonObjectHasKeys(JSONObject json, String keysString) {
        String[] keys = keysString.split(";");
        for (String string : keys) {
            if (!json.has(string))
                return false;
        }
        return true;
    }

    public String getPbocHighError(int ErrorCode) {
        String message;
        switch (ErrorCode) {
        case 1:
            message = "?";
            break;
        case 2:
            message = "?";
            break;
        case 3:
            message = "?";
            break;
        case 4:
            message = "??";
            break;
        case 5:
            message = "???";
            break;
        case 6:
            message = "?";
            break;
        case 7:
            message = "";
            break;
        default:
            message = "";
            break;
        }
        return message;
    }
}