blueshieldtyfone

MainFrm.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using TyfoneDLL;

namespace blueshieldtyfone
{
    public partial class MainFrm : Form
    {
        public MainFrm()
        {
            InitializeComponent();
            strBuilder = new StringBuilder();
            blueShieldMgr = BlueShieldManager.getIntance();
        }

        bool isOpen = false;
        bool isPowerOn = false;
        SerialPort sport = null;
        StringBuilder strBuilder = null;
        BlueShieldManager blueShieldMgr = null;

        private void btnBS_Click(object sender, EventArgs e)
        {
            if (!isOpen)
            {
                if(blueShieldMgr.openSerialPort())
                {
                    isOpen = true;
                    btnBS.Text = "斷開連接";
                    lbtip.Text = "已經連接到藍盾。";
                }
            }
            else
            {
                if(blueShieldMgr.closeSerialPort())
                {
                    isOpen = false;
                    btnBS.Text = "連接藍盾";
                    lbtip.Text = "已經斷開連接。";
                }
            }
        }

        private void btnSCPower_Click(object sender, EventArgs e)
        {
            if (!isPowerOn)
            {
                try
                {
                    int ret = Utilities.PowerOn();
                    isPowerOn = true;
                    btnSCPower.Text = "智能卡下電";
                    lbtip.Text = "智能卡已上電。";
                }
                catch (Exception ex)
                {
                    lbtip.Text = "智能卡上電出現異常。";
                }
            }
            else
            {
                try
                {
                    int ret = Utilities.PowerOff();
                    isPowerOn = false;
                    btnSCPower.Text = "智能卡上電";
                    lbtip.Text = "智能卡已下電。";
                }
                catch (Exception ex)
                {
                    lbtip.Text = "智能卡下電出現異常。";
                }
            }
        }

        private void btnSelect_Click(object sender, EventArgs e)
        {
            try
            {
                string apdu = "02001580FFFFFFFF00A4040010D15600010180038000000001000000003503";
                this.tboxRec.Text = Utilities.SMARTMxRW(apdu);
                lbtip.Text = "已經選擇陽光卡應用。";
            }
            catch (Exception ex)
            {
                lbtip.Text = "選擇陽光卡應用出現異常。";
            }
        }

        private void btnQuery_Click(object sender, EventArgs e)
        {
            try
            {
                string apdu = "02000580FFFFFFFF805c000204DA03";
                this.tboxRec.Text = Utilities.SMARTMxRW(apdu);
                lbtip.Text = "正在查詢陽光卡餘額。";
            }
            catch (Exception ex)
            {
                lbtip.Text = "查詢陽光卡餘額出現異常。";
            }
        }

        private void itemExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void itemBSPowerDown_Click(object sender, EventArgs e)
        {
            try
            {
                blueShieldMgr.BSPowerOff();
                this.tboxRec.Text = blueShieldMgr.BSCardReceiveAPDU();
                lbtip.Text = "藍盾已經下電。";
            }
            catch (Exception ex)
            {
                lbtip.Text = "藍盾下電出現異常。";
            }
        }
    }
}

 Utilities.cs

using System;
using System.Collections.Generic;
using System.Text;
using blueshieldtyfone;

namespace TyfoneDLL
{
    public class Utilities
    {
        public Utilities()
        {

        }

        public static int PowerOn()
        {
            try
            {
                BlueShieldManager.getIntance().BSCardPowerOn();
                return 0;
            }
            catch (Exception ex)
            {
                return 1;
            }
        }

        public static int PowerOff()
        {
            try
            {
                BlueShieldManager.getIntance().BSCardPowerOff();
                return 0;
            }
            catch (Exception ex)
            {
                return 1;
            }
        }

        //public static string SMARTMxRW(string APDU)
        //{
        //    BlueShieldManager.getIntance().BSCardSendAPDU(APDU);
        //    string apdu = BlueShieldManager.getIntance().BSCardReceiveAPDU();            
        //    int len = apdu.Length / 2;
        //    char[] chars = apdu.ToCharArray();
        //    string[] hexes = new string[len];
        //    byte[] bytes = new byte[len];
        //    for (int i = 0, j = 0; j < len; i = i + 2, j++)
        //    {
        //        hexes[j] = "" + chars[i] + chars[i + 1];
        //        bytes[j] = (byte)(Convert.ToInt16(hexes[j], 16));
        //    }
        //    string response = "";
        //    string tstr = "";
        //    for (int i = 8; i < len - 2; i++)
        //    {
        //        tstr = bytes[i].ToString("X");
        //        response += tstr.Length == 1 ? "0" + tstr : tstr;
        //        response += " ";
        //    }
        //    return response;
        //}

