//服务开启 private void btn_Start_Click(object sender, EventArgs e) { try { if (test_connection() == false) { listBox1.Items.Add("连接数据库失败"); listBox1.Items.Add("请确保数据库服务已开启,并且数据库连接填写正确"); return; } ServerSocketHelper.Init(); ServerSocketHelper.StartListen(txt_ServerIp.Text.Trim(), txt_Port_SWS.Text.Trim()); GPRSControl.DTU_NetServer.Init(); // GPRSControl.GPRSControlNetServer.StartListen("192.168.1.8","5678"); GPRSControl.DTU_NetServer.StartListen(txt_ServerIp.Text.Trim(), txt_port_DTU.Text.Trim()); V88CommunicationThread.getInstance().Start(); UdpV88Server.getInstance().StartListen(txt_ServerIp.Text.Trim(), txt_port_udp.Text.Trim()); //心跳线程开启 HeartbeatThread.Start(); //主动发指令的线程开启 ControlCommandThread.Start(); //定时发指令的线程开启 AutoCollectionThread.Start(); save(); btn_Start.Enabled = false; btn_Stop.Enabled = true; ///关闭自动启动服务的定时器 if (AutoStartTimer != null) { AutoStartTimer.Stop(); } listBox1.Items.Add("服务已成功开启"); } catch (Exception ex) { ServerSocketHelper.Close(); // DTU_NetServer.Close(); LogMg.AddError(ex); listBox1.Items.Add(ex.Message); // MessageBox.Show(ex.Message); } }
public static void HandlerData(Socket clientSocket, byte[] content, int conLen, byte type, string tel) { if (type == HD_DTU.DTU_REGISTER_DATA) { if (Response_Reigster(clientSocket, tel)) { DTU_ClientManager.AddClient(tel, clientSocket); } else { LogMg.AddDebug("tel=" + tel + " 响应客户端注册数据失败"); } } }
/// <summary> /// 返回毫秒数 /// </summary> /// <param name="item"></param> /// <returns></returns> private double GetSecond(string item) { double seconds = 0; try { seconds = double.Parse(GetItemByKey(item)) * 1000; } catch (Exception ex) { LogMg.AddError(ex); } return(seconds); }
/// <summary> /// 根据orgId返回Org.XML中的对象 如果不存在则返回null /// </summary> /// <param name="orgId"></param> /// <returns></returns> public Clazz.Config.XML_Org GetOrgByOrgId(string orgId) { Clazz.Config.XML_Org org = null; try { org = Orgs.SingleOrDefault(c => c.OrgId == orgId); } catch (Exception e) { LogMg.AddError(e); DEBUG.MsgBox(e.ToString()); } return(org); }
/// <summary> /// 拆包 /// </summary> /// <param name="str"></param> /// <param name="strcon"></param> /// <param name="type"></param> /// <param name="strlen"></param> /// <param name="conlen"></param> /// <returns></returns> public static bool UnPack(byte[] pack, int packLen, ref byte[] content, ref int conlen, ref byte type, ref string tel) { try { //日志 string str = ""; for (int j = 0; j < packLen; j++) { str += pack[j] + " "; } LogMg.AddDebug(str); int i; for (i = 0; i < pack.Length - 1; i++) { if (pack[i] == ZG_DTU.HEAD) { break; } } type = pack[i + 1]; //类型 if (type == ZG_DTU.USER_DATA) //用户数据拆包 { int low = pack[i + 2]; //低8位 int high = pack[i + 3]; //高8位 int length = high * 256 + low; //从手机号码到最后的字节数 conlen = length; //内容长度 Buffer.BlockCopy(pack, i + 4, content, 0, conlen); } else if (type == ZG_DTU.REGISTER_DATA) //注册数据拆包 { int low = pack[i + 2]; //低8位 int high = pack[i + 3]; //高8位 int length = high * 256 + low; //从手机号码到最后的字节数 byte[] byteTel = new byte[11]; //手机号码字节 Buffer.BlockCopy(pack, i + 4, byteTel, 0, 11); tel = Encoding.ASCII.GetString(byteTel); conlen = length - 11; //内容长度 Buffer.BlockCopy(pack, i + 4 + 11, content, 0, conlen); } } catch (Exception ex) { LogMg.AddError(ex); return(false); } return(true); }
/// <summary> /// 保存 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Save_Click(object sender, EventArgs e) { //新增 try { if (!Validation()) { return; } XML_Station _station = new XML_Station(); _station.StationId = int.Parse(txt_stationId.Text); _station.StationName = txt_stationName.Text; _station.OrgId = txt_orgid.Text; _station.TransferCode = txt_transferCode.Text; string msg = ""; if (UniqueId == 0) { if (SysConfig.clientConfig.AddStation(_station, ref msg)) { MessageBox.Show("添加成功"); this.Close(); } else { MessageBox.Show(msg); } } else { //修改 _station.UniqueId = UniqueId; if (SysConfig.clientConfig.EditStation(_station, ref msg)) { MessageBox.Show("修改成功"); this.Close(); } else { MessageBox.Show(msg); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); LogMg.AddError(ex); } }
/// <summary> /// 心跳数据处理 /// </summary> /// <param name="socket"></param> /// <param name="pack"></param> public static bool HeartbeatDataHandler(Socket socket) { try { //对心跳做一个回应 ZG_DTU.Send(socket, new byte[1], 0, ZG_DTU.HEARTBEAT_DATA); return(true); } catch (Exception ex) { LogMg.AddError(ex); DEBUG.MsgBox(ex.ToString()); return(false); } }
/// <summary> /// 保存 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Save_Click(object sender, EventArgs e) { try { if (!Validation()) { return; } XML_CountryTest ct = new XML_CountryTest(); ct.StationUniqueId = Convert.ToInt32(cmb_station.SelectedValue); ct.NodeId = cmb_node.SelectedValue.ToString(); ct.Remark = cmb_node.Text; ct.TestId = Convert.ToInt32(txt_testid.Text); ct.Multiple = Convert.ToInt32(txt_multiple.Text); string msg = ""; if (UniqueId == 0) { if (SysConfig.clientConfig.AddCountryTest(ct, ref msg)) { MessageBox.Show("添加成功", "提示"); this.Close(); } else { MessageBox.Show(msg, "提示"); } } else { ct.UniqueId = UniqueId; if (SysConfig.clientConfig.EditCountryTest(ct, ref msg)) { MessageBox.Show("修改成功", "提示"); this.Close(); } else { MessageBox.Show(msg, "提示"); } } } catch (Exception ex) { LogMg.AddError(ex); } }
private static void 添加DTU控制任务(SWSDataContext db) { try { //查询出一个小时内有指令的站点的id //List<int> stations = db.ExecuteQuery<int>("SELECT station_id FROM dbo.control_command where (state=0 OR state IS NULL) and communication_mode=2 and datediff(mi,add_datetime,GETDATE())<60 group by station_id ").ToList(); List <int> stations = db.ExecuteQuery <int>("SELECT station_id FROM dbo.control_command where (state=0 OR state IS NULL) and (communication_mode=2 or tp='3') group by station_id ").ToList(); if (stations.Count == 0) { return; } ///站点id和transfer_code的键值对 List <Station_transferCode> StaTrans = db.ExecuteQuery <Station_transferCode>("SELECT id as stationId,transfer_code FROM dbo.country_station WHERE transfer_code IS NOT NULL AND transfer_code<>'' AND transfer_code<>'null'").ToList(); //循环站点 将站点添加到线程池 foreach (int stationid in stations) { try { Station_transferCode StaTran = StaTrans.SingleOrDefault(c => c.stationId == stationid); //如果这个站点没有配置dtu 就跳过 if (StaTran == null) { continue; } //根据设备唯一编号 找出 DTUClientInfo DTUClientInfo client = DTU_ClientManager.Clients.SingleOrDefault(c => c.TelOrGprsId == StaTran.transfer_code); if (client == null) { continue; } //如果客户端在【任务队列】和【线程里】里已经存在了,就不继续添加 if (!HasExistClientInPool(client)) { PoolA.AddTaskItem(new WaitCallback(ExecuteDtuOrder), client); } } catch (Exception ex) { LogMg.AddError(ex); } } } catch (Exception ex) { LogMg.AddError(ex); } }
/// <summary> /// 读取配置文件数据 /// </summary> public static void ReadConfig() { DateTime start = DateTime.Now; userProfile.ReadConfig(); orgConfig.ReadConfig(); DTU_StationConfig.ReadConfig(); DBCJconfig.ReadConfig(); clientConfig.ReadConfig(); GD_Config.GenerateConfig(); V88CommunicationThread.getInstance().readConfig(); DateTime end = DateTime.Now; LogMg.AddInfo(DateUtil.datediff(start, end)); }
private SqlConnection getConByOrgId(string orgId) { string dbname = ""; try { Clazz.Config.XML_Org _org = SysConfig.orgConfig.GetOrgByOrgId(orgId); dbname = _org.DBName; } catch (Exception ex) { LogMg.AddError("orgId:" + orgId + System.Environment.NewLine + ex.ToString()); DEBUG.ThrowException(ex); } return(Util.ServerSocketHelper.GetConnection(dbname)); //返回分厂数据库连接 }
/// <summary> /// 分配任务 /// </summary> private static void Work() { while (true) { int length = DTU_ClientManager.Clients.Count; for (int i = 0; i < length; i++) { try { if (DTU_ClientManager.Clients[i].StationId != 0)//如果这个客户端在数据库中有对应的站点id { if (!HasExistClientInPool(DTU_ClientManager.Clients[i])) { PoolB.AddTaskItem(new WaitCallback(ExecuteOrder), DTU_ClientManager.Clients[i]); } } } catch (Exception ex) { LogMg.AddError(ex); } } List <GD_Station> gd_stations = SysConfig.GD_Config.GD_Stations; for (int i = 0; i < gd_stations.Count; i++) { try { //if (gd_stations[i].stationId == 2371) //{ // if (!HasExistClientInPool(gd_stations[i].Unique)) if (!HasExistClientInPool(gd_stations[i])) { PoolB.AddTaskItem(new WaitCallback(ExecuteGD透传Order), gd_stations[i]); } //} } catch (Exception ex) { LogMg.AddError(ex); } } Thread.Sleep((int)SysConfig.userProfile.RequestToClientInterval); } }
/// <summary> /// 根据传输编码获得stationid /// </summary> /// <param name="transferCode"></param> /// <returns></returns> public int GetStationIdByTransferCode(string transferCode) { int stationId = 0; try { Clazz.Config.ClientConfig.XML_Station station = AllStation.SingleOrDefault(c => c.TransferCode == transferCode); if (station != null) { stationId = station.StationId; } } catch (Exception ex) { LogMg.AddError(ex); } return(stationId); }
/// <summary> /// 根据传输编码获得orgid /// </summary> /// <param name="transferCode"></param> /// <returns></returns> public string GetOrgIdByTransferCode(string transferCode) { string orgid = ""; try { Clazz.Config.ClientConfig.XML_Station station = AllStation.SingleOrDefault(c => c.TransferCode == transferCode); if (station != null) { orgid = station.OrgId; } } catch (Exception ex) { LogMg.AddError(ex); } return(orgid); }
/// <summary> /// 根据socket 查找这个站点所使用的DTU采用的传输协议 /// </summary> /// <param name="socket"></param> /// <returns></returns> public static string GetProtocolBySocket(Socket socket) { string protocol = ""; try { DTUClientInfo client = Clients.SingleOrDefault(c => c.socket == socket); if (client != null) { protocol = client.Protocol; } } catch (Exception ex) { LogMg.AddError(ex); } return(protocol); }
/// <summary> /// 解析注册的数据是DTU协议还是DDP协议 /// </summary> /// <param name="buffer"></param> /// <returns></returns> public static string CheckProtocolByRegisterData(byte[] buffer, int len) { if (ZG_DTU.CheckProtocolByRegisterData(buffer, len) == true) { return(_ZG_DTU); } if (HD_DTU.CheckProtocolByRegisterData(buffer, len) == true) { return(_HD_DTU); } if (JBT_DTU.CheckProtocolByRegisterData(buffer, len) == true) { return(_JBT_DTU); } //如果不符合上面的协议标准 则返回空字符串 LogMg.AddDebug("检验注册数据格式不正确 ,即不符合佐格DTU协议,也不符合宏电DTU协议,也不符号金博通DTU协议"); return(""); }
/// <summary> /// 保存数据到数据库 /// </summary> /// <param name="testid"></param> /// <param name="value"></param> private static void SaveToDatabase(SWSDataContext db, int testid, double value) { LogMg.AddDebug(string.Format("testid={0} value={1}", testid, value)); // SWSDataContext db = new SWSDataContext(Util.ServerSocketHelper.GetConnection(dbname)); test test = db.test.SingleOrDefault(c => c.testid == testid); //查询出检测点 if (test != null) { if (test.means.Trim() == "屏幕取词" || test.means.Trim() == "自动获取") { realrec realrec = new realrec(); realrec.testid = testid; realrec.value = (decimal)value; realrec.testtime = DateTime.Now; realrec.remark = "from 201 Server AutoCollectionThread"; db.realrec.InsertOnSubmit(realrec); db.SubmitChanges(); //提交 } } }
/// <summary> /// 测试连接并立即使用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_test_connection_Click(object sender, EventArgs e) { if (test_connection() == true) { try { save(); } catch (Exception ex) { LogMg.AddError(ex); DEBUG.ThrowException(ex); } MessageBox.Show("连接数据库成功"); } else { MessageBox.Show("连接数据库失败"); } }
//接收到客户端发来的数据,并向客户端返回消息 private void RecieveCallBack(Socket RSocket, string msg) { try { //Socket RSocket = (Socket)ar.AsyncState; bool flag = this.Save(msg, RSocket); S_To_C_Data <object> s_to_c_data = new S_To_C_Data <object>(); s_to_c_data.Flag = HandleFlag.Country; s_to_c_data.Success = flag; string json = Utility.JsonHelper.JsonSerializer <S_To_C_Data <object> >(s_to_c_data); RSocket.Send(Encoding.Unicode.GetBytes(json)); } catch (Exception ex) { LogMg.AddError(ex); DEBUG.ThrowException(ex); } }
/// <summary> /// 修改countrytest /// </summary> /// <param name="_test"></param> /// <param name="msg"></param> /// <returns></returns> public bool EditCountryTest(XML_CountryTest _test, ref string msg) { bool flag = true; try { lock (AllCountryTest) { XML_CountryTest s = AllCountryTest.SingleOrDefault(c => c.UniqueId == _test.UniqueId); AllCountryTest.Remove(s); //先把这个对象删了 AllCountryTest.Add(_test); //再把新的对象添加进去 flag = EditCountryTestFromXML(_test); } } catch (Exception ex) { LogMg.AddError(ex); flag = false; } return(flag); }
public bool EditStation(XML_Station station, ref string msg) { bool flag = true; try { lock (AllStation) { XML_Station s = AllStation.SingleOrDefault(c => c.UniqueId == station.UniqueId); AllStation.Remove(s); //先把这个对象删了 AllStation.Add(station); //再把新的对象添加进去 flag = EditStationFromXML(station); } } catch (Exception ex) { LogMg.AddError(ex); flag = false; } return(flag); }
/// <summary> /// 修改DeviceControl /// </summary> /// <param name="_device"></param> /// <param name="msg"></param> /// <returns></returns> public bool EditDeviceControl(XML_DeviceControl _device, ref string msg) { bool flag = true; try { lock (AllDevice) { XML_DeviceControl dc = AllDevice.SingleOrDefault(c => c.UniqueId == _device.UniqueId); AllDevice.Remove(dc); //先把这个对象删了 AllDevice.Add(_device); //再把新的对象添加进去 flag = EditDeviceControlFromXML(_device); } } catch (Exception ex) { LogMg.AddError(ex); flag = false; } return(flag); }
/// <summary> /// 当收到注册信息无误后, 应调用此方法回应DTU /// </summary> public static bool ResponseRegister(Socket socket, string tel) { try { //应答客户端 byte[] sendBytes = new byte[16]; sendBytes[0] = HD_DTU.HEAD; sendBytes[1] = HD_DTU.DSC_REGISTER_DATA; sendBytes[2] = 0; sendBytes[3] = 0x10; byte[] b_tel = Encoding.ASCII.GetBytes(tel); Buffer.BlockCopy(b_tel, 0, sendBytes, 4, 11); sendBytes[4 + 11] = HD_DTU.END; int n = Send(socket, sendBytes, 16); return(n > 0); } catch (Exception ex) { LogMg.AddError(ex); return(false); } }
// 接收客户端的连接 private static void RecieveAccept() { while (true) { try { Socket clientSocket = ServerSocket.Accept(); clientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallBack), clientSocket); if (ClientConnectHandler != null) { ClientConnectHandler(); //执行委托 } } catch (Exception ex) { LogMg.AddError(ex); DEBUG.ThrowException(ex); } } }
public void NW_Init() { try { allOrg = SysConfig.orgConfig.Orgs;; ALLTestList = SysConfig.DBCJconfig.ListTest; } catch (Exception ex) { LogMg.AddError(ex); DEBUG.ThrowException(ex); } NetwaySDK.NW_Init(); globalOperaCallback = DoOnGlobalOperation; realDataCallback = DoOnRealData; alarmDataCallback = DoOnAlarmData; NetwaySDK.NW_SetGlobalOperaCallBack(globalOperaCallback, IntPtr.Zero); //设置全局操作回调 NetwaySDK.NW_SetRealCallBack(realDataCallback, IntPtr.Zero); //设置实时数据回调 NetwaySDK.NW_SetAlarmCallBack(alarmDataCallback, IntPtr.Zero); //设置警报回调 NetwaySDK.NW_StartListen("0.0.0.0", 9000); }
/// <summary> /// 保存图片到数据库 /// </summary> /// <param name="db"></param> /// <param name="stationId"></param> /// <param name="imageBytes"></param> /// <returns></returns> private static bool SavePicture(SWSDataContext db, int stationId, byte[] imageBytes) { try { picture_info pic = new picture_info(); pic.station_id = stationId.ToString(); pic.title = "在线抓拍"; pic.contents = "在线抓拍"; pic.username = ""; pic.images = imageBytes; pic.updatetime = DateTime.Now; pic.source = "03"; pic.type = "01"; db.picture_info.InsertOnSubmit(pic); db.SubmitChanges(); return(true); } catch (Exception ex) { LogMg.AddError(ex); return(false); } }
/// <summary> /// 循环客户端列表,将客户端添加到线程池队列 /// </summary> private static void Work() { while (true) { //循环数据库,根据transfer_code找出客户端, //将客户端添加到线程池, foreach (XML_Org org in SysConfig.orgConfig.Orgs) { try { SWSDataContext db = new SWSDataContext(ConnectStringHelper.GetConnection(SysConfig.userProfile.DbAddress, org.DBName, SysConfig.userProfile.DbUserName, SysConfig.userProfile.DbPassword)); 添加DTU控制任务(db); 添加广岱控制任务(db, org.DBName, org.gdServerCfg); 添加广岱透传控制任务(db, org.DBName, org.gdServerCfg); } catch (Exception ex) { LogMg.AddError(ex); } } Thread.Sleep((int)SysConfig.userProfile.GongKuangConfigInterval); } }
/// <summary> /// 处理接收到的数据 /// </summary> /// <param name="asyncResult"></param> public static void HandlerData(Socket socket, byte[] content, int conLen, byte type, string tel) { try { if (type == ZG_DTU.HEARTBEAT_DATA) //心跳数据 { HeartbeatDataHandler(socket); } else if (type == ZG_DTU.REGISTER_DATA) //注册数据 貌似这里好像不会出现注册数据了,因为注册数据在第一次注册后就不会再注册了 { DTU_ClientManager.AddClient(tel, socket); } else if (type == ZG_DTU.USER_DATA) { } } catch (Exception ex) { //LogManager.Add("json字符串:" + data + System.Environment.NewLine + ex.ToString()); LogMg.AddError(ex); DEBUG.ThrowException(ex); } }
/// <summary> /// 保存客户端发来的设备控制信息 ,把状态字段更新到数据库 /// </summary> /// <param name="db"></param> /// <param name="receiveObj"></param> private void saveData(SWSDataContext db, C_To_S_Data <CSDataStandard.Transfer.DeviceControl> receiveObj, string stationName) { try { //接收客户端数据 foreach (CSDataStandard.Transfer.DeviceControl item in receiveObj.Data) { device_control device_control = db.device_control.Where(c => c.id == item.DeviceControlId).SingleOrDefault(); if (device_control != null) { device_control.execute_result = item.ExecuteResult; } } db.SubmitChanges(); //输出消息 // string msg = string.Format("保存【{0}】客户端发送来的{1}行设备控制执行结果", stationName, receiveObj.Data.Count); // lb_msg.BeginInvoke(new Action<string>(printMsg), msg); } catch (Exception ex) { LogMg.AddError(ex); } }
private void dbToXML() { DateTime start = DateTime.Now; LogMg.AddDebug("准备开始从数据库生成站点和检测点配置"); //if (SysConfig.DTU_StationConfig.GenerateFromDbToXML() == true) if (SysConfig.DTU_StationConfig.GenerateFromDbToXML() == true && SysConfig.GD_Config.GenerateConfig() == true) { LogMg.AddDebug("从数据库生成站点和检测点配置到XML成功"); //MessageBox.Show(""); SysConfig.ReadConfig(); DTU_ClientManager.Update(); BeginInvoke(new Action <String>(showMessageBox), "已成功从数据库生成配置"); } else { LogMg.AddDebug("从数据库生成站点和检测点配置失败"); BeginInvoke(new Action <String>(showMessageBox), "从数据库生成站点和检测点配置失败,请查看日志文件"); } DateTime end = DateTime.Now; LogMg.AddInfo("生成xml并读取配置到内存耗时:" + DateUtil.datediff(start, end)); }