MAC地址记录与重复检测系统

一、通信模块如WiFi、Zigbee都会有唯一的MAC地址,这些模块在出厂前需要一套系统来确保唯一性。

此套MAC地址记录与重复检测系统已经经过KK级的出货验证,难有漏网之鱼。

二、系统设计思路:

客户端程序读取模块MAC地址,然后去pass数据库中寻找是否已经存在,如果不存在,则将此MAC存到pass数据库中,显示PASS,如果已经存在,证明已经生产过了,有重复,则将此MAC存到repeat数据库中。

 

三、系统实施步骤:

1,搭建一台windows2003服务器,外接交换机,通过网线与产线上几十台电脑相连。

2,在服务器上安装mysql服务端和mysql客户端程序,用mysql客户端先建立两个数据库:pass数据库、repeat数据库。

3,编写客户端程序,上传MAC作对比,显示结果给产线员工。

当然为了更好的追踪MAC重复的模块,可以上传检测时间、电脑编号。

四、给出mysql代码片段:

void SendMactoServer(char *SendMac)
{
//*******************************************************************************
char  szSqlText[500] ;    

MYSQL *conn;    
MYSQL_RES *rs;    
MYSQL_ROW row;    //注意它的声明 typedef char**MYSQL_ROW,字符串数组    

conn = mysql_init(NULL);    
if (conn == NULL)    
{    
fprintf(stderr, "mysql_init() failed (probably out of memory) " );   
exit(1);    
}    

if  (mysql_real_connect(conn,host_name,user_name,password,    
MacDbName,MYSQL_PORT,NULL,0) == NULL)    
{    
//在MYSQL初始化之后的操作如果有错误,可以用mysql_errno(MYSQL*)和    
//mysql_errer(MYSQL*) 分别获得出错代号和描述    
fprintf(stderr, "mysql_real_connect() failed: Error %u (%s) " ,   
mysql_errno(conn),mysql_error(conn));    
exit(1);    
}    

printf( "connect to %s 数据库 successful. ",MacDbName);  

//*******************************************************************************

char MysqlCmd[64];
sprintf(MysqlCmd,"select value from %s where value ='AA:BB:AA:DD:CC:FF'",MacDbName);

int MacDbNameLen = strlen(MacDbName);

    int k;
    for(k=0;k<17;k++)
    {
        MysqlCmd[33+MacDbNameLen+k]=*(SendMac+k);
    }

sprintf(szSqlText, MysqlCmd );
printf("szSqlText = %s ",szSqlText);
//********************************************************************************

//执行成功则返回零    
if  (mysql_query(conn,szSqlText) != 0)
{    
    mysql_close(conn);   

    if(DEBUG)
        printf(" select value from %s where value ='AA:BB:AA:DD:CC:FF' return 0 ",MacDbName);

    while(1);  
}    
else  {    
//立即从服务器返回所有行,存储到本地,产生结果集,失败则返回NULL    
rs = mysql_store_result(conn);    

//结果集是保留在服务器上,fetch_row时才逐行从服务器上取    
//rs = mysql_use_result(conn);    
//Get query result.    
int count = ( int )mysql_num_rows(rs);    

while ((row = mysql_fetch_row(rs)) != NULL){   //返回NULL,则说明不再有行    

                    if(!strcmp(SendMac,row[0]))
                        {
                                        wColor=SetConsoleColor(FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE);
                            printf("*************************************************** ");
                            printf("*******MAC  地址检测:  重复  重复  重复  重复  重复 ");
                            printf("*************************************************** ");
                            ResetConsoleColor(wColor);

                            SendRepeatMactoServer(SendMac);

                            while(1);
                            exit(1);
                            
                        }
                    else continue;

//}    
fputc(' ',stdout);    
}   

void SendRepeatMactoServer(char *SendMac)
{
//*******************************************************************************
char  szSqlText[500] ;    

MYSQL *conn;    
MYSQL_RES *rs;    
MYSQL_ROW row;    //注意它的声明 typedef char**MYSQL_ROW,字符串数组    

conn = mysql_init(NULL);    
if (conn == NULL)    
{    
fprintf(stderr, "mysql_init() failed (probably out of memory) " );   
exit(1);    
}    

if  (mysql_real_connect(conn,host_name,user_name,password,    
repeat_db_name,MYSQL_PORT,NULL,0) == NULL)    
{    
//在MYSQL初始化之后的操作如果有错误,可以用mysql_errno(MYSQL*)和    
//mysql_errer(MYSQL*) 分别获得出错代号和描述    
fprintf(stderr, "mysql_real_connect() failed: Error %u (%s) " ,   
mysql_errno(conn),mysql_error(conn));    
while(1);
exit(1);    
}    

printf( "connect to repeat db successful. " );  

//*****************************************************************************************************
GetLocalTime( &sys );
sprintf(date,"%4d-%02d-%02d %02d:%02d:%02d ",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond);

sprintf(szSqlText, "insert into repeatmac values ('%s','%s','%s')",SendMac,PcNum,date);   
printf("待上传重复MAC值:%s ",SendMac);

if  (mysql_query(conn,szSqlText)) {    
printf( "上传数据库 error: Error %u (%s) " ,    
mysql_errno(conn),mysql_error(conn));    
mysql_close(conn);    
while(1);
exit(1);

}    
else {    
//insert/delete/update 语句可用mysql-affected_rows()得到受作用的行    
//printf( "INSERT statement succeeded: %lu rows affected " ,   
//(unsigned  long )mysql_affected_rows(conn));    
    printf("重复MAC上传数据库 OK ! ");
}   

//*****************************************************************************************************
}

原文地址:https://www.cnblogs.com/caoyongan/p/4313913.html