        public static byte[] SMARTMxRW(string APDU)
        {
            BlueShieldManager.getIntance().BSCardSendAPDU(APDU);
            string apdu = BlueShieldManager.getIntance().BSCardReceiveAPDU();
            int len = apdu.Length / 2;
            char[] chars = apdu.ToCharArray();
            string[] hexes = new string[len];
            byte[] bytes = new byte[len];
            for (int i = 0, j = 0; j < len; i = i + 2, j++)
            {
                hexes[j] = "" + chars[i] + chars[i + 1];
                bytes[j] = (byte)(Convert.ToInt16(hexes[j], 16));
            }
            byte[] response = new byte[len - 9];
            response[0] = (byte)(len - 10);
            CUtil.arrayCopy(bytes, 8, response, 1, len - 10);
            return response;
        }
    }
}

 

BlueShieldManager.cs

 

using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;

namespace blueshieldtyfone
{
    public class BlueShieldManager
    {
        private int t = 0;
        private StringBuilder strBuilder = null;
        private string responseAPDU = "006F";
        private SerialPort sport = new SerialPort();
        private static BlueShieldManager blueShieldMgr = new BlueShieldManager();
        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
        private BlueShieldManager() 
        {
            timer.Interval = 100;
            timer.Enabled = false;
            timer.Tick += new EventHandler(timer_Tick);           
        }
        void timer_Tick(object sender, EventArgs e)
        {
            t += 100;
        }
        public bool openSerialPort()
        {
            sport = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
            sport.ReadTimeout = 2000;
            sport.WriteTimeout = 2000;
            sport.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived);
            try
            {
                sport.Open();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        public bool closeSerialPort()
        {
            sport.DataReceived -= new SerialDataReceivedEventHandler(sport_DataReceived);
            try
            {
                sport.Close();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        void sport_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int rsLength = 0;
            bool loop = true;
            strBuilder = new StringBuilder();
            strBuilder.Remove(0, strBuilder.Length);
            while (loop)
            {
                if (sport.BytesToRead == rsLength)
                {
                    loop = false;
                }
                else
                {
                    rsLength = sport.BytesToRead;
                } 
            }
            byte[] buf = new byte[rsLength];
            sport.Read(buf, 0, rsLength);
            foreach (byte b in buf)
            {
                string hex = b.ToString("x").ToUpper();
                hex = (hex.Length == 1) ? "0" + hex : hex;
                strBuilder.Append(hex);
            }
            string result = strBuilder.ToString();
            responseAPDU = result;
        }
        private void sendAPDU(string apdu)
        {
            int len = apdu.Length / 2;
            char[] chars = apdu.ToCharArray();
            string[] hexes = new string[len];
            byte[] bytes = new byte[len];
            for (int i = 0, j = 0; j < len; i = i + 2, j++)
            {
                hexes[j] = "" + chars[i] + chars[i + 1];
                bytes[j] = (byte)(Convert.ToInt16(hexes[j], 16));
            }
            sport.Write(bytes, 0, len);
        }
        public static BlueShieldManager getIntance()
        {
            return blueShieldMgr;
        }
        public void BSCardPowerOn()
        {
            sendAPDU("02000011FFFFFFFF");
        }
        public void BSCardPowerOff()
        {
            sendAPDU("02000012FFFFFFFF");
        }
        public void BSPowerOff()
        {
            sendAPDU("02000022FFFFFFFF");
        }
        public void BSCardSendAPDU(string apdu)
        {
            responseAPDU = "006F";
            sendAPDU(apdu);
        }
        public string BSCardReceiveAPDU()
        {
            timer.Enabled = true;
            Cursor.Current = Cursors.WaitCursor;
            while (responseAPDU.Equals("006F")) 
            {
                if (t >= 2000)
                {
                    responseAPDU = "FF6F";
                    timer.Enabled = false;
                    t = 0;
                    break;
                }
            }
            timer.Enabled = false;
            Cursor.Current = Cursors.Default;
            return responseAPDU;
        }
        public void BSPairingCodeChange() { }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章