Купил часы Garmin Fenix 3 HR, и через них захотел контролировать состояние сигнализации Starline GSM, то есть: поставить на сигнализацию, снять с сигнализации, завести, остановить двигатель и т.п.
Потрейсив приложение для Android нашёл следующий протокол:
1. получаем токен:
2. с этим токеном делаем POST
- ответ JSON
- ответ JSON
и повторно пункт 2.
3. далее получаем user_id и Cookie для работы с API (slnet=XXXX)
- ответ JSON + Set-Cookie: slnet=XXXX
4. список устройств
- ответ JSON
5. инфо по устройству
6. постановка на сигнализацию.
- 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.
Потрейсив приложение для 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":{Чтобы снять бан, надо при логине дополнительно ещё передавать параметры captchaSid и распознанный captchaCode:
"message":"Captcha needed.",
"captchaSid":"e98ed10d75ea00da7f5a419d0bc068c6",
"captchaImg":"https:\/\/id.starline.ru\/apiV3\/captcha\/e98ed10d75ea00da7f5a419d0bc068c6"
}}
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=e98ed10d75ea00da7f5a419d0bc068c62.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.
Casino video games are, without any doubt, one of the prevalent pastimes for adults these days. We have all heard tales in regards to the glistening Las Vegas, which has turn into the world's playing capital, and an unlimited variety of folks 카지노사이트 have really seen it with their own eyes. In Vegas, yow will discover 1000's of casinos and experience 1000's of video games. So, let's return in time and learn how exactly the historical past of on line casino video games and the playing industry, in general, did evolve.
ОтветитьУдалить