`

触摸屏应用相关技术之四——终端监控

    博客分类:
  • VC++
阅读更多

触摸屏应用相关技术之四——终端监控
终端监控集成了http服务作为其重要部分,因此能够通过http交互接受并处理指令,或者返回终端的适时状态。考虑到系统的安全性,http协议交互采用了md5验证和ip验证,并附带时间戳。
经过比较选择,本文采用了以下链接作为httpServer原型
http://www.codeproject.com/KB/IP/mhttpsrv.aspx
它具备以下特征:多线程、能够处理标准的http GET请求,实现了统一的日志类。
Md5实现采用了
http://www.koders.com/c/fid736BC59EAF6EB77661FB371C054D6B464644266B.aspx?s=suck
    控制
通过http通道,可以向终端发送控制命令,包括:更新参数设置(默认首页、长时间无人点击自动切回首页时间等)、指定访问页面等。
1.Wake On Lan
由于触摸屏特殊性,远程开机是终端控制必不可少的组成部分。
如果触摸屏主机的网卡、主板、电源均支持WOL,而且已知该网卡的mac地址,则可以通过网络向发送包含该mac地址信息的wol packet,实现远程开机。
采用此机制的VC实现请参考:
http://www.codeproject.com/KB/IP/WOL.aspx?fid=211282&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2155379&fr=26
而java实现的关键代码如下:
    public static void wake(String ipStr,String macStr) throws IOException{
        byte[] macBytes = getMacBytes(macStr);
        byte[] bytes = new byte[6 + 16 * macBytes.length];
        for (int i = 0; i < 6; i++) {
            bytes[i] = (byte) 0xff;
        }
        for (int i = 6; i < bytes.length; i += macBytes.length) {
            System.arraycopy(macBytes, 0, bytes, i, macBytes.length);
        }
        String destIP = "255.255.255.255";
        if(ipStr!=null)
            destIP = ipStr;
        InetAddress address = InetAddress.getByName(destIP);
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, PORT);
        DatagramSocket socket = new DatagramSocket(10000);
        socket.send(packet);
        socket.close();
       
        System.out.println("Wake-on-LAN packet sent.");
       
    }
2.程序关机
关键代码如下:
BOOL CJSCallApp::MySystemShutdown()
{
   HANDLE hToken;
   TOKEN_PRIVILEGES tkp;

   // Get a token for this process.

   if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
      return( FALSE );

   // Get the LUID for the shutdown privilege.

   LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
        &tkp.Privileges[0].Luid);

   tkp.PrivilegeCount = 1;  // one privilege to set   
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

   // Get the shutdown privilege for this process.

   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
        (PTOKEN_PRIVILEGES)NULL, 0);

   if (GetLastError() != ERROR_SUCCESS)
      return FALSE;

   // Shut down the system and force all applications to close.

   if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_POWEROFF, 0))
      return FALSE;
   return TRUE;
}

3.程序重启系统
BOOL CJSCallApp::MySystemReboot()
{
    HANDLE hToken;
   TOKEN_PRIVILEGES tkp;

   // Get a token for this process.

   if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
      return( FALSE );

   // Get the LUID for the shutdown privilege.

   LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
        &tkp.Privileges[0].Luid);

   tkp.PrivilegeCount = 1;  // one privilege to set   
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

   // Get the shutdown privilege for this process.

   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
        (PTOKEN_PRIVILEGES)NULL, 0);

   if (GetLastError() != ERROR_SUCCESS)
      return FALSE;

   // Shut down the system and force all applications to close.

   if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
      return FALSE;

   return TRUE;
}

4.禁止屏幕保护和省电模式
    //禁用屏保
     BOOL bScrActive;
     SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bScrActive, 0);
     if (bScrActive)
        SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
    //禁用电源保护
     m_nLowpowerTimeout = 0;
     m_nPoweroffTimeout = 0;
     SystemParametersInfo(SPI_GETLOWPOWERTIMEOUT, 0, &m_nLowpowerTimeout, 0);
     SystemParametersInfo(SPI_GETPOWEROFFTIMEOUT, 0, &m_nPoweroffTimeout, 0);
     SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, 0, NULL, 0);
     SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, 0, NULL, 0);
5.隐藏任务栏和桌面
    //隐藏任务栏,桌面
    ::ShowWindow(::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);
    ::ShowWindow(::FindWindow("ProgMan",NULL),SW_HIDE); 

6.添加IE信任站点
void CJSCallApp::setZoneMap(LPCTSTR sites)
{
    string ss = sites;
    string sp = ";";
    vector<string> v2 = tokenize(ss, sp ,false,"");
    CRegisterKey   key; 
    CString   str;
    DWORD dw;
    BOOL ret;

    CString dn = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Domains\\"); 
    CString kn = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges\\Range"); 
    int id = 0;
    for(int i=0; i<v2.size(); i++){
        string s = v2[i];
        //去掉http://
        int pos = s.find("://");
        if(pos!=-1)
            s =s.substr(pos+3);
        bool bIP = true;
        vector<string> v1 = tokenize(s, "." ,false,"");
        for(int j=0; j<v1.size(); j++){
            for (int k=0;k<v1[j].size(); k++ ){
                char cc = v1[j][k];
                if(cc>'9' || cc<'0')
                {
                    bIP = false;
                    break;
                }
            }
            if(!bIP)
                break;
        }
        dw=2;
        if(!bIP){
            for(int j=1; j<v1.size(); j++){
                if(j==1)
                    s=v1[j];
                else
                    s += "."+v1[j];
            }
            s+="\\"+v1[0];
            CString dns;
            dns.Format("%s%s",dn,s.c_str());
            key.Open(HKEY_CURRENT_USER,(LPCTSTR)dns);
            ret = key.Write("http",dw);
            key.Close();
        }else{
            CString kns;
            id++;
            kns.Format("%s%d",kn,id);
            key.Open(HKEY_CURRENT_USER,(LPCTSTR)kns); 
            ret = key.Write(":Range",s.c_str());
            ret = key.Write("http",dw);
            key.Close();
        }
    }
}

7.设置IE每次访问页面检查(内容的更新能立即反映到终端)
     CRegisterKey   key; 
     key.Open(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings");
     DWORD dw=0x3;
     key.Write("SyncMode5",dw);
     key.Close();


    监视
1.屏幕快照
调用API CreateCompatibleBitmap可以将打印屏幕到bitmap,但是采用bitmap格式,文件尺寸较大,不利于网络传输,在VC6.0下,我们可以请求于GdiPlus.lib,将bitmap格式转换为互联网广泛使用的jpeg格式。
关键代码如下:
       CBitmap* m_pBackBitmap;
        …
        //NEW资源(调用一次重新拷贝一次)
        if (m_pBackBitmap != NULL)
        {
                delete m_pBackBitmap;
                m_pBackBitmap = NULL;
        }
        m_pBackBitmap = new CBitmap();
        CDC ScrDC,MemDC;
        ScrDC.CreateDC("DISPLAY", NULL, NULL, NULL);
        MemDC.CreateCompatibleDC(&ScrDC);
        m_pBackBitmap->CreateCompatibleBitmap(&ScrDC,width,height);
        MemDC.SelectObject(m_pBackBitmap);
        //开始拷贝
        MemDC.BitBlt(xStartPt, yStartPt, width, height,&ScrDC,xToCopy,yToCopy,SRCCOPY);
        ScrDC.DeleteDC();
        MemDC.DeleteDC();

void CScreenSnap::snap(LPCTSTR fpath)//fpath保存路径
{
    int width = ::GetSystemMetrics(SM_CXSCREEN);
    int height = ::GetSystemMetrics(SM_CYSCREEN);
    this->CopyScreenToBitmap(0,0,width,height,0,0);
      //创建位图句柄

    HBITMAP   hBitmap;
    hBitmap=(HBITMAP)m_pBackBitmap->GetSafeHandle();

    //获取jpg or png编码

   CLSID encoderClsid;
   Bitmap bitmap(hBitmap,NULL);
  CString ImageFileName=fpath;
  if(ImageFileName.Find(".jpg")>0)
    GetEncoderClsid(L"image/jpeg",&encoderClsid);
  else
    GetEncoderClsid(L"image/png",&encoderClsid);
   //JPG编码
   EncoderParameters encoderPara;
   encoderPara.Count=1;
   encoderPara.Parameter[0].Guid=EncoderQuality;
   encoderPara.Parameter[0].Type=EncoderParameterValueTypeLong;
   encoderPara.Parameter[0].NumberOfValues=1;
   ULONG quality=50;
   encoderPara.Parameter[0].Value=&quality;
   //调用GDI+保存
   bitmap.Save(ImageFileName.AllocSysString(),&encoderClsid,&encoderPara);
}

2.本进程的内存占用情况

string CJSCallApp::getMyMemSta()
{
    HANDLE hp = GetCurrentProcess();
    PROCESS_MEMORY_COUNTERS pmc;
    if (! GetProcessMemoryInfo(hp, &pmc, sizeof (pmc)))
        // 调用 api 失败,退出
        return "";
    CString str;
    str.Format("phy: %d M,virtual: %d M",
        (pmc.WorkingSetSize/1024)/1024,
        (pmc.PagefileUsage/1024)/1024);
    CloseHandle(hp);
    return str;
}

3.全局内存占用情况
string CJSCallApp::getGlobalMemStatus()
{
  MEMORYSTATUS   memStatus; 
  memStatus.dwLength   =   sizeof(MEMORYSTATUS); 
  
  GlobalMemoryStatus(&memStatus); 
  
  DWORD   total   =   (DWORD)memStatus.dwTotalPhys; 
  DWORD   avail   =   (DWORD)memStatus.dwAvailPhys; 
  DWORD   vir     =   (DWORD)memStatus.dwTotalVirtual; 
  DWORD   avail_vir = (DWORD)memStatus.dwAvailVirtual;
  
  //转化为MB 
  total   =   (total/1024)/1024; 
  avail   =   (avail/1024)/1024; 
  vir       =   (vir/1024)/1024; 
  avail_vir = (avail_vir/1024)/1024;

  CString   memsta; 
  memsta.Format("phy:%ld/%ld MB,virtual:%ld/%ld MB",
      avail,total,avail_vir,vir);  
  return memsta;
}

4.CPU使用情况
参见:http://topic.csdn.net/t/20060208/20/4546140.html

分享到:
评论

相关推荐

    电子电器架构——智能座舱设备终端.docx

    2. **中央信息娱乐屏幕**:中央信息娱乐屏幕是智能座舱的主要交互界面,用户可以通过触摸屏操作各种应用程序和服务。 3. **抬头显示器(HUD)**:HUD能够将关键信息投射到前挡风玻璃上,使得驾驶者可以在视线不离开...

    工控电脑(工控机)、VGA工控板、人机界面组态软件——单片机或PLC专业8至55寸触摸屏与显示器、电视机人机界面显示终端

    **VGA工控板**是一种专为工业应用设计的视频输出板卡,通常配备有VGA接口,用于连接显示器或触摸屏。这种板卡通常集成在工控机内,用于提供高质量的图像输出。VGA工控板的特点包括: - **高清晰度**:支持多种...

    基于STM 32的智能终端的设计与实现.pdf

    总结而言,本文所展示的基于STM32的智能终端设计,通过无线通信技术与有线技术的结合,实现了家居环境的智能监控和数据采集,并确保了系统稳定运行和用户友好的交互。这些技术的结合为智能家居系统的开发和应用提供...

    Android自动化压力测试图解教程——Monkey工具

    它的主要工作原理是向目标应用发送一系列伪随机的用户事件,如触摸屏幕、滑动、按键等,以模拟真实用户在不同场景下的操作。你可以通过指定参数来控制事件的数量、类型以及频率,例如: ```bash adb shell monkey -...

    行业分类-外包设计-智能快递自助服务终端的说明分析.rar

    硬件系统包括扫描装置、显示屏、输入设备(如触摸屏)、支付模块(如读卡器或二维码扫描仪)、储物柜以及必要的物理安全措施,如防盗门锁。软件系统则涵盖了用户界面、后台管理系统、接口协议、数据分析等功能,用于...

    海泰客软件

    【海泰客软件】——触摸屏技术的创新者与引领者 海泰客软件,作为一个在信息技术领域专注于触摸屏技术的公司,致力于为用户提供高效、便捷的交互式体验。其产品广泛应用于工业自动化、商业展示、自助服务终端等多个...

    电信设备-基于液晶触摸屏的移动存储设备数据单向导入装置.zip

    本专题聚焦于一种特别设计的电信设备——基于液晶触摸屏的移动存储设备数据单向导入装置。这种设备结合了先进的液晶触摸屏技术和安全的数据处理机制,为电信行业的数据交换提供了高效且安全的解决方案。 首先,我们...

    基于WINCC的工业炉群智能监控系统.pdf

    上位机使用工控机和触摸屏实现了现场监控,工控机除了负责本地的控制任务外,也支持通过远程PC进行监控和管理。在数据通信方面,系统主要通过RS232和以太网两种方式实现。 经过现场运行的检验,基于WINCC的工业炉群...

    电信设备-基于移动智能终端、W3C标准的散杂货码头生产系统.zip

    本文将深入探讨一个结合了现代通信技术与互联网标准的先进生产管理系统——基于移动智能终端、遵循W3C标准的散杂货码头生产系统。这个系统是电信设备领域的一次创新,旨在提升港口物流效率,降低运营成本,并实现...

    电气专业词汇-中国工控网-中国自动化企业信息化门户-中国.docx

    人机界面是用户与机器交互的接口,通常包括触摸屏、键盘、鼠标等输入设备和显示器等输出设备。HMI的设计需要考虑用户体验,使操作更加直观、简便。 #### 工控机——Industrial Personal Computer (IPC) 工控机是一...

    TQ2440 介绍——我代理的2440开发板

    TQ2440开发板广泛应用于车载设备、GIS平台、数据服务器、VoIP设备、网络终端、工业控制、检测设备、仪器仪表、智能终端、医疗器械和安全监控等领域,已被众多高科技公司、科研机构和教育培训机构采用,并远销海外...

    行业分类-设备装置-基于乱架图书管理机器人手持式辅助终端的图书管理方法.zip

    《基于乱架图书管理机器人手持式辅助终端的图书管理方法》这一资料主要聚焦于图书馆行业中的一项创新技术——乱架图书管理机器人与手持式辅助终端的结合应用。在现代图书馆服务中,图书的分类、上架、查找等工作量...

    行业-电子政务-水溶性导电组合物及改变及其应用的介绍分析.rar

    在电子政务的数字化服务方面,水溶性导电组合物可以作为新型的触控材料,用于开发防水、耐湿的触摸屏设备,提高户外或潮湿环境下的使用体验,比如在雨天或湿度较高的地区,公共信息亭和自助服务终端可以保持正常运行...

    基于Android平台和Wi-Fi的无线点菜系统设计.docx

    点菜终端服务模块提供开台、点菜和系统设置等功能,服务员可以通过触摸屏设备操作。开台模块允许服务员快速为顾客分配座位,点菜模块则提供了直观的菜单浏览和选择功能,支持按类别点菜或搜索菜品。点菜信息实时发送...

    基于嵌入式智能化家居系统设计.doc

    - **人机交互界面**:包括按键、触摸屏等,以便用户进行操作。 综上所述,基于嵌入式系统的智能化家居系统设计涉及多个方面的内容,从硬件设计到软件开发,再到系统集成,每一个环节都至关重要。随着技术的不断进步...

    电信设备-数据通信终端手动拨号及时长显示装置.zip

    手动拨号是指用户通过键盘或触摸屏输入电话号码来建立连接的过程。在数据通信终端中,手动拨号功能可能涉及到编码规则(如E.164国际电话号码格式)、错误检测和校正机制,以及连接建立的协议(如PPP,Point-to-Point...

    基于Android 的“绿色车间”监测系统的设计与实现.pdf

    Android平台以其内核Linux为基础,具备开放源代码的特点,拥有触摸屏高级图形界面显示功能,具有成本低、开放性好、交互性强、稳定性强等优势,非常适合移动设备的应用开发。 2. “绿色车间”概念:文件中提到的...

    信捷MODBUS例程

    信捷电子是一家专注于工业自动化产品研发和生产的公司,其产品如PLC、触摸屏等支持MODBUS通讯,便于与其他设备集成。 MODBUS通信的基本结构包括主设备(Master)和从设备(Slave)。主设备发起请求,从设备响应。...

    嵌入式5.6寸平板电脑简介

    - **触摸屏**: 配备了四线电阻式的触摸屏,具有较高的表面硬度(3H以上),并且单点寿命超过10百万次,保证了长时间使用的可靠性和耐用性。 **3. 接口与扩展性** - **接口**: 提供了丰富的外部接口,包括网口、USB...

    行业分类-设备装置-图书快速上架及寻书装置.zip

    3. 互动查询终端:图书馆内部设置互动查询终端,通过触摸屏界面,读者可以输入书名或作者,系统会即时反馈图书的存放位置。 三、集成管理系统 1. 图书馆信息管理系统(ILS):集成图书上架、寻书装置的数据,实现...

Global site tag (gtag.js) - Google Analytics