不知道什么时候起,有款这样的公交 APP, 平时用来查看公交车在哪一站、大概什么时候到,着实方便了本地人的出行。今日对这款应用起了兴趣,便打算开始分析,猜想:是否能够统计各时间段下某两站之间行驶所用时间,存储并处理一周以内的数据,结合节假日信息做出较准确的时间预测,并且可以为此做一份分析报告也是挺有趣的事。

Android 掌上公交源码_Code

        如果要我来写接口,我大概会给每个站点进行标号,在服务端计算好车辆在哪两站之间,大概进度是多少,提供这样两个数据:

StationOut

已经出的站序号

Percentage

距下一站行驶路程已驶过的百分比

       来看看和我拟的样不样。使用 Fiddler 抓包,整理主要的三个 API。先做一点说明:

  1. API 中的 Addr 和 Port 等参数,是从另外的地址里头获取的,不同城市的值不同。
  2. 后来发现这些 API 是一个叫恒宇电子的公司出的智能公交调度系统的组成部分。
  3. 这些接口,以及应用界面...不敢恭维。
  4. 我怎么成了写文档的了…

获取线路列表

地址   http://<Addr:Port>/sdhyschedule/PhoneQueryAction!getLineInfo.shtml

响应(JSON)

lineCode

公交线路 ID

lineName

线路名称

JSON 格式中有一个匿名的、由一组字典组成的列表,字典中主要的有上述两对值,其他键值对均为空,未列出。

获得车辆列表

地址    http://<Addr2:Port2>/

参数

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 入手了。