我有一個來自數據庫的MAC地址列表。我希望查找每個MAC地址的供應商,然後最終在供應商網絡上統計設備數量。是否有一個從MAC地址查找供應商的PHP庫?
我相信我可以做到這一點的骯髒的方式,將解析從這裏可用的文件供應商前綴http://standards.ieee.org/develop/regauth/oui/oui.txt。
但我想知道是否有更好的方法?
我有一個來自數據庫的MAC地址列表。我希望查找每個MAC地址的供應商,然後最終在供應商網絡上統計設備數量。是否有一個從MAC地址查找供應商的PHP庫?
我相信我可以做到這一點的骯髒的方式,將解析從這裏可用的文件供應商前綴http://standards.ieee.org/develop/regauth/oui/oui.txt。
但我想知道是否有更好的方法?
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
我從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示例代碼。
玩得開心!
如果你所關心的是根據mac地址獲取設備的製造商,那麼你可以在這裏簡單地複製和粘貼這個網站上的列表(一次200個)。做法很簡單:
www.admin-toolkit.com/mac-address-lookup-manufacturer.html
網站is offline ... – Anfuca 2017-02-17 10:48:04
但我不知道是否有更好的辦法?
如果可以使用其他語言,如紅寶石,有一個名爲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")
爲什麼你要使用查找時web服務你可以用本地的方式(一旦你下載了這個文件......)更快地做到這一點? – 2012-07-12 18:17:06
@MarcB - 呃....我沒有說我想使用網絡服務。 – devcoder 2012-07-12 18:23:12
您打算將該文件中的數據添加到數據庫嗎?如果您找不到一個庫,那麼通過查詢進行計數可能會很好。 – ghbarratt 2012-07-12 18:29:53