# IPLookup 使用文档
IPLookupV2 基于IP地址获取地理位置或ASN(自治系统号码)信息。核心功能:
- [构建GeoIP Databases 文件](https://docs.geedge.net/pages/viewpage.action?pageId=39135257)
- 通过开源解析库[MaxMind DB Reader](https://github.com/maxmind/MaxMind-DB-Reader-java)生成Reader 对象
## 功能设计
因IP知识库来源不同,默认分两种类型数据库:IP-ASN 和 IP-LOCATION。具体实现类:
- IPLookup IP地址映射为国家,地区,经纬度及ASN(内置ASNLookup类) 等。
- ASNLookup IP地址映射AS号,组织及国家编码等。
## 数据库信息
GeoIP 数据库文件默认存储在 "dat目录" 中,并且在加载工具类时,如果没有指定数据库文件的路径,它将自动加载默认路径下的数据库文件。默认文件名如下:
| Name | Filename | Description |
| ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 基础IP定位库 | ip.mmdb
ip_v4.mmdb
Ip_v6.mmdb | IP基础定位库,一般来源于系统内置或第三方购置;包括全局,v4格式和v6格式。
|
| 用户自定义IP定位库 | ip_private.mmdb
ip_private_v4.mmdb
ip_private_v6.mmdb | 用户自定义IP定位库,一般来源于企业或运营商内部的知识库,相对权威和可信度更高;包括全局,v4格式和v6格式。
|
| 基础ASN库 | asn.mmdb
asn_v4.mmdb
asn_v6.mmdb | 基础ASN库,一般来源于系统内置或第三方购置;包括全局,v4格式和v6格式。 |
| 用户自定义ASN库 | asn_private.mmdb
asn_private_v4.mmdb
asn_private_v6.mmdb | 自定义IP映射ASN库,一般来源于企业或运营商内部的知识库,相对权威和可信度更高;包括全局,v4格式和v6格式。 |
## 实现方式
### 同类型不同格式数据库的加载顺序
支持同时加载相同类型多个格式的IP定位库,基于下图将产生的DBReader对象顺序存储到LIST集合中。例如:基础库同时加载了v4,v6和 All(包含v4和v6)三个文件,读取时将优先使用v4和v6 DBReader。

### 不同类型数据库的执行顺序
当同时指定公共与用户自定义库时,将优先使用自定义库获取IP地理位置。执行顺序如下:

## 方法说明
**IpLookupV2**
| Name | Type | Description |
| ------------------------------------------------------------ | ---------------- | -------------------------------------------------- |
| IpLookupV2.Builder(boolean isDefaultDB) | IpLookupV2.Builder |是否使用默认数据库 |
| Builder.loadDataFile(String databaseFile) | IpLookupV2.Builder | 加载基础IP定位库 |
| Builder.loadDataFileV4(String databaseFile) | IpLookupV2.Builder | 加载基础IPv4定位库 |
| Builder.loadDataFileV6(String databaseFile) | IpLookupV2.Builder | 加载基础IPv6定位库 |
| Builder.loadDataFilePrivate(String databaseFile) | IpLookupV2.Builder | 加载用户自定义IP定位库 |
| Builder.loadDataFilePrivateV4(String databaseFile) | IpLookupV2.Builder | 加载用户自定义IPv4定位库 |
| Builder.loadDataFilePrivateV6(String databaseFile) | IpLookupV2.Builder | 加载用户自定义IPv6定位库 |
| Builder.loadAsnDataFile(String databaseFile) | IpLookupV2.Builder | 加载基础ASN库 |
| Builder.loadAsnDataFileV4(String databaseFile) | IpLookupV2.Builder | 加载基础IPv4 ASN库 |
| Builder.loadAsnDataFileV6(String databaseFile) | IpLookupV2.Builder | 加载基础IPv6 ASN库 |
| Builder.loadAsnDataFilePrivate(String databaseFile) | IpLookupV2.Builder | 加载用户自定义ASN库 |
| Builder.loadAsnDataFilePrivateV4(String databaseFile) | IpLookupV2.Builder | 加载用户自定义IPv4 ASN库 |
| Builder.loadAsnDataFilePrivateV6(String databaseFile) | IpLookupV2.Builder | 加载用户自定义IPv6 ASN库 |
| Builder.loadDataFile(Inputstream databaseStream) | IpLookupV2.Builder | 加载基础IP定位库 |
| Builder.loadDataFileV4(Inputstream databaseStream) | IpLookupV2.Builder | 加载基础IPv4定位库 |
| Builder.loadDataFileV6(Inputstream databaseStream) | IpLookupV2.Builder | 加载基础IPv6定位库 |
| Builder.loadDataFilePrivate(Inputstream databaseStream) | IpLookupV2.Builder | 加载用户自定义IP定位库 |
| Builder.loadDataFilePrivateV4(Inputstream databaseStream) | IpLookupV2.Builder | 加载用户自定义IPv4定位库 |
| Builder.loadDataFilePrivateV6(Inputstream databaseStream) | IpLookupV2.Builder | 加载用户自定义IPv6定位库 |
| Builder.loadAsnDataFile(Inputstream databaseStream) | IpLookupV2.Builder | 加载基础ASN库 |
| Builder.loadAsnDataFileV4(Inputstream databaseStream) | IpLookupV2.Builder | 加载基础IPv4 ASN库 |
| Builder.loadAsnDataFileV6(Inputstream databaseStream) | IpLookupV2.Builder | 加载基础IPv6 ASN库 |
| Builder.loadAsnDataFilePrivate(Inputstream databaseStream) | IpLookupV2.Builder | 加载用户自定义ASN库 |
| Builder.loadAsnDataFilePrivateV4(Inputstream databaseStream) | IpLookupV2.Builder | 加载用户自定义IPv4 ASN库 |
| Builder.loadAsnDataFilePrivateV6(Inputstream databaseStream) | IpLookupV2.Builder | 加载用户自定义IPv6 ASN库 |
| Builder.build() | IpLookupV2 | 构建IPLookupV2对象 |
| countryLookup(String ip) | String | 返回国家/区域 |
| provinceLookup(String ip) | String | 返回省/洲 |
| cityLookup(String ip) | String | 返回城市 |
| administrativeAreaLookupDetail(String ip) | String | 返回到区/县的四级定位信息 |
| ispLookup(String ip) | String | 返回运营商 |
| organizationLookup(String ip) | String | 返回组织 |
| cityLookupDetail(String ip) | String | 返回到城市的3级定位信息,包含城市,省(州),国家;分隔符为英文句号"." |
| locationLookupDetail(String ip) | String | 返回地理位置信息明细,支持7级 |
| infoLookupToCSV(String ip) | String | 返回地理位置信息明细,支持7级,csv格式 |
| infoLookupToJSON(String ip) | String | 返回地理位置信息明细,支持7级,json格式 |
| infoLookup(String ip) | String | 返回地理位置信息明细,支持7级,Response 对象 |
| latLngLookup(String ip) | String | 返回经纬度,格式:维度,经度 ;分隔符为英文逗号"," |
| cityLatLngLookup(String ip) | String | 返回 cityLookup+latLngLookup信息; |
| asnLookup(String ip) | String | 返回ASN,调用AsnLookup工具类 |
| asnLookupOrganization(String ip) | String | 返回所属AS组织,调用AsnLookup工具类 |
| asnLookupDetail(String ip) | String | 返回ASN及ISP信息,调用AsnLookup工具类 |
**AsnLookup**
| Name | Type | Description |
| ------------------------------------------------------------ | ----------------- | ---------------------------- |
| AsnLookup.Builder(boolean isDefaultDB) | AsnLookup.Builder | |
| Builder.loadDataFile(String databaseFile) | AsnLookup.Builder | 加载基础ASN库 |
| Builder.loadDataFileV4(String databaseFile) | AsnLookup.Builder | 加载基础V4 ASN库 |
| Builder.loadDataFileV6(String databaseFile) | AsnLookup.Builder | 加载基础V6 ASN库 |
| Builder.loadDataFilePrivate(String databaseFile) | AsnLookup.Builder | 加载用户自定义ASN库 |
| Builder.loadDataFilePrivateV4(String databaseFile) | AsnLookup.Builder | 加载用户自定义V4 ASN库 |
| Builder.loadDataFilePrivateV6(String databaseFile) | AsnLookup.Builder | 加载用户自定义V6 ASN库 |
| Builder.loadDataFile(Inputstream databaseStream) | AsnLookup.Builder | 加载基础ASN库 |
| Builder.loadDataFileV4(Inputstream databaseStream) | AsnLookup.Builder | 加载基础V4 ASN库 |
| Builder.loadDataFileV6(Inputstream databaseStream) | AsnLookup.Builder | 加载基础V6 ASN库 |
| Builder.loadDataFilePrivate(Inputstream databaseStream) | AsnLookup.Builder | 加载用户自定义ASN库 |
| Builder.loadDataFilePrivateV4(Inputstream databaseStream) | AsnLookup.Builder | 加载用户自定义V4 ASN库 |
| Builder.loadDataFilePrivateV6(Inputstream databaseStream) | AsnLookup.Builder | 加载用户自定义V6 ASN库 |
| Builder.build() | AsnLookup | 构建AsnLookup对象 |
| asnLookup(String ip) | String | 返回ASN |
| asnLookupOrganization(String ip) | String | 返回AS 组织 |
| asnLookupDetail(String ip) | String | 返回ASN及ISP信息 |
## 实现举例
```java
IpLookupV2 ipLookup = ipLookupV2 = new IpLookupV2.Builder(false)
.loadDataFileV4(new FileInputStream(new File("dat/ip_v4_built_in.mmdb")))
.loadDataFilePrivateV4(new FileInputStream(new File("dat/ip_v4_user_defined.mmdb")))
.loadDataFileV6(new FileInputStream(new File("dat/ip_v6_built_in.mmdb")))
.loadDataFilePrivateV6(new FileInputStream(new File("dat/ip_v6_user_defined.mmdb")))
.loadAsnDataFile(new FileInputStream(new File("dat/asn_v4.mmdb")))
.loadAsnDataFileV6(new FileInputStream(new File("dat/asn_v6.mmdb")))
.build();
logger.info(ipLookup.countryLookup("192.168.50.21"));
logger.info(ipLookup.cityLookupDetail("192.168.50.21"));
logger.info(ipLookup.latLngLookup("192.168.50.21"));
logger.info(ipLookup.infoLookupToJSON("120.221.155.223"));
logger.info(ipLookup.countryLookup("2001:4860:4860::8888"));
logger.info(ipLookup.asnLookup("120.221.155.223"));
logger.info(ipLookup.asnLookup("2001:4860:4860::8888"));
logger.info(ipLookup.latLngLookup("119.253.39.18"));
logger.info(ipLookup.cityLatLngLookup("120.221.155.223"));
```