GPS定位

M2000网关支持GPS定位,使用 调用RESTful API 调用GPS相关接口:

  • 读取定位状态:GET /cassia/info 响应中的 gps 字段,参考 网关信息获取/设置

  • 开机启用GPS:POST /cassia/info 设置 dongle.gps_startup"1"

  • 请求定位:GET /cassia/gps/request,等待定位成功后返回

备注

  • 需要网关支持 gps 功能(/cassia/info 响应的 features 包含 gps

  • 网关刚启动时GPS模块初始化中,接口可能返回 gps is starting

  • 无卫星信号时 /cassia/gps/request 会长时间阻塞,务必配合 asyncio.wait_for() 设置超时

示例

 1import asyncio
 2import json
 3
 4import cassiablue
 5
 6REQUEST_TIMEOUT_S = 30
 7
 8
 9def dms_to_deg(dms, sign):
10    d, m, s = str(dms).split(".")
11    deg = int(d) + int(m) / 60 + int(s) / 3600
12    return -deg if sign in ("S", "W") else deg
13
14
15def print_gps(gps):
16    if not gps:
17        print("no gps data")
18        return
19
20    lat, lon = gps.get("LAT"), gps.get("LON")
21    if lat and lon:
22        print("lat:", dms_to_deg(lat, gps.get("NS")))
23        print("lon:", dms_to_deg(lon, gps.get("WE")))
24        print("time(UTC):", gps.get("TIME"))
25    else:
26        print("no fix")
27
28    for i in (1, 2, 3):
29        sv = gps.get("SATELLITE%d" % i)
30        if sv:
31            print("satellite:", sv, "snr:", gps.get("SATELLITE%d_SNR" % i))
32
33
34async def read_gps_state():
35    ok, ret = await cassiablue.send_cmd("/cassia/info")
36    if not ok:
37        print("get info failed:", ret)
38        return
39    print_gps(json.loads(ret).get("gps"))
40
41
42async def request_gps():
43    try:
44        ok, ret = await asyncio.wait_for(cassiablue.send_cmd("/cassia/gps/request"), REQUEST_TIMEOUT_S)
45    except asyncio.TimeoutError:
46        print("gps request timeout, no fix yet")
47        return
48
49    if not ok:
50        print("gps request failed:", ret)
51        return
52    print_gps(json.loads(ret).get("gps"))
53
54
55async def main():
56    print("read cached gps state")
57    await read_gps_state()
58
59    print("request gps")
60    await request_gps()
61
62
63asyncio.run(main())

API

请求定位

ok, result = await asyncio.wait_for(cassiablue.send_cmd("/cassia/gps/request"), 30)

定位成功响应示例:

{
  "gps": {
    "TIME": "07:40:09",
    "LON": "117.14.18",
    "LAT": "32.47.21",
    "NS": "N",
    "WE": "E",
    "SATELLITE1": 8,
    "SATELLITE1_SNR": 37,
    "SATELLITE2": 26,
    "SATELLITE2_SNR": 44,
    "SATELLITE3": 31,
    "SATELLITE3_SNR": 46
  }
}
gps字段说明

字段

类型

说明

示例

TIME

str

UTC时间

07:40:09

LON

str

经度(度.分.秒格式)

117.14.18

LAT

str

纬度(度.分.秒格式)

32.47.21

NS

str

南北半球(N 北纬 S 南纬)

N

WE

str

东西半球(E 东经 W 西经)

E

SATELLITE1~3

int

卫星编号(0表示无)

8

SATELLITE1~3_SNR

int

卫星信噪比

37

坐标格式

LAT / LON度.分.秒 格式,非十进制度,换算方式:

32.47.21 = 32 + 47/60 + 21/3600 = 32.789167

NSSWEW 时,对应坐标取负值。

读取定位状态

GET /cassia/info 响应中的 gps 字段为最近一次定位状态,字段与上表一致,未定位时 LAT / LON 为空字符串。

开机启用GPS

body = json.dumps({"dongle": {"gps_startup": "1"}})
ok, result = await cassiablue.send_cmd("/cassia/info", "POST", None, body)

设置方式参考 网关信息获取/设置,配置变更后网关会重启,重启后自动开启GPS。