📄 faketolcanview.cpp
字号:
{
m_bSP = FALSE;
if (m_bNW == FALSE)
{
KillTimer(1);
}
}
if (flag == 1)
{
return;
}
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData = "";
m_bCollectData = FALSE;
// m_nCollectCmd = 0;
}
if (m_strRecvData == "8902")
{
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
}
if (m_strRecvData == "8903")
{
if (!m_strNodeInfo.IsEmpty())
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql;
sql.Format("delete from Nodes");
m_AdoConn.ExecuteSQL((_bstr_t)sql);
CString strNodeNum;
strNodeNum = m_strNodeInfo.Mid(4, 2);
//int iNodeNum = atoi(strNodeNum); // 有问题啊
int iNodeNum = strtoul(strNodeNum, NULL, 16);
m_strNodeInfo = m_strNodeInfo.Right(m_strNodeInfo.GetLength() - 6);
for (int i = 0; i < iNodeNum; i++)
{
CString strNodeId = m_strNodeInfo.Mid(0, 8);
CString strByteNum = m_strNodeInfo.Mid(8, 2);
CString strNodeOrder = m_strNodeInfo.Mid(10, 2);
CString strSmallInterval = m_strNodeInfo.Mid(12, 4);
CString strBigInterval = m_strNodeInfo.Mid(16, 4);
CString strWayNum = m_strNodeInfo.Mid(20, 2);
DWORD dwNodeId = strtoul(strNodeId, NULL, 16);
CopyMemory(&m_NodeNO, &dwNodeId, 2);
CString strNodeNo;
strNodeNo.Format("%d", m_NodeNO);
CString strMonth = strNodeId.Mid(2, 2);
int iMonth = strtoul(strMonth, NULL, 16);
strMonth.Format("%d", iMonth);
CString strNodeType = strNodeId.Mid(0, 2);
m_iNodeType = strtoul(strNodeType, NULL, 16);
//strNodeType.Format("%d", m_iNodeType);
if (m_iNodeType == 0)
{
strNodeType = "深度节点";
}
else if (m_iNodeType == 1)
{
strNodeType = "泵冲节点";
}
else if (m_iNodeType == 2)
{
strNodeType = "4-20mA模拟节点";
}
else if (m_iNodeType == 3)
{
strNodeType = "色谱节点";
}
BYTE byteNum = (BYTE)strtoul(strByteNum, NULL, 16);
strByteNum.Format("%d", byteNum);
BYTE nodeOrder = (BYTE)strtoul(strNodeOrder, NULL, 16);
strNodeOrder.Format("%d", nodeOrder);
USHORT smallInterval = (USHORT)strtoul(strSmallInterval, NULL, 16);
strSmallInterval.Format("%d", smallInterval);
USHORT bigInterval = (USHORT)strtoul(strBigInterval, NULL, 16);
strBigInterval.Format("%d", bigInterval);
BYTE wayNum = (BYTE)strtoul(strWayNum, NULL, 16);
strWayNum.Format("%d", wayNum);
m_strNodeInfo = m_strNodeInfo.Right(m_strNodeInfo.GetLength() - 32);
sql.Format("INSERT INTO Nodes VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')",\
strNodeId,strNodeNo,strMonth,strNodeType,strByteNum,strNodeOrder,strSmallInterval,strBigInterval,strWayNum);
m_AdoConn.ExecuteSQL((_bstr_t)sql);
}
m_AdoConn.ExitConnect();
}
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
ModifyNodesOrder();
m_bNodeChange = TRUE;
m_NodeList.DeleteAllItems();
UpdateNodeList();
m_NodeList.InsertItem(ReturnNodeNum()+1,0);
//add at 08-11-21
CString strNum;
strNum.Format("%d", ReturnNodeNum());
SetDlgItemText(IDC_STATIC_NODE_NUM, strNum);
}
if (m_strRecvData == "8904")
{
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
}
if (m_strRecvData == "8905")
{
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
}
if (m_strRecvData == "8906")
{
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
}
if (m_strRecvData == "8907")
{
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
ReturnNodeId(flag);
}
if (m_strRecvData == "8908")
{
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
}
if (m_strRecvData == "8909")
{
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
ReturnNodeInfo(flag);
}
static BOOL bFind89oa = TRUE;
static int len = 0;
if(bFind89oa)
{
if (m_strRecvData.Left(4) == "890A")
{
if (m_strRecvData.GetLength() >= 6)
{
CString str;
str = m_strRecvData.Mid(4, 2);
//LPTSTR num = str.GetBuffer(2);
//strcpy(num, m_strRecvData.Mid(4, 2).GetBuffer(0));
//len = atoi(num); // num为个位数时,没有问题,但是......
len = strtoul(str, NULL, 16);
len = len * 16 + 3;
len = len * 2;
bFind89oa = FALSE;
}
}
}
if (!bFind89oa)
{
if (len && (m_strRecvData.GetLength() == len))
{
m_strNodeInfo = m_strRecvData;
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
bFind89oa = TRUE;
}
}
if (m_strRecvData == "890B")
{
m_strCmd += m_strRecvData;
m_strCmd += "\r\n";
m_strRecvData.Empty();
}
UpdateData(FALSE); //将接收到的字符显示在接收编辑框中
CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_RECV_DATA);
pEdit->LineScroll(pEdit->GetLineCount());
}
void CFakeTolcanView::OnNetWorkConfig()
{
// TODO: Add your command handler code here
CServerDlg dlg;
if (IDOK == dlg.DoModal())
{
m_iPort = dlg.m_iPort;
SaveParamInfo();
if(!CreateAndListen(m_iPort))
{
MessageBox("启动服务出错!");
return;
}
}
}
long CFakeTolcanView::OnSocket(WPARAM wParam, LPARAM lParam)
{
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR);
// 取得有事件发生的套节字句柄
SOCKET s = wParam;
// 查看是否出错
if(WSAGETSELECTERROR(lParam))
{
RemoveClient(s);
closesocket(s);
return 0;
}
// 处理发生的事件
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT: // 监听中的套接字检测到有连接进入
{
if(m_nClient < MAX_SOCKET)
{
// 接受连接请求,新的套节字client是新连接的套节字
// SOCKET client = ::accept(s, NULL, NULL);
SOCKET client = accept(s, (SOCKADDR*)&addrFrom, &len);
// 设置新的套节字为窗口通知消息类型
int i = WSAAsyncSelect(client,
m_hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);
AddClient(client);
}
else
{
MessageBox("连接客户太多!");
}
}
break;
case FD_CLOSE: // 检测到套接字对应的连接被关闭。
{
RemoveClient(s);
BOOL bFind = FALSE;
int nCount = m_SockArray0.GetSize();
for (int i = 0; i < nCount; i++)
{
if (m_SockArray0.GetAt(i) == s)
{
m_SockArray0.RemoveAt(i);
bFind = TRUE;
break;
}
}
if (bFind)
{
nCount = m_SockArray0.GetSize();
if (nCount == 0)
{
m_bNW = FALSE;
if (m_bSP == FALSE)
{
KillTimer(1);
m_bCollectData = FALSE;
}
}
}
closesocket(s);
}
break;
case FD_READ: // 套接字接受到对方发送过来的数据包
{
/*
// 取得对方的IP地址和端口号(使用getpeername函数)
// Peer对方的地址信息
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
int nSockAddrLen = sizeof(sockAddr);
getpeername(s, (SOCKADDR*)&sockAddr, &nSockAddrLen);
// 转化为主机字节顺序
int nPeerPort = ntohs(sockAddr.sin_port);
// 转化为字符串IP
CString sPeerIP = inet_ntoa(sockAddr.sin_addr);
// 取得对方的主机名称
// 取得网络字节顺序的IP值
DWORD dwIP = inet_addr(sPeerIP);
// 获取主机名称,注意其中第一个参数的转化
hostent* pHost = ::gethostbyaddr((LPSTR)&dwIP, 4, AF_INET);
char szHostName[256];
strncpy(szHostName, pHost->h_name, 256);
*/
// 接受真正的网络数据
BYTE szText[1024] = { 0 };
int retval = recv(s, (char *)szText, 1023, 0);
if (retval > 0)
{
CString strData;
for (int i = 0; i < retval; i++)
{
strData.Format("%02X", szText[i]);
//m_strRecvData1 += strData;
m_strRecvData += strData;// 暂时用m_strRecvData
}
if (m_strRecvData == "8900")
{
CString str;
str.Format("%ul", s);
m_SockArray0.Add(str);
}
if (m_strRecvData == "8901")
{
CString str;
str.Format("%ul", s);
BOOL bFind = FALSE;
int nCount = m_SockArray0.GetSize();
for (int i = 0; i < nCount; i++)
{
if (m_SockArray0.GetAt(i) == s)
{
m_SockArray0.RemoveAt(i);
bFind = TRUE;
break;
}
}
if (bFind)
{
nCount = m_SockArray0.GetSize();
if (nCount == 0)
{
m_bNW = FALSE;
if (m_bSP == FALSE)
{
KillTimer(1);
m_bCollectData = FALSE;
}
}
}
}
if (m_strRecvData == "8907")
{
CString str;
str.Format("%ul", s);
m_SockArray7.Add(str);
}
if (m_strRecvData == "8909")
{
CString str;
str.Format("%ul", s);
m_SockArray9.Add(str);
}
PumpData(1);
}
}
break;
}
return 0;
}
BOOL CFakeTolcanView::CreateAndListen(int nPort)
{
if(m_socket == INVALID_SOCKET)
::closesocket(m_socket);
// 创建套节字
m_socket = ::socket(AF_INET, SOCK_STREAM, 0);
if(m_socket == INVALID_SOCKET)
return FALSE;
// 填写要关联的本地地址
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(nPort);
sin.sin_addr.s_addr = INADDR_ANY;
// 绑定端口
if(::bind(m_socket, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
return FALSE;
}
// 设置socket为窗口通知消息类型
::WSAAsyncSelect(m_socket, m_hWnd, WM_SOCKET, FD_ACCEPT|FD_CLOSE);
// 进入监听模式
::listen(m_socket, 5);
return TRUE;
}
BOOL CFakeTolcanView::AddClient(SOCKET s)
{
if(m_nClient < MAX_SOCKET)
{
// 添加新的成员
m_arClient[m_nClient++] = s;
return TRUE;
}
return FALSE;
}
void CFakeTolcanView::RemoveClient(SOCKET s)
{
BOOL bFind = FALSE;
for(int i=0; i<m_nClient; i++)
{
if(m_arClient[i] == s)
{
bFind = TRUE;
break;
}
}
// 如果找到就将此成员从列表中移除
if(bFind)
{
m_nClient--;
// 将此成员后面的成员都向前移动一个单位
for(int j=i; j<m_nClient; j++)
{
m_arClient[j] = m_arClient[j+1];
}
}
}
void CFakeTolcanView::CloseAllSocket()
{
/* if (m_bNW)
{
m_bNW = FALSE;
if (m_bSP == FALSE)
{
KillTimer(1);
}
}
*/
// 关闭监听套节字
if(m_socket != INVALID_SOCKET)
{
::closesocket(m_socket);
m_socket = INVALID_SOCKET;
}
// 关闭所有客户的连接
for(int i=0; i<m_nClient; i++)
{
::closesocket(m_arClient[i]);
}
m_nClient = 0;
}
void CFakeTolcanView::OnBtnStartService()
{
// TODO: Add your control notification handler code here
if(m_socket == INVALID_SOCKET) // 开启服务
{
// 取得端口号
if(m_iPort < 1 || m_iPort > 65535)
{
MessageBox("端口号错误!");
return;
}
// 创建监听套节字,使它进入监听状态
if(!CreateAndListen(m_iPort))
{
MessageBox("启动服务出错!");
return;
}
// 设置相关子窗口控件状态
GetDlgItem(IDC_BTN_START_SERVICE)->SetWindowText("停止服务");
// m_bar.SetText(" 正在监听……", 0, 0);
// GetDlgItem(IDC_PORT)->EnableWindow(FALSE);
}
else // 停止服务
{
// 关闭所有连接
CloseAllSocket();
// 设置相关子窗口控件状态
GetDlgItem(IDC_BTN_START_SERVICE)->SetWindowText("启动服务");
// m_bar.SetText(" 空闲", 0, 0);
// GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
if (m_bNW)
{
/* KillTimer(1);
if (m_bSP)
{
SetTimer(1, m_PackInterval, NULL);
}*/
m_bNW = FALSE;
if (m_bSP == FALSE)
{
KillTimer(1);
}
}
}
}
void CFakeTolcanView::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
HD_NOTIFY *phdn = (HD_NOTIFY *)pNMHDR;
int iItem = phdn->iItem;
if (iItem >= 0)
{
m_iItem = iItem;
}
*pResult = 0;
}
LRESULT CFakeTolcanView::OnEndItemEdit(WPARAM wParam, LPARAM lParam)
{
ItemInfo *myItem = (ItemInfo *)lParam;
int row = myItem->row;
int col = myItem->col;
CString sLabel = myItem->strText;
delete myItem;
return true;
}
void CFakeTolcanView::SetWinchCurrentData()
{
POSITION pos;
CString strKey;
CNodeData *pNodeData;
pos = m_NodeDatas.GetStartPosition();
while(NULL != pos)
{
m_NodeDatas.GetNextAssoc(pos, strKey, pNodeData);
if (pNodeData)
{
if (pNodeData->m_strNodeType == "深度节点")
{
pNodeData->m_iCurrentValue = pNodeData->m_iFirstValue;
pNodeData->m_iCurrentStep = pNodeData->m_iStep;
}
}
}
}
BOOL CFakeTolcanView::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
m_NodeList.DeleteAllToolTips();
m_NodeList.DeleteAllItems();
return CFormView::DestroyWindow();
}
void CFakeTolcanView::OnBtnModifyNode()
{
// TODO: Add your control notification handler code here
if (m_iItem == -1)
{
MessageBox("请先选择一个节点", "温馨提示", MB_ICONASTERISK | MB_ICONINFORMATION);
return;
}
ModifyNode();
}
void CFakeTolcanView::OnBtnDeleteNode()
{
// TODO: Add your control notification handler code here
if (m_iItem == -1)
{
MessageBox("请先选择一个节点", "温馨提示", MB_ICONASTERISK | MB_ICONINFORMATION);
return;
}
OnDeleteNode();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -