📄 dtedlg.cpp
字号:
{
EnterCriticalSection(&m_csLock);
if(m_CanDeal)
{
DealDataFromPRU(Protoal);
m_recvedit.SetWindowText(aStr);
m_CanDeal = FALSE ;
}
LeaveCriticalSection(&m_csLock);
// UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
//----------------------------------------------------------------------
//查询本节点的等待发送的分组个数
//数据格式:0x11 0x00
//------------------------------------------------------------------------
void CDTEDlg::OnPktnum()
{
UINT16 iLen = 0;
unsigned char *Temp = NULL;
Query_OutData DTEQueryData;
DTEQueryData.Command = PhyWaitSendPktNum;
DTEQueryData.CommandAdd = 0x00;
Temp = (unsigned char *)(&DTEQueryData);
iLen = 2;
SerialWriteData(m_hCommPort, Temp, iLen);
}
//--------------------------------------------------------------------
//查询本节点的最大传输单元
//数据格式:0x10 0x00
//---------------------------------------------------------------------
void CDTEDlg::OnMtu()
{
UINT16 iLen = 0;
unsigned char *Temp = NULL;
Query_OutData DTEQueryData;
DTEQueryData.Command = ReturnMTU;
DTEQueryData.CommandAdd = 0x00;
Temp = (unsigned char *)(&DTEQueryData);
iLen = 2;
SerialWriteData(m_hCommPort, Temp, iLen);
}
//--------------------------------------------------------------------
// 查询本节点路由信息
//数据格式:0x06 0x00
//-----------------------------------------------------------------------
void CDTEDlg::OnRoute()
{
UINT16 iLen = 0;
unsigned char *Temp = NULL;
Query_OutData DTEQueryData;
DTEQueryData.Command = ParaLocalNodeRouteTable;
DTEQueryData.CommandAdd = 0x00;
Temp = (unsigned char *)(&DTEQueryData);
iLen = 2;
SerialWriteData(m_hCommPort, Temp, iLen);
}
//-------------------------------------------------------------------
//查询本节点有效IP地址
//数据格式:0x0d 0x00
//--------------------------------------------------------------------
void CDTEDlg::OnEffecip()
{
UINT16 iLen = 0;
unsigned char *Temp = NULL;
Query_OutData DTEQueryData;
DTEQueryData.Command = QueryLocalNodeList;
DTEQueryData.CommandAdd = 0x00;
Temp = (unsigned char *)(&DTEQueryData);
iLen = 2;
SerialWriteData(m_hCommPort, Temp, iLen);
}
//------------------------------------------------------
//主动发起路由
//数据格式0x71 0x00
//------------------------------------------------------
void CDTEDlg::OnTakeroute()
{
UINT16 iLen = 0;
unsigned char *Temp = NULL;
SendRoute_OutStruct SendRoute;
SendRoute.Command = SendRouteADV ;
SendRoute.AutoRoute = 0x00;
Temp = (unsigned char *)(&SendRoute);
iLen = 2;
SerialWriteData(m_hCommPort, Temp, iLen);
}
//------------------------------------------------------
//主动退网注销
//数据格式 0x72 0x00
//-------------------------------------------------------
void CDTEDlg::OnExitroute()
{
UINT16 iLen = 0;
unsigned char *Temp = NULL;
SendExit_OutStruct SendExit;
SendExit.Command = Logout ;
SendExit.AutoExit = 0x00;
Temp = (unsigned char *)(&SendExit);
iLen = 2;
SerialWriteData(m_hCommPort, Temp, iLen);
}
//--------------------------------------------------------
//调试信息开
//数据格式 0x73 0x01 0x01
//-----------------------------------------------------------
void CDTEDlg::OnDebugopen()
{
UINT16 iLen = 0;
unsigned char *Temp = NULL;
DTE_OutData DTEOutData;
DTEOutData.Command = CloseDebugInfo;
DTEOutData.Length = 0x01;
DTEOutData.Data.SendDebugOpen.Debug = 0x01;
Temp = (unsigned char *)(&DTEOutData);
iLen = 3;
SerialWriteData(m_hCommPort, Temp, iLen);
//菜单复选标志
m_isDebug = 0?1:0;
}
void CDTEDlg::OnUpdateDebugopen(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(1);
}
//-----------------------------------------------------------------
//调试信息关
//数据格式 0x73 0x01 0x00
//----------------------------------------------------------------
void CDTEDlg::OnDebugoff()
{
UINT16 iLen = 0;
unsigned char *Temp = NULL;
DTE_OutData DTEOutData;
DTEOutData.Command = CloseDebugInfo;
DTEOutData.Length = 0x01;
DTEOutData.Data.SendDebugOpen.Debug = 0x00;
Temp = (unsigned char *)(&DTEOutData);
iLen = 3;
SerialWriteData(m_hCommPort, Temp, iLen);
//菜单复选标志
m_isDebug = 0?1:0;
}
void CDTEDlg::OnUpdateDebugoff(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_isDebug);
}
//------------------------------------------------------------------------
//发送分组数据包
//
//---------------------------------------------------------------------
void CDTEDlg::OnSendbutton()
{
UINT16 iLen = 0;
UINT16 Datalength = 0;
unsigned char *Temp = NULL;
int i;
DWORD IP = 0;
time_t timer;
struct tm *tblock;
IPData_OutStruct DTEIPData;
DTEIPData.IpVersion = IPVer;
switch(m_pricombo.GetCurSel())
{
case 0:DTEIPData.PktServiceType = CommLevel;
break;
case 1: DTEIPData.PktServiceType = FirstLevel;
break;
case 2: DTEIPData.PktServiceType = UrgencyLevel;
break;
}
DTEIPData.PktAppID0 = (PacketID & 0xff00)>>8;
DTEIPData.PktAppID1 = PacketID & 0xff;
PacketID++;
DTEIPData.PktAppID2 = 0x00;
DTEIPData.PktAppID3 = 0x00;
DTEIPData.TTL = PktTTL;
DTEIPData.ProtocolType = Protype;
DTEIPData.Checksum0 = Checksum;
DTEIPData.Checksum1 = Checksum;
/* 源地址*/
if(!memcmp(&OwnUserCode, &IP, 4))
{
AfxMessageBox("本机IP地址不正确!请重新设置");
return;
}
memcpy(&DTEIPData.Src, &OwnUserCode, 4);
/*目的IP地址*/
m_IPADDRESS.GetAddress(IP);
DTEIPData.Dst[0] = (IP&0xff000000)>>24;
DTEIPData.Dst[1] = (IP&0x00ff0000)>>16;
DTEIPData.Dst[2] = (IP&0x0000ff00)>>8;
DTEIPData.Dst[3] = (IP&0x000000ff);
/*保密标志*/
for(i=0;i<5;i++)
DTEIPData.Privacy[i] = 0x00;
//获取数据长度
CString strText;
m_pktedit.GetWindowText(strText);
Datalength = strText.GetLength();
//954 = 1024 -70 yuqi2004_415
if(Datalength >954)
{
AfxMessageBox("数据超长!");
}
else
{ /*数据*/
memset(&DTEIPData.Data, 0, sizeof(DTEIPData.Data));
LPTSTR temp = strText.GetBuffer(Datalength);
memcpy(&DTEIPData.Data, temp, Datalength);
strText.ReleaseBuffer();
DTEIPData.len0 = ((Datalength + 20 + 5 +2)&0xff00)>>8; //数据+头长度+保密标识+时间
DTEIPData.Len = (Datalength + 27)& 0xff;
/*获取时间*/
/* gets time of day */
timer = time(NULL);
tblock = localtime(&timer);
if(tblock->tm_hour > 12)
tblock->tm_hour = tblock->tm_hour - 12;
DTEIPData.Data[Datalength] = ((((UINT8)(tblock->tm_hour))<< 4)&0xf0)|
((((UINT8)(tblock->tm_min)) >>2)&0x0f);
DTEIPData.Data[Datalength + 1] = ((((UINT8)(tblock->tm_min))<<6)&0xc0)|
((((UINT8)(tblock->tm_sec)))&0x3f);
Temp = (unsigned char *)(&DTEIPData);
iLen = Datalength + 27;
SerialWriteData(m_hCommPort, Temp, iLen);
}
}
//-----------------------------------------------------------------------------
//解析收到的报文
//
//--------------------------------------------------------------------------------
void CDTEDlg::DealDataFromPRU(unsigned char *PRUToDTEbuffer)
{
UINT8 PktType;
UINT8 temp;
UINT8 IPTemp[4];
UINT16 i, j, m;
UINT16 index = 0;
UINT16 Length = 0;
time_t timer;
struct tm *tblock;
char string1[7000], string2[7000], string3[5], LocalIP[20];
TopoofLocalNode_InStruct LocalNodeRoute;
UINT8 hour, minute, second;
CString STemp;
STemp = _T("");
PktType = PRUToDTEbuffer[index];
//是否IP数据报?
if((PktType>=0x45)&&(PktType<=0x4F))
{
index += 2; //指向IP数据包长度
//ip数据包的长度
//ycx_20050331/Length = ((UINT16)PRUToDTEbuffer[index]<<8) + (UINT16)PRUToDTEbuffer[index+1];
Length = ((UINT8)PRUToDTEbuffer[index]<<8) + (UINT8)PRUToDTEbuffer[index+1];
index += 10; //指向源IP地址的位置
aStr += "-------------------------------------------------------------------------------" ;
aStr += "\r\n";
for(i=0;i<4;i++)
IPTemp[i] = (UINT8)PRUToDTEbuffer[index+i];
STemp.Format("源IP地址是: %d.%d.%d.%d", (UINT8)IPTemp[0], (UINT8)IPTemp[1], (UINT8)IPTemp[2], (UINT8)IPTemp[3]);
aStr += STemp;
aStr += "\r\n";
m = ((UINT16)PRUToDTEbuffer[4]<<8) + (UINT16)PRUToDTEbuffer[5];
STemp.Format("分组ID: %d", m);
aStr += STemp;
aStr += "\r\n";
index += 13 ;//指向数据的位置
//将数据打出来
for(i=0;i<(Length-27);i++)
string1[i] = (UINT8)(PRUToDTEbuffer[index+i]);
string1[i] = '\0';
aStr += "发送的数据内容:";
aStr += string1;
aStr += "\r\n";
//发送数据的时间
index += Length-27;
//小时
hour = (UINT8)(PRUToDTEbuffer[index]>>4)&0x0f;
/*获取时间*/
/* gets time of day */
timer = time(NULL);
tblock = localtime(&timer);
if(tblock->tm_hour > 12)
hour += 12;
//分钟
minute = (((UINT8)PRUToDTEbuffer[index]& 0x0f)<< 2)|\
(((UINT8)PRUToDTEbuffer[index+1]&0xc0)>>6 );
//秒
second = (UINT8)(PRUToDTEbuffer[index+1]&0x3f);
STemp.Format("发送数据时间: %d:%d:%d", hour, minute, second);
aStr += STemp;
aStr += "\r\n";
}
else
{
switch(PktType)
{ //得到本节点的ID
case ParaUserID:
index += 2;
aStr += "-------------------------------------------------------------------------------";
aStr += "\r\n";
STemp.Format("本节点地址为: %d.%d.%d.%d", (UINT8)PRUToDTEbuffer[index],\
(UINT8)PRUToDTEbuffer[index+1],\
(UINT8)PRUToDTEbuffer[index+2],\
(UINT8)PRUToDTEbuffer[index+3]);
aStr += STemp;
aStr += "\r\n";
break;
//得到本机预置的有效节点地址
case ParaNetActiveNode:
index += 2;
aStr += "-------------------------------------------------------------------------------" ;
aStr += "\r\n";
temp = PRUToDTEbuffer[index]; //节点的个数
index++;
for(i=0;i<temp;i++)
{
STemp.Format("预置的节点地址为: %d.%d.%d.%d", (UINT8)PRUToDTEbuffer[index],\
(UINT8)PRUToDTEbuffer[index+1],\
(UINT8)PRUToDTEbuffer[index+2],\
(UINT8)PRUToDTEbuffer[index+3]);
index += 4;
}
aStr += STemp;
aStr += "\r\n";
break;
//查询有效的节点地址列表
case QueryLocalNodeList:
aStr += "-------------------------------------------------------------------------------";
aStr += "\r\n";
index += 2;
temp = PRUToDTEbuffer[index]; //节点的个数
//yuqi20050419 打印有效节点个数
STemp.Format("有效节点个数是: %d", temp);
aStr += STemp;
aStr += "\r\n";
index++;
for(i=0;i<temp;i++)
{
STemp.Format("已入网节点地址为: %d.%d.%d.%d", (UINT8)PRUToDTEbuffer[index],\
(UINT8)PRUToDTEbuffer[index+1],\
(UINT8)PRUToDTEbuffer[index+2],\
(UINT8)PRUToDTEbuffer[index+3]);
aStr += STemp;
aStr += "\r\n";
index += 4;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -