/// <summary> /// 向APP返回通用错误消息 /// </summary> /// <param name="appToken">app信息</param> /// <param name="type">app发送过来的消息类型</param> /// <param name="str">错误描述</param> protected void Send2APP_GeneralError(AsyncUserToken appToken, string type, string str) { MessageType mt = MessageType.MSG_JSON; MessageBody mb = new MessageBody(); InterModuleMsgStruct msg = new InterModuleMsgStruct(); msg.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); msg.MsgType = MsgStruct.MsgType.CONFIG.ToString(); msg.ApInfo = null; msg.AppInfo.Type = string.Empty; msg.AppInfo.Ip = appToken.IPAddress.ToString(); msg.AppInfo.Port = appToken.Port; msg.AppInfo.Group = appToken.Group; msg.AppInfo.User = appToken.User; msg.AppInfo.Domain = appToken.Domain; Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(AppMsgType.general_error_result, "ErrStr", str, "RecvType", type); msg.Body = TypeKeyValue; mb.bJson = JsonConvert.SerializeObject(msg); OnOutputLog(LogInfoType.INFO, string.Format("发送消息({0})给MainController模块!", TypeKeyValue.type), LogCategory.S); OnOutputLog(LogInfoType.DEBG, string.Format("消息内容:\n{0}", mb.bJson), LogCategory.S); ApManager.sendMsg_2_MainController(mt, mb); }
/// <summary> /// 发送所有在线AP的列表给 MainContorller模块 /// </summary> protected void Send2main_OnLineList() { OnOutputLog(LogInfoType.DEBG, "发送所有在线AP列表给MainController模块!"); AsyncUserToken token = new AsyncUserToken(); Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(Main2ApControllerMsgType.OnLineAPList); AsyncUserToken[] dList = MyDeviceList.GetConnListToArray(); int i = 0; foreach (AsyncUserToken x in dList) { Name_DIC_Struct n_dic = new Name_DIC_Struct("Ap" + i++); n_dic.dic.Add("Sn", x.Sn); n_dic.dic.Add("FullName", x.FullName); n_dic.dic.Add("Ip", x.IPAddress.ToString()); n_dic.dic.Add("Port", x.Port.ToString()); n_dic.dic.Add("Type", DeviceType); TypeKeyValue.n_dic.Add(n_dic); } //向Main模块发消息 OnSendMsg2Main(0, MsgStruct.MsgType.NOTICE, token, TypeKeyValue); }
/// <summary> /// 发送消息到App /// </summary> /// <param name="appToKen">App信息</param> /// <param name="TypeKeyValue">消息内容</param> protected void SendMsg2App(AsyncUserToken appToKen, Msg_Body_Struct TypeKeyValue) { if (appToKen == null) { OnOutputLog(LogInfoType.WARN, string.Format("目的设备信息为NULL!")); return; } if (TypeKeyValue.type == ApMsgType.scanner) { sendAppImsiMsgNum++; } DeviceServerMsgStruct msgStruct = new DeviceServerMsgStruct(); msgStruct.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); msgStruct.ApInfo.IP = MsgStruct.NullDevice; msgStruct.Body = TypeKeyValue; string strJosn = JsonConvert.SerializeObject(msgStruct); if (-1 == strJosn.IndexOf(AppMsgType.app_heartbeat_response)) { OnOutputLog(LogInfoType.INFO, string.Format("发送消息({0})给APP[{1}:{2}]!", TypeKeyValue.type, appToKen.IPAddress, appToKen.Port), LogCategory.S); OnOutputLog(LogInfoType.DEBG, string.Format("消息内容:\n{0}", strJosn), LogCategory.S); } byte[] buff = System.Text.Encoding.Default.GetBytes(strJosn); MySocket.SendMessage(appToKen, buff); }
protected void Send2APP_GeneralError(Ap_Info_Struct apInfo, App_Info_Struct appInfo, string type, string str) { MessageType mt = MessageType.MSG_JSON; MessageBody mb = new MessageBody(); InterModuleMsgStruct msg = new InterModuleMsgStruct(); msg.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); msg.MsgType = MsgStruct.MsgType.CONFIG.ToString(); msg.ApInfo = apInfo; msg.AppInfo = appInfo; Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(AppMsgType.general_error_result, "ErrStr", str, "RecvType", type); msg.Body = TypeKeyValue; mb.bJson = JsonConvert.SerializeObject(msg); OnOutputLog(LogInfoType.INFO, string.Format("发送消息({0})给MainController模块!", TypeKeyValue.type), LogCategory.S); OnOutputLog(LogInfoType.DEBG, string.Format("消息内容:\n{0}", mb.bJson), LogCategory.S); ApManager.sendMsg_2_MainController(mt, mb); //OnReceiveMainMsg(mt, mb); }
/// <summary> /// 获取AP的配置信息 /// </summary> /// <param name="apToKen">AP信息</param> private void Send2ap_get_general_para_request(AsyncUserToken apToKen) { Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(ApMsgType.get_general_para_request, "timeout", 5, "timestamp", DateTime.Now.ToLocalTime().ToString()); SendMsg2Ap(apToKen, 0, TypeKeyValue); }
/// <summary> /// 向MainController模块发送状态改变消息(GSM_ZYF/CDMA_ZYF状态) /// </summary> /// <param name="apToKen">AP信息,包含改变后的状态</param> /// <param name="OldDetail">改变前的状态</param> protected void Send2ap_ApStatusChange_GSM_ZYF(AsyncUserToken apToKen, UInt32 detail, Byte ApReadySt) { UInt32 oldDetail = apToKen.Detail; //byte oldApReadySt = apToKen.ApReadySt; //状态改变时才发送消息 //需去掉上下线状态,再比较 if (((detail | AP_STATUS_LTE.OnLine) == (oldDetail | AP_STATUS_LTE.OnLine))) { return; } string st = ApReadyStEnum.Cell_Ready.ToString(); if ((detail & AP_STATUS_LTE.RADIO2) != (oldDetail & AP_STATUS_LTE.RADIO2) || (detail & AP_STATUS_LTE.ALIGN_SYS2) != (oldDetail & AP_STATUS_LTE.ALIGN_SYS2)) { Msg_Body_Struct TypeKeyValue2 = new Msg_Body_Struct(Main2ApControllerMsgType.ApStatusChange, "carry", 1, "detail", string.Format("0x{0:X}", detail), "SCTP", ((detail & AP_STATUS_LTE.SCTP) > 0) ? 1 : 0, "S1", ((detail & AP_STATUS_LTE.S1) > 0) ? 1 : 0, "GPS", ((detail & AP_STATUS_LTE.GPS) > 0) ? 1 : 0, "CELL", ((detail & AP_STATUS_LTE.CELL) > 0) ? 1 : 0, "SYNC", ((detail & AP_STATUS_LTE.SYNC) > 0) ? 1 : 0, "LICENSE", ((detail & AP_STATUS_LTE.LICENSE) > 0) ? 1 : 0, "RADIO", ((detail & AP_STATUS_LTE.RADIO2) > 0) ? 1 : 0, "wSelfStudy", ((detail & AP_STATUS_LTE.wSelfStudy) > 0) ? 1 : 0, "ALIGN", ((detail & AP_STATUS_LTE.ALIGN_SYS2) > 0) ? 1 : 0, "ApReadySt", st, "timestamp", DateTime.Now.ToLocalTime().ToString()); //向Main模块发消息 OnSendMsg2Main(0, MsgStruct.MsgType.NOTICE, apToKen, TypeKeyValue2); } Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(Main2ApControllerMsgType.ApStatusChange, "carry", 0, "detail", string.Format("0x{0:X}", detail), "SCTP", ((detail & AP_STATUS_LTE.SCTP) > 0) ? 1 : 0, "S1", ((detail & AP_STATUS_LTE.S1) > 0) ? 1 : 0, "GPS", ((detail & AP_STATUS_LTE.GPS) > 0) ? 1 : 0, "CELL", ((detail & AP_STATUS_LTE.CELL) > 0) ? 1 : 0, "SYNC", ((detail & AP_STATUS_LTE.SYNC) > 0) ? 1 : 0, "LICENSE", ((detail & AP_STATUS_LTE.LICENSE) > 0) ? 1 : 0, "RADIO", ((detail & AP_STATUS_LTE.RADIO) > 0) ? 1 : 0, "wSelfStudy", ((detail & AP_STATUS_LTE.wSelfStudy) > 0) ? 1 : 0, "ALIGN", ((detail & AP_STATUS_LTE.ALIGN) > 0) ? 1 : 0, "ApReadySt", st, "timestamp", DateTime.Now.ToLocalTime().ToString()); //向Main模块发消息 OnSendMsg2Main(0, MsgStruct.MsgType.NOTICE, apToKen, TypeKeyValue); }
/// <summary> /// 封装激活、去激活消息 /// </summary> /// <param name="apToKen">ap信息</param> /// <param name="active_mode">1(start), 2(stop)</param> /// <param name="mode">1:scanner mode 2: audit mode</param> private void Send2ap_activate_nodeb_request(AsyncUserToken apToKen, Byte active_mode, Byte mode) { Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(ApMsgType.activate_nodeb_request, "active_mode", active_mode, "mode", mode, "timeout", 0); SendMsg2Ap(apToKen, 0, TypeKeyValue); }
protected void Send2App_device_test_response(AsyncUserToken apToKen) { //向APP回复测试回应 Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(ApMsgType.device_test_response, "timeout", 5, "timestamp", DateTime.Now.ToLocalTime().ToString()); SendMsg2App(apToKen, TypeKeyValue); }
/// <summary> /// 向AP回应心跳消息 /// </summary> /// <param name="apToKen">AP信息</param> protected void Send2ap_status_request(AsyncUserToken apToKen) { //向AP回复心跳 Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(ApMsgType.status_request, "timeout", 5, "timestamp", DateTime.Now.ToLocalTime().ToString()); SendMsg2Ap(apToKen, 0, TypeKeyValue); }
/// <summary> /// 向AP发送消息 /// </summary> /// <param name="apToKen">Ap信息</param> /// <param name="id">消息id</param> /// <param name="body">消息内容</param> /// <returns>消息封装是否成功</returns> protected bool SendMsg2Ap(AsyncUserToken apToKen, ushort id, Msg_Body_Struct body) { string sendMsg = EncodeApXmlMessage(id, body); if (sendMsg == null) { OnOutputLog(LogInfoType.EROR, string.Format("封装XML消息({0})出错!", body.type)); return(false); } SendMsg2Ap(apToKen, body.type, sendMsg); return(true); }
/// <summary> /// 将键值对封装成发给AP的xml消息 /// </summary> /// <param name="KeyValueList">键值对列表</param> /// <returns>封装后的xml消息</returns> static public string EncodeApXmlMessage(UInt16 id, Msg_Body_Struct TypeKeyValue) { //初始化一个xml实例 XmlDocument myXmlDoc = new XmlDocument(); try { ////加入XML的声明段落,<?xml version="1.0" encoding="UTF-8"?> XmlDeclaration rootElement = myXmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null); //创建xml的根节点 myXmlDoc.AppendChild(rootElement); //初始化第一层节点:message_content XmlElement levelElement1 = myXmlDoc.CreateElement("message_content"); myXmlDoc.AppendChild(levelElement1); //添加消息id XmlElement levelId = myXmlDoc.CreateElement("id"); levelId.InnerText = id.ToString(); levelElement1.AppendChild(levelId); //初始化第二层节点(消息类型) XmlElement levelType = myXmlDoc.CreateElement(TypeKeyValue.type); levelElement1.AppendChild(levelType); //添加属性字段 addDicNodes(myXmlDoc, TypeKeyValue.dic, levelType); if (TypeKeyValue.n_dic != null) { foreach (Name_DIC_Struct x in TypeKeyValue.n_dic) { addDicNodes(myXmlDoc, x.dic, levelType); } } //将xml文件保存到指定的路径下 //myXmlDoc.Save("d://data2.xml"); //MemoryStream ms = new MemoryStream(); //myXmlDoc.Save(ms); //byte[] data = ms.ToArray(); //return data; return(ConvertXmlToString(myXmlDoc)); } catch (Exception ex) { Logger.Trace(LogInfoType.EROR, "封装XML出错。出错原因:" + ex.ToString(), "XML", LogCategory.I); return(null); } }
/// <summary> /// 检测数所库保存的Ap上下线状态是否正确,若不正确,向其发送正状态 /// </summary> /// <param name="status">数据库保存状态</param> /// <param name="apToKen">ap信息</param> protected void Send2main_OnOffLineCheck(string status, Ap_Info_Struct ApInfo) { string MainControllerStatus = OffLine; AsyncUserToken apToKen = MyDeviceList.FindByIpPort(ApInfo.IP, ApInfo.Port); if (apToKen == null) { apToKen = MyDeviceList.FindByFullname(ApInfo.Fullname); } if (apToKen == null) { MainControllerStatus = OffLine; } else { MainControllerStatus = apToKen.MainControllerStatus; } OnOutputLog(LogInfoType.DEBG, "保存的状态为:" + MainControllerStatus + ";接收到状态为:" + status); if (String.Compare(MainControllerStatus, status, true) != 0) { Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(Main2ApControllerMsgType.OnOffLine, "AllOnLineNum", MyDeviceList.GetCount().ToString(), "Status", MainControllerStatus, "mode", apToKen.Mode, "timestamp", DateTime.Now.ToLocalTime().ToString()); //向Main模块发消息 MessageType mt = MessageType.MSG_JSON; MessageBody mb = new MessageBody(); InterModuleMsgStruct msg = new InterModuleMsgStruct(); msg.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); msg.MsgType = MsgStruct.MsgType.NOTICE.ToString(); msg.ApInfo = ApInfo; App_Info_Struct appInfo = new App_Info_Struct(); appInfo.Ip = AllDevice; msg.AppInfo = appInfo; msg.Body = TypeKeyValue; mb.bJson = JsonConvert.SerializeObject(msg); OnOutputLog(LogInfoType.INFO, string.Format("发送消息({0})给MainController模块!", TypeKeyValue.type), LogCategory.S); OnOutputLog(LogInfoType.DEBG, string.Format("消息内容:\n{0}", mb.bJson), LogCategory.S); ApManager.sendMsg_2_MainController(mt, mb); } }
/// <summary> /// 发送通用出错消息给App /// </summary> /// <param name="appToKen">App信息</param> /// <param name="type">接收到的消息类型</param> /// <param name="str">出错信息描述</param> protected void SendErrorMsg2App(AsyncUserToken appToKen, AppMsgType type, String str) { string sType = string.Empty; if (type != null) { sType = type.ToString(); } Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(AppMsgType.general_error_result, "ErrStr", str, "RecvType", sType); SendMsg2App(appToKen, TypeKeyValue); }
/// <summary> /// 向MainController模块发送状态改变消息(LTE/WCDMA状态) /// </summary> /// <param name="apToKen">AP信息,包含改变后的状态</param> /// <param name="OldDetail">改变前的状态</param> protected void Send2ap_ApStatusChange_LTE(AsyncUserToken apToKen, UInt32 detail, Byte ApReadySt) { UInt32 oldDetail = apToKen.Detail; byte oldApReadySt = apToKen.ApReadySt; OnOutputLog(LogInfoType.DEBG, "oldDetail=" + oldDetail + ";detail=" + detail + ";oldApReadySt=" + oldApReadySt + ";ApReadySt=" + ApReadySt); //状态改变时才发送消息 //需去掉上下线状态,再比较 if (((detail | AP_STATUS_LTE.OnLine) == (oldDetail | AP_STATUS_LTE.OnLine)) && (oldApReadySt == ApReadySt)) { return; } string st = Enum.GetName(typeof(ApReadyStEnum), ApReadySt); if (string.IsNullOrEmpty(st)) { OnOutputLog(LogInfoType.EROR, string.Format("收到设备[{0}:{1}]的addStatu为{2}错误。", apToKen.IPAddress.ToString(), apToKen.Port, ApReadySt)); return; } st = st.Replace("_", "-"); Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(Main2ApControllerMsgType.ApStatusChange, "carry", 0, "detail", string.Format("0x{0:X}", detail), "SCTP", ((detail & AP_STATUS_LTE.SCTP) > 0) ? 1 : 0, "S1", ((detail & AP_STATUS_LTE.S1) > 0) ? 1 : 0, "GPS", ((detail & AP_STATUS_LTE.GPS) > 0) ? 1 : 0, "CELL", ((detail & AP_STATUS_LTE.CELL) > 0) ? 1 : 0, "SYNC", ((detail & AP_STATUS_LTE.SYNC) > 0) ? 1 : 0, "LICENSE", ((detail & AP_STATUS_LTE.LICENSE) > 0) ? 1 : 0, "RADIO", ((detail & AP_STATUS_LTE.RADIO) > 0) ? 1 : 0, "wSelfStudy", ((detail & AP_STATUS_LTE.wSelfStudy) > 0) ? 1 : 0, "ALIGN", ((detail & AP_STATUS_LTE.ALIGN) > 0) ? 1 : 0, "ApReadySt", st, "timestamp", DateTime.Now.ToLocalTime().ToString()); //向Main模块发消息 OnSendMsg2Main(0, MsgStruct.MsgType.NOTICE, apToKen, TypeKeyValue); }
/// <summary> /// 发送AP上下线消息 /// </summary> /// <param name="status">状态(OnLine:上线;OffLine:下线)</param> /// <param name="allNum">当前在线的AP总数</param> /// <param name="apToKen">Ap信息</param> /// <param name="MainControllerStatus">发送给数据库上、下线状态</param> protected void Send2main_OnOffLine(string status, int allNum, AsyncUserToken apToKen, string MainControllerStatus) { //保存的状态有更改时才上报 //string MainControllerStatus = MyDeviceList.GetMainControllerStatus(token); //if (string.IsNullOrEmpty(MainControllerStatus)) MainControllerStatus = "unknown"; OnOutputLog(LogInfoType.DEBG, "旧状态为:" + MainControllerStatus + "新状态为:" + status); if ((String.Compare(status, OffLine, true) == 0) && (MainControllerStatus.Equals("unknown"))) { OnOutputLog(LogInfoType.WARN, "未向MainController模块上报过上线消息,该下线消息不上报!"); return; } if ((String.Compare(status, OffLine, true) == 0) && (null != MyDeviceList.FindByFullname(apToKen.FullName))) { OnOutputLog(LogInfoType.WARN, "该设备有另外一个TCP连接在线,不向MainController模块上报下线消息!"); return; } if (String.Compare(MainControllerStatus, status, true) != 0) { Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(Main2ApControllerMsgType.OnOffLine, "AllOnLineNum", allNum.ToString(), "Status", status, "mode", apToKen.Mode.Replace("-", "_"), "version", apToKen.version, "timestamp", DateTime.Now.ToLocalTime().ToString()); //向Main模块发消息 OnSendMsg2Main(0, MsgStruct.MsgType.NOTICE, apToKen, TypeKeyValue); //修改状态----测试版本中使用,正式版本中在收到Ack后更改状态。 //if (DebugMode) //{ // MyDeviceList.SetMainControllerStatus(status, token); //} } }
/// <summary> /// 向AP发送透传消息 /// </summary> /// <param name="appToKen"></param> /// <param name="ApInfo"></param> /// <param name="TypeKeyValue"></param> protected void OnSendTransparentMsg2Main(AsyncUserToken appToKen, Ap_Info_Struct ApInfo, Msg_Body_Struct TypeKeyValue) { MessageType mt = MessageType.MSG_JSON; MessageBody mb = new MessageBody(); InterModuleMsgStruct msg = new InterModuleMsgStruct(); msg.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); msg.MsgType = MsgType.TRANSPARENT.ToString(); msg.AppInfo.User = appToKen.User; msg.AppInfo.Group = appToKen.Group; msg.AppInfo.Domain = appToKen.Domain; msg.AppInfo.Ip = appToKen.IPAddress.ToString(); msg.AppInfo.Port = appToKen.Port; msg.AppInfo.Type = DeviceType; msg.ApInfo = ApInfo; string sData = GetMsgStringValueInList("transparent_msg", TypeKeyValue); //sData = Regex.Replace(sData, "<\\s*id\\s*>.+<\\s*/\\s*id\\s*>", string.Format("<id>{0}</id>", ApMsgIdClass.addTransparentMsgId())); Dictionary <string, object> dic = new Dictionary <string, object>(); dic.Add("transparent_msg", sData); TypeKeyValue.dic = dic; msg.Body = TypeKeyValue; mb.bJson = JsonConvert.SerializeObject(msg); OnOutputLog(LogInfoType.INFO, string.Format("发送消息({0})给MainController模块!", TypeKeyValue.type), LogCategory.S); OnOutputLog(LogInfoType.DEBG, string.Format("消息内容:\n{0}", mb.bJson), LogCategory.S); AppManager.sendMsg_2_MainController(mt, mb); }
/// <summary> /// 发送消息到MainContrller模块 /// </summary> /// <param name="appToKen">App连接信息</param> /// <param name="ApInfo">Ap信息</param> /// <param name="TypeKeyValue">发送内容</param> protected void OnSendMsg2Main(AsyncUserToken appToKen, Ap_Info_Struct ApInfo, Msg_Body_Struct TypeKeyValue) { MessageType mt = MessageType.MSG_JSON; MessageBody mb = new MessageBody(); InterModuleMsgStruct msg = new InterModuleMsgStruct(); msg.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); msg.MsgType = MsgType.CONFIG.ToString(); msg.AppInfo.User = appToKen.User; msg.AppInfo.Group = appToKen.Group; msg.AppInfo.Domain = appToKen.Domain; msg.AppInfo.Ip = appToKen.IPAddress.ToString(); msg.AppInfo.Port = appToKen.Port; msg.AppInfo.Type = DeviceType; msg.ApInfo = ApInfo; msg.Body = TypeKeyValue; mb.bJson = JsonConvert.SerializeObject(msg); OnOutputLog(LogInfoType.INFO, string.Format("发送消息({0})给MainController模块!", TypeKeyValue.type), LogCategory.S); OnOutputLog(LogInfoType.DEBG, string.Format("消息内容:\n{0}", mb.bJson), LogCategory.S); AppManager.sendMsg_2_MainController(mt, mb); }
/// <summary> /// 处理收到的App侧消息 /// </summary> /// <param name="appToKen"></param> /// <param name="AppMsg"></param> private void HandleAppMsg(AsyncUserToken appToKen, string msg) { ////解析收到的消息 DeviceServerMsgStruct AppMsg = null; try { AppMsg = JsonConvert.DeserializeObject <DeviceServerMsgStruct>(msg); } catch (Exception) { OnOutputLog(LogInfoType.EROR, "解析收到的App消息出错。JSON格式错误!"); SendErrorMsg2App(appToKen, null, "解析收到的App消息出错。JSON格式错误!"); return; } if (AppMsg == null) { OnOutputLog(LogInfoType.EROR, "收到消息格式错误!"); SendErrorMsg2App(appToKen, null, "收到消息格式错误!"); OnOutputLog(LogInfoType.DEBG, "出错消息内容:" + msg); return; } Msg_Body_Struct msgBody = AppMsg.Body; if (msgBody == null) { OnOutputLog(LogInfoType.EROR, "消息内容为NULL!"); SendErrorMsg2App(appToKen, null, "消息内容为NULL!"); return; } if (msgBody.type == ApMsgType.device_test_request) { Send2App_device_test_response(appToKen); return; } if (msgBody.type != ApMsgType.status_response) { OnOutputLog(LogInfoType.INFO, string.Format("处理APP[{0}:{1}]消息({2})!", appToKen.IPAddress.ToString(), appToKen.Port, msgBody.type)); } //心跳消息 if (AppMsg.Body.type == AppMsgType.app_heartbeat_request) { //OnOutputLog(LogInfoType.INFO, "收到心跳消息"); //if (GetMsgIntValueInList(MsgStruct.AllNum, msgBody) != msgBody.dic.Count()) //{ // OnOutputLog(LogInfoType.EROR, string.Format("收到消息里键值对数[{0}]与校验值[{1}]不一至。", // msgBody.dic.Count(), GetMsgIntValueInList(MsgStruct.AllNum, msgBody))); // return; //} appToKen.User = (string)GetMsgStringValueInList("User", msgBody); appToKen.Group = (string)GetMsgStringValueInList("Group", msgBody); appToKen.Domain = (string)GetMsgStringValueInList("Domain", msgBody); MyDeviceList.add(appToKen); Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(AppMsgType.app_heartbeat_response, "timestamp", DateTime.Now.ToLocalTime().ToString()); SendMsg2App(appToKen, TypeKeyValue); } else if (AppMsg.Body.type == AppMsgType.transparent_msg_request) { //透传消息 OnSendTransparentMsg2Main(appToKen, AppMsg.ApInfo, AppMsg.Body); } else { //将消息转发给Main模块 OnSendMsg2Main(appToKen, AppMsg.ApInfo, AppMsg.Body); } }
/// <summary> /// 向AP删除黑白名单 /// </summary> /// <param name="token">AP信息</param> private void Send2ap_imsi_list_delconfig(InterModuleMsgStruct MainMsg) { AsyncUserToken apToKen = MyDeviceList.FindByApInfo(MainMsg.ApInfo); if (apToKen == null) { OnOutputLog(LogInfoType.WARN, string.Format("在线AP列表中找不到Ap[{0}:{1}]设备({2})!", MainMsg.ApInfo.IP, MainMsg.ApInfo.Port.ToString(), MainMsg.ApInfo.Fullname)); return; } Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(ApMsgType.imsi_list_delconfig); int i = 0; foreach (Name_DIC_Struct n_dicList in MainMsg.Body.n_dic) { Dictionary <string, object> dic = n_dicList.dic; String bwFlag = GetMsgStringValueInList("bwFlag", dic); if (!bwFlag.Equals("black") && !bwFlag.Equals("white")) { OnOutputLog(LogInfoType.WARN, "删除黑白名单参数错误。bwFlag字段错误!"); Send2APP_GeneralError(MainMsg.ApInfo, MainMsg.AppInfo, MainMsg.Body.type, "删除黑白名单参数错误。bwFlag字段错误!"); continue; } if (bwFlag.Equals("white")) { String imsi = GetMsgStringValueInList("imsi", dic); if (imsi.Equals(String.Empty)) { OnOutputLog(LogInfoType.WARN, "删除白名单参数错误。imsi字段错误!"); Send2APP_GeneralError(MainMsg.ApInfo, MainMsg.AppInfo, MainMsg.Body.type, "删除白名单参数错误。imsi字段错误!"); continue; } Name_DIC_Struct n_dic = new Name_DIC_Struct("name" + i++); n_dic.dic.Add("whiteimsi/imsi", imsi); TypeKeyValue.n_dic.Add(n_dic); } if (bwFlag.Equals("black")) { String imsi = GetMsgStringValueInList("imsi", dic); if (imsi.Equals(String.Empty)) { OnOutputLog(LogInfoType.WARN, "删除黑名单参数错误。imsi字段错误!"); Send2APP_GeneralError(MainMsg.ApInfo, MainMsg.AppInfo, MainMsg.Body.type, "删除黑名单参数错误。imsi字段错误!"); continue; } Name_DIC_Struct n_dic = new Name_DIC_Struct("name" + i++); n_dic.dic.Add("blackimsi/imsi", imsi); TypeKeyValue.n_dic.Add(n_dic); } } if (i == 0) { OnOutputLog(LogInfoType.EROR, "删除黑名单参数错误。没有要发送的名单!"); Send2APP_GeneralError(MainMsg.ApInfo, MainMsg.AppInfo, MainMsg.Body.type, "删除黑名单参数错误。没有要发送的名单!"); return; } if (!SendMsg2Ap(apToKen, 0, TypeKeyValue)) { Send2APP_GeneralError(MainMsg.ApInfo, MainMsg.AppInfo, MainMsg.Body.type, "封装XML消息(imsi_list_delconfig)出错!"); } }
/// <summary> /// 发送消息给MainController模块 /// </summary> /// <param name="msgId">Ap返回的消息Id</param> /// <param name="msgType">Main模块消息类型</param> /// <param name="apToKen">Ap信息</param> /// <param name="TypeKeyValue">消息内容</param> public void OnSendMsg2Main(UInt16 msgId, MsgStruct.MsgType msgType, AsyncUserToken apToKen, Msg_Body_Struct TypeKeyValue) { MessageType mt = MessageType.MSG_JSON; MessageBody mb = new MessageBody(); InterModuleMsgStruct msg = new InterModuleMsgStruct(); msg.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); msg.MsgType = msgType.ToString(); msg.ApInfo.SN = apToKen.Sn; msg.ApInfo.Fullname = apToKen.FullName; msg.ApInfo.IP = apToKen.IPAddress.ToString(); msg.ApInfo.Port = apToKen.Port; msg.ApInfo.Type = DeviceType; App_Info_Struct appInfo = new App_Info_Struct(); if ((msgType == MsgType.NOTICE) || (msgId == 0)) { appInfo.Ip = AllDevice; } else { //通过消息id查找AppInfo AsyncUserToken ListToken = MyDeviceList.FindByIpPort(apToKen.IPAddress.ToString(), apToKen.Port); if (ListToken == null) { String str = string.Format( "未找到设备[{0}:{1}]消息ID({2})对应的APP信息,不发送消息给MainController模块!", apToKen.IPAddress.ToString(), apToKen.Port, msgId); OnOutputLog(LogInfoType.EROR, str); return; } HashSet <MsgId2App> msgId2App = new HashSet <MsgId2App>(); msgId2App = ListToken.msgId2App; foreach (MsgId2App x in msgId2App) { if (x.id == msgId) { appInfo = x.AppInfo; break; } } //删除保存的消息Id列表(目前实现的方法是120秒后自动删除) //MyDeviceList.RemoveMsgId2App(apToKen, msgId); } if (string.IsNullOrEmpty(appInfo.Ip)) { String str = string.Format( "未找到设备[{0}:{1}]消息ID({2})对应的APP信息,不发送消息给MainController模块!", apToKen.IPAddress.ToString(), apToKen.Port, msgId); OnOutputLog(LogInfoType.EROR, str); return; } msg.AppInfo = appInfo; msg.Body = TypeKeyValue; mb.bJson = JsonConvert.SerializeObject(msg); //当设备状态为在线时再发送消息给Main模块 if ((String.Compare(MyDeviceList.GetMainControllerStatus(apToKen), OnLine, true) != 0) && (!TypeKeyValue.type.Equals(Main2ApControllerMsgType.OnOffLine))) { OnOutputLog(LogInfoType.WARN, string.Format("设备[{0}:{1}]在线状态为:{2},OnLine状态才向Main模块发送消息{3}!", apToKen.IPAddress.ToString(), apToKen.Port.ToString(), MyDeviceList.GetMainControllerStatus(apToKen), TypeKeyValue.type)); if (TypeKeyValue.type == ApMsgType.scanner) { noSendMainImsiNum++; } return; } if (TypeKeyValue.type == ApMsgType.scanner) { sendMainImsiMsgNum++; } OnOutputLog(LogInfoType.INFO, string.Format("发送消息({0})给MainController模块!", TypeKeyValue.type), LogCategory.S); OnOutputLog(LogInfoType.DEBG, string.Format("消息内容:\n{0}", mb.bJson), LogCategory.S); ApManager.sendMsg_2_MainController(mt, mb); }
/// <summary> /// 处理收到的AP消息 /// </summary> /// <param name="apToKen"></param> /// <param name="msg"></param> private void HandleApMsg(AsyncUserToken apToKen, string msg) { //解析AP发过来的消息 UInt16 msgId = 0; Msg_Body_Struct msgBody = null; try { msgBody = Xml_codec.DecodeApXmlMessage(msg, ref msgId); } catch (Exception) { OnOutputLog(LogInfoType.EROR, string.Format("解析收到的Ap[{0}:{1}]消息出错!", apToKen.IPAddress.ToString(), apToKen.Port.ToString())); return; } if (msgBody == null) { OnOutputLog(LogInfoType.EROR, "收到消息格式错误!"); OnOutputLog(LogInfoType.DEBG, "出错消息内容:" + msg); return; } if (msgBody.type == ApMsgType.device_test_request) { Send2ap_device_test_response(apToKen); return; } if (msgBody.type != ApMsgType.status_response) { OnOutputLog(LogInfoType.INFO, string.Format("处理AP[{0}:{1}]消息({2}),消息Id={3}!", apToKen.IPAddress.ToString(), apToKen.Port, msgBody.type, msgId)); } //处理透传消息 if (msgId >= ApMsgIdClass.MIN_TRANSPARENT_MSG_ID && msgId <= ApMsgIdClass.MAX_TRANSPARENT_MSG_ID) { if (msgBody.type != ApMsgType.get_general_para_response) //参数上报消息不透传 { Msg_Body_Struct body = new Msg_Body_Struct(Main2ApControllerMsgType.transparent_msg_response, "transparent_msg", msg); OnSendMsg2Main(msgId, MsgStruct.MsgType.TRANSPARENT, apToKen, body); return; } } //心跳消息处理 if (msgBody.type == ApMsgType.status_response) { //OnOutputLog(LogInfoType.INFO, "收到心跳消息"); heartbeatMsgNum++; //UInt32 oldDetail = apToKen.Detail; UInt32 detail = 0; string sDetail = GetMsgStringValueInList("detail", msgBody); if (!string.IsNullOrEmpty(sDetail)) { detail = Convert.ToUInt32(sDetail, 16); } //Byte oldApReadySt = apToKen.ApReadySt; Byte ApReadySt = 5; string sApReadySt = GetMsgStringValueInList("addStatus", msgBody); if (!string.IsNullOrEmpty(sApReadySt)) { ApReadySt = Convert.ToByte(sApReadySt); } apToKen.version = GetMsgStringValueInList("version", msgBody); apToKen.Mode = GetMsgStringValueInList("mode", msgBody); apToKen.Sn = GetMsgStringValueInList("sn", msgBody); apToKen.FullName = GetMsgStringValueInList("fullname", msgBody); if (string.IsNullOrEmpty(apToKen.FullName)) //兼容老Agent拼写错误 { apToKen.FullName = GetMsgStringValueInList("fullaname", msgBody); } apToKen.Id = GetMsgStringValueInList("id", msgBody); //apToKen.Detail = detail; int i = MyDeviceList.add(apToKen); Send2main_OnOffLine(OnLine, i, apToKen); //判断是周期心跳,还是上线心跳 if ((detail & (int)AP_STATUS_LTE.OnLine) > 0) //上线 { //OnOutputLog(LogInfoType.DEBG, "上线消息"); if (OnLine.Equals(MyDeviceList.GetMainControllerStatus(apToKen))) { Send2ap_status_request(apToKen); Thread.Sleep(1000); Send2ap_get_general_para_request(apToKen); } else { OnOutputLog(LogInfoType.DEBG, "MainController未回复上线成功消息!"); } } else //周期心跳 { //OnOutputLog(LogInfoType.DEBG, "周期心跳消息"); } //发送状态改变 Send2ap_ApStatusChange_LTE(apToKen, detail, ApReadySt); } else if (msgBody.type == ApMsgType.get_general_para_response) { Msg_Body_Struct SendMsgBody = msgBody; SendMsgBody.type = Main2ApControllerMsgType.ReportGenPara; // 向Main模块发消息 OnSendMsg2Main(0, MsgStruct.MsgType.NOTICE, apToKen, SendMsgBody); } else if (msgBody.type == ApMsgType.set_general_para_response) { Msg_Body_Struct SendMsgBody = msgBody; SendMsgBody.type = Main2ApControllerMsgType.SetGenParaRsp; // 向Main模块发消息 OnSendMsg2Main(0, MsgStruct.MsgType.NOTICE, apToKen, SendMsgBody); } else if (msgBody.type == ApMsgType.imsi_list_config_result) { Msg_Body_Struct SendMsgBody = msgBody; SendMsgBody.type = Main2ApControllerMsgType.app_add_bwlist_response; // 向Main模块发消息 OnSendMsg2Main(msgId, MsgStruct.MsgType.NOTICE, apToKen, SendMsgBody); } else if (msgBody.type == ApMsgType.imsi_list_delconfig_result) { Msg_Body_Struct SendMsgBody = msgBody; SendMsgBody.type = Main2ApControllerMsgType.app_del_bwlist_response; // 向Main模块发消息 OnSendMsg2Main(msgId, MsgStruct.MsgType.NOTICE, apToKen, SendMsgBody); } else if (msgBody.type == ApMsgType.scanner) { imsiMsgNum++; recvApImsiMsgNum++; string imsi = GetMsgStringValueInList("imsi", msgBody); if (!string.IsNullOrEmpty(imsi)) { //IMSI去重处理 if (DataController.RemoveDupMode == 1) { //有该IMSI,去重,不用上报 if (ImsiRemoveDup.isExist(imsi)) { OnOutputLog(LogInfoType.INFO, string.Format("Imsi[{0}]在{1}时被抓到过,不再上报!", imsi, ImsiRemoveDup.GetTime(imsi))); return; } ImsiRemoveDup.add(imsi); } Msg_Body_Struct body = new Msg_Body_Struct(msgBody.type, msgBody.dic); OnOutputLog(LogInfoType.DEBG, string.Format("上报imsi:{0}", imsi)); OnSendMsg2Main(0, MsgStruct.MsgType.NOTICE, apToKen, body); } } else { Msg_Body_Struct body = new Msg_Body_Struct(msgBody.type, msgBody.dic); OnSendMsg2Main(msgId, MsgStruct.MsgType.CONFIG, apToKen, body); } msgBody = null; }
/// <summary> /// 解析收到的xml消息 /// </summary> /// <param name="msg">xml消息</param> /// <returns>解析后的结构体</returns> static public Msg_Body_Struct DecodeApXmlMessage(String msg, ref UInt16 msgId) { Msg_Body_Struct TypeKeyValueList = new Msg_Body_Struct(); //List<Key_Value_List_Struct> dic = new List<Key_Value_List_Struct>(); //Key_Value_Struct KeyValue = new Key_Value_Struct(); XmlDocument xmlDoc = new XmlDocument(); XmlElement root = null; try { xmlDoc.LoadXml(msg); root = xmlDoc.DocumentElement;//取到根结点 } catch (Exception) { StaticOutputLog(LogInfoType.EROR, "加载Xml消息结构出错。", "XML"); return(null); } XmlNode FirstNode = null; FirstNode = root.FirstChild; if (FirstNode == null) { StaticOutputLog(LogInfoType.EROR, "获取Xml消息中第一个子节点出错。", "XML"); return(null); } XmlNode LastNode = null; LastNode = FirstNode.NextSibling; if (LastNode == null) { StaticOutputLog(LogInfoType.EROR, "获取Xml消息中第二个子节点出错。", "XML"); return(null); } XmlNode idNode; XmlNode MsgTypeNode; if (FirstNode.Name.ToLower() == "id") { idNode = FirstNode; MsgTypeNode = LastNode; } else { idNode = LastNode; MsgTypeNode = FirstNode; } msgId = Convert.ToUInt16(idNode.InnerText, 10); Msg_Body_Struct TypeKeyValue = new Msg_Body_Struct(); TypeKeyValue.type = MsgTypeNode.Name; Dictionary <string, object> KeyValueList = new Dictionary <string, object>(); GetAllKeyNodes(null, MsgTypeNode, ref KeyValueList); //KeyValueList.Add(MsgStruct.AllNum, KeyValueList.Count + 1); TypeKeyValue.dic = KeyValueList; TypeKeyValueList = TypeKeyValue; return(TypeKeyValueList); }