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; namespace blueshieldtest { public partial class MainFrm : Form { public MainFrm() { InitializeComponent(); strBuilder = new StringBuilder(); } bool isOpen = false; bool isPowerOn = false; SerialPort sport = null; StringBuilder strBuilder = null; private void btnBS_Click(object sender, EventArgs e) { if (!isOpen) { if (openSerialPort()) { isOpen = true; btnBS.Text = "斷開連接"; lbtip.Text = "已經連接到藍盾。"; } } else { if (closeSerialPort()) { isOpen = false; btnBS.Text = "連接藍盾"; lbtip.Text = "已經斷開連接。"; } } } private delegate void SafeWinFormsThreadDelegate(string msg); private void WriteMsg(string msg) { SafeWinFormsThreadDelegate d = new SafeWinFormsThreadDelegate(UpdateUI); Invoke(d, new object[] { msg }); } private void UpdateUI(string msg) { this.tboxRec.Text = msg; } public bool closeSerialPort() { sport.DataReceived -= new SerialDataReceivedEventHandler(sport_DataReceived); try { sport.Close(); return true; } catch (Exception ex) { return false; } } 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; } } void sport_DataReceived(object sender, SerialDataReceivedEventArgs e) { int rsLength = 0; bool loop = true; strBuilder.Remove(0, strBuilder.Length); while (loop) { if (sport.BytesToRead == rsLength) { loop = false; } else { rsLength = sport.BytesToRead; } //Thread.Sleep(100); } 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(); WriteMsg(result); } private void btnSCPower_Click(object sender, EventArgs e) { if (!isPowerOn) { try { sendAPDU("02000011FFFFFFFF"); isPowerOn = true; btnSCPower.Text = "智能卡下電"; lbtip.Text = "智能卡已上電。"; } catch (Exception ex) { lbtip.Text = "智能卡上電出現異常。"; } } else { try { sendAPDU("02000012FFFFFFFF"); isPowerOn = false; btnSCPower.Text = "智能卡上電"; lbtip.Text = "智能卡已下電。"; } catch (Exception ex) { lbtip.Text = "智能卡下電出現異常。"; } } } public 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); this.tboxSend.Text = apdu; } private void btnSelect_Click(object sender, EventArgs e) { try { sendAPDU("02001580FFFFFFFF00A4040010D15600010180038000000001000000003503"); lbtip.Text = "已經選擇陽光卡應用。"; } catch (Exception ex) { lbtip.Text = "選擇陽光卡應用出現異常。"; } } private void btnQuery_Click(object sender, EventArgs e) { try { sendAPDU("02000580FFFFFFFF805c000204DA03"); 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 { sendAPDU("02000022FFFFFFFF"); lbtip.Text = "藍盾已經下電。"; } catch (Exception ex) { lbtip.Text = "藍盾下電出現異常。"; } } } }