MeasurementKit是一个库,实现了开放网络测量方法(性能、审查等)并面向移动平台(Android和iOS)。
它可以嵌入具有特定网络测量需求的第三方应用程序,也可以作为研究人员实现新技术的基础。
目前,它实现了以下高级测试
它包含构建您自己的测试有用的功能模块。更详细地说,它目前实现了
TCP连接(可以用来向端点创建TCP连接、接收和发送数据)
DNS客户端(可以用来使用任意名称服务器解析和反解析A和AAAA记录)
HTTP客户端(可以用来发送HTTP/1.1请求并接收和解析相应的响应)
Android traceroute(可以用来发送带有特定负载和TTL的单个traceroute探测)
短期内计划向MeasurementKit添加
还计划添加的功能包括构建块功能,例如uTP和iOS的traceroute。
以下索引说明了本文件剩余内容的内容
要克隆MeasurementKit仓库,请执行以下操作:
git clone https://github.com/measurement-kit/measurement-kit
如果您需要检出特定分支(例如 feature/foo
)进行测试,请克隆存储库,然后输入:
git fetch origin
git checkout feature/foo
然后按照说明构建和测试MeasurementKit。
要构建,MeasurementKit需要以下内容:
必须启用C++11,否则某些C++11特性(如std::function
)将不会被识别。
MeasurementKit包含并无条件地编译以下项目的源代码
MeasurementKit还依赖于以下项目(这些项目仅按以下说明有条件地编译)
在./configure
脚本中,应该检查所有依赖项是否就绪,并正确配置编译器。如果未找到依赖项,./configure
将回退到存储在src/ext
目录下的依赖项副本。
纯构建过程如下:
autoreconf -i
./configure
make
您也可以使用以下标志强制./configure
选择特定目录中可用的依赖项:
--with-libevent=PREFIX
这告诉./configure
使用在PREFIX安装的libevent库和头文件
--with-yaml-cpp=PREFIX
这告诉./configure
使用在PREFIX安装的yaml-cpp库和头文件
--with-boost=PREFIX
这告诉./configure
使用在PREFIX安装的boost头文件
--with-jansson=PREFIX
这告诉./configure
使用在PREFIX安装的jansson库和头文件
--with-libmaxminddb=PREFIX
这告诉./configure
使用在PREFIX安装的libmaxminddb库和头文件
在所有上述情况下,您也可以指定PREFIX为builtin
,以强制./configure
使用内置源代码。
例如:
/opt/local
(意味着event.h
是/opt/local/include/event.h
而libevent.a
是/opt/local/lib/libevent.a
),使用: ./configure --with-libevent=/opt/local
./configure --with-libevent=builtin
构建了MeasurementKit后,要编译和运行单元测试程序,请运行:
make check
要告诉make减少输出(如Linux内核构建过程),请运行:
make V=0
要编译Android上的MeasurementKit,请参阅位于此存储库中mobile/android
目录下的README.md文件。
要在已安装XCode及其命令行工具的MacOSX系统上编译和使用MeasurementKit,请执行以下操作:
./mobile/ios/scripts/build.sh
CoCoapods的spec文件尚未提交,但您已经可以在项目中使用,只需在Podfile中添加以下一行:
pod 'measurement_kit', :git => 'https://github.com/measurement-kit/measurement-kit.git'
您可以使用以下方式包含另一个分支
pod 'measurement_kit',
:git => 'https://github.com/measurement-kit/measurement-kit.git'
:branch => 'branch_name'
然后输入pod install
并打开.xcworkspace
文件(请注意,不要打开.xcodeproj
文件,因为这不足以编译)。
以下示例展示了如何使用OONI库。
以下第一个示例展示了如何运行同步测试。也就是说,在以下示例中,run调用将阻塞,直到测试完成。(请注意,在这种情况下,测试可能在调用run的同一线程中运行,也可能不在同一线程中运行)。
#include <measurement_kit/ooni.hpp>
// Run sync test
mk::ooni::HttpInvalidRequestLineTest()
.set_backend("http://127.0.0.1/")
.set_verbose()
.on_log([](const char *s) {
// If needed, acquire the proper locks
// Process incoming log line
})
.run();
// Note: run() returns when test is complete
在此第二个示例中,相反,我们展示了如何运行异步测试。在这种情况下,run立即返回,测试在后台线程中运行,当测试完成时,传递给run的回调被调用。
// Run async test
mk::ooni::HttpInvalidRequestLineTest()
.set_backend("http://127.0.0.1/")
.set_verbose()
.on_log([](const char *s) {
// If needed, acquire the proper locks
// Process incoming log line
})
.run([]() {
// If needed, acquire the proper locks
// Handle test completion
});
// Note: run() returns immediately, callback called when done
在这两种情况下,您需要在小回调中保持谨慎,因为通常它们可能会从后台线程中被调用。
您可以在存储库的最后doc/api
文件夹中找到MeasurementKit C++ API的文档。