0
Answered

работа со сторонним API

BlackAngel 8 years ago in Products / AV & Custom Systems updated 8 years ago 14

Доброго дня! подскажите как реализовать данную задачу: есть устройство которое управляется посредством API через интернет, первое что нужно сделать это устройству отправить POST запрос на принятие slid_token:

Адрес:

http://***********.ru:4444/json/v2/auth.slid

Запрос:

{ "slid_token" : "123456789:987654321" }


в случае отправки правильного токена, прилетает такая инфа:


{

"code": "200",
"codestring": "OK",
"realplexor_id": "******************************************",
"user_id": "555555"

}


в случае не правильного:


{

"code": "401",
"codestring": "Bad slid token"
}


Помогите в иридиуме сделать кнопку при нажатии на которую пройдет отправка токена, и несколько окон 1. значаение "code" 2. "codestring" 3. "user_id"


очень хотелось бы получить пример, далее буду пробовать сам. Сильно не пинайте, только учусь писать драйвера.

и да, немаловажно! что для дальнейшей работы с API нужно что бы хранилось куки и каждый раз отправлялось с запросом....

+1

Куки нужно будет сохранять самостоятельно, в переменную проекта

+1
Answered

Здравствуйте


POST разпросы в Иридиум формируются так. В вашем случае должно получиться:

URI: /json/v2/auth.slid

Data: 'slid_token" : "123456789:987654321'


Настройка HTTP драйвера:

Host: ***********.ru

Port: 4444



Полученные данные нужно обработать с помощью слушателя

IR.AddListener(IR.EVENT_RECEIVE_TEXT, IR.GetDevice("AV (HTTP)"), function(text) 
{
    IR.Log("received: " + text);
}

Пример по ссылке.

статусы реализовал но вот маленькая загвостка у меня... в общем: при запросе инфы о сигналке


приходит такой json:

{
"code": 200,
"codestring": "OK",
"devices": [
{
"alias": "DEMO",
"balance": 50,
"battery": 12.09,
"car_alr_state": {
"add_h": null,
"add_l": null,
"door": 2,
"hbrake": null,
"hijack": null,
"hood": 2,
"ign": 2,
"pbrake": null,
"shock_h": null,
"shock_l": null,
"tilt": null,
"trunk": 2
},
"car_state": {
"add_sens_bpass": 0,
"alarm": 2,
"arm": 1,
"door": 2,
"hbrake": 2,
"hijack": 2,
"hood": 2,
"ign": 2,
"out": 2,
"pbrake": null,
"r_start": 2,
"run": 2,
"shock_bpass": 0,
"tilt_bpass": 0,
"trunk": 2,
"valet": 2,
"webasto": 2
},
"ctemp": 23,
"device_id": "",
"etemp": 23,
"fw_version": "FG53-J7,FI24-L2",
"gps_lvl": 8,
"gsm_lvl": 18,
"imei": "",
"mayak_temp": 50,
"mon_type": 2,
"phone": " ",
"position": {
"dir": null,
"s": null,
"sat_qty": 8,
"ts":,
"x": "",
"y": ""
},
"reg": null,
"rpl_channel": null,
"sn": "",
"status": 1,
"ts_activity": 516480691,
"type": 16
}
],
"shared_devices": []
}

в иридиуме в логах вижу только: "alias":
"DEMO",
"balance": 50,
"battery": 12.09,

подозреваю что это связано с тем что танный json содержит не один обьект... в общем я накатал так:

//Анализируем JSON ответ
if (JSONObject.code == 200)
{
if (JSONObject.devices != undefined)
{
if (JSONObject.devices.length >0)
{
//Получаем данные статусов найденного устройства
s_alias = JSONObject.devices[0].alias;
s_balance = JSONObject.devices[0].balance;
s_battery = JSONObject.devices[0].battery;
IR.Log("alias " + s_alias);
IR.Log("balance " + s_balance);
IR.Log("battery " + s_battery);
//Получаем статусы car_alr_state
if (JSONObject.car_alr_state >0)
{
s_add_h = JSONObject.car_alr_state[0].add_h;
s_add_l = JSONObject.car_alr_state[0].add_l;
s_door = JSONObject.car_alr_state[0].door;
s_hbrake = JSONObject.car_alr_state[0].hbrake;
s_hijack = JSONObject.car_alr_state[0].hijack;
s_hood = JSONObject.car_alr_state[0].hood;
s_ign = JSONObject.car_alr_state[0].ign;
IR.Log("door " + s_door);
IR.GetItem("Page 1").GetItem("arm").Text = JSONObject.car_alr_state.door;
}
//IR.Log("door " + s_door);
//IR.GetItem("Page 1").GetItem("arm").Text = JSONObject.devices[0].door;
}
}
}

и нема

"С вопросом выше разобрался, надо было: s_add_h = JSONObject.devices[0].car_alr_state.add_h;

остальное по такому же принципу.

теперь загвостка в следующем, json приходит как text....
соответственно если я в итем: IR.GetItem("Page 1").GetItem("arm").Text = JSONObject.devices[0].car_alr_state.door; то в итеме вижу значение (к примеру "2", бывают значения "1","2","3","4")

мне надо чтобы итем менял статус по этому значению, делаю так: IR.GetItem("Page 1").GetItem("arm").Value = JSONObject.devices[0].car_alr_state.door; но итем не меняет статусы... полагаю что он не понимает что это значение, думает что текст и не отрабатывает.... как его сделать значением???"

+1

Попробуйте для смены состояния итема использовать не параметр Value, а параметр State. Т.е.

IR.GetItem("Page 1").GetItem("arm").State = JSONObject.devices[0].car_alr_state.door;

Гуд! сработало! только надо учесть что в проекте надо статус делать с учетом: приходящее число +1.

теперь задачка поинтереснее.... но походу я сам с ней не справлюсь.... и даже не знаю возможно ли это сделать....


в общем при выше описанных функциях:


//Получаем статусы Position

s_dir = JSONObject.devices[0].position.dir;
s_s = JSONObject.devices[0].position.s;
s_sat_qty = JSONObject.devices[0].position.sat_qty;
s_ts = JSONObject.devices[0].position.ts;
s_x = JSONObject.devices[0].position.x;
s_y = JSONObject.devices[0].position.y;

//Выводим в лог данные Position

IR.Log("dir " + s_dir);
IR.Log("s " + s_s);
IR.Log("sat_qty " + s_sat_qty);
IR.Log("ts " + s_ts);
IR.Log("x " + s_x);
IR.Log("y " + s_y);


я имею объекты с данными:


"dir": null,


"s": null,
"sat_qty": 4,
"ts": 516702212,
"x": "75.800758",
"y": "96.729339"


теперь самое главное! вопрос! как сделать вывод куска яндекс карты с отображением точки по выше полученным координатам=)


