最近在做一个数据上传的C#程序,通过获取websocket数据,读取ini配置文件,依据相关文档完成数据上传。
ini配置文件展示
[煤矿代码]CS_MINE_CODE=411481B0012010000011[IP地址(KJ66的IP地址)]URL=192.168.100.23[备用IP地址]backupUrl=192.168.100.231[端口号]PORT=9999[文件时间间隔]intervalTime=12fiveMinuter=300[文件目录]fileReserve=E:\mine\templatefileReserveBuffer=E:\mine\template\buffer[ftp]ftpurl=192.168.100.19:31file=lxxusername=guorpassword=123[备用IP地址]backupUrl=192.168.100.23
界面展示
一切皆配置
[{ "resource":"FTP", "separator":",", "isNeed":"0"},{ "resource":"DEV", "filename": "devcgq", "fields":[1,3,2,4,5,6,7,8,9,10,11,12,13], "separator":",", "filter":"([15]==0)&&([12]==1)", "isNeed":"1"},{ "resource":"RTDATA", "filename": "ssdata", "fields":[1,2,3], "separator":",", "filter":"([15]==0)&&([12]==1)", "isNeed":"1"}]
配置文件中数字含义
[dev]1=分站编号2=传感器编号3=工作面编号4=安装地点5=传感器名称6=传感器类型代码7=单位8=量程下限9=量程上限10=报警下限11=报警上限12=断电值13=复电值14=断电区域[rtdata]1=传感器编号2=实时测量值3=测点状态
程序源码
/* * Created by SharpDevelop. * User: Administrator * Date: 2018/9/27 星期四 * Time: 8:49 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */using System;using System.Collections;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net;using System.Text;using System.Windows.Forms;using Newtonsoft.Json.Linq;using WebSocket4Net;namespace DataUploadTemplate{ public partial class MainForm : Form{ public MainForm(){ //The InitializeComponent() call is required for Windows Forms designer support. InitializeComponent(); iniReader(); InitUI(); if(isFTP().Equals("0")){ setFtpEnabled(); } //首先判断列表框中的项是否大于0 if(logReveal.Items.Count > 0){ //清空所有项 logReveal.Items.Clear(); } } //读取ini配置文件-----------------------------begin------------------------------------------------------- //基本信息 MainForm configIni = null; //状态 MainForm stateIni = null; //延展状态 MainForm exstateIni = null; //传感器名称代码 MainForm transducerIni = null; //传感器类型的代码 MainForm transducer_name_codeIni = null; //生成文件 MainForm templateIni = null; //文件字段 MainForm generateFileIni = null; //工作面类型 MainForm workface_typeIni = null; //测点名称 MainForm station_nameIni = null; //传感器类型 MainForm typeIni = null; //开关量IO类型 MainForm switch_io_dIni = null; //控制量IO类型 MainForm switch_io_cIni = null; //传感器类型编码表 MainForm transducer_typeIni = null; //煤矿名称 string cs_mine_code = ""; //存储路径 string file_name_save = ""; //读取INI配置文件 void iniReader(){ //基本信息 configIni = new MainForm("./config.ini"); //状态 stateIni = new MainForm("./state.ini"); //延展状态 exstateIni = new MainForm("./exstate.ini"); //传感器名称代码 transducerIni = new MainForm("./transducer.ini"); //传感器类型的代码 transducer_name_codeIni = new MainForm("./transducer_name_code.ini"); //生成文件 templateIni = new MainForm("./template.ini"); //文件字段 generateFileIni = new MainForm("./generateFile.ini"); //工作面类型 workface_typeIni = new MainForm("./workface_type.ini"); //测点名称 station_nameIni = new MainForm("./station_name.ini"); //传感器类型 typeIni = new MainForm("./type.ini"); //开关量IO类型 switch_io_dIni = new MainForm("./switch_io_d.ini"); //控制量IO类型 switch_io_cIni = new MainForm("./switch_io_c.ini"); //传感器类型编码表 transducer_typeIni = new MainForm("./transducer_type.ini"); //煤矿名称 cs_mine_code = configIni.ReadValue("煤矿代码","CS_MINE_CODE"); //存储路径 file_name_save = configIni.ReadValue("文件目录","fileReserve"); } //读取ini文件 // 声明INI文件的写操作函数 WritePrivateProfileString() [System.Runtime.InteropServices.DllImport("kernel32")] static extern long WritePrivateProfileString(string section, string key, string val, string filePath); // 声明INI文件的读操作函数 GetPrivateProfileString() [System.Runtime.InteropServices.DllImport("kernel32")] static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath); string sPath = null; public MainForm(string path){ this.sPath = path; } string ReadValue(string section, string key){ // 每次从ini中读取多少字节 System.Text.StringBuilder temp = new System.Text.StringBuilder(255); // section=配置节,key=键名,temp=上面,path=路径 GetPrivateProfileString(section, key, "", temp, 255, sPath); return temp.ToString(); } //congig.ini路径 static string INIFileName =Path.Combine(Directory.GetCurrentDirectory(), "config.ini"); //写入ini文件 void WriteValue(string SECTION,string key, string value){ if (!File.Exists(INIFileName)){ FileStream fs = new FileStream(INIFileName, FileMode.OpenOrCreate); } WritePrivateProfileString(SECTION, key, value, INIFileName); return; } //-----------------------------------连接websocket---------------------------------------------- void websocket_MessageReceived(object sender, MessageReceivedEventArgs e){ MessageReceivedEventArgs responseMsg = (MessageReceivedEventArgs)e; //接收服务端发来的消息 string strMsg = responseMsg.Message; recieveMessage(strMsg); } Boolean websocketConn = true; void websocket_Closed(object sender, EventArgs e){ if(websocketConn){ Log("websocekt connect fail!启用备用IP!"); connectWebsocketBackup(); }else{ Log("websocekt connect fail! 请确认KJ66 IP地址的准确性!"); websocketConn = false; } } void websocket_Opened(object sender, EventArgs e){ Log("websocket_Opened"); } //websocket连接 void connectWebsocket(){ string url = configIni.ReadValue("IP地址(KJ66的IP地址)","URL"); string port = configIni.ReadValue("端口号","PORT"); websocket = new WebSocket("ws://"+url+":"+port); websocket.Opened += websocket_Opened; websocket.Closed += websocket_Closed; websocket.MessageReceived += websocket_MessageReceived; websocket.Open(); } //备用websocket连接 private void connectWebsocketBackup(){ string url = configIni.ReadValue("备用IP地址","backupUrl"); string port = configIni.ReadValue("端口号","PORT"); websocket = new WebSocket("ws://"+url+":"+port); websocket.Opened += websocket_Opened; websocket.Closed += websocket_Closed; websocket.MessageReceived += websocket_MessageReceived; websocket.Open(); websocketConn = false; } //------------------------------------接收websocket数据------------------------------------------- //测点定义 string CMD101 = ""; //控制定义 string CMD102 = ""; //区域定义 string CMD103 = ""; //工作面定义 string CMD104 = ""; //位置定义 string CMD105 = ""; //增量数据 string CMD106 = ""; //测试状态测点集合 string[] strArray = new string[2048]; int strI = 0; WebSocket websocket = null; ListlistFiveMinuter = new List (); Boolean bFiveMinute = false; long lLastTimeFiveMinute = 0; Boolean bStart30 = false; long lLastTime30 = 0; //修改标志 int editSign = 0; void recieveMessage(string jsonText){ var obj = JObject.Parse(jsonText); var id = obj["CMD_ID"].ToString(); switch (id) { case "101": CMD101 = jsonText; editSign = 1; break; case "102": CMD102 = jsonText; break; case "103": CMD103 = jsonText; break; case "104": CMD104 = jsonText; break; case "105": CMD105 = jsonText; break; case "106": CMD106 = jsonText; break; default: break; } //根据类型不同分别创建XML文件 if(!CMD101.Equals("")&&!CMD102.Equals("")&&!CMD103.Equals("")&&!CMD104.Equals("")&&!CMD105.Equals("")&&!CMD106.Equals("")){ //获取数据生成时间 string cs_data_time = getCurrentTime(); try{ //接收数据并存入本地hashtable //测点定义数据 InitCMD101(cs_data_time); //控制定义 InitCMD102(); //分站数据 InitCMD101_fz(); getValueByIndex(); }catch(Exception e){ Log(e.Message); } CMD102 = ""; CMD103 = ""; CMD104 = ""; CMD105 = ""; } if(!CMD101.Equals("")&&!CMD106.Equals("")){ try{ InitCMD106(); listFiveMinuter.Add(CMD106); string cs_data_time = getCurrentTime(); //全量数据hash化 InitCMD_all(); //生成实时状态下的所需文件 getValueBySSSJ(); //存储模拟量测点值对应时间 getTimeJktjsj(cs_data_time); }catch(Exception e){ Log(e.Message); } } long lCurrentTime30 = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; if(!bStart30){ lLastTime30 = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; bStart30 = true; } if(bStart30 && ((lCurrentTime30-lLastTime30)>=long.Parse(configIni.ReadValue("文件时间间隔","intervalTime")))){ lLastTime30 = lCurrentTime30; try{ //何岗煤矿传感器全局定时显示(模拟量显示、开关量显示、实时数据) getValueByAllAnalogDisplay(); }catch(Exception e){ Log(e.Message); } } //等待五分钟执行监测文件 long lCurrentTime = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; if(!bFiveMinute){ lLastTimeFiveMinute = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; bFiveMinute = true; } if(bFiveMinute && ((lCurrentTime-lLastTimeFiveMinute)>=long.Parse(configIni.ReadValue("文件时间间隔","fiveMinuter")))){ lLastTimeFiveMinute = lCurrentTime; try{ //统计数据文件 getValueByIndexFive(); }catch(Exception e){ Log(e.Message); } } } //获取配置文件中-基本定义文件 void getValueByIndex(){ //读取generateFile.txt文件内容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "DEV": string devFields = items["fields"].ToString(); fileName = items["filename"].ToString(); //测点信息数据文件 createDev(devFields,separator,fileName); break; case "控制关系定义": string fields102 = items["fields"].ToString(); fileName = items["filename"].ToString(); createCdkzgx(fields102,separator,fileName); break; case "分站定义": string fzxxFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createFzxx(fzxxFields,separator,fileName); break; case "工作面定义": string gzmxxFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createGzmxx(gzmxxFields,separator,fileName); break; case "模拟量初始化": string AQMCFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQMC(AQMCFields,separator,fileName); break; case "开关量初始化": string AQKCFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQKC(AQKCFields,separator,fileName); break; case "传感器描述文件": string fields = items["fields"].ToString(); var obj = JObject.Parse(fields); string CDDYFields_A = obj["A"].ToString(); string CDDYFields_D = obj["D"].ToString(); string CDDYFields_C = obj["C"].ToString(); fileName = items["filename"].ToString(); string CDDY_time = DateTime.Now.ToString("yyyyMMddHHmmss",new System.Globalization.DateTimeFormatInfo()); string CDDY_filePath = cs_mine_code+"_"+fileName+"_"+CDDY_time; createCDDY(CDDYFields_D,CDDYFields_A,separator,CDDY_filePath); break; default: break; } } } //获取配置文件中-实时状态文件 void getValueBySSSJ(){ //读取generateFile.txt文件内容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "RTDATA": string rtdataFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createRtdata(rtdataFields,separator,fileName); break; case "开关量状态变化": string AQKDFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQKD(AQKDFields,separator,fileName); break; default: break; } } } //获取配置文件中-分钟累计文件 void getValueByIndexFive(){ string cs_data_time = getCurrentTime(); //读取generateFile.txt文件内容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "五分钟统计文件": string fiveMinuFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createJktjsj_list(fiveMinuFields,separator,fileName); break; default: break; } } } //-------------------------------------------何岗煤矿传感器全局定时显示--------------------------- void getValueByAllAnalogDisplay(){ //读取generateFile.txt文件内容 JArray array = readGenerateFile(); string fileName = ""; foreach (JObject items in array){ string resource = items["resource"].ToString(); string separator = items["separator"].ToString(); string isNeed = items["isNeed"].ToString(); if(isNeed.Equals("0")){ continue; } switch (resource){ case "模拟量显示": string analogDisplayFields = items["fields"].ToString(); fileName = items["filename"].ToString(); //何岗煤矿全局模拟量定时显示 createAnalogDisplay(analogDisplayFields,separator,fileName); break; case "开关量显示": string switchDisplayFields = items["fields"].ToString(); fileName = items["filename"].ToString(); //何岗煤矿全局开关量定时显示 createSwitchDisplay(switchDisplayFields,separator,fileName); break; case "实时数据": string AQSSFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createAQSS(AQSSFields,separator,fileName); break; case "实时数据文件": string SSSJFields = items["fields"].ToString(); fileName = items["filename"].ToString(); createSSSJ(SSSJFields,separator,fileName); break; } } } //何岗煤矿全局开关量定时显示 void createSwitchDisplay(string switchDisplayFields,string separator,string fileName){ int sum = 0; string rowStr = ""; string[] fields = switchDisplayFields.Split(','); foreach (string key in CMD_all_Hash.Keys){ if (key.Contains("C")||key.Contains("D")){ //数值、状态、延展状态、名称、安装地点、分站编号、传感器编号、时间 string[] data = (string[])CMD_all_Hash[key]; //类型 int ss_transducer_type = 0; //io类型 string ss_transducer_type_io = ""; //状态 string ss_transducer_value = ""; if(key.Contains("D")){ //类型 ss_transducer_type = 1; //io类型 ss_transducer_type_io = switch_io_dIni.ReadValue("开关量输入I/0类型",data[3]); //状态 ss_transducer_value = getState(data[2],"D"); }else if(key.Contains("C")){ //类型 ss_transducer_type = 2; //io类型 ss_transducer_type_io = switch_io_cIni.ReadValue("开关量控制输出I/O类型",data[3]); //状态 ss_transducer_value = getState(data[2],"C"); } for(int i=0;i 0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i m_str = new List (); foreach (string key in CMD101_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD101_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("传感器类型编码表",data[41]); for(int i=0;i m_str = new List (); foreach (string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; string transducer_code = transducer_typeIni.ReadValue("传感器类型编码表",data[41]); for(int i=0;i m_strA = new List (); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ //测试状态的过滤 string[] data = (string[])CMD101_Hash[key]; if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } for(int i=0;i m_strD = new List (); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("D")){ string[] data = (string[])CMD101_Hash[key]; if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } for(int i=0;i m_strC = new List (); foreach(string key in CMD101_Hash.Keys){ if(key.Contains("C")){ string[] data = (string[])CMD101_Hash[key]; if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } for(int i=0;i list = new List (); List list_state = new List (); string cs_data_time = getCurrentTime(); //定义数据列表 foreach(string key in CMD101_Hash.Keys){ if(key.Contains("A")){ string[] data = (string[])CMD101_Hash[key]; //过滤测试测点 if(bitChannel(int.Parse(data[18]),16)[3].Equals("1")){ continue; } //传感器编号+数值 string strs = key+","+data[46]; string stateStr = key+","+data[44]+","+data[45]; list.Add(strs); list_state.Add(stateStr); } } //增量数据106的数值、状态集合 foreach (string jsonList in listFiveMinuter){ JObject obj = JObject.Parse(jsonList); int nLen = obj["CONTENT"].ToString().Trim().Length; if(nLen>0){ JArray content = (JArray)obj["CONTENT"]; for(int i=0;i list = (List )key_avg_Hash[key]; string[] data = (string[])CMD101_Hash[key]; //工作状态 string ss_transducer_state = ""; //状态 int state = 0; List list_state = (List )key_state_Hash[key]; for(int i = 0;i