一、通信模块如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 !
");
}
//*****************************************************************************************************
}