были ли тут вообще пример по отображению карты яндекс?

возможно ли вывести яндекс карту посредством API яндекса????


если нет, то обидно(((( тогда подскажите как написать скрипт что бы в созданный объект в проекте:


IR.GetItem("Page 1").GetItem("pozition_maps")


было отображено статическое изображение, с подставленными значениями из:

s_x = JSONObject.devices[0].position.x;

s_y = JSONObject.devices[0].position.y;


https://static-maps.yandex.ru/1.x/?ll=(s_y),(s_x)&size=600,450&z=15&l=map&pt=(s_y),(s_x),pm2gnl

С выводом статической карты и метки из json разобрался. Но остаётся актуальным вопрос про работу карты посредством скрипта. Спецы аууу, что скажете

Здравствуйте!


К сожалению во второй версии не получится вывести изображение карты в интерфейс Иридиума, т.к. ее можно получить только используя https соединение. Но в i3Pro это уже исправлено и вы можете спокойно использовать вашу ссылку для того чтобы вывести изображение на элемент интерфейса.


Вот пример как это сделать:


IR.GetItem("Page 1").GetItem("Item 1").GetState(0).Image = "https://static-maps.yandex.ru/1.x/?ll=37.620070,55.753630&size=450,450&z=13&l=map&pt=37.620070,55.753630,pmwtm1~37.64,55.76363,pmwtm99";


Вам остается только подставить свои значения как вы описали выше.

В примере я использовал ссылку из документации по Яндекс API.


Спасибо за ответ, но как я уже выше написал, вывод статики я реализовал (во 2м иридиуме и прекрасно работает, но не совсем то что нужно)


var iPosition_maps = 0;

if(IR.GetItem("Page 1").GetItem("Position_maps") != null)
iPosition_maps = IR.GetItem("Page 1").GetItem("Position_maps");


if(iPosition_maps != 0)

iPosition_maps.GetState(0).Image = ("https://static-maps.yandex.ru/1.x/?ll=" + s_y + "," + s_x + "&size=600,450&z=15&l=map&pt=" + s_y + "," + s_x + ",pm2gnl");

интересует возможность работы со скриптом яндекса в иридиуме.....