不知道什么时候起,有款这样的公交 APP, 平时用来查看公交车在哪一站、大概什么时候到,着实方便了本地人的出行。今日对这款应用起了兴趣,便打算开始分析,猜想:是否能够统计各时间段下某两站之间行驶所用时间,存储并处理一周以内的数据,结合节假日信息做出较准确的时间预测,并且可以为此做一份分析报告也是挺有趣的事。
如果要我来写接口,我大概会给每个站点进行标号,在服务端计算好车辆在哪两站之间,大概进度是多少,提供这样两个数据:
StationOut | 已经出的站序号 |
Percentage | 距下一站行驶路程已驶过的百分比 |
来看看和我拟的样不样。使用 Fiddler 抓包,整理主要的三个 API。先做一点说明:
- API 中的 Addr 和 Port 等参数,是从另外的地址里头获取的,不同城市的值不同。
- 后来发现这些 API 是一个叫恒宇电子的公司出的智能公交调度系统的组成部分。
- 这些接口,以及应用界面...不敢恭维。
- 我怎么成了写文档的了…
获取线路列表
地址 http://<Addr:Port>/sdhyschedule/PhoneQueryAction!getLineInfo.shtml
响应(JSON)
lineCode | 公交线路 ID |
lineName | 线路名称 |
JSON 格式中有一个匿名的、由一组字典组成的列表,字典中主要的有上述两对值,其他键值对均为空,未列出。
获得车辆列表
参数
lineCode | 线路编号 |
sxx | 上下行:1. 上行 2. 下行 |
IMEI | 客户端 IMEI 号 |
响应
一个 JSON 列表,包含若干个字典。字典中的键如下表:
Speed | 车速(km/h) |
busCode | 车辆编号 |
cph | 车牌号 |
flag | 总为 0 |
isTravel | 总为 2 |
lat | 纬度(Latitude) |
lineCode | 线路编号 |
lon | 经度(Longitude) |
lx | 2 : 正常行驶 0 : 停车 1 : 出站 |
passStation | 剩余站数 |
sxx | 上下行 |
获取线路停靠站
地址 http://<Addr>:<Port>/sdhyschedule/PhoneQueryAction!getLineStation.shtml
参数
lineCode | 线路编号 |
响应
一个 lineList 列表,包含若干字典,字典键如下:
beginStation | 始发站 |
endStation | 终点站 |
lineCode | 线路编号 |
lineName | 线路名称 |
maxOrder | 最大站序 |
minOrder | 最小站序 |
stationOrder | 站序,从1开始 |
staDis | 两位浮点数,站距 |
sxx | 上下行 |
lat | 纬度 |
lon | 经度 |
经过整理发现了接口提供的很有用的数据,现在已经可以获取站和车辆的位置,三个接口也确实能将 线路 - 车站 - 车辆 结合,但是仍然无法动态更新车与车站之间的距离。如果整条线路是直线,还可以使用经纬度配合勾股定理进行计算,但如果遇到拐弯怎么解决?暂时还没想明白。但是在抓包过程中未发现其他相关的有用的接口,看来只能从逆向分析 APP 入手了。