Страницы

среда, 24 августа 2016 г.

Starline GSM API

Купил часы Garmin Fenix 3 HR, и через них захотел контролировать состояние сигнализации Starline GSM, то есть: поставить на сигнализацию, снять с сигнализации, завести, остановить двигатель и т.п.

Потрейсив приложение для Android нашёл следующий протокол:


1. получаем токен:
https://id.starline.ru/apiV3/application/getToken?appId=4&secret=82f4ec68b8769dcda04a76735b93ebc4
  - ответ JSON
  {"state":1,"desc":{"token":"b8da62a75e06b929c3ddb7XXXXXX87ff66690bb70c3e6314e75d2c86e62bcaba7f"}}

2. с этим токеном делаем POST
POST https://id.starline.ru/apiV3/user/login HTTP/1.1
token: b8da62a75e06b929c3ddb7XXXXXX87ff66690bb70c3e6314e75d2c86e62bcaba7f
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
pass=sha1(pass)&login=e-mail

  - ответ JSON
  {"state":1,"desc":{"user_token":"184c214XXXXXXa7461ba31942741XX87:33XX68","roles":["user"]}}
В случае ошибки "state" будет 0, например, ошибка в логине/пароле. Далее IP вносится в чёрный список на несколько минут. И будет предлагаться распознать капчу:
{"state":0,"desc":{
    "message":"Captcha needed.",
     "captchaSid":"e98ed10d75ea00da7f5a419d0bc068c6",
     "captchaImg":"https:\/\/id.starline.ru\/apiV3\/captcha\/e98ed10d75ea00da7f5a419d0bc068c6"
}}
Чтобы снять бан, надо при логине дополнительно ещё передавать параметры captchaSid и распознанный captchaCode:
POST https://id.starline.ru/apiV3/user/login HTTP/1.1
token: b8da62a75e06b929c3ddb7XXXXXX87ff66690bb70c3e6314e75d2c86e62bcaba7f
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
pass=sha1(pass)&login=e-mail&captchaCode=gasc&captchaSid=e98ed10d75ea00da7f5a419d0bc068c6
2.a усиление авторизации (хз зачем делается, но иногда оно получает поновой токен, но уже с user_token пареметром, я думаю на это можно забить вообще)
GET https://id.starline.ru/apiV3/application/getToken?appId=4&secret=82f4ec68b8769dcda04a76735b93ebc4&user_token=184c214XXXXXXa7461ba31942741XX87:33XX68 HTTP/1.1
token: b8da62a75e06b929c3ddb7XXXXXX87ff66690bb70c3e6314e75d2c86e62bcaba7f

  - ответ JSON
   {"state":1,"desc":{"token":"97c4d6c177217f322dcXXXXXXca3d063fd4fba507191c896ac6887ae52fdXX5e"}}

и повторно пункт 2.

3. далее получаем user_id и Cookie для работы с API (slnet=XXXX)
POST https://dev.starline.ru/json/v2/auth.slid HTTP/1.1
User-Agent: Mozilla/5.0
Content-Type: application/json; charset=utf-8 
{"slid_token":"184c214XXXXXXa7461ba31942741XX87:33XX68","app.data":{"os_type":"Android","os_version":"23:6.0.1","app_version":"4.0.299","phone_model":"SAMSUNG-SM-G891A","network_type":"WIFI","theme":"black","language":"en","locale":"United States"}}

  - ответ JSON + Set-Cookie: slnet=XXXX
  { "code" : "200", "codestring" : "OK",
"realplexor_id" : "F002E2412XXXXXX44B84AD02AC34XXFB",
"user_id" : "333XXX"}

4. список устройств
GET https://dev.starline.ru/json/user/333XXX/devices HTTP/1.1
Cookie: slnet=F16BE04AXXXXXXE8446EE49EFDC9XX02

- ответ JSON
{"devices":[{"activity":"2016-08-23 18:50:56","device_id":"97XXXX3","has_alarms":"0","name":"AMG","online":"1","type":"16","typename":"GSM Alarm"},{"activity":"2016-08-23 09:13:21","device_id":"35XXXX0393XXXX8","has_alarms":"0","name":"BMW","online":"0","type":"6","typename":"GPS Tracker"}],"shared_devices":null,"code":200,"codestring":"OK"}

