# 介绍

SmartPing是一个综合性网络质量(PING)检测工具，支持正/反向PING绘图、互PING拓扑绘图与报警、全国PING延迟地图与在线检测工具等功能。

## 功能

* 正向PING，反向Ping绘图
* 互PING间机器的状态拓扑，自定义延迟、丢包阈值报警（声音报警与邮件报警），报警时MTR检测
* 全国PING延迟地图（各省份可分电信、联通、移动三条线路）
* 检测工具，支持使用SmartPing各节点进行网络相关检测

## 设计思路

本系统的定位为轻量级工具，即使组多点成互Ping网络可以遵守无中心化原则，所有的数据均存储自身节点中，每个节点提供出方向的数据，从任意节点查询数据均会通过Ajax请求关联节点的API接口获取并组装全部数据。

* [数据去中心化](https://docs.smartping.org/arch/decentralized.html)
* [存储数据结构](https://docs.smartping.org/arch/data.html)
* [集中配置管理(云模式)](https://docs.smartping.org/arch/cloud.html)

## 功能截图

正/反向Ping![](/files/-MHg-i9OTQ3ymbe99Im9)

Ping拓扑及报警![](/files/-MHg-i9PccbychZo83IJ)![](/files/-MHg-i9QE28PweK9X2xX)延迟地图![](/files/-MHg-i9R5pSc9ZaMP0Ix)

检测工具![](/files/-MHg-i9SffuEQaA0WixN)

系统配置![](/files/-MHg-i9TBJVDIeVXS04T)


# 下载安装

## 二进制安装

### 选择相应OS的二进制包（最新版本v0.8.0）

* Linux： [Github](https://github.com/smartping/smartping/releases/download/v0.8.0/smartping-v0.8.0.tar.gz) [百度云](https://pan.baidu.com/s/1DYE8uTnaOy-B63QtDK0t5Q)(提取码:gbcg)
* Windows：[Github](https://github.com/smartping/smartping/releases/download/v0.8.0/smartping-v0.8.0.zip) [百度云](https://pan.baidu.com/s/1DYE8uTnaOy-B63QtDK0t5Q)(提取码:gbcg)

All Release：[Github](https://github.com/gy-games/smartping/releases) [百度云](https://pan.baidu.com/s/11FNUTNebrEzpa34UYjHUew)(提取码:gbcg)

### 解压并运行程序

* 解压压缩包。
* 使用命令(Windows使用CMD) cd 进入到刚刚创建的目录。
* 执行命令
* * **Linux:** ./control start
*

```
* **Windows:** 双击 control.cmd
```

```
**SmartPing默认WEB服务端口为8899，管理界面默认密码为:smartping,若需要修改请修改conf/config.json或conf/config-base.json**
```

## 源码安装

### 基本依赖

* Go 语言：版本 >= 1.6

### 安装GO语言

如果您的系统已经安装要求版本的 Go 语言，可以跳过。

安装参考：<https://studygolang.com/dl>

### 源码编译

克隆或直接下载ZIP的源码包

* git clone <https://github.com/gy-games/smartping.git>
* cd smartping
* * **Linux:** ./control build
* * **Windows:** control.cmd build

### 运行程序

* * **Linux:** ./control start
*

```
* **Windows:** control.cmd start
```

```
**SmartPing默认WEB服务端口为8899，管理界面默认密码为:smartping,若需要修改请修改conf/config.json或conf/config-base.json**
```


# 配置说明

SmartPing从0.3.0版本开始，配置可以使用WEB界面修改。

## 配置修改节点

![](/files/-MHg-j7z5-WpWhInW7cJ)配置修改节点分为4个大部分

1. 保存配置，对于2，3，4上的操作修改完后均为暂存，需要在此输入密码后保存才可生效，可以在此切换至云模式
2. 基础配置，分为基础、Ping拓扑、邮件报警、检测工具、授权管理几个大功能
   1. 基础
      1. 接口超时(秒)：本节点访问其他节点的Ajax超时时间
      2. 页面刷新(分钟)：页面的定时刷新时间（暂时只用在了Ping拓扑上，设计是除配置外所有页面，有需要可以在源码上修改一下）
      3. 数据存数（天）：正向Ping、拓扑报警、全国延迟的存档天数
   2. Ping拓扑
      1. 报警声音：触发报警规则时的报警声音
      2. 连线粗细：Ping拓扑的连线粗细
      3. 形状大小：Ping拓扑的形状大小
   3. 报警邮件
      1. 邮件服务器：发送邮件的服务器
      2. 发件邮箱：发送邮件的邮箱地址
      3. 发件邮箱密码：发送邮件的邮箱密码
      4. 收件邮箱列表：收信邮箱，多个以;隔开
   4. 检测工具
      1. 限定频率（秒）：工具的CD时间（以源IP唯一计算）
   5. 授权管理
      1. 用户IP列表：设置后仅允许设置的IP访问，多个以逗号隔开
3. Ping节点测试网络
   1. 添加节点，添加后默认开启正向Ping与Ping拓扑
   2. 正向Ping配置，可以自定义选择开启哪些正向Ping
   3. Ping拓扑，可以自定义选择开启哪些Ping拓扑以及设置报警规则
4. 全国延迟测试网络
   1. 添加各省份电信、联通、移动的目标测试IP

## 备注

* 首次运行SmartPing时，SmartPing默认优先读取conf/config.json文件，若无此文件，则读取conf/config-base.json文件
* 若需要修改密码，需要手工修改conf/config.json或conf/config-base.json文件中的password字段，并重启SmartPing


# 脚本参数

smartping采用脚本调用方式运行，Linux使用 ./control , Windows使用 control.cmd

## Linux

&#x20;**./control**

```
build|run|start|stop|restart|status

build   : 源码编译，最终构建成至 bin
run     : 直接启动smartping
start   : 以nohup(deamon)形式启动smartping
stop    : 关闭smartping
restart : 执行 stop & start
status  : 查看smartping的运行状态
version : 查看当前smartping版本
pack    : 执行Build并进行二进制包制作
```

## Windows

&#x20;**control.cmd**&#x20;

```
build|run|install|start|stop|restart|version

build   : 源码编译，最终构建成至 bin
run     : 直接启动smartping
install : 使用nssm将smartping安装为服务
start   : 启动smartping服务
stop    : 关闭smartping服务
restart : 执行 stop & start
version : 显示当前smartping版本
```


# API文档

SmartPing所有的数据均可以通过各点的程序通过HTTP方式获取（SmartPing Dashbord数据的展示同样调用以上接口获取），SmartPing的API接口均以打开Access-Control-Allow-Origin:\*支持跨域。

| **名称**                      | **METHOD** | **URI**            | **介绍**                  |
| --------------------------- | ---------- | ------------------ | ----------------------- |
| [当前节点配置信息](/api/config)     | GET        | /api/config.json   | 获取当前节点的配置信息             |
| [PING目标机器数据](/api/ping)     | GET        | /api/ping.json     | 获取当前节点对外的PING数据         |
| [PING目标机器状态](/api/topology) | GET        | /api/topology.json | 获取当前节点PING外部的状态数据（用于拓扑） |
| [PING目标机器报警数据](/api/alert)  | GET        | /api/alert.json    | 获取当前的报警数据               |
| [PING全国延迟](/api/mapping)    | GET        | /api/mapping.json  | 获取当前机器全国延迟数据            |
| [PING工具](/api/tools)        | GET        | /api/tools.json    | 测试目标机器获取数据              |


# config

本接口将返回该节点的配置信息

## 接口方法

GET

## 接口地址

/api/config.json

## 接口入参

无

## 接口数据

```
{
    "Ver": "0.8.0",
    "Port": 8899,
    "Name": "本机",
    "Addr": "127.0.0.1",
    "Mode": {
        "Endpoint": "",
        "LastSuccTime": "",
        "Status": "true",
        "Type": "local"
    },
    "Base": {
        "Archive": 10,
        "Refresh": 1,
        "Timeout": 5
    },
    "Topology": {
        "Tline": "1",
        "Tsound": "/alert.mp3",
        "Tsymbolsize": "70"
    },
    "Alert": {
        "EmailHost": "",
        "RevcEmailList": "",
        "SendEmailAccount": "",
        "SendEmailPassword": ""
    },
    "Network": {
        "1.2.3.4": {
            "Name": "OtherSP",
            "Addr": "1.2.3.4",
            "Smartping": true,
            "Ping": [
                "114.114.114.114",
                "127.0.0.1",
                "8.8.4.4"
            ],
            "Topology": [
                {
                    "Addr": "127.0.0.1",
                    "Name": "本机",
                    "Thdavgdelay": "200",
                    "Thdchecksec": "900",
                    "Thdloss": "30",
                    "Thdoccnum": "3"
                },
                {
                    "Addr": "114.114.114.114",
                    "Name": "114DNS",
                    "Thdavgdelay": "200",
                    "Thdchecksec": "900",
                    "Thdloss": "30",
                    "Thdoccnum": "3"
                },
                {
                    "Addr": "8.8.4.4",
                    "Name": "GoogleDNS",
                    "Thdavgdelay": "200",
                    "Thdchecksec": "900",
                    "Thdloss": "30",
                    "Thdoccnum": "3"
                },
                {
                    "Addr": "1.2.3.4",
                    "Name": "OtherSP",
                    "Thdavgdelay": "200",
                    "Thdchecksec": "900",
                    "Thdloss": "30",
                    "Thdoccnum": "3"
                }
            ]
        },
        "114.114.114.114": {
            "Name": "114DNS",
            "Addr": "114.114.114.114",
            "Smartping": false,
            "Ping": [],
            "Topology": []
        },
        "123.125.114.144": {
            "Name": "百度",
            "Addr": "123.125.114.144",
            "Smartping": false,
            "Ping": [],
            "Topology": []
        },
        "127.0.0.1": {
            "Name": "本机",
            "Addr": "127.0.0.1",
            "Smartping": true,
            "Ping": [
                "1.2.3.4",
                "114.114.114.114",
                "123.125.114.144",
                "127.0.0.1",
                "69.171.229.28",
                "8.8.4.4"
            ],
            "Topology": [
                {
                    "Addr": "1.2.3.4",
                    "Name": "OtherSP",
                    "Thdavgdelay": "200",
                    "Thdchecksec": "900",
                    "Thdloss": "30",
                    "Thdoccnum": "3"
                },
                {
                    "Addr": "114.114.114.114",
                    "Name": "114DNS",
                    "Thdavgdelay": "200",
                    "Thdchecksec": "900",
                    "Thdloss": "30",
                    "Thdoccnum": "3"
                },
                {
                    "Addr": "8.8.4.4",
                    "Name": "GoogleDNS",
                    "Thdavgdelay": "200",
                    "Thdchecksec": "900",
                    "Thdloss": "10",
                    "Thdoccnum": "3"
                },
                {
                    "Addr": "69.171.229.28",
                    "Name": "Facebook",
                    "Thdavgdelay": "200",
                    "Thdchecksec": "900",
                    "Thdloss": "30",
                    "Thdoccnum": "3"
                },
                {
                    "Addr": "123.125.114.144",
                    "Name": "百度",
                    "Thdavgdelay": "200",
                    "Thdchecksec": "900",
                    "Thdloss": "30",
                    "Thdoccnum": "3"
                }
            ]
        },
        "69.171.229.28": {
            "Name": "Facebook",
            "Addr": "69.171.229.28",
            "Smartping": false,
            "Ping": [],
            "Topology": []
        },
        "8.8.4.4": {
            "Name": "GoogleDNS",
            "Addr": "8.8.4.4",
            "Smartping": false,
            "Ping": [],
            "Topology": []
        }
    },
    "Chinamap": {
        "上海": {
            "cmcc": [
                "117.184.42.114"
            ],
            "ctcc": [
                "180.163.15.160"
            ],
            "cucc": [
                "223.167.104.117"
            ]
        },
        "北京": {
            "cmcc": [
                "111.13.217.125"
            ],
            "ctcc": [
                "120.92.180.135"
            ],
            "cucc": [
                "111.207.189.5"
            ]
        },
        "广东": {
            "cmcc": [
                "120.236.14.140"
            ],
            "ctcc": [
                "218.17.216.171"
            ],
            "cucc": [
                "58.252.2.194"
            ]
        },
        "浙江": {
            "cmcc": [
                "183.246.69.139"
            ],
            "ctcc": [
                "115.236.169.86"
            ],
            "cucc": [
                "60.12.214.156"
            ]
        }
    },
    "Toollimit": 0,
    "Authiplist": "",
    "Password": ""
}
```


# ping

本节点将返回该节点的正向PING数据，默认不传参的情况下将显示两小时内的数据，可以传入开始时间与结束时间显示响应数据

## 接口方法

GET

## 接口地址

/api/ping.json

## 接口入参

| **参数**    | **格式**           | **示例**           |
| --------- | ---------------- | ---------------- |
| ip        | ip               | 127.0.0.1        |
| starttime | yyyy-mm-dd hh:ii | 2017-09-14 14:44 |
| endtime   | yyyy-mm-dd hh:ii | 2017-09-14 14:44 |

## 接口数据

```
{
    "avgdelay": [                        #平均延迟
        "248",
        "252",
        "250",
        "251"
    ],
    "lastcheck": [                        #检测时间
        "2017-09-16 16:10",
        "2017-09-16 16:11",
        "2017-09-16 16:12",
        "2017-09-16 16:13"
    ],
    "losspk": [                           #丢包率
        "0",
        "0",
        "0",
        "0"
    ],
    "maxdelay": [                         #最大延迟
        "254",
        "257",
        "255",
        "254"
    ],
    "mindelay": [                          #最小延迟
        "247",
        "246",
        "247",
        "247"
    ]
}
```


# topology

本节点将返回经过报警规则过滤后的目标节点状态,SmartPing Dashbord使用此数据来绘制拓扑

## 接口方法

GET

## 接口地址

/api/topology.json

## 接口入参

无

## 接口数据

```
{
    "1.2.3.4": "false",
    "114.114.114.114": "true",
    "123.125.114.144": "true",
    "69.171.229.28": "false",
    "8.8.4.4": "false"
}
```

目标节点IP->状态(treu,false)


# alert

本节点将返回有效时间区域内的报警信息，默认参数为空时显示当日数据。注意：报警每分钟进行检测

## 接口方法

GET

## 接口地址

/api/alert.json

## 接口入参

| **参数** | **格式**     | **示例**     |
| ------ | ---------- | ---------- |
| date   | yyyy-mm-dd | 2017-09-16 |

## 接口数据

```
[
    [
        "2017-09-15",                    #报警日期列表
        "2017-09-16"
    ],
    [
        {
            "Logtime": "2017-09-16 15:22",      #报警时间
            "Targetip": "127.0.0.1",      #来源名称
            "Targetname": "114DNS",                 #目标名称
            "Tracert": "..."                    #MTR信息
        },
        {
            "Logtime": "2017-09-16 15:22",
            "Targetip": "127.0.0.2",
            "Targetname": "NOPING",
            "Tracert": "..."
        }
    ]
]
```


# mapping

本节点将返回全国延迟Ping数据，不加参数默认显示前一分钟的数据

## 接口方法

GET

## 接口地址

/api/mapping.json

## 接口入参

| **参数** | **格式**           | **示例**           |
| ------ | ---------------- | ---------------- |
| d      | yyyy-mm-dd hh:mm | 2017-09-16 10:20 |

## 接口数据

```
{
    "text": "本机",
    "subtext": "2019-07-02 16:02",
    "avgdelay": {
        "cmcc": [{                       //中国移动
            "value": 5.34,
            "name": "北京"
        }, {
            "value": 28.99,
            "name": "上海"
        }],
        "ctcc": [{                       //中国电信
            "value": 27.33,
            "name": "上海"
        }, {
            "value": 29,
            "name": "北京"
        }],
        "cucc": [{                      //中国联通
            "value": 3.33,
            "name": "北京"
        }, {
            "value": 28.99,
            "name": "上海"
        }]
    }
}
```


# tools

本节点将返回目标Ping结果数据，默认Ping5个数据包

## 接口方法

GET

## 接口地址

/api/tools.json

## 接口入参

| **参数** | **格式**       | **示例**                    |
| ------ | ------------ | ------------------------- |
| t      | ip or domain | 127.0.0.1 / smartping.org |

## 接口数据

```
{
    "status": "true",
    "error": "",
    "ip": "127.0.0.1",
    "ping": {
        "SendPk": 5,
        "RevcPk": 5,
        "LossPk": 0,
        "MinDelay": 0,
        "AvgDelay": 0.59982,
        "MaxDelay": 0.9997
    }
}
```


# 设计思路


# 数据去中心化

去中心化设计是SmartPing的一大特点，这里的去中心化并非集群概念，而是与分布式更加接近，简单点理解及数据分布式存储，各节点通过互相调用保持数据展示的统一性。

## 实例

如在我们的网络中存在三个对等节点A，B，C；三个节点之间将产生3!(3*2*1)=6条交互数据，在SmartPing中，每个节点存储相同的配置数据(Conf)，检测数据只存储目标为其他节点的数据，及A存储 A->B|A->C , B存储B->C|B-A，C存储C->A|C->B的数据， 当用户访问任意一个节点时，用户在前端进行各节点的数据汇总使各节点的数据展示在前端上保持一致。

![](/files/-LilIyAOATxaOhu5UdGz)


# 存储数据结构

SmartPing采用Sqlite进行数据存储，且数据结构非常简单，如果需要二次开发且对数据库操作比较熟悉，可以直接在此取数据

打开SmartPing的Sqlite数据库后可以看到，SmartPing总共三张表

* pinglog
* alertlog
* mappinglog

## pinglog

pinglog数据表存储正向Ping数据

```
CREATE TABLE pinglog (
    logtime  VARCHAR (16),
    target   VARCHAR (15),
    maxdelay FLOAT,
    mindelay FLOAT,
    avgdelay FLOAT,
    sendpk   INT,
    revcpk   INT,
    losspk   INT
);
```

## alertlog

alertlog存储报警信息

```
CREATE TABLE alertlog (
    logtime    VARCHAR (16),
    targetip   VARCHAR (16),
    targetname VARCHAR (15),
    tracert    TEXT
);
```

## mappinglog

mappinglog存储全国延迟检测信息

```
CREATE TABLE mappinglog (
    logtime DATETIME,
    mapjson TEXT
);
```


# 集中配置管理(云模式)

在我们的实际使用中，当部署的点越来越多，对于配置的更新成本也越来越大，所以从0.5.0+以上的版本我们增加了一个新的功能，云模式，允许一台机器为主配置节点，其他节点在此节点拉取主要配置信息。

![](/files/-MHg-jpSFrfaaIqtK58M)

使用云模式时，需要有一个节点为本地模式，提供配置文件，剩余节点选择云模式，并将本地模式的节点config API配置上，默认为每分钟进行一次数据拉取。


# 更新记录

* **2019.07.02 SMARTPING v0.8.0 RELEASE**

```
- 报警记录挪至Ping拓扑节点，traceroute功能变更为mtr
- 增加全国延迟测试(绘图)功能
- 增加检测工具(检测目标IP网络Ping)功能
- 增加云模式(中心端配置)
- 增加邮件报警功能(附带MTR发送
- 增加用户IP授权功能
- ping图由JS画图切换为由golang生成图片
- 重新设计系统配置界面
- 语言改为中文
- 支持修改数据存档天数
```

* **2018.04.02 SMARTPING v0.5.0 RELEASE**

```
- 增加traceroute功能，当报警时进行Traceroute检测
- 去除sysping功能，仅保留goping，并重写goping
- 正向Ping/反向Ping页面增加定时刷新功能
- 轻微修改配置面板显示
- 代码优化与重构
```

* **2017.09.26 SMARTPING v0.4.1 RELEASE**

```
- 修订拓扑图自身节点显示红线BUG
```

* **2017.09.15 SMARTPING v0.4.0 RELEASE**

```
- 增加日志支持[基于seelog]
- 修订使用系统Ping命令的取值方法，支持Win/Linux/Mac
- 增加用户选择使用系统Ping或GoPing[基于go-fastping]的选项（推荐使用SysPing，若存在兼容性问题时选用-GoPing）
- Windows下增加后台运行服务支持[基于nssm],并可使用双击control.cmd运行SmartPing
- Linux下增加pack指令，可以快速将SmartPing进行编译并打包
- WebDashbord中AgentList更名为SmartPing NetWork
- 修订部分数据类型
```

* **2017.09.16 SMARTPING v0.3.1 RELEASE**

```
- 修订计算算法，每3s发送一个ping包,每分钟发送20个，计算其最高,最低,平均延迟、丢包率。
- API接口header变更为json
- 修复拓扑节点自动刷新失效问题
```

* **2017.09.16 SMARTPING v0.3.0 RELEASE**

```
- 全新的Dashbord设计，支持报警数据存储，配置WEB管理
- 更新数据结构，进行数据拆表
- 开放API接口，Dashbord数据全部采用API接口方式通过Ajax获取
- 修订了一大堆的BUG
- 项目官网上线smartping.org，文档上线docs.smartping.org
```

* **2017.09.12 SMARTPING v0.2.5 RELEASE**

```
 -
```

* **2017.07.17 SMARTPING v0.2.4 RELEASE**

```
 -
```


