MMDB ip地址库操作

MMDB ip地址库操作

@(博客文章)[java]

MMDB即Maxmind DB,是一个设计用于存储IPv4和IPv6的数据信息的数据库,mmdb文件是一个二进制格式的文件,它使用一个二分查找树加速IP信息的查询。

1、数据格式说明

{
    continent => {                    //大洲
        code        => string,        //大洲代码,如AS,可能为空
        names       => {              //大洲名称
            en      => string,        //大洲英文名称,如Asia,可能为空
            zh_CN   => string,        //大洲中文名称,如亚洲,可能为空
        },
    },
    country   => {                    //国家
        iso_code    => string,        //国家iso代码,如CN,可能为空
        names       => {              //国家名称
            en      => string,        //国家英文名称,如China,可能为空
            zh_CN   => string,        //国家中文名称,如中国,可能为空
        },
    },
    subdivisions => {                 //省份
        iso_code    => string,        //省iso代码省ISO代码,如44,可能为空
        names       => {              //省份名称
            en      => string,        //省份英文名称,如Guangdong,可能为空
            zh_CN   => string,        //省份中文名称,如广东,可能为空
        },
    },
    city      => {                    //城市
        id          => int,           //城市id,如440000,可能为空
        names       => {              //城市名称
            en      => string,        //城市英文名称,如Guangzhou,可能为空
            zh_CN   => string,        //城市中文名称,如广州,可能为空
        },
    },
    location  => {                    //地理位置
        latitude    => double,        //纬度,可能为空
        longitude   => double,        //经度,可能为空
        time_zone   => string,        //时区,可能为空
    },
    isp       => {                    //运营商
        id          => int,           //运营商id,可能为空
        names       => {              //运营商名称
            zh_CN   => string,        //运营商中文名称,如电信,可能为空
    },
}

其中:
* 国家ISO代码可以参考维基百科ISO_3166-2。
* 省ISO代码,国内的省ISO代码均为该省公民身份证号的前两位。国外的省ISO代码可能存在为英文的情况,不一定全是数字。具体可以参考维基百科ISO_3166-2。
* 城市id,只有中国IP存在城市id(包含港澳台),该城市id为该城市公民身份证号的前6位。具体可以参考国家统计局网站。
* 运营商id,只有中国大陆的IP存在运营商字段,现有id规则如下:电信10000,联通10010,移动10086,铁通10050,教育网985211,鹏博士600804,华数96171,方正网络9990,歌华网络96196,阿里云1688,其他(包括国内未知)1,国外ip的运营商id为空。
* 运营商名称,中文,如电信,可能为空,只有中国大陆的IP才可能存在运营商字段,中国大陆的IP也可能存在未知运营商的情况,此时运营商字段也为空。
* 使用程序语言解析mmdb的数据可能返回数组、字典或哈希表数据(视编程语言而定)。

2、java读取mmdb文件

可以使用maxmind-db库。在pom.xml中添加以下内容:

    <dependency>
        <groupId>com.maxmind.db</groupId>
        <artifactId>maxmind-db</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.0</version>
    </dependency>

代码如下:

public class IpDemo {
    public static void main(String[] args) throws Exception {
        File database = new File("resources/ip.mmdb");
        Reader reader = new Reader(database);
        InetAddress address = InetAddress.getByName("24.24.24.24");
        JsonNode response = reader.get(address);
        System.out.println(response);
        reader.close();
    }
}

其中ip.mmdb放在resources目录下,这相目录是src folder。输出如下:

{"location":{"time_zone":"America/New_York","longitude":-76.1474,"latitude":43.0481},"isp":{"id":0,"names":{"zh_CN":""}},"continent":{"names":{"zh_CN":"北美洲","en":"North America"},"code":"NA"},"subdivisions":{"names":{"zh_CN":"纽约州","en":"New York"},"iso_code":"NY"},"country":{"names":{"zh_CN":"美国","en":"United States"},"iso_code":"US"},"city":{"id":0,"names":{"zh_CN":"锡拉丘兹","en":"Syracuse"}}}

你可能感兴趣的:(mmdb)