所谓校园跑我也不想跑,骑车我也不想骑,我就想寝室里跑步😋
注意:以下内容的更新可能不及时,请看我的仓库Campus-Real-Run 中的Readme进行操作。
前置要求
- Python 3.x
- iOS 设备(需要正确安装驱动)
- Windows 管理员权限
安装方法
安装必需的 Python 包:
python -m pip install -U pymobiledevice3
验证安装:
pymobiledevice3 version
确保版本号为 4.14.16 或更高。如果不是,请查看 pymobiledevice3 仓库 获取正确的安装说明。
使用方法
注意
务必仔细阅读以下内容:
- 所有操作都需要管理员权限。请确保以管理员身份运行命令提示符。
- 如果你遇到问题“[winError 10054]远程主机强迫关闭了一个现有的连接。” 请先尝试重启你的电脑和手机,并检查是否有代理软件在后台运行!如果有代理软件,请关闭!
- 如果你是
iOS 17.3
及以下的用户,在第二步START-TUNNEL
时,使用如下命令:python -m pymobiledevice3 remote start-tunnel
。 - 如果你是
iOS 16
及以下的用户,在模拟位置时,请你修改main.py
文件,command = f'pymobiledevice3 developer dvt simulate-location set -- {long} {lat}'
改成:command = f'pymobiledevice3 developer simulate-location set -- {long} {lat}'
。
建立连接
以管理员权限打开命令提示符并运行:
python -m pymobiledevice3 remote tunneld
保持此窗口始终运行。
如果正确运行,你会看到类似以下的输出:
INFO: Started server process [40388]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:49151 (Press CTRL+C to quit)
以管理员权限打开另一个命令提示符并运行:
python -m pymobiledevice3 lockdown start-tunnel
如果正确运行,你会看到类似以下的输出:
2024-10-27 19:59:34 TheUnknownThing pymobiledevice3.cli.remote[16932] INFO tunnel created
Identifier: # UUID OF YOUR DEVICE #
Interface: pywintun
Protocol: TunnelProtocol.TCP
RSD Address: # RSD ADDRESS #
RSD Port: # RSD PORT #
Use the follow connection option:
--rsd #RSD ADDRESS # # RSD PORT #
访问DVT Service
同样以管理员权限打开另一个命令提示符并运行:python -m pymobiledevice3 developer dvt ls /
如果正确运行,你会看到类似以下的输出:
2024-10-27 17:41:29 TheUnknownThing __main__[21244] WARNING Got an InvalidServiceError. Trying again over tunneld since it is a developer command
/usr
/bin
/sbin
/.file
/etc
/System
/var
/Library
/private
/.b
/dev
/tmp
/Applications
/Developer
/cores
此时你已经成功99%了,接下来就是运行模拟器了。
运行位置模拟
本仓库包含两个主要的 Python 脚本:
generate_geojson.py
- 生成 GeoJSON 格式的路线文件main.py
- 模拟沿路线移动
生成路线
generate_geojson.py
脚本会创建一个具有适当坐标间距的路线。你可以通过修改脚本参数来自定义起始坐标和距离:
# 当前默认值:
lon = 121.4276 # 起始经度
lat = 31.19139 # 起始纬度
num_features = 170 # 大约 2 公里的路线
要找到特定位置的坐标,你可以使用高德地图坐标拾取器。
运行模拟
生成路线文件:
python generate_geojson.py
开始位置模拟:
python main.py
如果一切正常,你会看到类似以下的输出:
Simulating location: 31.180029999999924, 121.43895999999957
Simulating location: 31.179949999999923, 121.43903999999957
Simulating location: 31.179869999999923, 121.43911999999956
Simulating location: 31.179789999999922, 121.43919999999956
Simulating location: 31.179709999999922, 121.43927999999956
打开地图应用,你会看到模拟的位置在不断移动。此时你可以开始校园跑活动了!
技术细节
- 坐标间距:脚本使用 0.00006 的经纬度增量来保持真实的跑步步调
- 更新间隔:位置更新每 2.5 秒进行一次,以确保稳定运行
- 路线长度:默认配置生成约 2 公里的路线
已知问题及解决方案
速度注意事项:
- 坐标间距和更新间隔已针对真实跑步速度优化
- 坐标间距过大可能导致无效的速度读数
- 坐标间距过小可能导致系统卡顿
以下内容没有用了!!!请看上面的教程!!!
注意:以下教程基于苹果设备
Disclaimer:
本教程使用的软件GeoPort并未开源!(尽管作者将其放在了Github仓库中,但并未公开任何源代码!)请各位小心使用为好,避免可能的病毒!(截至目前,我并未发现开源替代,浙大之前有个学生写的我运行不起来)我正在编写类似的程序,但学期即将过半,所以我决定暂时先用这个。
这软件用Python开发,使用Flask。(别问我为什么知道,我解包把源代码看了眼)基于PyMobileDevice3实现设备的操作。但是!我要说但是!你们可能会问:你都解包出来了为什么不基于源码自己运行而是用作者未开源的软件?首先我要说第一,这是不道德的;第二,PyMobileDevice3库更新太快了!我自己本地pip install pymoiledevice3,获得的import内容其中有些函数就是和作者代码对不上!然后这个库documentation做的非常垃圾,我目前还没有找到解决方案来让程序跑起来。
为什么不用爱思助手?
你用过就会发现,爱思助手的虚拟定位会在当前位置和模拟的位置之间横跳,导致无法跑步成功。
软件使用指南
连接设备(确保你在电脑上正确安装了设备驱动,对于小白我推荐直接安装个爱思助手连接设备让软件帮你安装)。
地图(可能需要魔法上网才能打开,确保你的网络环境通畅)
- 右侧第一个按钮上传是上传
geojson
文件(代表模拟的路径,我后续会讲) - 第二个按钮是保存你目前画的路径到
geojson
文件 - 第三个按钮是开始模拟路径
- 第四个按钮有两种状态,通过点击切换:(1)图示状态是选择单个点,双击地图选点;(2)再次点击按钮,变成笔的状态,单击地图上的多个点,可以构建路径
- 第五个按钮是速度选择
- 第六个是清除所有的选点
接下来讲一下geojson
文件:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[121.4276,31.19139],
[121.42768,31.191309999999998],
[121.42768,31.191309999999998]
]
},
"properties": {}
}
}
这个文件大概长上面这样,coordinates
里面第一个坐标和第二个坐标表示的是地图上线的起点和终点。
导入这个文件(我在后面会教如何生成geojson
以及我踩的坑)选择速度为Run
,按下启动即可开始跑步。
我踩的坑
1. geojson
各个coordinates的间距应该如何选取?
因为交大校园跑你不能在一点停留太久(比如两点距离很长,然后你模拟跑步速度,可能10秒才能从一点到另一点,这个时候你会发现你的配速要么太快要么太慢,反正就是没办法记录进去)。但是,因为软件设置location是需要时间的,所以你两点的间距也不能太短,不然的话软件就会一直疯狂的设置位置然后很卡。
经过我的试验,我发现:坐标x
每次增加0.00008,y
也每次增加0.00008,(或者你算一下勾股定理,x
增加0.00008sqrt(2),y
不增加也可以)此时你在软件中选择跑步的速度,坐标更新的速度为3.5s,属于不会卡死软件,同时校园跑也认定有效的速度。
这里我提供一个python
文件来帮助大家生成geojson
文件,因为交大没有要求一定要在校园内跑步,所以我坐标就选的很随意了,各位可以根据自己的需求更改。
关于起始的经纬度,各位可以去高德地图开放平台查询:这是网页地址
import json
def generate_geojson(num_features):
"""
生成 GeoJSON 格式的数据
Args:
lon, lat: 起始点的经纬度
0.00008: 两个点之间的经纬度差值,这个值可以根据你的需求调整,建议算一下勾股定理,和这个值保持一致
"""
features = []
lon = 121.4276
lat = 31.19139
for i in range(num_features):
feature = {
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[lon, lat],
[lon + 0.00008, lat - 0.00008],
[lon + 0.00008, lat - 0.00008]
]
},
"properties": {}
}
features.append(feature)
lon += 0.00008
lat -= 0.00008
geojson = {
"type": "FeatureCollection",
"features": features
}
return json.dumps(geojson, indent=4)
# 生成170个点,你自己调整,这样大概是1km多一点
result = generate_geojson(170)
with open('data.geojson', 'w') as f:
f.write(result)
然后将生成的geojson
文件导入软件,即可跑步!
2. 请务必保持软件打开的浏览器页面在前台!最好不要切走!
因为目前的浏览器都会有“切走标签页进入休眠”的机制,而这个软件是一个Flask
应用程序,因此可能会导致位置更新的失败!所以请务必将浏览器页面至于前台!
3. 位置更新到后面怎么不更新了?跑了一公里左右怎么不跑了?
如下图,是一个软件正常运行的示例:
而这种是软件异常的表现(表现为没有Location Set Successfully 的黄字)此时位置也不再更新。我怀疑是因为一段时间内位置更新过多导致的问题。
我一般遇到这种问题都是在跑了1km左右,遇到软件异常应该怎么办?首先,在你的跑步APP上暂停跑步,不需要关闭跑步APP,因为我们有最低的跑步公里1km。其次,关闭软件,再重新打开,重新导入geojson
文件,重新选择速度,开始模拟,然后再恢复跑步(此时你的位置会瞬移到你设置的路径起点,这是比较危险的操作,所以我建议你瞬移完成后再启动跑步,不然有可能会被判定为无效)。
写在最后
当然这个软件使用还是比较复杂的,我也正在开发一个更好用的替代品,但目前来说这个软件还能用,所以也就勉强先用着吧。