• 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 ! ");
    }   

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

  • 相关阅读:
    关于前后端跨域问题的解决
    vue+vuex+router+element ui
    winfrom导入excel文件
    winform 导出excel文件
    winfrom DataGridView 列表操作
    LaTex之CTex初体验一
    图像配准的步骤
    Phase Based Feature Detection and Phase Congruency(相位一致性)
    查找论文中的代码
    KullbackLeibler
  • 原文地址:https://www.cnblogs.com/caoyongan/p/4313913.html
Copyright © 2020-2023  润新知