mac地址前6位对应vendor
1.首先 mac地址对应厂商列表可以再ieee官方网站下载。
wget http://standards.ieee.org/develop/regauth/oui/oui.txt
2.处理下oui.txt文本内容,只要一些关键部分数据,重复部分不需要,从而缩减这个文本的大小。
cat oui.txt | grep base > result.txt
#删除(base 16)字符串:
sed -i 's/(base 16)//g' result.txt
#删除tab键符合(即制表符):
sed -i 's/\x09//g' result.txt
#将多个连续的空格符替换为|,方便匹配关键字:
sed -i 's/ /|/g' result.txt
处理好后的文本内容:
好了现在测试下:
cat result.txt | grep -i 98a942 | awk -F '|' '{print $2}'
代码实现部分:注意cmd的大小尽量大一些, 否则出现的错误想找也找不了😂
方法1:
static char *Get_Vendor(char *lanmac, char *dev_vendor)
{
if( NULL==lanmac || NULL==dev_vendor )
return NULL;
char vendor[64] = "0";
char mac[7] = "0";
char cmd[128] = "0";
memcpy(mac, lanmac, 6);
mac[6] = '\0';
sprintf(cmd, "cat /tmp/vendor.txt | grep -i %s | cut -d '|' -f2", mac);
get_cmd_result(cmd, vendor, sizeof(vendor));
memcpy(dev_vendor, vendor, strlen(vendor));
return dev_vendor;
}
方法2:
static char *Get_Vendor(char *lanmac, char *dev_vendor)
{
if( NULL==lanmac || NULL==dev_vendor )
return NULL;
char mac[7] = "0";
char cmd[128] = "0";
char buf[256] = "0";
char *p = NULL;
memcpy(mac, lanmac, 6);
mac[6] = '\0';
FILE *fp = fopen("./vendor.txt", "r");
if(NULL==fp)
{
return NULL;
}
while(fgets(buf, sizeof(buf), fp))
{
if(!strncasecmp(buf, mac, 6))
{
p = strchr(buf, '|');
if(NULL!=p)
{
strcpy(dev_vendor, (char*)(p+1));
dev_vendor[strlen(dev_vendor)-1] = '\0';
return dev_vendor;
}
}
}
}