本人小白一個,初次使用C#,希望各位大神對小白不足之處能指點一下,O(∩_∩)O謝謝
項目需求:公司錫膏室有四台冰箱,需要對該四台冰箱的溫濕度實時采集同時以曲線圖方式Show到一塊看板上
思路:1,需要將設備發送的數據實時存儲至數據庫(使用TCP通訊協議實時抓取數據)
2,將數據以曲線圖方式Show至看板上(需要使用到AJAX以及強大的JS庫【ECharts】})
一,實現數據抓取並存儲至數據庫:
代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Data.SqlClient; 6 using System.Drawing; 7 using System.IO; 8 9 using System.Net; 10 using System.Net.Sockets; 11 using System.Text; 12 using System.Threading; 13 14 using System.Windows.Forms; 15 16 namespace WindowsFormsApplication1 17 { 18 public partial class Form1 : Form 19 { 20 public Form1() 21 { 22 InitializeComponent(); 23 TextBox.CheckForIllegalCrossThreadCalls = false; 24 } 25 Thread threadWatch = null; // 負責監聽客戶端連接請求的 線程; 26 Socket socketWatch = null; 27 28 Dictionary<string, Socket> dict = new Dictionary<string, Socket>(); 29 Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>(); 30 31 /// <summary> 32 /// 啟動監控服務 33 /// </summary> 34 /// <param name="sender"></param> 35 /// <param name="e"></param> 36 private void button1_Click(object sender, EventArgs e) 37 { 38 // 創建負責監聽的套接字,注意其中的參數; 39 socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 40 // 獲得文本框中的IP對象; 41 IPAddress address = IPAddress.Parse(textBox1.Text.Trim()); 42 // 創建包含ip和端口號的網絡節點對象; 43 IPEndPoint endPoint = new IPEndPoint(address, int.Parse(textBox2.Text.Trim())); 44 try 45 { 46 // 將負責監聽的套接字綁定到唯一的ip和端口上; 47 socketWatch.Bind(endPoint); 48 } 49 catch (SocketException se) 50 { 51 MessageBox.Show("異常:" + se.Message); 52 return; 53 } 54 // 設置監聽隊列的長度; 55 socketWatch.Listen(10); 56 // 創建負責監聽的線程; 57 threadWatch = new Thread(WatchConnecting); 58 threadWatch.IsBackground = true; 59 threadWatch.Start(); 60 ShowMsg("服務器啟動監聽成功!"); 61 } 62 63 /// <summary> 64 /// 監聽客戶端請求的方法; 65 /// </summary> 66 void WatchConnecting() 67 { 68 while (true) // 持續不斷的監聽客戶端的連接請求; 69 { 70 // 開始監聽客戶端連接請求,Accept方法會阻斷當前的線程; 71 Socket sokConnection = socketWatch.Accept(); // 一旦監聽到一個客戶端的請求,就返回一個與該客戶端通信的 套接字; 72 // 想列表控件中添加客戶端的IP信息; 73 listBox1.Items.Add(sokConnection.RemoteEndPoint.ToString()); 74 // 將與客戶端連接的 套接字 對象添加到集合中; 75 dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection); 76 ShowMsg("客戶端連接成功!"); 77 Thread thr = new Thread(RecMsg); 78 thr.IsBackground = true; 79 thr.Start(sokConnection); 80 dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr); // 將新建的線程 添加 到線程的集合中去。 81 } 82 } 83 84 85 void RecMsg(object sokConnectionparn) 86 { 87 Socket sokClient = sokConnectionparn as Socket; 88 while (true) 89 { 90 // 定義一個2M的緩存區; 91 byte[] arrMsgRec = new byte[1024 * 1024 * 2]; 92 // 將接受到的數據存入到輸入 arrMsgRec中; 93 int length = -1; 94 try 95 { 96 length = sokClient.Receive(arrMsgRec); // 接收數據,並返回數據的長度; 97 } 98 catch (SocketException se) 99 { 100 ShowMsg("異常:" + se.Message); 101 // 從 通信套接字 集合中刪除被中斷連接的通信套接字; 102 dict.Remove(sokClient.RemoteEndPoint.ToString()); 103 // 從通信線程集合中刪除被中斷連接的通信線程對象; 104 dictThread.Remove(sokClient.RemoteEndPoint.ToString()); 105 // 從列表中移除被中斷的連接IP 106 listBox1.Items.Remove(sokClient.RemoteEndPoint.ToString()); 107 break; 108 } 109 catch (Exception e) 110 { 111 ShowMsg("異常:" + e.Message); 112 // 從 通信套接字 集合中刪除被中斷連接的通信套接字; 113 dict.Remove(sokClient.RemoteEndPoint.ToString()); 114 // 從通信線程集合中刪除被中斷連接的通信線程對象; 115 dictThread.Remove(sokClient.RemoteEndPoint.ToString()); 116 // 從列表中移除被中斷的連接IP 117 listBox1.Items.Remove(sokClient.RemoteEndPoint.ToString()); 118 break; 119 } 120 121 ///--------------------------------------接收客戶端發送過來的信息---------------------------------------------- 122 string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1);// 將接受到的字節數據轉化成字符串; 123 ShowMsg(strMsg); 124 125 126 ///------------------------------------向客戶端發送回執信息-------------------------------------- 127 string WD = strMsg.Substring(42, 4); 128 string SD = strMsg.Substring(47, 4); 129 string Mdl = strMsg.Substring(21, 10); 130 string ZOOM = strMsg.Substring(32, 1); 131 string SendTime = "20" + strMsg.Substring(3, 17) + ":000"; 132 if (Mdl == "0072916200") { Mdl = "冰箱-01"; } 133 else if (Mdl == "0072915200") { Mdl = "冰箱-03"; } 134 else if (Mdl == "0072914500") { Mdl = "冰箱-04"; } 135 else if (Mdl == "0072912300") { Mdl = "冰箱-02"; } 136 SqlConnection sqlcon = new SqlConnection("Data Source=10.99.106.***;Initial Catalog=PCA_REPORT;User ID=***;pwd=***"); 137 string addx = "INSERT INTO PCA_REPORT..Temperature VALUES ('" + Mdl + "','" + WD + "','" + SD + "','" + SendTime + "',getdate(),'" + ZOOM + "')"; 138 DataSet ds = new DataSet(); 139 SqlDataAdapter adapter = new SqlDataAdapter(addx, sqlcon); 140 adapter.Fill(ds); 141 142 string send = "*RR," + strMsg.Substring(3, 17) + "," + strMsg.Substring(21, 10) + "#"; 143 144 145 146 byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(send); // 將要發送的字符串轉換成Utf-8字節數組; 147 byte[] arrSendMsg = new byte[arrMsg.Length + 1]; 148 arrSendMsg[0] = 0; // 表示發送的是消息數據 149 Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); 150 for (int i = 0; i < listBox1.Items.Count; i++) 151 { 152 string strKey = listBox1.Items[i].ToString(); 153 154 dict[strKey].Send(arrSendMsg);// 解決了 sokConnection是局部變量,不能再本函數中引用的問題; 155 //ShowMsg(send); 156 157 158 } 159 160 } 161 } 162 163 164 165 void ShowMsg(string str) 166 { 167 textBox5.AppendText(str + "\r\n"); 168 } 169 170 private void label2_Click(object sender, EventArgs e) 171 { 172 173 } 174 175 } 176 }
1,將設備與該程式設置為同一網段IP
2,將設備IP指向與當前程式運行的IP(以上程式表明設備指向的IP是:192.168.1.130,指向端口是:9438)
設置以上后,程式就可以接受設備傳輸的數據了
運行之后如下圖:
二,實現將數據以曲線圖方式實時Show至看板上
可跳轉至:https://download.csdn.net/download/bibabu135766/10274321
看板效果如下圖: