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)\n" );   
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:\nError %u (%s)\n" ,   
mysql_errno(conn),mysql_error(conn));    
exit(1);    
}

printf( "connect to %s 数据库 successful.\n",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\n",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 \n",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("***************************************************\n");
                            printf("*******MAC  地址检测:  重复  重复  重复  重复  重复\n");
                            printf("***************************************************\n");
                            ResetConsoleColor(wColor);

SendRepeatMactoServer(SendMac);

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

//}    
fputc(‘\n‘,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)\n" );   
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:\nError %u (%s)\n" ,   
mysql_errno(conn),mysql_error(conn));    
while(1);
exit(1);    
}

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

//*****************************************************************************************************
GetLocalTime( &sys );
sprintf(date,"%4d-%02d-%02d %02d:%02d:%02d\n",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\n",SendMac);

if  (mysql_query(conn,szSqlText)) {    
printf( "上传数据库 error:\nError %u (%s)\n" ,    
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\n" ,   
//(unsigned  long )mysql_affected_rows(conn));    
    printf("重复MAC上传数据库 OK !\n");
}

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

时间: 2024-11-08 13:47:58

MAC地址记录与重复检测系统的相关文章

(转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的. 交换机的工作原理 交换机在接收到数据帧以后,首先.会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着.会检查自己的MAC

MAC地址表、ARP缓存表以及路由表

一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的. 交换机的工作原理 交换机在接收到数据帧以后,首先.会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着.会检查自己的MAC表中是否有数据帧中目标MAC地址的信息,如果有则会根据MAC表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数

网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的. 交换机的工作原理 交换机在接收到数据帧以后,首先.会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着.会检查自己的MAC表中是否有数据帧中目标MAC地址的信息,如果有则会根据MAC表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数

Mininet实验 MAC地址学习

实验目的 了解交换机的MAC地址学习过程. 了解交换机对已知单播.未知单播和广播帧的转发方式. 实验原理 MAC(media access control,介质访问控制)地址是识别LAN节点的标识.MAC对设备(通常是网卡)接口是全球唯一的,MAC地址为48位,用12个16进制数表示.前6个16进制数字由IEEE管理,用来识别生产商或者厂商,构成OUI(Organization Unique Identifier,组织唯一识别符).后6个包括网卡序列号,或者特定硬件厂商的设定值.对于一个网卡来说

Android中通过进程注入技术修改系统返回的Mac地址

致谢 感谢看雪论坛中的这位大神,分享了这个技术:http://bbs.pediy.com/showthread.php?t=186054,从这篇文章中学习到了很多内容,如果没有这篇好文章,我在研究的过程中会遇到很多困难,说不定我就放弃了~~在此感谢他. 前言 之前的几篇文章都是在介绍了OC的相关知识,之前的半个月也都是在搞IOS的相关东西,白天上班做Android工作,晚上回家还有弄IOS,感觉真的很伤了.不过OC的知识也学习了差不多了.不过在这段时间遗留了很多Android方面的问题都没有进行

【转载】取得系统中网卡MAC地址的三种方法

From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址,一般说网卡地址我是指物理地址,不知道别人怎么看?物理地址指的是网卡上的存放地址的ROM里的地址,mac地址是这块卡工作的时候用的地址,一般情况下这两个地址是一样的,所以很多人都混用了,甚至不知道有区别  -_-# 网卡工作的时候,一个以太网帧60到1514(不包括crc),帧的crc是网卡自动加的

MD5做为文件名。机器唯一码有电脑的CPU信息和MAC地址,这两个信息需要在linux或unix系统下才能获取吧。

可以采用机器(电脑)唯一码 + 上传IP + 当前时间戳 + GUID ( + 随机数),然后MD5做为文件名.机器唯一码有电脑的CPU信息和MAC地址,这两个信息需要在linux或unix系统下才能获取吧. //获取电脑的CPU信息function OnlyU(){        $a = '';        $b = array();        if(function_exists('exec')){                if(mailto:[email protected]

java工具类,在Windows,Linux系统获取电脑的MAC地址、本地IP、电脑名

package com.cloudssaas.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.rege

获得Unix/Linux系统中的IP、MAC地址等信息

获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 作者:diaoyf  |  文章来源:http://programmerdigest.cn 实际环境和特殊需求往往会将简单问题复杂化,比如计算机IP地址,对于一个连接中socket,可以直接获得本端和对端的IP.端口信息.但在一些特殊场合我们可能需要更多的信息,比如系统中有几块网卡,他们的Mac地