5. инфо по устройству
GET https://dev.starline.ru/json/device/97XXXX3 HTTP/1.1
Cookie: slnet=F16BE04AXXXXXXE8446EE49EFDC9XX02

- ответ JSON
{
"code" : "200",
"codestring" : "OK",
"device" : {
"adv_state" : {
"balance" : XXX,
"battery" : "12.740000",
"ctemp" : "29",
"etemp" : "25"
},
"info" : {
"controls" : [
"ign",
"arm",
"poke",
"arm_stop",
"arm_start",
"call"
],
"device_id" : "97XXXX3",
"frm_version" : "xxx",
"functions" : [
"adv_controls",
"adv_guard",
"adv_state",
"controls",
"events",
"info",
"mon_cfg",
"obd_params",
"offless_hijack",
"position",
"push",
"rstart_cfg",
"shock_cfg",
"state",
"tracking"
],
"name" : "AMG",
"owner_tel" : "+7XXXXXXXXX",
"sn" : "",
"tel" : "79XXXXXXXXX",
"type" : "16",
"typename" : "GSM Alarm"
},
"position" : {
"lat" : "XX.XX3187",
"lon" : "XX.XX2926",
"ts" : "2016-08-23 18:36:12"
},
"state" : {
"add_sens_bpass" : "0",
"alarm" : "0",
"arm" : "1",
"balance" : XXX,
"battery" : "12.740000",
"ctemp" : "29",
"door" : "0",
"etemp" : "25",
"gps" : "5",
"gsm" : "28",
"hbrake" : "0",
"hijack" : "0",
"hood" : "0",
"ign" : "0",
"key" : "0",
"online" : "1",
"out" : "0",
"pbrake" : "0",
"poke" : "0",
"shock" : "0",
"shock_bpass" : "0",
"tilt" : "0",
"tilt_bpass" : "0",
"trunk" : "0",
"valet" : "0",
"webasto" : "0"
}
},
"info" : {
"device_id" : "97XXXX3"
}
}

6. постановка на сигнализацию.
POST https://dev.starline.ru/json/device/97XXXX3/set_param HTTP/1.1
Content-Type: application/json; charset=utf-8
Cookie: slnet=F16BE04AXXXXXXE8446EE49EFDC9XX02 
{"arm":1}
  - ответ JSON
  {
"add_sens_bpass" : "0",
"alarm" : "0",
"arm" : "1",
"code" : 200,
"codestring" : "OK",
"door" : "0",
"hbrake" : "0",
"hijack" : "0",
"hood" : "0",
"ign" : "0",
"out" : "0",
"pbrake" : "0",
"poke" : "0",
"r_start" : "0",
"reply_code" : null,
"run" : "0",
"shock_bpass" : "0",
"tilt_bpass" : "0",
"trunk" : "0",
"type" : "command_reply",
"valet" : "0"
Вот и всё. Сделал приложение, работает, но пару проблем есть, одна неразрешимая:
- Monkey C makeWebRequest не даёт доступа к Reponse Header, так что Set-Cookie: slnet= не достать. Написал на форум garmin, ответили попробовать, попробовал - не проканало :-). Решение - захардкодил Cookie, можно это делать через приложение компаньон, но только для этого делать, чтобы извлечь куки из одного запроса... почему в Starline не вернули сессию в JSON?
-  для авторизации пароль не передаётся как plain-text что по идее хорошо + TLS, как бы хорошо, можно это было бы усилить через RSA, ведь мне достаточно знать и sha1 этого ключа чтобы работать с протоколом. Но это бы только добавило проблем во время трейса) и отсюда проблема - теперь писать sha1 алгоритм на Monkey C. что не очень быстро. (512 байт + 80 итераций) получаем 5 хешей по 32 бита = 160 бит.

Написал шлюз для примера на AWS Lambda, чтобы можно было работать на часах Garmin.