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() { } } }