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