示例#1
0
        public static void Stop()
        {
            // 宏电API的状态维护
            if (IsRuningMaintainHDAPI)
            {
                StopMaintainHDAPI();
                if (IsRuningMaintainHDAPI)
                {
                    TraceManager.AppendErrMsg("HDAPI维护服务停止失败");
                }
            }

            //宏电官方库
            try
            {
                StringBuilder mess           = new StringBuilder(1000);
                int           socketShutFlag = HDDTUAPI.stop_net_service(mess);
                if (socketShutFlag != 0)
                {
                    TraceManager.AppendErrMsg("DTU通信服务关闭失败:" + mess);
                }
            }
            catch { }

            IsRuning = false;
        }
示例#2
0
        public static void Start(out string errMsg)
        {
            errMsg = "";

            if (IsRuning)
            {
                return;
            }

            LoadConfig();

            // 打开宏电官方库
            HDDTUAPI.SetCustomIP(HDDTUAPI.inet_addr(ip));
            HDDTUAPI.SetWorkMode(serverMode);                       //开发包函数,设置服务模式:2-消息,0-阻塞,1-非阻塞
            HDDTUAPI.SelectProtocol((socketType == "TCP") ? 1 : 0); //开发包函数,设置服务类型:0-UDP,1-TCP
            StringBuilder mess = new StringBuilder(1000);

            if (HDDTUAPI.start_net_service(IntPtr.Zero, 0, port, mess) != 0)    //开发包函数,非消息模式启动服务
            {
                errMsg = mess.ToString().Trim();
                Stop();
                return;
            }

            // 宏电API的状态维护
            StartMaintainHDAPI();
            if (!IsRuningMaintainHDAPI)
            {
                TraceManager.AppendErrMsg("HDAPI维护服务启动失败" + errMsg);
                Stop();
                return;
            }

            IsRuning = true;
        }
示例#3
0
        private static void ReadOnce()
        {
            GPRS_DATA_RECORD dataRecord  = new GPRS_DATA_RECORD();
            bool             isNeedReply = false;
            StringBuilder    mess        = new StringBuilder(100);

            if (HDDTUAPI.do_read_proc(ref dataRecord, mess, isNeedReply) >= 0)
            {
                // 本服务以非阻塞模式运行, do_read_proc 无论有无消息都立即返回
                DTUResolverManager.Append(dataRecord);
            }
        }
示例#4
0
        private static void HDAPIRefresh()
        {
            uint   i, iDtuAmount;
            string str = "";

            StringBuilder  mess      = new StringBuilder(1000);
            GPRS_USER_INFO user_info = new GPRS_USER_INFO();

            str        = str + 0x00 + 0x00 + 0x00;
            iDtuAmount = HDDTUAPI.get_max_user_amount();    // 取最大数量, 为 3000

            for (i = 0; i < iDtuAmount; i++)
            {
                HDDTUAPI.get_user_at(i, ref user_info);

                if (user_info.m_status == 1)    // 在线
                {
                    // 判断 DTU 最后注册时间与现在时间的差值是否超过设置的超时时间
                    if ((DateTime.Now - HDDTUAPI.ConvertToDateTime(user_info.m_update_time)) > TimeSpan.FromMinutes(dtuTimeoutNum))
                    {
                        string dtuID = user_info.m_userid;
                        // 若超时则认为该 DTU 不在线, 调用开发包函数使其下线
                        HDDTUAPI.do_close_one_user2(dtuID, mess);
                        // 从缓存队列移除
                        DTUInfo dtuCache = DTUCacheManager.GetDTUInfo(dtuID);
                        if (dtuCache != null)
                        {
                            DTUCacheManager.OperDTUCache(DTUCacheManager.OPeratingType.Delete, dtuID, null);//DTUCacheManager.RemoveDtuCache(dtuID);
                            // 下线状态回填数据库
                            DBWorker.Append(DBCommand.CreateDtuOffline(dtuID));
                        }
                        else
                        {
                            TraceManager.AppendWarning("DTU:" + dtuID + "超时未注册,从缓存队列移除未发现该对象!");
                        }
                        continue;
                    }
                }
            }
        }
示例#5
0
        public static DTUInfo ToDTUInfoForSoc(GPRS_USER_INFO gprsUserInfo)
        {
            try
            {
                DTUInfo dtuInfo = new DTUInfo();
                dtuInfo.ID               = gprsUserInfo.m_userid;
                dtuInfo.IsUsed           = 1;
                dtuInfo.IsActive         = 1;
                dtuInfo.ActiveTime       = DataUtil.ToDateString(gprsUserInfo.m_logon_date);
                dtuInfo.LastRegisterTime = DataUtil.ToDateString(HDDTUAPI.ConvertToDateString(gprsUserInfo.m_update_time));
                dtuInfo.TerminalIP       = HDDTUAPI.inet_ntoa(HDDTUAPI.ntohl(gprsUserInfo.m_sin_addr));
                dtuInfo.TerminalPort     = gprsUserInfo.m_sin_port;
                dtuInfo.GatewayIP        = HDDTUAPI.inet_ntoa(HDDTUAPI.ntohl(gprsUserInfo.m_local_addr));
                dtuInfo.GatewayPort      = gprsUserInfo.m_local_port;

                return(dtuInfo);
            }
            catch
            {
            }
            return(null);
        }
示例#6
0
        private static void Excute(GPRS_DATA_RECORD item)
        {
            switch (item.m_data_type)
            {
            case 0x01:      // 注册包
                GPRS_USER_INFO userInfo = new GPRS_USER_INFO();
                if (HDDTUAPI.get_user_info(item.m_userid, ref userInfo) == 0)
                {
                    DTUInfo sourceDTU = DTUInfo.ToDTUInfoForSoc(userInfo);
                    if (sourceDTU == null)
                    {
                        return;
                    }
                    DTUInfo targetDTU = DTUCacheManager.GetDTUInfo(item.m_userid);
                    if (targetDTU == null)
                    {
                        // 首次注册--在DBWorker从数据读取业务信息添加到缓存
                        DBWorker.Append(DBCommand.CreateDtuRegister(sourceDTU));
                    }
                    else
                    {
                        // 更新链路
                        DTUCacheManager.OperDTUCache(DTUCacheManager.OPeratingType.UpdateSocketInfo, targetDTU, sourceDTU);
                    }
                }
                break;

            case 0x02:      // 注销包
            {
                DTUCacheManager.OperDTUCache(DTUCacheManager.OPeratingType.Delete, item.m_userid, null);
            }
            break;

            case 0x04:      // 无效包
                TraceManager.AppendInfo(item.m_userid + "---接收无效的数据包");
                break;

            case 0x05:      // DTU已经接收到DSC发送的用户数据包
                TraceManager.AppendInfo(item.m_userid + "---已经接收到DSC发送的用户数据包");
                break;

            case 0x09:      // 数据包
            {
                //TraceManager.AppendInfo("DTU:" + item.m_userid + "接收了" +
                //                       ByteUtil.BytesToText(item.m_data_buf, item.m_data_len)
                //                       + "--共计" + item.m_data_len.ToString() + "个字节");

                DTUInfo dtu = DTUCacheManager.GetDTUInfo(item.m_userid);
                if (dtu == null)
                {
                    return;
                }
                dtu.Analysis(item.m_data_buf, item.m_data_len);
            }
            break;

            case 0x0d:
                TraceManager.AppendInfo(item.m_userid + "---参数设置成功");
                break;

            case 0x0b:
                TraceManager.AppendInfo(item.m_userid + "---参数查询成功");
                //  config.readconf();
                break;

            case 0x06:
                TraceManager.AppendInfo("---断开PPP连接成功");
                break;

            case 0x07:
                TraceManager.AppendInfo(item.m_userid + "---停止向DSC发送数据");
                break;

            case 0x08:
                TraceManager.AppendInfo("---允许向DSC发送数据");
                break;

            case 0x0A:
                TraceManager.AppendInfo("---丢弃用户数据");
                break;

            default:
                break;
            }
        }