【问题标题】:Is there a PHP library for looking up vendor from MAC address?是否有用于从 MAC 地址查找供应商的 PHP 库?
【发布时间】:2012-07-12 18:15:02
【问题描述】:

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

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

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

【问题讨论】:

  • 当您可以使用本地(一旦您下载该文件...)数据更快地自己进行查找时,为什么还要使用网络服务进行查找?
  • @MarcB - 呃....我没说我想使用网络服务。
  • 您打算将该文件中的数据添加到数据库中吗?如果您找不到这样的库,那么通过查询进行计数可能会很好。
  • @ghbarratt - 我可以做一个数据库,所以我可以解析该数据并将其添加到数据库中。我担心的是对数据库的调用和性能,因为我遍历每个 MAC 地址,然后在另一个表中查找供应商前缀。

标签: php mac-address vendor-prefix


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      如果你可以使用其他语言,比如 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")

      【讨论】:

        【解决方案4】:

        我从 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);
        
            }
        
        }
        

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

        玩得开心!

        【讨论】:

          【解决方案5】:

          更新

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

          包托管here


          是的,这是我写的,依赖Mac address vendor website的在线API

          Here 是包含示例的存储库

          【讨论】:

            猜你喜欢
            • 2019-01-19
            • 2012-05-24
            • 2020-09-03
            • 1970-01-01
            • 2021-06-05
            • 1970-01-01
            • 2010-09-14
            • 2016-08-26
            • 1970-01-01
            相关资源
            最近更新 更多