永发信息网

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

答案:2  悬赏:70  手机版
解决时间 2021-01-02 17:07
远程监控的原理和实现如何用c语言实现
最佳答案
以人工气候室远程监控系统为例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控件画出温度曲线
完成后通过远程登录看到的运行界面
全部回答

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

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控件画出温度曲线 完成后通过远程登录看到的运行界面

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
战斗机飞行中关于安全包线和柯西不等式定律的
为什么突然感觉全身没有力气
叶酸片一定要吃吗
哪个快递公司待遇好
开标时间是什么意思?
贾乃亮2014年演得一个综艺节目叫什么?被整的
奖赏不冤仇的反义词
艺术培训学校起名
炸油条用什么油比较好
目前全世界的天文观测者每年大约会新发现多少
我的同学快生日了,给她一首诗的祝福。他的名
驾驶证计分周期是怎么计算的?
时辰吉凶什么意思
美国的国际区号是多少
魔域新区法师冲多少钱能打9星副本
推荐资讯
纯WS喂龙蛋,纯WS喂龙蛋喂什么龙好 严厉和溺
从广州往四川发东西几天能到是中通快递
第五掌骨骨折后腕关节僵硬怎么办?
安装网络电视多少钱
又不会挣钱脾气又大的老公怎么对待
梦到钓鱼
图上有多少正方形
慢日语怎么说
手机降温的最快方法
像这样的价格表怎么制作 用什么软件 5分
蒙古语二蛋的意思是什么?是不是宝贝的意思?
零下用英语怎么说
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?