Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        /// <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);
        }
Пример #11
0
        /// <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);
            }
        }
Пример #12
0
        /// <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);
            }
        }
Пример #13
0
        /// <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);
        }
Пример #14
0
        /// <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);
        }
Пример #15
0
        /// <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);
                //}
            }
        }
Пример #16
0
        /// <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);
        }
Пример #17
0
        /// <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);
        }
Пример #18
0
        /// <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);
            }
        }
Пример #19
0
        /// <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)出错!");
            }
        }
Пример #20
0
        /// <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);
        }
Пример #21
0
        /// <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;
        }
Пример #22
0
        /// <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);
        }