📄 opam300cdlg.cpp
字号:
return;
}
//取CE机剩余物理内存
long COpAm300cDlg::GetphyMemory()
{
long avaiphys;
MEMORYSTATUS MemStat;
MemStat.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&MemStat);
avaiphys=MemStat.dwAvailPhys;
//delete lpBuffer;
return avaiphys;
}
/*开启SOCKET SERVER 服务,监听3815端口*/
/************************************************
说明:以下的是开启TCPSERVER,并监听相关的通信情况
由于现只是放在了BUTTON的事件里,故需要改一下,
在点击这个BUTTON时,重新开启一个线程去执行它,
而不是放在此处,另需加一个配置文件或其它方式
用于存储自动开关的值。此处是10月15日加的,为
AutoReset,值为1自动重启,为0不进行自动重启,
在接收到时处理变量后并写到相关的配置处,及
ResetTime,详细见函数体内
**************************************************/
UINT COpAm300cDlg::StartSockSvr(LPVOID pParam)
{
COpAm300cDlg *pDlg=(COpAm300cDlg *)pParam;
SOCKET hSocket,ClientSocket;
hSocket=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP );
//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
if (hSocket == INVALID_SOCKET)
{
TRACE0("无法创建服务器!");
WSACleanup();
return 1;
}
SOCKADDR_IN SocketAddr;
SocketAddr.sin_family = AF_INET;
SocketAddr.sin_port = htons(3815);
SocketAddr.sin_addr.s_addr = INADDR_ANY;
if (bind(hSocket, (LPSOCKADDR)&SocketAddr,
sizeof(SocketAddr)) == SOCKET_ERROR) //与选定的端口绑定
{
TRACE0("无法绑定服务器!");
WSACleanup();
return 1;
}
if (listen(hSocket, 5/*QUEUE_SIZE*/) == SOCKET_ERROR) //开始监听客户连接请求
{
TRACE0("服务器监听失败!");
WSACleanup();
return 1;
}
while(1)
{
BOOL bConnect = FALSE;
BOOL bFileOpen = FALSE;
int nBuf=0;
// SOCKET ClientSocket;
int nLength;
SOCKADDR_IN sockAddr;
memset( &sockAddr, 0, sizeof( sockAddr ) );
ClientSocket = accept(hSocket, (LPSOCKADDR)&sockAddr, (LPINT)&nLength);
send(ClientSocket,"连接成功\r\n",strlen("连接成功\r\n"),0);
//pDlg->UpdateEdit(inet_ntoa(sockAddr.sin_addr));
if (ClientSocket == INVALID_SOCKET)
{
TRACE0("Server socket failed to accept connection.");
WSACleanup();
return 1;
}
int len;
char szBuf[2048];
bConnect = TRUE;
while(bConnect)
{
len = recv(ClientSocket,&szBuf[0],2048,0);
//pDlg->UpdateEdit(&szBuf[0]);
CFile File;
if(len == SOCKET_ERROR || len == 0)
{
TRACE0("接收出错!");
closesocket(ClientSocket);
bConnect = FALSE;
break;
}
szBuf[len]=0;
if(strstr(&szBuf[0],"DeleteFile;\r\n")!=NULL)
{
//在这里通过STRSTR来检索子串,如果是DELETEFILE则执行删除操作
/*对于有错误的配置文件的操作(DELETE),当监听到DELETEFILE命令*/
try
{
pDlg->CloseAm300c();
Sleep(200);
DeleteFile(L"硬盘\\AM300C\\am300c.ini");
// DeleteFile(L"硬盘\\AM300C\\status.ini");
// DeleteFile(L"硬盘\\AM300C\\startinfo.ini");
// DeleteFile(L"硬盘\\AM300C\\tempstatus.ini");
send(ClientSocket,"配置文件及状态文件已删除\r\n",strlen("配置文件及状态文件已删除\r\n"),0);
pDlg->StartupAm300c();
}
catch(...)
{
send(ClientSocket,"删除配置文件及状态文件出错\r\n",strlen("删除配置文件及状态文件出错\r\n"),0);
}
}
else if (strstr(&szBuf[0],"CaptureScreen;\r\n")!=NULL)//捕捉下位机屏幕信息
{
LPCTSTR filename = L"硬盘\\AM300C\\CopyScreen.bmp";
DeleteFile(filename);
HBITMAP hBitmap = pDlg->CopyScreenToBitmap();
LPSTR lpstr = pDlg->GettingBits(hBitmap);
BOOL SaveScreen = pDlg->SaveDIBToFile(lpstr, filename);
CloseHandle(hBitmap);
DeleteObject(hBitmap);
if (lpstr != NULL)
{
LocalFree((HLOCAL)lpstr);
lpstr = NULL;
}
if (SaveScreen)
{
CFile bmpFile(filename, CFile::typeBinary | CFile::modeRead);
char *bmpBuf;
long fileLen = bmpFile.GetLength();
bmpBuf = new char[fileLen];
bmpFile.Read(bmpBuf,fileLen);
char restr[20];
sprintf(restr,"BmpLength:%d\r\n",fileLen);
send(ClientSocket, restr, strlen(restr), 0);
send(ClientSocket, bmpBuf, fileLen, 0);
bmpFile.Close();
delete[] bmpBuf;
}
else
{
send(ClientSocket,"取得下位机屏幕信息失败\r\n",strlen("取得下位机屏幕信息失败\r\n"),0);
}
}
else if (strstr(&szBuf[0],"GetLog:")!=NULL) //取日志---对应日期的日志文件
{
CString s_FileDate = szBuf;
//wcscpy(LPCTSTR(s_FileDate), &szBuf[0]);
s_FileDate.Delete(0,7);
s_FileDate.TrimRight();
LPCTSTR filename = L"硬盘\\AM300C\\" + s_FileDate;
//::MessageBox(NULL,filename,L"info",0);
try
{
CFile logFile;
if (logFile.Open(filename, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate | CFile::shareDenyNone) != NULL)
{
char *logBuf;
long fileLen = logFile.GetLength();
logBuf = new char[fileLen];
logFile.Read(logBuf,fileLen);
char restr[20];
sprintf(restr,"LogLength:%d\r\n",fileLen);
send(ClientSocket, restr, strlen(restr), 0);
send(ClientSocket, logBuf, fileLen, 0);
logFile.Close();
delete[] logBuf;
}
else
{
send(ClientSocket,"当前日志不存在\r\n",strlen("当前日志不存在\r\n"),0);
}
}
catch(...)
{
send(ClientSocket,"取日志操作失败\r\n",strlen("取日志操作失败\r\n"),0);
}
}
else if(strstr(&szBuf[0],"RenameFile;\r\n")!=NULL)
{
//重命名文件
//CopyFile(
//CFile::Rename(
}
else if(strstr(&szBuf[0],"SoftReset;")!=NULL)
{
//在这里进行软件的重启动作,先利用消息WM_CLOSE关闭程序
//再利用进程控制关闭得到的AM300C的进程,是为了防止因为异常
//AM300C没关彻底
try
{
pDlg->CloseAm300c();
pDlg->StartupAm300c();
send(ClientSocket,"软件已刷新\r\n",strlen("软件已刷新\r\n"),0);
}
catch(...)
{
send(ClientSocket,"软件刷新出错\r\n",strlen("软件刷新出错\r\n"),0);
}
}
else if(strcmp(&szBuf[0],"MachineReset;\r\n")==0)
{
//在这里进行机器的重启
//首先还是要先发WM_CLOSE消息给AM300C
//然后利用软等待等100MS
//然后再对机器进行重启
try
{
pDlg->CloseAm300c();
//***************关闭音乐通道***************
pDlg->CommPortOpen();
pDlg->Mute(L"aa 05 10 00");
pDlg->Mute(L"aa 06 10 00");
Sleep(1000); //等待1秒
//******************************************
send(ClientSocket,"机器正在刷新,稍后请重新连接\r\n",strlen("机器正在刷新,稍后请重新连接\r\n"),0);
pDlg->PowerOff(); //挂起
Sleep(2000); //等待2秒
pDlg->RebootCE(); //Reset
}
catch(...)
{
send(ClientSocket,"机器刷新失败\r\n",strlen("机器刷新失败\r\n"),0);
}
}
else if(strcmp(&szBuf[0],"GetStatus;\r\n")==0)
{
//在这里利用FINDWINDOW得到当前AM300C是否在运行
HWND hwnd=::FindWindow(NULL,L"CEAm300");
if (hwnd==NULL)
{
send(ClientSocket,"软件未运行或运行有错\r\n",strlen("软件未运行或运行有错\r\n"),0);
}
else
send(ClientSocket,"软件正在运行\r\n",strlen("软件正在运行\r\n"),0);
}
else if (strcmp(&szBuf[0],"GetPhys;\r\n")==0)
{
//在这里读取下位机的可用物理内存
char restr[20];
sprintf(restr,"%d\r\n",pDlg->GetphyMemory());
send(ClientSocket,restr,strlen(restr),0);
try
{
free(restr);
}
catch(...)
{
;
}
}
else if (strstr(&szBuf[0],"COM:")!=NULL)
{
//在这里播放音乐
char restr[100];
int i=0;
int j=0;
for (i=4;i<strlen(szBuf);i++)
{
if ((szBuf[i]!='\r')&&(szBuf[i]!='\n') && (szBuf[i]!=';'))
{
restr[j]=szBuf[i];
j++;
}
}
restr[j]=0;
//那么restr就是音乐路径及名称;
try
{
pDlg->SendToCom(restr);
send(ClientSocket,restr,strlen(restr),0);
}
catch(...)
{
;
}
//sprintf(restr,"%d\r\n",pDlg->GetphyMemory());
//send(ClientSocket,restr,strlen(restr),0);
}
else if (strstr(&szBuf[0],"musicplay:")!=NULL)
{
//在这里播放音乐
char restr[200];
int i=0;
int j=0;
for (i=10;i<strlen(szBuf);i++)
{
if ((szBuf[i]!='\r')&&(szBuf[i]!='\n') && (szBuf[i]!=';'))
{
restr[j]=szBuf[i];
j++;
}
}
restr[j]=0;
//那么restr就是音乐路径及名称;
charToWCh(pDlg->musicname,restr);
try
{
if (pDlg->Played)
{
pDlg->closemusic();
pDlg->Played=false;
}
}
catch(...)
{
;
}
try
{
/*在线程中单独调用DSHOW测试*/
IGraphBuilder *pGraph3;
IMediaControl *pMediaControl3;
wchar_t *musicname2;
musicname2=pDlg->musicname;
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraph3);
pGraph3->QueryInterface(IID_IMediaControl, (void **)&pMediaControl3);
/* 连接播放指定文件所需的filter */
//pGraph->RenderFile(strMusicName, NULL);
/* 开始播放指定的文件 */
int sl=wcslen(musicname2);
musicname2[sl]=0;
pGraph3->RenderFile(musicname2,NULL);
//pMediaControl3->RenderFile(musicname2);//strMusicName
pMediaControl3->Run();
/*pDlg->playmusic();*/
pDlg->Played=true;
// if state==true
send(ClientSocket,restr,strlen(restr),0);
// else
// send(ClientSocket,"播放不成功\r\n",strlen("播放不成功\r\n"),0);
}
catch(...)
{
send(ClientSocket,"播放不成功\r\n",strlen("播放不成功\r\n"),0);
}
//sprintf(restr,"%d\r\n",pDlg->GetphyMemory());
//send(ClientSocket,restr,strlen(restr),0);
}
else if (strstr(&szBuf[0],"musicstop;")!=NULL)
{
//在这里停止播放音乐
try
{
pDlg->stopmusic();
//if state==true
send(ClientSocket,"停止播放\r\n",strlen("停止播放\r\n"),0);
//else
// send(ClientSocket,"停止播放出错\r\n",strlen("停止播放出错\r\n"),0);
}
catch(...)
{
send(ClientSocket,"停止播放出错\r\n",strlen("停止播放出错\r\n"),0);
}
}
else if(strstr(&szBuf[0],"ModIPAddresss:")!=NULL)
{
//修改当前的WINCE主机IP地址为设定值
int i=0;
int j=0;
char restr[40];
for(i=14;i<strlen(szBuf);i++)
{
if((szBuf[i]!='\r')&&(szBuf[i]!='\n') && (szBuf[i]!=';'))
{
restr[j]=szBuf[i];
j++;
}
}
restr[j]=0;
try
{
if(pDlg->ModifyIP(restr))
{
send(ClientSocket,"IP地址已更新\r\n",strlen("IP地址已更新\r\n"),0);
}
else
{
send(ClientSocket,"IP地址未更新\r\n",strlen("IP地址未更新\r\n"),0);
}
}
catch(...)
{
;
}
try
{
free(restr);
}
catch(...)
{
;
}
}
else if(strstr(&szBuf[0],"ModWinceName:")!=NULL)
{
//修改当前的WINCE主机名称为设定值
int i=0;
int j=0;
char restr[50];
for(i=13;i<strlen(szBuf);i++)
{
if((szBuf[i]!='\r')&&(szBuf[i]!='\n') && (szBuf[i]!=';'))
{
restr[j]=szBuf[i];
j++;
}
}
restr[j]=0;
if(pDlg->ModifyName(restr))
{
send(ClientSocket,"更新机器名成功\r\n",strlen("更新机器名成功\r\n"),0);
}
else
{
send(ClientSocket,"更新机器名失败\r\n",strlen("更新机器名失败\r\n"),0);
}
try
{
free(restr);
}
catch(...)
{
;
}
}
else if (strstr(&szBuf[0],"SendAm300c:")!=NULL)
{
int i,j;
char rN[8];
i=0;
j=0;
//解析出文件流的长度
//for (i=11; i<11+8+2; i++)
pDlg->CloseAm300c();
for (i=11; i<11+8; i++)
{
rN[j]=szBuf[i];
j++;
}
rN[j]=0;
//纪录文件流的长度
TCHAR mychar[10];
memset(mychar,0,9);
charToWCh(&mychar[0],&rN[0]);
nBuf = atoi(mychar);//文件长度
LPCTSTR filename=L"硬盘\\am300c\\amce300.exe";//文件名
DeleteFile(filename);//要接收新的更新程序,必须先要删了原先的文件
CFile file(filename,CFile::modeCreate | CFile::modeWrite);//创建新文件
char buffer[1024]={0};//接收缓冲区
if (len > i )
{
// 读接收文件时有文件数据过来
for (j=i+1;j<=len ;j++)
buffer[j-i-1]=szBuf[j];
if (nBuf>(len-i))
{
file.Write(buffer,len-i);//把多余的写入文件
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -