| 
				 2)数据分析 
数据分析模块的主要功能是不断地循环读取包数据缓冲区的内容,按规则分离出告警信息,将这些信息保存到数据库表AlarmLog中。 
核心代码如下: 
private void MessageDecode() 
{ 
//信息包解码 
for(;;) 
{ 
if( MessagePacket.Count>0 ) 
{ 
try 
{ 
Message m = (Message)MessagePacket[0]; 
if (savePacket) 
{ 
    //保存包数据到文件 
    string headString = "BSCType:" + m.BSCType + "  BSC:" + m.BSC + "  Time:" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "  PacketLength:" + m.length.ToString() + "\r\n"; 
    string outString = ""; 
    for (int i = 0; i < m.length; i++) 
        outString += m.buffer[i].ToString("x2") + " "; 
    outString += "\r\n"; 
    FileStream aFile = new FileStream("Log\\PacketLog" + System.DateTime.Now.ToString("yyyyMMdd") + ".txt", FileMode.Append); 
    StreamWriter sw = new StreamWriter(aFile); 
    sw.WriteLine(headString); 
    sw.WriteLine(outString); 
    sw.Close(); 
} 
  
//解码 
if (m.BSCType == "HuaWei") 
{ 
    if (m.length >= 165) 
        huaweiAlarmDecode(m.buffer, m.length, m.BSC);//华为通信包解码 
} 
else 
    motoAlarmDecode(m.buffer, m.length);//MOTOROLA通信包解码 
MessagePacket.Remove(m); 
} 
catch (Exception ex) 
{ 
    SaveError("MessageDecode", ex);//保存错误信息 
} 
} 
Thread.Sleep(500); 
} 
} 
  
private string huaweiAlarmDecode(byte[] buffer, uint length, string BSC) 
{ 
//华为告警信息包解码 
string serialNo="", moduleID, siteID, siteName, siteEnName, alarmID, alarmName, alarmType, alarmLevel, alarmDate ; 
uint restoreFlag, temp, startPos=0, i; 
try 
{ 
int forFlag = 1; 
while (forFlag == 1) 
{ 
//告警信息长度 
if (buffer[startPos + 28] == 0x73 && buffer[startPos + 29] == 0x00) 
{ 
//告警流水号 
serialNo = "0x" + buffer[startPos + 144].ToString("x2") + buffer[startPos + 143].ToString("x2") + buffer[startPos + 142].ToString("x2") + buffer[startPos + 141].ToString("x2"); 
temp = Convert.ToUInt32(serialNo, 16); 
serialNo = temp.ToString(); 
... 
if (alarmType == "1") 
{ 
    //播放告警声音 
    dr["Flag"] = AlarmSound(dr); 
} 
AddNewRecord("HuaWei", dr); 
} 
startPos += 30; 
for (i = startPos; i < length; i++) 
{ 
if (buffer[i] == 0xff && buffer[i + 1] == 0xff && buffer[i + 2] == 0xff && buffer[i + 3] == 0xff) 
{ 
    startPos = i - 20;//继续下条告警 
    break; 
} 
} 
if (i >= length) 
forFlag = 0;//退出 
} 
} 
catch (Exception ex) 
{ 
SaveError("huaweiAlarmDecode", ex);//保存错误信息 
serialNo = ex.Message; 
} 
  
return serialNo; 
} 
  
3)声音告警 
声音告警模块的功能是根据预先设置的条件,播放对应的告警录音波形文件。 
核心代码如下: 
private int AlarmSound(DataRow dr) 
{ 
string waveFile, alarmLevel, alarmName; 
DateTime startTime; 
int i,returnFlag=0, reCount=0; 
bool findFlag=false; 
..... 
try 
{ 
returnFlag = Convert.ToInt32(dr["Flag"]); 
alarmName = dr["告警名称"].ToString().Trim(); 
startTime = Convert.ToDateTime(dr["告警时间"].ToString()).AddMinutes(0 - Convert.ToInt32(intervalTime)); 
  
if (waveFile != null && waveFile != "") 
{ 
    //告警级别声音 
    FileInfo file = new FileInfo(waveFile); 
    if (file.Exists) 
    { 
        SoundPlayer player = new SoundPlayer(); 
        player.SoundLocation = waveFile; 
        player.Load();//装载播放器 
        for (i = 0; i < reCount; i++) 
        { 
            player.PlaySync();//播放声音 
        } 
        player.Dispose(); 
    } 
} 
FileInfo fileAlarmName = new FileInfo(alarmName + ".wav"); 
if (fileAlarmName.Exists) 
{ 
    //告警名称声音 
    SoundPlayer player = new SoundPlayer(); 
    player.SoundLocation = alarmName + ".wav"; 
    player.Load();//装载播放器 
    for (i = 0; i < reCount; i++) 
    { 
        player.PlaySync();//播放声音 
    } 
    player.Dispose(); 
} 
returnFlag = 0 - returnFlag;    //播放声音后返回负数, 否则返回正数 
} 
} 
catch (Exception ex) 
{ 
    SaveError("AlarmSound", ex); //保存错误信息 
} 
return returnFlag; 
} 			
				 |