using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
using WebSocket4Net;
namespace Kjmonitor{
public partial class MainForm : Form{
public MainForm(){
InitializeComponent();
//读取ini配置文件
iniReader("config.ini");
iniReader("type.ini");
iniReader("state.ini");
iniReader("exstate.ini");
iniReader("switch_io_d.ini");
iniReader("switch_io_c.ini");
}
//读取ini配置文件-----------------------------begin-------------------------------------------------------
MainForm config = null;
MainForm typeIni = null;
MainForm stateIni = null;
MainForm exstateIni = null;
MainForm switch_io_dIni = null;
MainForm switch_io_cIni = null;
//煤矿名称
string cs_mine_code = "";
int Enable = 0;
private void iniReader(string filename){
if(filename.Equals("config.ini")){
config = new MainForm("./config.ini");
}else if(filename.Equals("type.ini")){
typeIni = new MainForm("./type.ini");
}else if(filename.Equals("state.ini")){
stateIni = new MainForm("./state.ini");
}else if(filename.Equals("exstate.ini")){
exstateIni = new MainForm("./exstate.ini");
}else if(filename.Equals("switch_io_d.ini")){
switch_io_dIni = new MainForm("./switch_io_d.ini");
}else if(filename.Equals("switch_io_c.ini")){
switch_io_cIni = new MainForm("./switch_io_c.ini");
}
//煤矿名称
cs_mine_code = config.ReadValue("煤矿代码","CS_MINE_CODE");
Enable = int.Parse(config.ReadValue("数据传输","Enable"));
}
//读取ini文件
// 声明INI文件的写操作函数 WritePrivateProfileString()
[System.Runtime.InteropServices.Dllimport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
// 声明INI文件的读操作函数 GetPrivateProfileString()
[System.Runtime.InteropServices.Dllimport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath);
private string sPath = null;
public MainForm(string path){
this.sPath = path;
}
public 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();
}
//------------------------------------------------------------------end-----------------------------------------------------------------------------
//连接websocket-------------------------------begin-----------------------------------------------
void MainFormLoad(object sender, EventArgs e){
InitUI();
//首先判断列表框中的项是否大于0
if(logReveal.Items.Count > 0 )
{
//清空所有项
logReveal.Items.Clear();
}
}
private void websocket_MessageReceived(object sender, MessageReceivedEventArgs e){
MessageReceivedEventArgs responseMsg = (MessageReceivedEventArgs)e; //接收服务端发来的消息
string strMsg = responseMsg.Message;
recieveMessage(strMsg);
}
private void websocket_Closed(object sender, EventArgs e){
//websocket.Send("一个客户端 下线");
}
void websocket_Opened(object sender, EventArgs e){
Log("websocket_Opened");
//websocket.Send("一个客户端 上线");
}
//-------------------------------end-----------------------------------------------
//websocket获取数据并生成文件
private WebSocket websocket = null;
private string strSendText = string.Empty;
//测点定义
string CMD101 = "";
//控制定义
string CMD102 = "";
//区域定义
string CMD103 = "";
//工作面定义
string CMD104 = "";
//位置定义
string CMD105 = "";
//增量数据
string CMD106 = "";
List listFiveMinuter = new List();
Boolean bStart106 = false;
long lLastTime = 0;
Boolean bStart30 = false;
long lLastTime30 = 0;
//接收websocket数据
public void recieveMessage(string jsonText){
var obj = Newtonsoft.Json.Linq.JObject.Parse(jsonText);
var id = obj["CMD_ID"].ToString();
if(id.Equals("101")){
CMD101 = jsonText;
}else if(id.Equals("102")){
CMD102 = jsonText;
}else if(id.Equals("103")){
CMD103 = jsonText;
}else if(id.Equals("104")){
CMD104 = jsonText;
}else if(id.Equals("105")){
CMD105 = jsonText;
}else if(id.Equals("106")){
CMD106 = jsonText;
}
if(!CMD101.Equals("")&&!CMD102.Equals("")&&!CMD106.Equals("")){
//获取数据生成时间
string cs_data_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo());
//测点定义数据 hashtable
InitCMD101(cs_data_time);
//控制定义数据 hashtable
InitCMD102();
CMD102 = "";
}
if(!CMD101.Equals("")&&!CMD106.Equals("")){
//获取数据生成时间
string cs_data_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo());
//增量数据106初始化
InitCMD106(cs_data_time);
//全量数据存入hashtable
InitCMD_all();
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(config.ReadValue("rtdata生成时间","EnableTime")))){
lLastTime30 = lCurrentTime30;
//if(Enable==0){
//模拟量显示文件
createAnalogDisplay(cs_data_time);
//开关量显示文件
createSwitchDisplay(cs_data_time);
//分站状态显示文件
createSubstationDisplay(cs_data_time);
//开关量状态变化累计时间统计
createSwitchStateChange();
//分站状态
createSubstationState(cs_data_time);
//}
}
listFiveMinuter.Add(CMD106);
long lCurrentTime = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
if(!bStart106){
lLastTime = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
bStart106 = true;
}
if(bStart106 && ((lCurrentTime-lLastTime)>=long.Parse(config.ReadValue("rtdata生成时间","intervalTime")))){
lLastTime = lCurrentTime;
//if(Enable==0){
createListFiveData();
createFiveMinuteData();
//}
}
}
}
//接收数据并存入本地hashtable------------------------------begin--------------------------------------
//测点定义数据
Hashtable CMD101_Hash = new Hashtable();
private void InitCMD101(string time){
CMD101_Hash.Clear();
JObject obj = Newtonsoft.Json.Linq.JObject.Parse(CMD101);
JArray content = (JArray)obj["CONTENT"];
for(int i=0;i list_value = new List();
List list_state = new List();
//测点定义数据101的数值、状态集合
foreach (string key in CMD101_Hash.Keys){
if (key.Contains("A")){
string[] data = (string[])CMD101_Hash[key];
string strs = key +","+ data[46];
list_value.Add(strs);
string states = key +","+ data[44]+","+ data[45];
list_state.Add(states);
}
}
//增量数据106的数值、状态集合
foreach (string jsonList in listFiveMinuter){
JObject obj = Newtonsoft.Json.Linq.JObject.Parse(jsonList);
JArray content = (JArray)obj["CONTENT"];
for(int i=0;i list){
key_val_Hash.Clear();
foreach(string list_value in list){
string[] sArray=list_value.Split(',') ;
string key = sArray[0];
string value = sArray[1];
if (!key_val_Hash.ContainsKey(key)) {
List list1 = new List();
list1.Add(float.Parse(value));
key_val_Hash.Add(key,list1);
}else {
List list1 = (List)key_val_Hash[key];
list1.Add(float.Parse(value));
key_val_Hash.Remove(key);
key_val_Hash.Add(key,list1);
}
}
getAvgMaxMin();
list = new List();
}
//求平均值
Hashtable key_avg_Hash = new Hashtable();
private void getAvgMaxMin(){
key_avg_Hash.Clear();
foreach (string key in key_val_Hash.Keys){
List list = (List)key_val_Hash[key];
float sum = 0;
foreach(float list_value in list){
sum += list_value;
}
List list_val = new List();
float ss_analog_avgvalue = sum/list.Count;
float ss_analog_maxvalue = list.Max();
float ss_analog_minvalue = list.Min();
list_val.Add(ss_analog_avgvalue);
list_val.Add(ss_analog_maxvalue);
list_val.Add(ss_analog_minvalue);
key_avg_Hash.Add(key,list_val);
}
}
//状态hashtable
Hashtable key_state_Hash = new Hashtable();
Hashtable key_exstate_Hash = new Hashtable();
private void createCodeStateHash(List list_state){
key_state_Hash.Clear();
key_exstate_Hash.Clear();
foreach(string list in list_state){
string[] sArray=list.Split(',') ;
string key = sArray[0];
string state = sArray[1];
string exstate = sArray[2];
if (!key_state_Hash.ContainsKey(key)) {
List list1 = new List();
list1.Add(int.Parse(state));
key_state_Hash.Add(key, list1);
} else {
List list1 = new List();
list1.Add(int.Parse(state));
key_state_Hash.Remove(key);
key_state_Hash.Add(key, list1);
}
if (!key_exstate_Hash.ContainsKey(key)) {
List list1 = new List();
list1.Add(int.Parse(exstate));
key_exstate_Hash.Add(key, list1);
} else {
List list1 = new List();
list1.Add(int.Parse(exstate));
key_exstate_Hash.Remove(key);
key_exstate_Hash.Add(key, list1);
}
}
}
//接收数据并存入本地hashtable------------------------------end--------------------------------------
//分钟数据
Boolean ftp_boo = true;
private void createFiveMinuteData(){
//获取数据生成时间
string cs_data_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss",new System.Globalization.DateTimeFormatInfo());
string rowStr = "";
foreach (string key in CMD_all_Hash.Keys){
if (key.Contains("A")){
//{值、传感器名称、状态、扩展状态、安装地点、分站编号、传感器编号}
string[] data = (string[])CMD_all_Hash[key];
//分站编号
int ss_station_code = int.Parse(data[5]);
//描述(安装地点)
string ss_transducer_point = data[4];
//传感器编号
int ss_transducer_code = int.Parse(data[6]);
//类型
string ss_transducer_type = typeIni.ReadValue("传感器类型",data[1]);
//平均值
List list = (List)key_avg_Hash[key];
//平均值
float ss_transducer_avg = 0;
//最大值
float ss_transducer_max = 0;
//最小值
float ss_transducer_min = 0;
for(int i = 0;i list_state = (List)key_state_Hash[key];
for(int i = 0;i list_exstate = (List)key_exstate_Hash[key];
for(int i = 0;i>1;
}
return channel;
}
//转换数据格式
private string formatToThree(string str){
return double.Parse(str).ToString("000");
}
private string formatToTwo(string str){
return double.Parse(str).ToString("00");
}
//ftp上传
private string ftpUpload(string filename){
string url = config.ReadValue("ftp","ftpurl");
string file = config.ReadValue("ftp","file");
string username = config.ReadValue("ftp","username");
string password = config.ReadValue("ftp","password");
FtpHelper ftp = new FtpHelper(url,file,username,password);
string ret = ftp.Upload(filename);
return ret;
}
//ftp上传缓存文件
private void ftpBufferFile(){
if(ftp_boo){
Log("ftp上传缓存成功!");
string path = config.ReadValue("文件目录","filename_buffer");
DirectoryInfo folder = new DirectoryInfo(path);
foreach (FileInfo file in folder.GetFiles("*.txt")){
ftpUpload(file.FullName);
}
DeleteFolder(path);
ftp_boo = false;
}
}
//清空缓存中文件
private static void DeleteFolder(string dir){
foreach (string d in Directory.GetFileSystemEntries(dir)){
if (File.Exists(d)){
FileInfo fi = new FileInfo(d);
if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)
fi.Attributes = FileAttributes.Normal;
File.Delete(d);//直接删除其中的文件
}else{
DirectoryInfo d1 = new DirectoryInfo(d);
if (d1.GetFiles().Length != 0){
DeleteFolder(d1.FullName);//递归删除子文件夹
}
Directory.Delete(d);
}
}
}
void MonitorBtnClick(object sender, EventArgs e){
FolderBrowserDialog path = new FolderBrowserDialog();
path.ShowDialog();
this.fileReserve.Text = path.SelectedPath;
}
void FileReserveBufferBtnClick(object sender, EventArgs e){
FolderBrowserDialog path = new FolderBrowserDialog();
path.ShowDialog();
this.fileReserveBuffer.Text = path.SelectedPath;
}
void LogRevealSelectedIndexChanged(object sender, EventArgs e){
}
void SaveClick(object sender, EventArgs e){
int isNull = textIsNull();
generateIni();
if(isNull==0){
this.save.Enabled =false;
connectWebsocket();
Log("保存成功!");
}
}
//生成config.ini文件
private void generateIni(){
ConfUtil.WritePrivateProfileString("煤矿代码","CS_MINE_CODE", this.minecode.Text);
ConfUtil.WritePrivateProfileString("IP地址(KJ66的IP地址)","URL", this.url.Text);
ConfUtil.WritePrivateProfileString("端口号","PORT", this.port.Text);
ConfUtil.WritePrivateProfileString("rtdata生成时间","intervalTime", this.intervalTime.Text);
ConfUtil.WritePrivateProfileString("rtdata生成时间","EnableTime", this.enableTime.Text);
ConfUtil.WritePrivateProfileString("地点","AddrOrWNameOrRName", this.point.Text);
ConfUtil.WritePrivateProfileString("ftp","ftpurl", this.ftpurl.Text);
ConfUtil.WritePrivateProfileString("ftp","file", this.ftpfile.Text);
ConfUtil.WritePrivateProfileString("ftp","username", this.ftpusername.Text);
ConfUtil.WritePrivateProfileString("ftp","password", this.ftppassword.Text);
ConfUtil.WritePrivateProfileString("文件目录","fileReserve", this.fileReserve.Text);
ConfUtil.WritePrivateProfileString("文件目录","fileReserveBuffer", this.fileReserveBuffer.Text);
string str = config.ReadValue("煤矿代码","CS_MINE_CODE");
}
//websocket连接
private void connectWebsocket(){
string url = config.ReadValue("IP地址(KJ66的IP地址)","URL");
string port = config.ReadValue("端口号","PORT");
websocket = new WebSocket("ws://"+url+":"+port);
websocket.Opened += websocket_Opened;
websocket.Closed += websocket_Closed;
websocket.MessageReceived += websocket_MessageReceived;
websocket.Open();
}
//config.ini页面初始化
private void InitUI()
{
this.minecode.Text = ConfUtil.GetProfileString("煤矿代码","CS_MINE_CODE");
this.url.Text = ConfUtil.GetProfileString("IP地址(KJ66的IP地址)","URL");
this.port.Text = ConfUtil.GetProfileString("端口号","PORT");
this.intervalTime.Text = ConfUtil.GetProfileString("rtdata生成时间","intervalTime");
this.enableTime.Text = ConfUtil.GetProfileString("rtdata生成时间","EnableTime");
this.point.Text = ConfUtil.GetProfileString("地点","AddrOrWNameOrRName");
this.enableState.Text = ConfUtil.GetProfileString("数据传输","Enable");
this.ftpurl.Text = ConfUtil.GetProfileString("ftp","ftpurl");
this.ftpfile.Text = ConfUtil.GetProfileString("ftp","file");
this.ftpusername.Text = ConfUtil.GetProfileString("ftp","username");
this.ftppassword.Text = ConfUtil.GetProfileString("ftp","password");
this.fileReserve.Text = ConfUtil.GetProfileString("文件目录","fileReserve");
this.fileReserveBuffer.Text = ConfUtil.GetProfileString("文件目录","fileReserveBuffer");
this.minecode.Focus();
}
//输入框不可为空
private int textIsNull(){
if (this.minecode.Text.Trim().Equals("")) {
Log("煤矿代码不能为空");
this.minecode.Focus();
return 1;
}
...
}
//listBox输出日志
private delegate void DoLog(string msg);//代理
private void Log(string msg){
if (this.InvokeRequired){
DoLog doLog = new DoLog(Log);
this.Invoke(doLog, new object[] { msg });
}else{
if (logReveal.Items.Count > 20) {
logReveal.Items.RemoveAt(0);
}
msg = DateTime.Now.ToLocalTime().ToString() + " " + msg;
logReveal.Items.Add(msg);
}
}
}
} 实现效果



