3

我有一个来自数据库的 MAC 地址列表。我想查找每个 MAC 地址的供应商,然后最终按供应商计算网络上的设备数量。

我相信我可以做到这一点,即从http://standards.ieee.org/develop/regauth/oui/oui.txt提供的文件中解析供应商前缀。

但我想知道是否有更好的方法?

4

5 回答 5

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

于 2012-07-12T18:25:51.470 回答
1

如果您只关心根据 mac 地址获取设备制造商,那么您只需在此处复制并粘贴此网站上的列表(一次最多 200 个)。它非常快:

www.admin-toolkit.com/mac-address-lookup-manufacturer.html

于 2015-03-07T05:03:24.383 回答
1

但我想知道是否有更好的方法?

如果您可以使用其他语言,例如 ruby​​,则有一个名为macvendors的 gem

无需使用外部 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")

于 2016-10-07T03:03:35.197 回答
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);

    }

}

对不起,不漂亮的示例代码。

玩得开心!

于 2012-10-02T02:53:20.613 回答
0

更新

还有另一个库不依赖于任何 API,而是 XML 文件数据库,即Cisco vendorMacs.xml

包托管在这里


是的,这是我写的,它取决于Mac地址供应商网站的在线API

是带有示例的存储库

于 2016-01-06T18:42:01.690 回答