0%

利用GPS模拟进行跑步打卡

本文仅作为技术分享,希望大家都能够拥有锻炼的自由,但不鼓励使用技术进行跑步打卡

针对北大的校园体育课跑步打卡,已经有如PKUNoRun这样的开源项目,但是PKUNoRun仅仅支持安卓平台的PKURunner用户,使用如乐动力等其他软件作为打卡方式的并不能很方便的使用。

本文采取的思路为进行GPS定位模拟,从而实际生成跑步轨迹。这种方法的优缺点如下:

  • 优点
    • 操作简单,不需要针对APP进行分析和逆向
    • 通用,可以适用于各种打卡平台和系统
  • 缺点
    • 耗时,需要挂机等同于跑步本身的时间

网络上已有的大多数教程普遍基于Xcode进行实现,但是由于Xcode版本更新以及使用存在门槛,很多开源教程的方法存在过时的问题。这里采用开源工具LocationSimulator进行GPS模拟定位,比使用Xcode更加用户友好。关于LocationSimulator的具体安装以及使用可以参考GitHub上的项目主页,总体使用方法即使用数据线连接手机,选中已连接的设备,之后便可以通过GPX文件或者手动控制的方式进行GPS模拟了。

在完成软件安装之后,则需要确定对应的打卡地点的经纬度坐标,可以考虑直接在LocationSimulator结合手机地图软件进行标点,来确定对应位置的经纬度,也可以考虑使用google地图等别的方式。在操场跑道一圈标上足够多的点之后,可以考虑利用经纬度坐标加上轻微的随机化来生成跑步轨迹对应的GPX文件。

以北京大学五四操场作为打卡地点违例,在确定操场一圈的经纬度坐标之后,便可以采用以下代码进行GPX文件的生成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import random

print("<?xml version=\"1.0\"?>\n<gpx version=\"1.1\" creator=\"Xcode\">\n")

points = [[39.98670783215012, 116.30664405734012],
[39.98618352533768, 116.30672865002087],
[39.98618352533768, 116.30672865002087],
[39.98581016760418, 116.30678898677019],
[39.98571908922798, 116.30689433671324],
[39.98561288688673, 116.30708452367374],
[39.98565674006142, 116.30742482197985],
[39.98570648307997, 116.30754884871082],
[39.98581008421271, 116.30760844737627],
[39.98630069330874, 116.30760921192963],
[39.98680940636073, 116.30751827280433],
[39.98691331279552, 116.30743465659333],
[39.98701527533597, 116.30723729348047],
[39.98702174059007, 116.30706010182425],
[39.98697385542131, 116.30689805739706],
[39.98687734879176, 116.30675655334059]]

for round in range(100):
for lat, lon in points:
print(" <wpt lat=\"{}\" lon=\"{}\"></wpt>\n".format(
lat + random.random() * 0.00005, lon + random.random() * 0.00005))

print("</gpx>")

之后直接运行Python脚本,将标准输出流重定向到文件,即可得到对应的GPX文件。

1
python gen_gpx.py > circle.gpx

在LocationSimulator通过File -> Open GPX File导入GPX文件,此时GPS坐标就已经在操场上进行规律的运动了。在这个时候打开手机上对应的打卡软件便可以足不出户进行跑步打卡了,同时通过在Walk和Cycle模式当中切换可以调节跑步速度,使得最终的平均速度在打卡范围之内。

P.S.

  1. 为保持LocationSimulator可以持续地对GPS定位进行修改,推荐保持电脑/手机屏幕常亮,避免锁屏。

  2. 由于连接有切断风险,所以LocationSimulator默认在断开链接之后仍然保持虚拟GPS,每次使用完记得点击左上角的X进行退出。