Beispiel #1
0
void MySQL_Write(int type)
{
    ostringstream MySQL_Command;
    switch(type)
    {
        case 1:  //Egg MPU data
        MySQL_Command<<"INSERT INTO `Egg_MPU`.`"<<Egg_UUID<<"` (`Time`, `Acc-x`, `Acc-y`, `Acc-z`, `Gyro-x`, `Gyro-y`, `Gyro-z`) VALUES (FROM_UNIXTIME('"<<Timestamp<<"'),"<<Egg_Acc_Data<<","<<Egg_Gyro_Data<<");";
        break;
        
        case 2:  //Egg TMP data
        MySQL_Command<<"INSERT INTO `Egg_TMP`.`"<<Egg_UUID<<"` (`Time`, `Temp-01`, `Temp-02`, `Temp-03`, `Temp-04`, `Temp-05`, `Temp-06`, `Temp-07`, `Temp-08`, `Temp-09`, `Temp-10`, `Temp-11`, `Temp-12`, `Temp-13`, `Temp-14`) VALUES (FROM_UNIXTIME('"<<Timestamp<<"'),"<<Temp_Data<<");";
        break;
        
        case 3:  //Egg HUM data
        MySQL_Command<<"INSERT INTO `Egg_HUM`.`"<<Egg_UUID<<"` (`Time`, `Humidity`) VALUES (FROM_UNIXTIME('"<<Timestamp<<"'),"<<Humi_Data<<");";
        break;
        
        case 4:
        MySQL_Command<<"INSERT INTO `Weather`.`EEF0` (`Time`, `Humidity`, `Light`, `Pressure`, `Temperature`) VALUES (FROM_UNIXTIME('"<<Timestamp<<"'),"<<Humi_Data<<","<<Weather_Light_Data<<","<<Weather_Pressure_Data<<","<<Temp_Data<<");";
        break;
        
        default:
        cout<<"Invalid SQL_Type."<<endl;
        break;
    }
    cout << MySQL_Command.str()<<endl;
    my.executeSQL(MySQL_Command.str());
}
int main(){
	//互斥锁初始化
	pthread_mutex_init(&mutexsql, NULL);
	//-----SQL更新线程--------
	pthread_t sqlupdatethread;
	pthread_create(&sqlupdatethread,NULL,sqlupdate_start,(void *)0);
	//-----打印当前时间-------
	GetTime();
	//-----mysql初始化--------
	int row=0;
	int col=0;	
    MySqlDB.initDB("localhost" , "root", "xiabo891219" , "r114" );//链接数据库
	char***r = MySqlDB.executeSQL("select * from people;",&row,&col);//打印所有信息
	Free3point(r,row,col);
	char***r1 = MySqlDB.executeSQL("select * from opentime;",&row,&col);//打印所有信息
	Free3point(r1,row,col);
	//MySqlDB.executeSQL("select peopleworkbegin from people where idpeople>0;",&row,&col);//打印所有信息
	//MySqlDB.executeSQL("update people p set p.peopletimetotal=0,p.peopletodayworktime=0 where idpeople>0;",&row,&col);
	printf("\n");
	//-----socket-------------
    int listenfd,connectfd;
    struct sockaddr_in server;
    struct sockaddr_in client;

    if(-1==(listenfd=socket(AF_INET,SOCK_STREAM,0))){
        perror("create socket error\n");
        exit(1);
    }

    int opt=SO_REUSEADDR;
    setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

    bzero(&server,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_port=htons(PORT);
    server.sin_addr.s_addr=htonl(INADDR_ANY);

    if(-1==(bind(listenfd,(struct sockaddr*)&server,sizeof(struct sockaddr)))){
        perror("bind error\n");
        exit(1);
    }

    if(-1==(listen(listenfd,BACKLOG))){
        perror("listen error\n");
        exit(1);
    }

    socklen_t len=sizeof(client);
    targs arg;

    while(1){
        if(-1==(connectfd=accept(listenfd,(struct sockaddr *)&client,&len))){
            perror("accept error\n");
            exit(1);
        }
        arg.connectfd=connectfd;
        arg.client=client;

        pthread_t tid;
        if(pthread_create(&tid,NULL,process,(void *)&arg)){
            perror("create thread error\n");
            exit(1);
        }
    }
    close(listenfd);
    return 0;
}
void *process(void *arg){
    targs client;
    client.connectfd=((targs *)arg)->connectfd;
    client.client=((targs *)arg)->client;
    char buf[1024];
	char* ipaddress;
    int n=0;
	//time get
	time_t now;   
	struct tm *timenow = (struct tm*)malloc(sizeof(struct tm));   
	time(&now);   
	timenow = localtime(&now); 
	//read socket datas
    while(0<(n=read(client.connectfd,buf,sizeof(buf)))){
        buf[n]='\0';
		ipaddress = inet_ntoa(client.client.sin_addr);
        printf("You got a message <%s> from %s.\n",buf,inet_ntoa(client.client.sin_addr));
		
		//open door
        if(buf[0] == '1' && strlen(buf) == 1){
			sprintf(buf,"\n%s : %s",ipaddress,"OpenDoor"); 	//年月日时间更新值
			Fprint_LogString(buf,LOG_OPENDOOR_FILE,"a+");
			OpenDoor();
		}
		
		//SQL updata
		char buffer[400] = {0};
		char day[20] ;
		sprintf(day,"%d-%d-%d",timenow->tm_year + 1900,timenow->tm_mon + 1,timenow->tm_mday); 	//年月日时间更新值

		char tm[7][50] =  {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};  
		char wday[100] ;
		sprintf(wday,"%s",tm[timenow->tm_wday ]); 												//星期更新值

		char btime[20];
		sprintf(btime,"%02d:%02d:%02d",timenow->tm_hour,timenow->tm_min,timenow->tm_sec); 			//当前时间更新值,上班
		char atime[20];
		sprintf(atime,"%02d:%02d:%02d",timenow->tm_hour,timenow->tm_min,timenow->tm_sec); 			//当前时间更新值,下班
		//加锁
		pthread_mutex_lock (&mutexsql);
		//上下班统计次数
		int atimef = 0;
		int row=0;
		int col=0;	
		sprintf(buffer,"select opentimenum from opentime where opentimeip='%s';",ipaddress);
		char***r = MySqlDB.executeSQL(buffer,&row,&col);
		if(NULL != r){
			if(atoi(r[0][0]) == 0) 
			{
				atimef = 0;
				//保存当天打卡次数
				sprintf(buffer,"update opentime  set opentimenum=%d where opentimeip='%s';",atoi(r[0][0])+1,ipaddress);
				MySqlDB.executeSQL(buffer,&row,&col);
			}
			else
			{
				atimef = 1;
				//保存当天打卡次数
				sprintf(buffer,"update opentime  set opentimenum=%d where opentimeip='%s';",atoi(r[0][0])+1,ipaddress);
				MySqlDB.executeSQL(buffer,&row,&col);
			}
			Free3point(r,row,col);
		}
		
		
		if(!atimef){	//第一次打卡
			sprintf(buffer,"update people p set p.peoplertimetoday='%s',p.peopleweektoday ='%s',p.peopleworkbegin ='%s' where peopleipaddress='%s';"\
																	,day																			\
																						,wday														\
																												,btime								\
																																		,ipaddress);									
			MySqlDB.executeSQL(buffer,&row,&col);
		}else{			//下班有可能多次打卡
			sprintf(buffer,"update people p set p.peoplertimetoday='%s',p.peopleweektoday ='%s',p.peopleworkafter ='%s' where peopleipaddress='%s';"\
																	,day																			\
																						,wday														\
																												,atime								\
																																		,ipaddress);									
			MySqlDB.executeSQL(buffer,&row,&col);
			
			sprintf(buffer,"select peopleworkbegin, peopleworkafter from people where peopleipaddress='%s';",ipaddress);	
			char** chtime;
			char***r = MySqlDB.executeSQL(buffer,&row,&col);
			if(NULL != r){
				chtime = GetTodayWorkTimeTotal(r,row,col);
			}
			Free3point(r,row,col);
			sprintf(buffer,"update people p set p.peopletodayworktime='%s' where peopleipaddress='%s';",chtime[0], ipaddress);	
			MySqlDB.executeSQL(buffer,&row,&col);												
		}
		pthread_mutex_unlock (&mutexsql); //解锁
        write(client.connectfd,buf,strlen(buf));
    }
    close(client.connectfd);
}
void* sqlupdate_start(void *message)
{
	time_t now;   
	struct tm *timenow = (struct tm*)malloc(sizeof(struct tm));  
	int row=0;
	int col=0;	
	char buffer[400] = {0};		//小心溢出!
	sleep(5);
	//读取配置文件
	sprintf(buffer,"select configday,configweek from config where idconfig=1;");
	char***r1 = MySqlDB.executeSQL(buffer,&row,&col);
	int oldday = atoi(r1[0][0]) ;	//每天更新一次, 包括更新本周总上班时间,清零当天打卡时间,更新日期,星期几,将上下班打卡时间标记为"无记录"
	int oldweek = atoi(r1[0][1]);	//每周更新一次,	包括清零本周总上班时间,清零当天打卡时间,更新日期,星期几,将上下班打卡时间标记为"无记录"
	Free3point(r1,row,col);
	//printf("oldday = %d,oldweek = %d \n",oldday,oldweek);
	while(1){
		sleep(5);
		time(&now);   
		timenow = localtime(&now);  
		int newday = timenow->tm_mday;	//几号
		int newweek= timenow->tm_wday; 	//星期几
		if((preday != newday) && (newday != oldday))
		{
			//SQL updata
			//printf("newday = %d, oldday = %d, update SQL excuse\n",newday,oldday);
			char day[20]    ;
			sprintf(day,"%d-%d-%d",timenow->tm_year + 1900,timenow->tm_mon + 1,timenow->tm_mday); 	//年月日时间更新值

			char tm[7][100] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};  
			char wday[100]  ;
			sprintf(wday,"%s",tm[timenow->tm_wday]); 											//星期更新值
			char btime[20] = {"无记录"};		//上班时间,清零
			char atime[20] = {"无记录"};		//下班时间,清零 
			char wtime[20] = {"00:00:00"} ;		//本周上班中总时间 += 当日上班总时间  
			char dtime[20] = {"00:00:00"} ;		//当日上班总时间,清零
			char** htime;
			char***r = MySqlDB.executeSQL("select peopletimetotal,peopleworkafter, peopleworkbegin from people where idpeople>0;",&row,&col);
			if(NULL != r){
				htime = GetWeekWorkTimeTotal1(r,row,col);
				//for(int i=0;i<row;i++){
				//	printf("%s \n",htime[i]);
				//}	
			}
			Free3point(r,row,col);
			if(newweek == 1 ){
				sprintf(buffer,"update people p set p.peoplertimetoday='%s',p.peopleweektoday ='%s',p.peopleworkbegin ='%s',p.peopleworkafter ='%s',p.peopletimetotal ='%s',p.peopletodayworktime ='%s' where idpeople>0;"	\
																	,day																																					\
																							,wday																															\
																													,btime																									\
																																			,atime																			\
																																									,wtime													\					
																																																,dtime);						
				MySqlDB.executeSQL(buffer,&row,&col); //不是线程安全的,以后记得修改,加锁
			}
			else{
				for(int i=0;i<row;i++){
					printf("htime = %s \n",htime[i]);
					sprintf(buffer,"update people p set p.peoplertimetoday='%s',p.peopleweektoday ='%s',p.peopleworkbegin ='%s',p.peopleworkafter ='%s',p.peopletimetotal ='%s',p.peopletodayworktime ='%s' where idpeople=%d;"	\
																		,day																																					\
																								,wday																															\
																														,btime																									\
																																				,atime																			\
																																										,htime[i]				 								\					
																																																	,dtime						\
																																																						,i+1);						
					MySqlDB.executeSQL(buffer,&row,&col); //不是线程安全的,以后记得修改,加锁
				}
			}

			Free2point(htime,row,col);
			
			//清除当日开门次数opentimenum
			sprintf(buffer,"update opentime  set opentimenum=0 where idopentime>0;");
			MySqlDB.executeSQL(buffer,&row,&col);
			//将当天的配置文件写入数据库中,避免系统重启时,数据被清空
			sprintf(buffer,"update config set configday=%d, configweek=%d where idconfig=1;",newday,newweek);
			MySqlDB.executeSQL(buffer,&row,&col);
		}
		preday = newday;
	}
	return message;
}