我有一个来自数据库的MAC地址列表。我想查找每个MAC地址的供应商,然后最终按供应商计算网络上的设备数量。
我相信我可以用脏的方式来解析来自http://standards.ieee.org/develop/regauth/oui/oui.txt的文件中的供应商前缀。
但我想知道是否有更好的方法?
答案 0 :(得分:5)
Pear中有一个库,但它确实有很大的开销,因为供应商查找需要一个已经加载了供应商数据的关系数据库。但是,考虑到替代方案,这可能值得探索。
http://pear.php.net/manual/en/package.networking.net-mac.php
该软件包为wireshark维护的列表提供了一个加载器:https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=manuf
答案 1 :(得分:1)
如果您只关心基于mac地址的设备制造商,那么您只需在此网站上复制并粘贴列表(一次只能200个)。这很快:
www.admin-toolkit.com/mac-address-lookup-manufacturer.html
答案 2 :(得分:0)
我从Wireshark manuf源创建了一个SQlite(Macvendors.db)。我通过PDO使用它进行简单的查询。
这是我写的一个方法,向您展示如何使用它:
public function getAllCompaniesFromMacs($macs)
{
try {
// connect to the SQLite file
$conn = new \PDO("sqlite:/path/to/sqlite/Macvendors.db");
$conn ->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
// aux vars
$macsParaBuscar = array();
$macsIN = "";
// output vars
$salida = array();
// Clean repeated MACs and remove the ":" chars
foreach ($macs as $unaMac) {
$unaMac = str_replace(":", "", $unaMac);
$firstChars = substr($unaMac, 0, 6);
$macsParaBuscar[$firstChars] = $firstChars;
}
// Create a IN statment for the WHERE
$macsIN = "( 'HOLA'";
foreach ($macsParaBuscar as $unaMacBuscar) {
$macsIN .= ", '" . $unaMacBuscar . "'";
}
$macsIN .= ")";
// Prepare and execute the query
$stm = $conn->prepare("SELECT mac, vendor FROM macvendor WHERE mac IN " . $macsIN);
$stm->execute();
// Put results in output var
while( $row = $stm->fetch() ) {
$auxMac = $row["mac"];
$salida[$auxMac] = $row["vendor"];
}
return $salida;
} catch (\Exception $e) {
throw new \Exception("Ha ocurrido un error", 1);
}
}
对于unbeauty示例代码感到抱歉。
玩得开心!
答案 3 :(得分:0)
答案 4 :(得分:0)
但我想知道是否有更好的方法?
如果你可以使用像ruby这样的其他语言,那就是名为macvendors的宝石
无需使用外部API或通过速率限制停止。
您可以在命令行中使用它:
gem install macvendors
macvendors find 98:e0:d9:a5:61:eb
Apple, Inc.
您可以在ruby代码中使用它:
require 'macvendors'
MacVendors.setup #for the first time
puts MacVendors.find("98:e0:d9:a5:61:eb")