Как принять / послать данные через http
Модератор: immortal
-
- Сообщения: 34
- Зарегистрирован: Ср июл 22, 2020 1:30 pm
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
Как принять / послать данные через http
Доброго времени суток. Читал-Читал мануалы - ничего не понял. Ситуация следующая. Есть погодная станция которая при обращении по адресу http://ip_adress/getinfo возвращает 3 значения через пробел температура, влажность, давление. Как его получить на экране/ в системе?
Также есть wi-fi выключатели, которые при обращении по http://ip_adress/CtrlPinOn или включает / выключает освещение. Как посылать такие сигналы и привязать их к системе? Понимаю что должен быть какой то Get-запрос, но где его писать???
Также есть wi-fi выключатели, которые при обращении по http://ip_adress/CtrlPinOn или включает / выключает освещение. Как посылать такие сигналы и привязать их к системе? Понимаю что должен быть какой то Get-запрос, но где его писать???
Orange Pi Lite + Armbian + MJD Majordomo пока на стадии изучения...
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Как принять / послать данные через http
По погодной станции вам надо сделать несколько вещей.
1. Создать объект.свойства, куда будут сохраняться полученные от станции значения.
Например, создаете в ОБЪЕКТах новый класс (Панель управления --> Объекты--> Объекты), назвав его как угодно.
В созданном классе заводите новые свойства (например, "Temp, "Hum", "Press"). Если вам потом потребуется рисовать графики или как-то ретроспективно отслеживать параметры со станции, то у свойств надо включить историю (установить значение "Хранить историю дней" больше "0").
Также в новом классе создаете новый объект для погодный станции (пусть, к примеру, называется "WeatherStation").
2. Написать код, с помощью которого будут получаться выдаваемые погодной станцией параметры и сохраняться в наши объект.свойства.
К примеру, код можно сохранить в методе нового класса.
Создаете новый метод, например, "GetValue". Внутри пишите код PHP (можно прямо в методе КЛАССА):
3. Организуете периодический запуск метода "GetValue", например 1 раз в 5 минут.
Как вариант, для этого можете написать в «onNewMinute» (Панель управления --> ОБЪЕКТЫ --> Объекты --> [класс] Timer --> ClockChime --> onNewMinute) такой код (ниже строки «$m=date('i',time());»):
Чтобы отобразить эти значения в интерфейсе, можно воспользоваться стандартными элементами. Температуру проще всего вывести с помощью элемента сцены "информер". Для начала почитать, к примеру, можно здесь (https://kb.mjdm.ru/category/video-po-ma ... majordomo/), а про меню вот здесь (https://kb.mjdm.ru/commands_help/).
Что касается ваших wi-Fi-выключателей, то для освещения тоже целесообразно сделать свой класс со своими объектами на каждую цепь освещения и методами на включение и выключение.Не забудьте про свойство "status". На сцене для каждого состояния интерфейсного выключателя ссылаетесь на соответствующие методы. Можете почитать, к примеру, тут (https://ab-log.ru/forum/viewtopic.php?f=1&t=1328). Там другое оборудование, но принципиально все тоже самое.
1. Создать объект.свойства, куда будут сохраняться полученные от станции значения.
Например, создаете в ОБЪЕКТах новый класс (Панель управления --> Объекты--> Объекты), назвав его как угодно.
В созданном классе заводите новые свойства (например, "Temp, "Hum", "Press"). Если вам потом потребуется рисовать графики или как-то ретроспективно отслеживать параметры со станции, то у свойств надо включить историю (установить значение "Хранить историю дней" больше "0").
Также в новом классе создаете новый объект для погодный станции (пусть, к примеру, называется "WeatherStation").
2. Написать код, с помощью которого будут получаться выдаваемые погодной станцией параметры и сохраняться в наши объект.свойства.
К примеру, код можно сохранить в методе нового класса.
Создаете новый метод, например, "GetValue". Внутри пишите код PHP (можно прямо в методе КЛАССА):
Код: Выделить всё
$data = file_get_contents('http://ip_adress/getinfo');
$arr = explode(' ', $data);
sg('WeatherStation.Temp', $arr[0]);
sg('WeatherStation.Hum', $arr[1]);
sg('WeatherStation.Press', $arr[2]);
Как вариант, для этого можете написать в «onNewMinute» (Панель управления --> ОБЪЕКТЫ --> Объекты --> [класс] Timer --> ClockChime --> onNewMinute) такой код (ниже строки «$m=date('i',time());»):
Код: Выделить всё
if ($m%5 == 0) callMethod("WeatherStation.GetValue");
Что касается ваших wi-Fi-выключателей, то для освещения тоже целесообразно сделать свой класс со своими объектами на каждую цепь освещения и методами на включение и выключение.Не забудьте про свойство "status". На сцене для каждого состояния интерфейсного выключателя ссылаетесь на соответствующие методы. Можете почитать, к примеру, тут (https://ab-log.ru/forum/viewtopic.php?f=1&t=1328). Там другое оборудование, но принципиально все тоже самое.
Последний раз редактировалось Chainik Пн июл 27, 2020 3:00 pm, всего редактировалось 1 раз.
- Рейтинг: 2.33%
- xor
- Сообщения: 2039
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 286 раз
- Поблагодарили: 629 раз
Re: Как принять / послать данные через http
Про обращение по адресу из кода в МДМ - функция getURL("192.168.0.1/setPinOn",0);
Отправлено с моего Redmi 4X через Tapatalk
Отправлено с моего Redmi 4X через Tapatalk
- Рейтинг: 1.16%
win10 connect https://connect.smartliving.ru/profile/303
-
- Сообщения: 141
- Зарегистрирован: Чт фев 13, 2020 6:39 pm
- Благодарил (а): 23 раза
- Поблагодарили: 34 раза
Re: Как принять / послать данные через http
Похожая ситуация.
Но в качестве разделителя - перевод строки.
Т.е. возвращаются 2-е строки.
Как взять параметры из 2-й строки?
Но в качестве разделителя - перевод строки.
Т.е. возвращаются 2-е строки.
Как взять параметры из 2-й строки?
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Как принять / послать данные через http
Вам надо всего лишь указать ваш разделитель в качестве аргумента функции. Например,
Код: Выделить всё
$arr = explode(PHP_EOL, $data);
-
- Сообщения: 141
- Зарегистрирован: Чт фев 13, 2020 6:39 pm
- Благодарил (а): 23 раза
- Поблагодарили: 34 раза
Re: Как принять / послать данные через http
Пробовал. Получается также, как и с пробелом.
Каждый элемент массива - один символ от строки.
Т.е. 2-я строка разбивается на отдельные символы в массиве.
Когда знаешь длину слова, то можно посчитать.
А при переменной длине слова - сложная функция.
Есть способ попроще?
$pow = getURL('http://192.168.1.46:8080/?command=1&channel=3');
$arr = explode(' ', $pow);
$pow1 = $pow[3];
$pow2 = $pow[4];
$pow3 = $pow[5];
$pow1 = $pow1*100 + $pow2*10 + $pow3;
setGlobal('Sensor_power70.value', $pow1);
Каждый элемент массива - один символ от строки.
Т.е. 2-я строка разбивается на отдельные символы в массиве.
Когда знаешь длину слова, то можно посчитать.
А при переменной длине слова - сложная функция.
Есть способ попроще?
$pow = getURL('http://192.168.1.46:8080/?command=1&channel=3');
$arr = explode(' ', $pow);
$pow1 = $pow[3];
$pow2 = $pow[4];
$pow3 = $pow[5];
$pow1 = $pow1*100 + $pow2*10 + $pow3;
setGlobal('Sensor_power70.value', $pow1);
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Как принять / послать данные через http
Вы бы написали, что именно у вас приходит в переменную в ответ на запрос
Тогда проще было бы помочь.
Код: Выделить всё
$pow = getURL('http://192.168.1.46:8080/?command=1&channel=3');
-
- Сообщения: 141
- Зарегистрирован: Чт фев 13, 2020 6:39 pm
- Благодарил (а): 23 раза
- Поблагодарили: 34 раза
Re: Как принять / послать данные через http
Через веб переменные получаю нормально.
Опрос через 15 сек.
Но после включения с кнопки хочу получить значение сразу без задержки, не ожидая опроса по веб переменной.
При прямом обращении получаю такую картинку.
Опрос через 15 сек.
Но после включения с кнопки хочу получить значение сразу без задержки, не ожидая опроса по веб переменной.
При прямом обращении получаю такую картинку.
- Вложения
-
- Безымянный.png (9.61 КБ) 2651 просмотр
-
- Безымянный1.png (45.52 КБ) 2651 просмотр
-
- Сообщения: 141
- Зарегистрирован: Чт фев 13, 2020 6:39 pm
- Благодарил (а): 23 раза
- Поблагодарили: 34 раза
Re: Как принять / послать данные через http
На JS делал так:
var a;
var b;
var e;
function pokazan(a,b){
var requestURL = 'http://192.168.1.'+a+':8080/?command=1&channel='+b;
var request = new XMLHttpRequest();
request.open('GET', requestURL, false);
request.responseType = 'text';
request.send();
e=request.responseText;
e=e.substring(1, 6);
return (e);
}
Как аналогично сделать на php?
var a;
var b;
var e;
function pokazan(a,b){
var requestURL = 'http://192.168.1.'+a+':8080/?command=1&channel='+b;
var request = new XMLHttpRequest();
request.open('GET', requestURL, false);
request.responseType = 'text';
request.send();
e=request.responseText;
e=e.substring(1, 6);
return (e);
}
Как аналогично сделать на php?
-
- Сообщения: 141
- Зарегистрирован: Чт фев 13, 2020 6:39 pm
- Благодарил (а): 23 раза
- Поблагодарили: 34 раза
Re: Как принять / послать данные через http
Проблема закрыта:
$pow = getURL('http://192.168.1.46:8080/?command=1&channel=3');
$pow = substr($pow, 3, 8) /10;
setGlobal('Sensor_power70.value', $pow);
$pow = getURL('http://192.168.1.46:8080/?command=1&channel=3');
$pow = substr($pow, 3, 8) /10;
setGlobal('Sensor_power70.value', $pow);