永发信息网

远程监控的原理和实现如何用c语言实现

答案:2  悬赏:70  手机版
解决时间 2021-01-02 17:07
  • 提问者网友:寂寞梧桐
  • 2021-01-01 21:35
远程监控的原理和实现如何用c语言实现
最佳答案
  • 五星知识达人网友:迟山
  • 2021-01-01 21:42
以人工气候室远程监控系统为例2.1通信接口-----套接字的创建本文所要实现的是对一个小型人工气候室的远程监控,在异地或同一个局域网范围内,可以不必亲临现场就可以观测到人工气候室当前的温度状况和运行中的温度曲线,由于在远端只是需要查询和观察,因此只要处理好现场监控计算机和远端客户机之间的通信和数据传输就可以了。这样不用占用现场计算机的CPU处理时间,从而能节省资源以便做更多的处理现场的工作。和远端服务器的连接可以分为以下几个过程:(1) 服务进程总是先于客户进程启动,服务进程首先创造套接字。(2) 将本地地址绑定到所创建的套接字上以使在网络上标识该套接字。 (3) 将套接字置于监听模式并准备接受连接请求。(4) 客户端创建套接字,调用SOCKET函数,方法同上。(5) 客户向服务器提出连接请求。(6) 当请求到来时,被阻塞服务进程的accept()函数如(3)中所述生成一个新的套接字与客户端建立连接,并向客户端返回接收信号。(7) 一旦客户机的套接字收到来自服务器的接收信号,则表示客户机与服务器的连接已就绪,则可以进行数据传输了。(8) 关闭套接字。一旦任务完成,就必须关掉连接已释放套接字占用的资源。创建连接的服务器端和客户端代码简述如下:服务器端:void CServerView::OnStart ()
{ Started=TRUE;
m_Start.EnableWindow(!Started);
try
{ g_sListen.Create(6802,SOCK_DGRAM,NULL);
g_sListen.Bind(6802,m_IP);//,6802为端口号,m_IP为服务器端IP地址
g_sListen.Listen();
((CServerDoc*)GetDocument())->g_pchatListen=new CChatLsnSock(
(CAnyServerDoc*)GetDocument());
CChatLsnSock* g_pchatListen=((CAnyServerDoc*)GetDocument())->g_pchatListen;
g_pchatListen->Create(9999,SOCK_STREAM);//侦听聊天室连接套接字创建
g_pchatListen->Listen();
GetDlgItem(IDC_RESPONSE)->SetWindowText("开始对客户端服务!");
}
服务端开启后的运行界面如图1所示。
客户端:
void CClientView::OnClientStart()
{m_sockRecv.Create(6801,SOCK_DGRAM,m_ClientIP);//6801为端口号,m_ClientIP为客户端IP<br>m_sockRecv.Bind(6801,m_ClientIP);<br>m_timer1=SetTimer(1,1000,NULL);<br>m_timer2=SetTimer(2,250,NULL);<br>GetLocalTime(&SysTime);<br>m_StartTime=SysTime;<br>m_WavePlay.SetStartTime(SysTime.wYear,SysTime.wMonth,SysTime.wDay,SysTime.wHour,SysTime.wMinute,SysTime.wSecond);//画出曲线初始时间<br>this->m_CurrentSysTime.SetFocus();<br>}
2.2网络中的数据传输与监控实现基于网络的远程控制和测量应用中,一般数据传输采用二进制格式是主丛式,在人工气候室的远程监控系统中,通信双方需要传输的数据流量少,下位机一般是微控制器等嵌入式系统,数据处理能力较慢,通信双方也不必保持紧密联系,因此大多采用UDP协议,基于点对点的方式,双方通信的数据可靠性可以通过定义数据表示格式来保证。另外采用把通过网络传输过来的数据在客户端用曲线的形式重画显示,用了一个本人自做的一个ActiveX控件来显示接收的数据,在数据传输过程中存在的滞后时间很短,可以忽略不计。在设备运行时,服务器端的状态一直保持开启,测温元件把测量到的温度值传入到控制微机,同时通过网络传到远程客户端,远程连接通过输入服务器端的IP地址,输入指定的用户名和密码,就可以连接上,从而就实现了远程监控。建立连接后客户端就可以接收发送过来的温度值且用曲线形式显示出来:void CClientView::OnDataReceive()
{
extern CListBox* pmyListBox;
char szTempRecv[20];
CString szIP(m_IP);//得到服务器端的IP
UINT uPort=6802;//指出端口
int iTempRecv=m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0);
szRecv[iRecv]='\0';
m_szRecv=szTempRecv;
m_listBox.AddString((LPCTSTR)m_szRecv);
int nCount=m_listBox.GetCount();
if (nCount > 0)
m_listBox.SetCurSel(nCount-1);
GetLocalTime(&SystemTime);
m_NowTime=SystemTime;
CString strSysTime;
strSysTime.Format(_T("%d-%d-%d %d:%d:%d"),SystemTime.wYear,SystemTime.wMonth,SystemTime.wDay,SystemTime.wHour,SystemTime.wMinute,SystemTime.wSecond);
UpdateData(FALSE);
CurABSTime=(m_NowTime-m_StartTime).GetTotalSeconds();
m_WavePlay.SetPoint2(CurABSTime,atoi(m_szRecv));//用自做ActiveX控件画出温度曲线
完成后通过远程登录看到的运行界面
全部回答
  • 1楼网友:慢性怪人
  • 2021-01-01 22:43

以人工气候室远程监控系统为例

2.1通信接口-----套接字的创建

本文所要实现的是对一个小型人工气候室的远程监控,在异地或同一个局域网范围内,可以不必亲临现场就可以观测到人工气候室当前的温度状况和运行中的温度曲线,由于在远端只是需要查询和观察,因此只要处理好现场监控计算机和远端客户机之间的通信和数据传输就可以了。这样不用占用现场计算机的cpu处理时间,从而能节省资源以便做更多的处理现场的工作。

和远端服务器的连接可以分为以下几个过程:

(1) 服务进程总是先于客户进程启动,服务进程首先创造套接字。

(2) 将本地地址绑定到所创建的套接字上以使在网络上标识该套接字。

(3) 将套接字置于监听模式并准备接受连接请求。

(4) 客户端创建套接字,调用socket函数,方法同上。

(5) 客户向服务器提出连接请求。

(6) 当请求到来时,被阻塞服务进程的accept()函数如(3)中所述生成一个新的套接字与客户端建立连接,并向客户端返回接收信号。

(7) 一旦客户机的套接字收到来自服务器的接收信号,则表示客户机与服务器的连接已就绪,则可以进行数据传输了。

(8) 关闭套接字。一旦任务完成,就必须关掉连接已释放套接字占用的资源。

创建连接的服务器端和客户端代码简述如下:

服务器端:

void cserverview::onstart () { started=true; m_start.enablewindow(!started); try { g_slisten.create(6802,sock_dgram,null); g_slisten.bind(6802,m_ip);//,6802为端口号,m_ip为服务器端ip地址 g_slisten.listen(); ((cserverdoc*)getdocument())->g_pchatlisten=new cchatlsnsock( (canyserverdoc*)getdocument()); cchatlsnsock* g_pchatlisten=((canyserverdoc*)getdocument())->g_pchatlisten; g_pchatlisten->create(9999,sock_stream);//侦听聊天室连接套接字创建 g_pchatlisten->listen(); getdlgitem(idc_response)->setwindowtext("开始对客户端服务!"); } 服务端开启后的运行界面如图1所示。 客户端: void cclientview::onclientstart() {m_sockrecv.create(6801,sock_dgram,m_clientip);//6801为端口号,m_clientip为客户端ip m_sockrecv.bind(6801,m_clientip); m_timer1=settimer(1,1000,null); m_timer2=settimer(2,250,null); getlocaltime(&systime); m_starttime=systime; m_waveplay.setstarttime(systime.wyear,systime.wmonth,systime.wday,systime.whour,systime.wminute,systime.wsecond);//画出曲线初始时间 this->m_currentsystime.setfocus(); }

2.2网络中的数据传输与监控实现

基于网络的远程控制和测量应用中,一般数据传输采用二进制格式是主丛式,在人工气候室的远程监控系统中,通信双方需要传输的数据流量少,下位机一般是微控制器等嵌入式系统,数据处理能力较慢,通信双方也不必保持紧密联系,因此大多采用udp协议,基于点对点的方式,双方通信的数据可靠性可以通过定义数据表示格式来保证。另外采用把通过网络传输过来的数据在客户端用曲线的形式重画显示,用了一个本人自做的一个activex控件来显示接收的数据,在数据传输过程中存在的滞后时间很短,可以忽略不计。

在设备运行时,服务器端的状态一直保持开启,测温元件把测量到的温度值传入到控制微机,同时通过网络传到远程客户端,远程连接通过输入服务器端的ip地址,输入指定的用户名和密码,就可以连接上,从而就实现了远程监控。

建立连接后客户端就可以接收发送过来的温度值且用曲线形式显示出来:

void cclientview::ondatareceive() { extern clistbox* pmylistbox; char sztemprecv[20]; cstring szip(m_ip);//得到服务器端的ip uint uport=6802;//指出端口 int itemprecv=m_sockrecv.receivefrom(szrecv,10,szip,uport,0); szrecv[irecv]='\0'; m_szrecv=sztemprecv; m_listbox.addstring((lpctstr)m_szrecv); int ncount=m_listbox.getcount(); if (ncount > 0) m_listbox.setcursel(ncount-1); getlocaltime(&systemtime); m_nowtime=systemtime; cstring strsystime; strsystime.format(_t("%d-%d-%d %d:%d:%d"),systemtime.wyear,systemtime.wmonth,systemtime.wday,systemtime.whour,systemtime.wminute,systemtime.wsecond); updatedata(false); curabstime=(m_nowtime-m_starttime).gettotalseconds(); m_waveplay.setpoint2(curabstime,atoi(m_szrecv));//用自做activex控件画出温度曲线 完成后通过远程登录看到的运行界面

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