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; }
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; }
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); } }
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; } } } }
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); }
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; } }