<fieldset id="drb0p"><optgroup id="drb0p"><mark id="drb0p"></mark></optgroup></fieldset>
<fieldset id="drb0p"></fieldset>
<center id="drb0p"></center>
<samp id="drb0p"></samp>
  • 国内精品久久久久久中文字幕_人妻少妇精品无码专区二区_蜜臀AV人妻久久无码精品麻豆_99精品国产一区二区三区_国内精品久久久久久TV

    NFC手機(jī)二代身份證閱讀開(kāi)發(fā)說(shuō)明

    2019-07-01 16:23:00
    諾塔斯智能科技
    原創(chuàng)
    4503
    摘要:隨著NFC手機(jī)的不斷普及,利用手機(jī)NFC進(jìn)行身份證證件識(shí)別和判斷真?zhèn)?,檢測(cè)身份證信息并讀取內(nèi)容進(jìn)行實(shí)名認(rèn)證。未來(lái),人們?cè)诰€交易或簽署合同時(shí),只需用手機(jī)掃描身份證即可完成身份驗(yàn)證,隨后便可使用該身份進(jìn)行交易、合同簽署,方便快捷的同時(shí),安全性更是上升到更高層級(jí)。
    人的身份是混亂的,最終將導(dǎo)致交易混亂,從而會(huì)出現(xiàn)大量的欺詐交易。如今網(wǎng)絡(luò)誠(chéng)信,網(wǎng)絡(luò)安全等問(wèn)題已經(jīng)嚴(yán)重制約的我國(guó)電子商務(wù),甚至威脅到我國(guó)互聯(lián)網(wǎng)的健康發(fā)展,實(shí)名認(rèn)證有利于確定身份,讓商家和客戶之間彼此了解和交流,有利于網(wǎng)絡(luò)商城的開(kāi)展,避免了一些不法分子在網(wǎng)絡(luò)上欺騙消費(fèi)者。

    實(shí)名認(rèn)證是市場(chǎng)經(jīng)濟(jì)中不能跳過(guò)的流程,那是否意味著每一次的認(rèn)證都要讓人百般懷疑的進(jìn)行“拍照”、“上傳”這一系列步驟嗎,萬(wàn)一真遇上“釣魚(yú)網(wǎng)站”,個(gè)人信息遭到泄露,后果將不堪設(shè)想,并且繁復(fù)的上傳回饋過(guò)程也大大降低了工作效率。再者,如遇到假冒偽造證件,普通民眾用肉眼并不能立即識(shí)別真假,

    隨著NFC手機(jī)的不斷普及,利用手機(jī)NFC進(jìn)行身份證證件識(shí)別和判斷真?zhèn)?,檢測(cè)身份證信息并讀取內(nèi)容進(jìn)行實(shí)名認(rèn)證。未來(lái),人們?cè)诰€交易或簽署合同時(shí),只需用手機(jī)掃描身份證即可完成身份驗(yàn)證,隨后便可使用該身份進(jìn)行交易、合同簽署,方便快捷的同時(shí),安全性更是上升到更高層級(jí)。

    NFC手機(jī)二代身份證閱讀開(kāi)發(fā)說(shuō)明

    1、首先需要在AndroidManifest.xml文件中進(jìn)行權(quán)限配置,我們需要手機(jī)上網(wǎng)和打開(kāi)NFC功能的權(quán)限。


       <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.INTERNET" >
        </uses-permission>
       <uses-permission android:name="android.permission.NFC" />
    <uses-feature
            android:name="android.hardware.nfc"
            android:required="true" />


    2、在Android NFC手機(jī)二代身份證閱讀工程中建立一個(gè)libs文件夾并導(dǎo)入.so庫(kù)文件,我們提供了包括,arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64等一系列的庫(kù)文件,開(kāi)發(fā)者可以根據(jù)自己項(xiàng)目需求,選擇性的導(dǎo)入.so庫(kù)文件。

    3、定義二代身份證閱讀過(guò)程中的關(guān)鍵參數(shù),如:姓名,性別,地址等。參數(shù)定義如下:

    package cc.lotuscard;
    public class TwoIdInfoParam {
    	public TwoIdInfoParam()
    	{
    		arrTwoIdName = new byte[30];
    		arrTwoIdSex = new byte[2];
    		arrTwoIdNation = new byte[4];
    		arrTwoIdBirthday = new byte[16];
    		arrTwoIdAddress = new byte[70];
    		arrTwoIdNo = new byte[36];
    		arrTwoIdSignedDepartment = new byte[30];
    		arrTwoIdValidityPeriodBegin = new byte[16];
    		arrTwoIdValidityPeriodEnd = new byte[16];
    		arrTwoIdNewAddress = new byte[70];
    		arrTwoIdPhoto = new byte[1024];
    		arrTwoIdFingerprint = new byte[1024];
    		arrTwoIdPhotoJpeg = new byte[4096];
    	}
    	
    	/**
    	 * 姓名 UNICODE
    	 */
    	public byte[] arrTwoIdName;
    	/**
    	 * 性別 UNICODE
    	 */
    	public byte[] arrTwoIdSex;
    	/**
    	 * 民族 UNICODE
    	 */
    	public byte[] arrTwoIdNation;
    	/**
    	 * 出生日期 UNICODE YYYYMMDD
    	 */
    	public byte[] arrTwoIdBirthday;
    	/**
    	 * 住址 UNICODE
    	 */
    	public byte[] arrTwoIdAddress;
    	/**
    	 * 身份證號(hào)碼 UNICODE
    	 */
    	public byte[] arrTwoIdNo;
    	/**
    	 * 簽發(fā)機(jī)關(guān) UNICODE
    	 */
    	public byte[] arrTwoIdSignedDepartment;
    	/**
    	 * 有效期起始日期 UNICODE YYYYMMDD
    	 */
    	public byte[] arrTwoIdValidityPeriodBegin;
    	/**
    	 * 有效期截止日期 UNICODE YYYYMMDD 有效期為長(zhǎng)期時(shí)存儲(chǔ)“長(zhǎng)期”
    	 */
    	public byte[] arrTwoIdValidityPeriodEnd;
    	/**
    	 * 最新住址 UNICODE
    	 */
    	public byte[] arrTwoIdNewAddress;
    	/**
    	 * 照片信息
    	 */
    	public byte[] arrTwoIdPhoto;
    	/**
    	 * 指紋信息
    	 */
    	public byte[] arrTwoIdFingerprint;
    	/**
    	 * 照片信息 JPEG 格式
    	 */
    	public byte[] arrTwoIdPhotoJpeg;
    	/**
    	 * 照片信息長(zhǎng)度 JPEG格式
    	 */
    	public int unTwoIdPhotoJpegLength;
    }
    

    注意,NFC手機(jī)二代身份證閱讀開(kāi)發(fā)過(guò)程中,建立項(xiàng)目的時(shí)候,包名必須要遵循以下格式,否則無(wú)法編譯通過(guò)。

    package cc.lotuscard;


    4、創(chuàng)建一個(gè)Activity來(lái)實(shí)現(xiàn)NFC手機(jī)二代身份證閱讀的功能。實(shí)現(xiàn)代碼如下:


    package cn.highwillow.iddemo;
    import android.Manifest;
    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.BitmapDrawable;
    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.net.DhcpInfo;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
    import android.nfc.NfcAdapter;
    import android.nfc.Tag;
    import android.nfc.tech.IsoDep;
    import android.nfc.tech.MifareClassic;
    import android.nfc.tech.Ndef;
    import android.nfc.tech.NfcA;
    import android.nfc.tech.NfcB;
    import android.os.Parcelable;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.os.Build.VERSION;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.LineNumberReader;
    import java.io.Reader;
    import java.io.UnsupportedEncodingException;
    import java.net.InetAddress;
    import java.net.MalformedURLException;
    import java.net.NetworkInterface;
    import java.text.SimpleDateFormat;
    import java.sql.Date;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import cc.lotuscard.ILotusCallBack;
    import cc.lotuscard.LotusCardDriver;
    import cc.lotuscard.LotusCardParam;
    import cc.lotuscard.TwoIdInfoParam;
    //import static GuoTeng.GtTermb.Wlt2Bmp2;
    import static cc.lotuscard.LotusCardDriver.isZero;
    public class MainActivity extends AppCompatActivity implements ILotusCallBack {
        private static final int REQUEST_READ_PHONE_STATE = 0; // 請(qǐng)求碼
        private UsbDeviceConnection m_UsbDeviceConnection = null;
        private UsbEndpoint m_InEndpoint = null;
        private UsbEndpoint m_OutEndpoint = null;
        private final static char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7',
                '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        private LotusCardDriver mLotusCardDriver;
        private NfcAdapter m_NfcAdpater;
        private PendingIntent pendingIntent;
        private IntentFilter[] mFilters;
        private String[][] mTechLists;
        private Handler m_Handler = null;
        private EditText m_edtLog;
        private TextView m_txtCommandIndex;
        private ImageView m_imgIdPhoto;
        private Activity m_MainActivity = null;
        private UsbManager m_UsbManager = null;
        private UsbDevice m_LotusCardDevice = null;
        private UsbInterface m_LotusCardInterface = null;
        private UsbDeviceConnection m_LotusCardDeviceConnection = null;
        private final int m_nVID = 1306;
        private final int m_nPID = 20763;
        private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
        private Boolean m_bUseUsbHostApi = true;
        private Boolean m_bCanUseUsbHostApi = true;
        private String m_strDeviceNode;
        private long m_nDeviceHandle = -1;
        private int m_nSystemVersion = -1;
        private int m_nCommandInex = 0;
        private static final String Activity_TAG = "IdDemo";
        private EditText m_edtPostCode = null;
        private EditText m_edtAccoutCode = null;
        private EditText m_edtUserPassword = null;
        private void requestPermission() {
            List<String> permissionsNeeded = new ArrayList<>();
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
                permissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
                permissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
            }
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) ==
                    PackageManager.PERMISSION_DENIED) {
                permissionsNeeded.add(Manifest.permission.CAMERA);
            }
            if (permissionsNeeded.size() > 0) {
                ActivityCompat.requestPermissions(this, permissionsNeeded.toArray(new
                        String[permissionsNeeded.size()]), 1);
            }
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, String permissions[], int
                [] grantResults) {
            switch (requestCode) {
                case 1: {
                    boolean allowed = true;
                    if (grantResults.length > 0) {
                        for (int i = 0; i < grantResults.length; i++) {
                            if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                //Timber.e("case 1權(quán)限沒(méi)有打開(kāi)");
                                AddLog(permissions[i] + "打開(kāi)");
                            } else {
                                //Timber.e("case 1權(quán)限沒(méi)有");
                                AddLog(permissions[i] + "關(guān)閉");
                                allowed = false;
                                break;
                            }
                        }
                    }
                    if (!allowed) {
                        //O TODO  自定義處理
                        //dialog();
                        //Timber.e("case 1自定義處理");
                    }
                    break;
                }
            }
        }
        /**
         * 獲取手機(jī)的MAC地址
         *
         * @return
         */
        public static String getMac() {
            String str = "";
            String macSerial = "";
            try {
                Process pp = Runtime.getRuntime().exec(
                        "cat /sys/class/net/wlan0/address ");
                InputStreamReader ir = new InputStreamReader(pp.getInputStream());
                LineNumberReader input = new LineNumberReader(ir);
                for (; null != str; ) {
                    str = input.readLine();
                    if (str != null) {
                        macSerial = str.trim();// 去空格
                        break;
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            if (macSerial == null || "".equals(macSerial)) {
                try {
                    return loadFileAsString("/sys/class/net/eth0/address")
                            .toUpperCase().substring(0, 17);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return macSerial;
        }
        public static String loadFileAsString(String fileName) throws Exception {
            FileReader reader = new FileReader(fileName);
            String text = loadReaderAsString(reader);
            reader.close();
            return text;
        }
        public static String loadReaderAsString(Reader reader) throws Exception {
            StringBuilder builder = new StringBuilder();
            char[] buffer = new char[4096];
            int readLength = reader.read(buffer);
            while (readLength >= 0) {
                builder.append(buffer, 0, readLength);
                readLength = reader.read(buffer);
            }
            return builder.toString();
        }
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            m_MainActivity = this;
            try {
                m_NfcAdpater = NfcAdapter.getDefaultAdapter(this);
                if (m_NfcAdpater == null) {
                    Toast.makeText(this, "Not Found NfcAdapter!", Toast.LENGTH_SHORT)
                            .show();
                    // finish();
                    // return;
                } else if (!m_NfcAdpater.isEnabled()) {
                    Toast.makeText(this, "Please Enabled NfcAdapter",
                            Toast.LENGTH_SHORT).show();
                    // finish();
                    // return;
                }
            } catch (java.lang.NullPointerException e) {
                Toast.makeText(this, e.toString(),
                        Toast.LENGTH_SHORT).show();
            }
            m_edtLog = (EditText) findViewById(R.id.edtLog);
            m_imgIdPhoto = (ImageView) findViewById(R.id.imgIdPhoto);
            m_txtCommandIndex = (TextView) findViewById(R.id.txtCommandIndex);
            m_edtPostCode = (EditText) findViewById(R.id.edtPostCode);
            m_edtAccoutCode = (EditText) findViewById(R.id.edtAccountCode);
            m_edtUserPassword = (EditText) findViewById(R.id.edtUserPassword);
            pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                    getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
            IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
            ndef.addCategory("*/*");
            mFilters = new IntentFilter[]{ndef};// 過(guò)濾器
            mTechLists = new String[][]{
                    new String[]{MifareClassic.class.getName()},
                    new String[]{NfcB.class.getName()},
                    new String[]{IsoDep.class.getName()},
                    new String[]{NfcA.class.getName()}};// 允許掃描的標(biāo)簽類型
            // 設(shè)置USB讀寫回調(diào) 串口可以不用此操作
            m_bCanUseUsbHostApi = SetUsbCallBack();
            if (m_bCanUseUsbHostApi) {
                AddLog("Find  IC Reader!");
                AddLog("Device Node:" + m_strDeviceNode);
            } else {
                AddLog("Not Find  IC Reader!");
            }
            mLotusCardDriver = new LotusCardDriver();
            mLotusCardDriver.m_lotusCallBack = this;
            m_Handler = new Handler() {
                public void handleMessage(Message msg) {
                    AddLog(msg.obj.toString());
                    super.handleMessage(msg);
                }
            };
            int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
            if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE);
            } else {
                //TODO
            }
            requestPermission();
            TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            String imsi = mTelephonyMgr.getSubscriberId();
            String imei = mTelephonyMgr.getDeviceId();
            //String tel = mTelephonyMgr.getLine1Number();
            String tel = mTelephonyMgr.getLine1Number();
            if (tel == null) tel = "";
            if (tel.equals("")) {
                tel = mTelephonyMgr.getSubscriberId();
            }
            if (tel == null) tel = "";
            String iccid = mTelephonyMgr.getSimSerialNumber();  //取出ICCID  }
        public static String int2ip(long ipInt) {
            StringBuilder sb = new StringBuilder();
            sb.append(ipInt & 0xFF).append(".");
            sb.append((ipInt >> 8) & 0xFF).append(".");
            sb.append((ipInt >> 16) & 0xFF).append(".");
            sb.append((ipInt >> 24) & 0xFF);
            return sb.toString();
        }
        public void OnClearLogListener(View arg0) {
            m_imgIdPhoto.setBackgroundColor(0);
            if (null == m_edtLog)
                return;
            m_edtLog.setText("");
        }
        public void OnIdOtgTestListener(View arg0) {
            if (m_nDeviceHandle == -1) {
                m_nDeviceHandle = mLotusCardDriver.OpenDevice("", 0, 0,
                        0, 0,// 使用內(nèi)部默認(rèn)超時(shí)設(shè)置
                        true);
            }
            if (m_nDeviceHandle == -1) return;
            TwoIdInfoParam tTwoIdInfo = new TwoIdInfoParam();
            boolean bResult = false;
            int nResult = 0;
            boolean bWlDecodeResult = false;
            byte[] arrBmpAndWl = null;
            String temp;
            int nErrorCode = 0;
            LotusCardParam tLotusCardParam1 = new LotusCardParam();
            bResult = mLotusCardDriver.Beep(m_nDeviceHandle, 10);
            // bResult = mLotusCardDriver.Beep(nDeviceHandle, 10);
            if (!bResult) {
                AddLog("Call Beep Error!");
                return;
            }
            AddLog("Call Beep Ok!");
            bResult = mLotusCardDriver.SetCardType(m_nDeviceHandle, 'B');
            if (!bResult) {
                AddLog("Call SetCardType Error!");
                return;
            }
            //mLotusCardDriver.GetTwoGenerationIDCardNo(m_nDeviceHandle);
            AddLog("Call SetCardType Ok!");
            nResult = mLotusCardDriver.RequestB(m_nDeviceHandle,0, tLotusCardParam1);
            if(nResult== 0)
            {
                AddLog("Call RequestB Error!");
                return;
            }
            nResult = mLotusCardDriver.SelectB(m_nDeviceHandle, tLotusCardParam1);
            if(nResult== 0)
            {
                AddLog("Call SelectB Error!");
                return;
            }
            bResult = mLotusCardDriver.GetTwoIdInfoByMcuServer(this, null,
                    m_nDeviceHandle, "samv.highwillow.cn", Integer.valueOf(m_edtAccoutCode.getText().toString()),
     
                    m_edtUserPassword.getText().toString(),  tTwoIdInfo, Long.valueOf(m_edtPostCode.getText().toString()), 0, 2, true);
            if (!bResult) {
                nErrorCode = mLotusCardDriver.GetTwoIdErrorCode(m_nDeviceHandle);
                AddLog("Call GetTwoIdInfoByMcuServer Error! ErrorCode:" + nErrorCode);
                AddLog("ErrorInfo:" + mLotusCardDriver.GetIdErrorInfo(nErrorCode));
                return;
            }
            AddLog("Call GetTwoIdInfoByMcuServer Ok!");
            if (true == bResult) {
                // 姓名
                try {
                    temp = new String(tTwoIdInfo.arrTwoIdName, 0, 30,
                            "UTF-16LE").trim();
                    if (temp.equals("")) {
                        AddLog("數(shù)據(jù)為空");
                        return;
                    }
                    AddLog("姓名:" + temp);
                    // 性別
                    temp = new String(tTwoIdInfo.arrTwoIdSex, 0, 2,
                            "UTF-16LE").trim();
                    if (temp.equals("1"))
                        temp = "男";
                    else
                        temp = "女";
                    AddLog("性別:" + temp);
                    // 民族
                    temp = new String(tTwoIdInfo.arrTwoIdNation, 0, 4,
                            "UTF-16LE").trim();
                    try {
                        int code = Integer.parseInt(temp.toString());
                        temp = decodeNation(code);
                    } catch (Exception e) {
                        temp = "";
                    }
                    AddLog("民族:" + temp);
                    // 出生日期
                    temp = new String(tTwoIdInfo.arrTwoIdBirthday, 0,
                            16, "UTF-16LE").trim();
                    AddLog("出生日期:" + temp);
                    // 住址
                    temp = new String(tTwoIdInfo.arrTwoIdAddress, 0,
                            70, "UTF-16LE").trim();
                    AddLog("住址:" + temp);
                    // 身份證號(hào)碼
                    temp = new String(tTwoIdInfo.arrTwoIdNo, 0, 36,
                            "UTF-16LE").trim();
                    AddLog("身份證號(hào)碼:" + temp);
                    // 簽發(fā)機(jī)關(guān)
                    temp = new String(
                            tTwoIdInfo.arrTwoIdSignedDepartment, 0, 30,
                            "UTF-16LE").trim();
                    AddLog("簽發(fā)機(jī)關(guān):" + temp);
                    // 有效期起始日期
                    temp = new String(
                            tTwoIdInfo.arrTwoIdValidityPeriodBegin, 0,
                            16, "UTF-16LE").trim();
                    AddLog("有效期起始日期:" + temp);
                    // 有效期截止日期 UNICODE YYYYMMDD 有效期為長(zhǎng)期時(shí)存儲(chǔ)“長(zhǎng)期”
                    temp = new String(
                            tTwoIdInfo.arrTwoIdValidityPeriodEnd, 0,
                            16, "UTF-16LE").trim();
                    AddLog("有效期截止日期:" + temp);
                    if (tTwoIdInfo.unTwoIdPhotoJpegLength > 0) {
                        final Bitmap photo = BitmapFactory.decodeByteArray(
                                tTwoIdInfo.arrTwoIdPhotoJpeg, 0,
                                tTwoIdInfo.unTwoIdPhotoJpegLength);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                m_imgIdPhoto.setBackgroundDrawable(new BitmapDrawable(photo));
                            }
                        });
                    }  } catch (UnsupportedEncodingException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            } else {
                AddLog("GetTwoIdInfoByMcuServer執(zhí)行失敗");
            }
        }
        public void AddLog(String strLog) {
            final String strText = strLog;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
                    //SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
                    SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss:SSS");
                    Date curDate = new Date(System.currentTimeMillis());// 獲取當(dāng)前時(shí)間
                    String strDate = formatter.format(curDate);
                    if (null == m_edtLog)
                        return;
                    String strLogs = m_edtLog.getText().toString().trim();
                    if (strLogs.equals("")) {
                        strLogs = strDate + " " + strText;
                    } else {
                        strLogs += "\r\n" + strDate + " " + strText;
                    }
                    m_edtLog.setText(strLogs);
                }
            });
        }
        public void showCommandIndex(int nIndex) {
            final int nTmp = nIndex;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    m_txtCommandIndex.setText("索引" + nTmp);
                }
            });
        }
        @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
            Log.i(Activity_TAG, "This is Information");
            if (m_NfcAdpater != null) {
                m_NfcAdpater.enableForegroundDispatch(this, pendingIntent, mFilters,
                        mTechLists);
                enableReaderMode();
            }
        }
        @Override
        protected void onPause() {
            super.onPause();
            if (m_NfcAdpater != null) {
                m_NfcAdpater.disableForegroundDispatch(this);
                disableReaderMode();
            }
        }
        @TargetApi(19)
        private void enableReaderMode() {
            if (m_nSystemVersion < 19)
                return;
            Bundle options = new Bundle();
            options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 5000);
            //int READER_FLAGS = NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK;
            int READER_FLAGS = NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_NFC_B | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK;
            if (m_NfcAdpater != null) {
                m_NfcAdpater.enableReaderMode(this, new IdReaderCallback(), READER_FLAGS, options);
            }
        }
        @TargetApi(19)
        public class IdReaderCallback implements NfcAdapter.ReaderCallback {
            @Override
            public void onTagDiscovered(Tag tag) {
                boolean bResult = false;
                boolean bWlDecodeResult = false;
                String temp;
                int nErrorCode = 0;
                byte[] arrBmpBuffer = new byte[38862];
                NfcB nfcbId = NfcB.get(tag);
                byte[] arrRequest = new byte[3];
                byte[] arrSelect = new byte[9];
                byte[] arrResult;
                //byte[] arrBmpAndWl = null;
                arrRequest[0] = (byte) 0x5;
                arrRequest[1] = (byte) 0x0;
                arrRequest[2] = (byte) 0x0;
                arrSelect[0] = (byte) 0x1D;//1D 00 00 00 00 00 08 01 08
                arrSelect[1] = (byte) 0x0;
                arrSelect[2] = (byte) 0x0;
                arrSelect[3] = (byte) 0x0;
                arrSelect[4] = (byte) 0x0;
                arrSelect[5] = (byte) 0x0;
                arrSelect[6] = (byte) 0x8;
                arrSelect[7] = (byte) 0x1;
                arrSelect[8] = (byte) 0x8;
                if (nfcbId != null) {
                    try {
                        nfcbId.connect();
                        if (nfcbId.isConnected())
                            AddLog("connect");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if (nfcbId.isConnected()) {
                        TwoIdInfoParam tTwoIdInfo = new TwoIdInfoParam();
                        try {
                            arrResult = nfcbId.transceive(arrRequest);
                            AddLog("length" + arrResult.length);
                            arrResult = nfcbId.transceive(arrSelect);
                            AddLog("length" + arrResult.length);
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        if (m_nDeviceHandle == -1) {
                            m_nDeviceHandle = mLotusCardDriver.OpenDevice("", 0, 0,
                                    0, 0,// 使用內(nèi)部默認(rèn)超時(shí)設(shè)置
                                    true);
                        }
                        m_nCommandInex = 0;
                        bResult = mLotusCardDriver.GetTwoIdInfoByMcuServer(m_MainActivity, nfcbId,
                                m_nDeviceHandle, "samv.highwillow.cn", Integer.valueOf(m_edtAccoutCode.getText().toString()),
                                //m_nDeviceHandle, "192.168.1.21", 99999,
                                m_edtUserPassword.getText().toString(), tTwoIdInfo, Long.valueOf(m_edtPostCode.getText().toString()), 0, 3, false);
                        if (!bResult) {
                            nErrorCode = mLotusCardDriver.GetTwoIdErrorCode(m_nDeviceHandle);
                            AddLog("Call GetTwoIdInfoByMcuServer Error! ErrorCode:" + nErrorCode);
                            AddLog("ErrorInfo:" + mLotusCardDriver.GetIdErrorInfo(nErrorCode));
                            return;
                        }
                        AddLog("Call GetTwoIdInfoByMcuServer Ok!");
                        if (true == bResult) {
                            // 姓名
                            try {
                                temp = new String(tTwoIdInfo.arrTwoIdName, 0, 30,
                                        "UTF-16LE").trim();
                                if (temp.equals("")) {
                                    AddLog("數(shù)據(jù)為空");
                                    return;
                                }
                                AddLog("姓名:" + temp);
                                // 性別
                                temp = new String(tTwoIdInfo.arrTwoIdSex, 0, 2,
                                        "UTF-16LE").trim();
                                if (temp.equals("1"))
                                    temp = "男";
                                else
                                    temp = "女";
                                AddLog("性別:" + temp);
                                // 民族
                                temp = new String(tTwoIdInfo.arrTwoIdNation, 0, 4,
                                        "UTF-16LE").trim();
                                try {
                                    int code = Integer.parseInt(temp.toString());
                                    temp = decodeNation(code);
                                } catch (Exception e) {
                                    temp = "";
                                }
                                AddLog("民族:" + temp);
                                // 出生日期
                                temp = new String(tTwoIdInfo.arrTwoIdBirthday, 0,
                                        16, "UTF-16LE").trim();
                                AddLog("出生日期:" + temp);
                                // 住址
                                temp = new String(tTwoIdInfo.arrTwoIdAddress, 0,
                                        70, "UTF-16LE").trim();
                                AddLog("住址:" + temp);
                                // 身份證號(hào)碼
                                temp = new String(tTwoIdInfo.arrTwoIdNo, 0, 36,
                                        "UTF-16LE").trim();
                                AddLog("身份證號(hào)碼:" + temp);
                                // 簽發(fā)機(jī)關(guān)
                                temp = new String(
                                        tTwoIdInfo.arrTwoIdSignedDepartment, 0, 30,
                                        "UTF-16LE").trim();
                                AddLog("簽發(fā)機(jī)關(guān):" + temp);
                                // 有效期起始日期
                                temp = new String(
                                        tTwoIdInfo.arrTwoIdValidityPeriodBegin, 0,
                                        16, "UTF-16LE").trim();
                                AddLog("有效期起始日期:" + temp);
                                // 有效期截止日期 UNICODE YYYYMMDD 有效期為長(zhǎng)期時(shí)存儲(chǔ)“長(zhǎng)期”
                                temp = new String(
                                        tTwoIdInfo.arrTwoIdValidityPeriodEnd, 0,
                                        16, "UTF-16LE").trim();
                                AddLog("有效期截止日期:" + temp);
                                //顯示JPEG
                                //顯示BMP
                                if(true == mLotusCardDriver.GetIdPhotoBmpBuffer(m_nDeviceHandle,arrBmpBuffer)) {
                                    final Bitmap photo = BitmapFactory.decodeByteArray(
                                            arrBmpBuffer, 0,
                                            38862);
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            m_imgIdPhoto.setBackgroundDrawable(new BitmapDrawable(photo));
                                        }
                                    });
                                }
                            } catch (UnsupportedEncodingException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            }
                        } else {
                            AddLog("GetTwoIdInfoByMcuServer執(zhí)行失敗");
                        }
                    }
                }
            }
        }
        @TargetApi(19)
        private void disableReaderMode() {
            if (m_nSystemVersion < 19)
                return;
            if (m_NfcAdpater != null) {
                m_NfcAdpater.disableReaderMode(this);
            }
        }
        //@Override
        protected void onNewIntent(Intent intent) {
            // TODO Auto-generated method stub
            super.onNewIntent(intent);
            boolean bResult = false;
            boolean bWlDecodeResult = false;
            String temp;
            int nErrorCode = 0;
            Log.d(Activity_TAG, intent.getAction());
            Log.i(Activity_TAG, "onNewIntent");
            if (m_nSystemVersion >= 19)
                return;
            if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {
                Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
                NfcB nfcbId = NfcB.get(tagFromIntent);
                if (nfcbId != null) {
                    try {
                        nfcbId.connect();
                        if (nfcbId.isConnected())
                            AddLog("connect");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if (nfcbId.isConnected()) {
                        TwoIdInfoParam tTwoIdInfo = new TwoIdInfoParam();
                        if (m_nDeviceHandle == -1) {
                            m_nDeviceHandle = mLotusCardDriver.OpenDevice("", 0, 0,
                                    0, 0,// 使用內(nèi)部默認(rèn)超時(shí)設(shè)置
                                    true);
                        }
                        bResult = mLotusCardDriver.GetTwoIdInfoByMcuServer(this, nfcbId,
                                m_nDeviceHandle, "samv.highwillow.cn", 99999,
                                "123456", tTwoIdInfo, 400000, 0, 2, false);
                        if (!bResult) {
                            nErrorCode = mLotusCardDriver.GetTwoIdErrorCode(m_nDeviceHandle);
                            AddLog("Call GetTwoIdInfoByMcuServer Error! ErrorCode:" + nErrorCode);
                            AddLog("ErrorInfo:" + mLotusCardDriver.GetIdErrorInfo(nErrorCode));
                            return;
                        }
                        AddLog("Call GetTwoIdInfoByMcuServer Ok!");
                        //處理照片
                        if (0x00 == tTwoIdInfo.unTwoIdPhotoJpegLength) {
                            bWlDecodeResult = mLotusCardDriver.WlDecodeByServer(m_nDeviceHandle, "119.29.18.30", tTwoIdInfo);
                            if (!bWlDecodeResult) {
                                AddLog("Call WlDecodeByServer Error! ");
                            } else {
                                AddLog("Call WlDecodeByServer Ok!");
                            }
                        }
                        if (true == bResult) {
                            // 姓名
                            try {
                                temp = new String(tTwoIdInfo.arrTwoIdName, 0, 30,
                                        "UTF-16LE").trim();
                                if (temp.equals("")) {
                                    AddLog("數(shù)據(jù)為空");
                                    return;
                                }
                                AddLog("姓名:" + temp);
                                // 性別
                                temp = new String(tTwoIdInfo.arrTwoIdSex, 0, 2,
                                        "UTF-16LE").trim();
                                if (temp.equals("1"))
                                    temp = "男";
                                else
                                    temp = "女";
                                AddLog("性別:" + temp);
                                // 民族
                                temp = new String(tTwoIdInfo.arrTwoIdNation, 0, 4,
                                        "UTF-16LE").trim();
                                try {
                                    int code = Integer.parseInt(temp.toString());
                                    temp = decodeNation(code);
                                } catch (Exception e) {
                                    temp = "";
                                }
                                AddLog("民族:" + temp);
                                // 出生日期
                                temp = new String(tTwoIdInfo.arrTwoIdBirthday, 0,
                                        16, "UTF-16LE").trim();
                                AddLog("出生日期:" + temp);
                                // 住址
                                temp = new String(tTwoIdInfo.arrTwoIdAddress, 0,
                                        70, "UTF-16LE").trim();
                                AddLog("住址:" + temp);
                                // 身份證號(hào)碼
                                temp = new String(tTwoIdInfo.arrTwoIdNo, 0, 36,
                                        "UTF-16LE").trim();
                                AddLog("身份證號(hào)碼:" + temp);
                                // 簽發(fā)機(jī)關(guān)
                                temp = new String(
                                        tTwoIdInfo.arrTwoIdSignedDepartment, 0, 30,
                                        "UTF-16LE").trim();
                                AddLog("簽發(fā)機(jī)關(guān):" + temp);
                                // 有效期起始日期
                                temp = new String(
                                        tTwoIdInfo.arrTwoIdValidityPeriodBegin, 0,
                                        16, "UTF-16LE").trim();
                                AddLog("有效期起始日期:" + temp);
                                // 有效期截止日期 UNICODE YYYYMMDD 有效期為長(zhǎng)期時(shí)存儲(chǔ)“長(zhǎng)期”
                                temp = new String(
                                        tTwoIdInfo.arrTwoIdValidityPeriodEnd, 0,
                                        16, "UTF-16LE").trim();
                                AddLog("有效期截止日期:" + temp);
                                if (tTwoIdInfo.unTwoIdPhotoJpegLength > 0) {
                                    Bitmap photo = BitmapFactory.decodeByteArray(
                                            tTwoIdInfo.arrTwoIdPhotoJpeg, 0,
                                            tTwoIdInfo.unTwoIdPhotoJpegLength);
                                    m_imgIdPhoto.setBackgroundDrawable(new BitmapDrawable(photo));
                                }
                            } catch (UnsupportedEncodingException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            }
                        } else {
                            AddLog("GetTwoIdInfoByMcuServer執(zhí)行失敗");
                        }
                    }
                }
            }
        }
        private String decodeNation(int code) {
            String nation;
            switch (code) {
                case 1:
                    nation = "漢";
                    break;
                case 2:
                    nation = "蒙古";
                    break;
                case 3:
                    nation = "回";
                    break;
                case 4:
                    nation = "藏";
                    break;
                case 5:
                    nation = "維吾爾";
                    break;
                case 6:
                    nation = "苗";
                    break;
                case 7:
                    nation = "彝";
                    break;
                case 8:
                    nation = "壯";
                    break;
                case 9:
                    nation = "布依";
                    break;
                case 10:
                    nation = "朝鮮";
                    break;
                case 11:
                    nation = "滿";
                    break;
                case 12:
                    nation = "侗";
                    break;
                case 13:
                    nation = "瑤";
                    break;
                case 14:
                    nation = "白";
                    break;
                case 15:
                    nation = "土家";
                    break;
                case 16:
                    nation = "哈尼";
                    break;
                case 17:
                    nation = "哈薩克";
                    break;
                case 18:
                    nation = "傣";
                    break;
                case 19:
                    nation = "黎";
                    break;
                case 20:
                    nation = "傈僳";
                    break;
                case 21:
                    nation = "佤";
                    break;
                case 22:
                    nation = "畬";
                    break;
                case 23:
                    nation = "高山";
                    break;
                case 24:
                    nation = "拉祜";
                    break;
                case 25:
                    nation = "水";
                    break;
                case 26:
                    nation = "東鄉(xiāng)";
                    break;
                case 27:
                    nation = "納西";
                    break;
                case 28:
                    nation = "景頗";
                    break;
                case 29:
                    nation = "柯?tīng)柨俗?;
                    break;
                case 30:
                    nation = "土";
                    break;
                case 31:
                    nation = "達(dá)斡爾";
                    break;
                case 32:
                    nation = "仫佬";
                    break;
                case 33:
                    nation = "羌";
                    break;
                case 34:
                    nation = "布朗";
                    break;
                case 35:
                    nation = "撒拉";
                    break;
                case 36:
                    nation = "毛南";
                    break;
                case 37:
                    nation = "仡佬";
                    break;
                case 38:
                    nation = "錫伯";
                    break;
                case 39:
                    nation = "阿昌";
                    break;
                case 40:
                    nation = "普米";
                    break;
                case 41:
                    nation = "塔吉克";
                    break;
                case 42:
                    nation = "怒";
                    break;
                case 43:
                    nation = "烏孜別克";
                    break;
                case 44:
                    nation = "俄羅斯";
                    break;
                case 45:
                    nation = "鄂溫克";
                    break;
                case 46:
                    nation = "德昂";
                    break;
                case 47:
                    nation = "保安";
                    break;
                case 48:
                    nation = "裕固";
                    break;
                case 49:
                    nation = "京";
                    break;
                case 50:
                    nation = "塔塔爾";
                    break;
                case 51:
                    nation = "獨(dú)龍";
                    break;
                case 52:
                    nation = "鄂倫春";
                    break;
                case 53:
                    nation = "赫哲";
                    break;
                case 54:
                    nation = "門巴";
                    break;
                case 55:
                    nation = "珞巴";
                    break;
                case 56:
                    nation = "基諾";
                    break;
                case 97:
                    nation = "其他";
                    break;
                case 98:
                    nation = "外國(guó)血統(tǒng)中國(guó)籍人士";
                    break;
                default:
                    nation = "";
            }
            return nation;
        }
        public String toHexString(byte[] d, int s, int n) {
            final char[] ret = new char[n * 2];
            final int e = s + n;
            int x = 0;
            for (int i = s; i < e; ++i) {
                final byte v = d[i];
                ret[x++] = HEX[0x0F & (v >> 4)];
                ret[x++] = HEX[0x0F & v];
            }
            return new String(ret);
        }
        public String toHexStringR(byte[] d, int s, int n) {
            final char[] ret = new char[n * 2];
            int x = 0;
            for (int i = s + n - 1; i >= s; --i) {
                final byte v = d[i];
                ret[x++] = HEX[0x0F & (v >> 4)];
                ret[x++] = HEX[0x0F & v];
            }
            return new String(ret);
        }
        public boolean callBackExtendIdDeviceProcess(Object objUser,
                                                     byte[] arrBuffer) {
            // TODO Auto-generated method stub
            boolean bResult = false;
            NfcB nfcbId = (NfcB) objUser;
            if (null == nfcbId)
                return false;
            byte[] arrCommnad = new byte[arrBuffer[0]];
            System.arraycopy(arrBuffer, 1, arrCommnad, 0, arrBuffer[0]);
            //AddLog("執(zhí)行指令"+arrCommnad.length);
            m_nCommandInex++;
            showCommandIndex(m_nCommandInex);
            try {
                //Log.i("LOTUS_CARD_DRIVER","Send   "+toHexString(arrCommnad, 0, arrCommnad.length));
                byte[] arrResult = nfcbId.transceive(arrCommnad);
                //Log.i("LOTUS_CARD_DRIVER","Receive "+toHexString(arrResult, 0, arrResult.length));
                if (LotusCardDriver.isZero(arrResult)) {
                    AddLog("讀取卡片數(shù)據(jù)全部為0");
                } else {
                    if (arrResult.length > 2) {
                        if (((byte) 0x90 == arrResult[arrResult.length - 3]) &&
                                ((byte) 0x00 == arrResult[arrResult.length - 2]) &&
                                ((byte) 0x00 == arrResult[arrResult.length - 1])) {
                            arrBuffer[0] = (byte) (arrResult.length - 1);
                        } else {
                            arrBuffer[0] = (byte) (arrResult.length);
                        }
                    } else {
                        arrBuffer[0] = (byte) (arrResult.length);
                    }
                    System.arraycopy(arrResult, 0, arrBuffer, 1, arrBuffer[0]);
                    bResult = true;
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                AddLog(e.getMessage());
            }
            return bResult;
        }
        private Boolean SetUsbCallBack() {
            Boolean bResult = false;
            PendingIntent pendingIntent;
            pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(
                    ACTION_USB_PERMISSION), 0);
            m_UsbManager = (UsbManager) getSystemService(USB_SERVICE);
            if (null == m_UsbManager)
                return bResult;
            HashMap<String, UsbDevice> deviceList = m_UsbManager.getDeviceList();
            if (!deviceList.isEmpty()) {
                for (UsbDevice device : deviceList.values()) {
                    if ((m_nVID == device.getVendorId())
                            && (m_nPID == device.getProductId())) {
                        m_LotusCardDevice = device;
                        m_strDeviceNode = m_LotusCardDevice.getDeviceName();
                        break;
                    }
                }
            }
            if (null == m_LotusCardDevice)
                return bResult;
            m_LotusCardInterface = m_LotusCardDevice.getInterface(0);
            if (null == m_LotusCardInterface)
                return bResult;
            if (false == m_UsbManager.hasPermission(m_LotusCardDevice)) {
                m_UsbManager.requestPermission(m_LotusCardDevice, pendingIntent);
            }
            UsbDeviceConnection conn = null;
            if (m_UsbManager.hasPermission(m_LotusCardDevice)) {
                conn = m_UsbManager.openDevice(m_LotusCardDevice);
            }
            if (null == conn)
                return bResult;
            if (conn.claimInterface(m_LotusCardInterface, true)) {
                m_LotusCardDeviceConnection = conn;
            } else {
                conn.close();
            }
            if (null == m_LotusCardDeviceConnection)
                return bResult;
            // 把上面獲取的對(duì)性設(shè)置到接口中用于回調(diào)操作
            m_UsbDeviceConnection = m_LotusCardDeviceConnection;
            if (m_LotusCardInterface.getEndpoint(1) != null) {
                m_OutEndpoint = m_LotusCardInterface.getEndpoint(1);
            }
            if (m_LotusCardInterface.getEndpoint(0) != null) {
                m_InEndpoint = m_LotusCardInterface.getEndpoint(0);
            }
            bResult = true;
            return bResult;
        }
        @Override
        public boolean callBackReadWriteProcess(long nDeviceHandle, boolean bRead, byte[] arrBuffer) {
            int nResult = 0;
            boolean bResult = false;
            int nBufferLength = arrBuffer.length;
            int nWaitCount = 0;
            if (null == m_UsbDeviceConnection)
                return false;
            if (null == m_OutEndpoint)
                return false;
            if (null == m_InEndpoint)
                return false;
            //AddLog("callBackReadWriteProcess nBufferLength:" + nBufferLength);
            if (nBufferLength < 65)
                return false;
            if (true == bRead) {
                arrBuffer[0] = 0;
                while (true) {
                    nResult = m_UsbDeviceConnection.bulkTransfer(m_InEndpoint,
                            arrBuffer, 64, 5000);
                    if (nResult <= 0)
                        break;
                    if (arrBuffer[0] != 0) {
                        //此處調(diào)整一下
                        System.arraycopy(arrBuffer, 0, arrBuffer, 1, nResult);
                        arrBuffer[0] = (byte) nResult;
                        break;
                    }
                    nWaitCount++;
                    if (nWaitCount > 1000)
                        break;
                }
                if (nResult < 64) AddLog("m_InEndpoint bulkTransfer Read:" + nResult);
                if (nResult == 64) {
                    bResult = true;
                } else {
                    bResult = false;
                }
            } else {
                nResult = m_UsbDeviceConnection.bulkTransfer(m_OutEndpoint,
                        arrBuffer, 64, 3000);
                //AddLog("m_OutEndpoint bulkTransfer Write:"+nResult);
                if (nResult == 64) {
                    bResult = true;
                    //AddLog("m_OutEndpoint bulkTransfer Write Ok!");
                } else {
                    bResult = false;
                }
            }
            return bResult;
        }
    }

    注意:以下兩個(gè)文本框需要輸入并獲取正確的用戶名和密碼才能接入解析服務(wù)器。


      m_nDeviceHandle, "samv.highwillow.cn", Integer.valueOf(m_edtAccoutCode.getText().toString()),
      m_edtUserPassword.getText().toString(),  tTwoIdInfo, Long.valueOf(m_edtPostCode.getText().toString()), 0, 2, true);


    以上內(nèi)容是關(guān)于NFC手機(jī)二代身份證閱讀開(kāi)發(fā)說(shuō)明,僅供參考!

    發(fā)表評(píng)論
    評(píng)論通過(guò)審核后顯示。
    熱門文章推薦
    關(guān)于PSAM卡、SAM卡、SIM卡的特征和區(qū)別 2019-03-22 由于人們對(duì)PSAM卡、SAM卡、SIM卡的概念理解不到位加之很少仔細(xì)的對(duì)PSAM卡、SAM卡、SIM卡實(shí)物進(jìn)行區(qū)別,容易將PSAM卡、SAM卡、SIM卡混為一談。諾塔斯智能科技就PSAM卡、SAM卡、SIM卡三者特征和作用進(jìn)行介紹,幫助大家對(duì)PSAM卡、SAM卡、SIM卡進(jìn)行深刻的認(rèn)識(shí)和區(qū)分。
    M1卡常見(jiàn)問(wèn)題和處理方法 2019-02-21 M1卡是恩智浦出品的芯片縮寫,全稱為NXP Mifare1系列,常用的有S50及S70兩種型號(hào),截止到2013年11月4日,已經(jīng)有國(guó)產(chǎn)芯片與其兼容,利用PVC封裝M1芯片、感應(yīng)天線,然后壓制成型后而制作的卡即是智能卡行業(yè)所說(shuō)的M1卡。M1卡的優(yōu)點(diǎn)是可讀可寫的多功能卡,缺點(diǎn)是:價(jià)格稍貴,感應(yīng)距離短,目前適合非定額消費(fèi)系統(tǒng)、停車場(chǎng)系統(tǒng)、門禁考勤系統(tǒng)等,目前應(yīng)用最廣泛的非接觸式IC卡。
    NFC數(shù)據(jù)交換格式(NDEF)規(guī)范 2019-05-28 為實(shí)現(xiàn)標(biāo)簽和NFC設(shè)備,及NFC設(shè)備之間的交互通信,NFC論壇定義了稱為NFC數(shù)據(jù)交換格式(NDEF)的通用數(shù)據(jù)格式。 NDEF是輕量級(jí)的緊湊的二進(jìn)制格式,可帶有URL,vCard和NFC定義的各種數(shù)據(jù)類型。
    非接觸式IC卡(M1卡)區(qū)塊讀寫控制 2019-02-21 非接觸式IC卡系列中的Mifare One (M1卡)的優(yōu)點(diǎn)是可讀可寫的多功能卡,缺點(diǎn)是:價(jià)格稍貴,感應(yīng)距離短,目前適合非定額消費(fèi)系統(tǒng)、停車場(chǎng)系統(tǒng)、門禁考勤系統(tǒng)等,目前應(yīng)用最廣泛的 非接觸式IC卡。諾塔斯智能科技專業(yè)從事非接觸式IC卡讀寫器的研發(fā)與銷售,為各行業(yè)用戶提供專業(yè)的IC卡系統(tǒng)解決方案。
    聯(lián)系我們
    聯(lián)系人: 張經(jīng)理
    電話: 400-023-6659
    傳真: 023-68798110
    Email: 843718693@qq.com
    QQ: 843718693
    微信: Lotus-Smart
    微博: lotusreader
    旺旺: 諾塔斯智能科技有限公司
    地址: 重慶市江北區(qū)宏帆路36號(hào)宏帆天地1棟6樓
    • 諾塔斯智能科技在線客服
      在線客服
    • 重慶諾塔斯智能科技有限公司微信公眾號(hào)
      關(guān)注微信
    • 諾塔斯智能科技網(wǎng)上商城
      網(wǎng)上商城
    移動(dòng)訪問(wèn)
    日本添下边视频全过程_人妻少妇精品无码专区二区_蜜臀AV人妻久久无码精品麻豆_99精品国产一区二区三区
    <fieldset id="drb0p"><optgroup id="drb0p"><mark id="drb0p"></mark></optgroup></fieldset>
    <fieldset id="drb0p"></fieldset>
    <center id="drb0p"></center>
    <samp id="drb0p"></samp>