需求:
在数据中获取 5 个离当前位置最近的服务器作为目标服务器进行网络测速。以测试图片下载速度的形式对下行网速进行模拟测速,以上传一个随机 1M文件速度对上行速度进行模拟测速;共计 25 秒。该篇文章以测试一个服务器为例模拟网络测速过程。
一、解析 XML 格式 数据
解析数据获取服务器列表:
解析网址数据,并获取 标签下的 server 列表(即获取所有的服务器)。
每一条 数据中包含url(服务器地址)、lat(纬度)、lon(经度)、name(名字)、sponsor(主办者)、id(id 标识)
serversList.png图片网址:
计算当前位置与服务器的距离并选出距离最近的 5 个服务器:
获取每一个服务器的经度(lon)和纬度(lat),并通过SpeedTestTool类中的方法- (void)speedCalculateDistanceWithViewController:(UIViewController *)viewController longitude:(double)longitude latitude:(double)latitude distanceBlock:(DistanceBlock)distanceBlock;计算出该服务器与当前位置的距离,找出离当前位置最近的 5 个服务器分别为 s1、s2、s3、s4、s5。
serverData.png图片网址:
获取地理位置代码示例如下:
[self.speedTool speedCalculateDistanceWithViewController:self longitude:116.3917 latitude:39.9139 distanceBlock:^(double distance, CLLocation * _Nonnull currentLocation) {
NSLog(@"%f,%f,%f",currentLocation.coordinate.longitude,currentLocation.coordinate.latitude,distance);
}];
二、获取网络延迟
获取主机地址:
使用SpeedTestTool类中- (NSString *)speedCutOutUrlString:(NSString *)urlString;方法获取 s1、s2、s3、s4、s5 这5 个服务器url标签中的主机地址。
例:url "http://www2.unicomtest.com:80/speedtest/upload.php"调用这个方法后获取的主机地址就为www2.unicomtest.com。
获取主机地址示例代码如下:
NSString *strUrl = @"http://nmgspeedtest1.ffcs.cn:80/speedtest/upload.jsp";
NSString *mainframe = [self.speedTool speedCutOutUrlString:strUrl];
获取 s1、s2、s3、s4、s5 这5 个服务器的平均网络延迟:
通过STDPingServices类中
+ (STDPingServices *)startPingAddress:(NSString *)address callbackHandler:(void(^)(STDPingItem *item, NSArray *pingItems))handler;方法获取 s1、s2、s3、s4、s5 这5 个服务器的网络延迟。每一个服务器获取 5 次网络延迟,计算这个服务器的平均网络延迟,依照这样的方法计算剩下 4 个服务器的平均网络延迟,最后取得 5 个服务器的平均网络延迟最为最终的网络延迟。
获取网络延迟代码示例如下:
//获取网络延迟
self.pingServices = [STDPingServices startPingAddress:@"www2.unicomtest.com" callbackHandler:^(STDPingItem *pingItem,