Получение данных из внешней сети

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Получение данных из внешней сети

Сообщение Ko/|xo3HUk » Пт ноя 18, 2016 4:15 pm

Всем доброго времени суток.
появилась у меня задача: купил гараж, который будет постоянно отапливаться (уже реализовано), хотелось бы ещё и температуру/влажность удалённо мониторить, т.е. чтобы данные с этих датчиков прилетали на домашний сервер с МЖД. Гараж находится в гаражном кооперативе, в 1100 метрах от дома. Интернет там, естественно, только мобильный. Из того что есть под рукой для создания гаражной части МЖД: датчики BME280, AM2320, DS18B20 (позже определюсь которые из них будут установлены), ESP8266 (NodeMCU Lua), смартфон с симкой для мобильного интернета.

Схема примерно будет следующая:
Сеть.png
Сеть.png (10.44 КБ) 6340 просмотров
В ESP8266 залита прошивка от MaksMS с опцией отправки данных на МЖД. В домашней сети всё работает прекрасно, даные с подобных ЕСП-шек прилетают на МЖД. Но все запросы из внешней сети - только через авторизацию, соответственно, и GET-запросы из мобильной сети будут также блокироваться (уже проверено - в логах апача видно что запрос прилетает с ошибкой 401 - "Нет авторизации").
Если отключить авторизацию в config.php - запросы прилетают, всё хорошо, кроме одного - нет вообще никакой защиты из внешки.
GET-запросы не позволяют проводить аутентификацию, только POST-запросы.
Пробовал поднять VPN (PPTP) между смартом и домашним компом - почему-то соединение постоянно рвётся через несколько секунд (максимум было 2 с чем-то минуты). Очень много информации по этой теме - все грешат на ОПСОСа - МТС использует NAT и режет протокол GRE. Поднимать L2TP ВПН - это ставить OpenVPN на смарт, но смарт старенький, андроид 2.3 только, поэтому требуются рут-права. Сделать можно, но не хочется.
MaksMS предлагает на папку objects можно назначить исключение , чтоб пускало без авторизации, но чёт я очкую - мало ли ещё к чему появится доступ.

Есть какие-нибудь идеи как получить данные из внешки на домашний сервер? Может кто-то реализовывал уже подобное?
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Аватара пользователя
savenko_egor
Сообщения: 705
Зарегистрирован: Вс авг 03, 2014 8:17 pm
Откуда: Украина, Запорожье
Благодарил (а): 108 раз
Поблагодарили: 147 раз
Контактная информация:

Re: Получение данных из внешней сети

Сообщение savenko_egor » Пт ноя 18, 2016 4:49 pm

1. Добавить отдельный PHP скрипт, в котором прописать передачу параметров другому скрипту, и первый скрипт сделать доступным из сети. Костыльно, но в Вашем случае, я смотрю это не помеха.
2. На смарте ставить таскер (или подобные) который будет получать инфу с датчиков и слать POST запросы домой.
3. Поднимать на смарте веб сервер с страницей в которой будет iframe на espшку из дому парсить через веб-переменные. Тут проблема в том, что IP на сматре может измениться.
4. MQTT тот же. Через промежуточный брокер.
5. Тот же народмон.

Или я чего-то не так понимаю, или я реально накидал кучу толковых идей)) С ночи сегодня, не спал, потому не ругайтесь если что))
За это сообщение автора savenko_egor поблагодарил:
Ko/|xo3HUk (Пт ноя 18, 2016 8:39 pm)
Рейтинг: 1.16%
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Получение данных из внешней сети

Сообщение sergejey » Пт ноя 18, 2016 6:45 pm

Ещё вариант решения. В данном случае необходимо будет настроить датчики, чтобы они на определённый URL слали данные.
За это сообщение автора sergejey поблагодарил:
Ko/|xo3HUk (Пт ноя 18, 2016 8:39 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Получение данных из внешней сети

Сообщение olehs » Пт ноя 18, 2016 6:57 pm

Ko/|xo3HUk писал(а): GET-запросы не позволяют проводить аутентификацию, только POST-запросы.
Это ограничение прошивки? А если использовать TCP/UDP Клиент и самому формировать заголовок Авторизации?
За это сообщение автора olehs поблагодарил:
Ko/|xo3HUk (Пт ноя 18, 2016 8:40 pm)
Рейтинг: 1.16%
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Получение данных из внешней сети

Сообщение Ko/|xo3HUk » Пт ноя 18, 2016 8:39 pm

Ого! Столько идей сразу! Мозговой штурм начался :twisted: :D
Огромное спасибо всем откликнувшимся!

warik
  • 1. Передача данных PHP скриптами - с моими скудными знаниями это выйдет долго и, да, костыльно как-то
    2. Интересное решение. Приму на заметку. Кстати, я до конца ещё не разобрался с опцией "TCP/UDP-клиент" самой ESP-шки, может этот клиент сам может POST-запросы отсылать. Тогда одним звеном (смартфоном) будет меньше
    3. Зачётное решение с iframe!!! Мне очень нравится! Особенно - тем что и на веб-морду самой ESP можно зайти, а иногда очень хочется/приходится понастраивать саму ESP. С динамическим IP-шником проблем не будет, myddns.ru поможет (MaksMS - создатель данного ресурса, также как и wifi-iot.com и купившим PRO-ключ на ESP - в подарок VIP на myddns.ru)
    4. MQTT хочу оставить на десерт. Пока не знаком с ним, очень хочется поразбираться, но со временем пока туго
    5. Народмон -"Лимит устр-в мониторинга исчерпан - помогите проекту". Пока нет желания 365 р/год за дополнительную ESP-шку платить.
sergejey
  • С Коннектом тоже пока не знаком, придётся поучить матчасть :) Я, кстати, в Коннекте отключал функцию Cloud Sync (очень сильно грузился проц из-за неё) - будет ли всё остальное работать без этой функции?
olehs
  • Это ограничение прошивки?
    Я вычитал эту информацию в интернетах при беглом поиске способа авторизации через GET-запрос. Если это не так и можно через GET авторизоваться - ткните носом, пожалуйста, где про это почитать
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Получение данных из внешней сети

Сообщение olehs » Пт ноя 18, 2016 8:50 pm

GET и POST авторизуются одинаково - через заголовок Authorization, например

Код: Выделить всё

Authorization: Basic ZWx1c3VhcmlvOnlsYWNsYXZl
В примерах TCP клиента показано, как формировать заголовки
За это сообщение автора olehs поблагодарил:
Ko/|xo3HUk (Сб ноя 19, 2016 11:34 am)
Рейтинг: 1.16%
Akorolev
Сообщения: 119
Зарегистрирован: Вт ноя 08, 2016 4:27 pm
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: Получение данных из внешней сети

Сообщение Akorolev » Сб ноя 19, 2016 5:42 am

О мысль а если им статика, то может просто в config.php исключения поставить на то ип?
За это сообщение автора Akorolev поблагодарил:
Ko/|xo3HUk (Сб ноя 19, 2016 11:34 am)
Рейтинг: 1.16%
MaksMS82
Сообщения: 422
Зарегистрирован: Ср сен 05, 2012 7:30 am
Откуда: Киров
Благодарил (а): 0
Поблагодарили: 70 раз
Контактная информация:

Re: Получение данных из внешней сети

Сообщение MaksMS82 » Сб ноя 19, 2016 8:22 am

Наверно проще тут использовать TCP клиент все же https://wifi-iot.com/?m=wiki&id=29&lang=ru

Там добавить строку Authorization: Basic ХХХХХХХХХХХХХХХХХ в заголовки, где ХХХХХХХХХХХХХХХХХ это логин:пароль в base64
За это сообщение автора MaksMS82 поблагодарил:
Ko/|xo3HUk (Сб ноя 19, 2016 11:34 am)
Рейтинг: 1.16%
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Получение данных из внешней сети

Сообщение Ko/|xo3HUk » Сб ноя 19, 2016 11:47 am

Получилось!!!
Использовал TCP/UDP-Клиент ЕСПшки, Get-запрос.
Закодировал свои логин:пароль в base64:

Код: Выделить всё

sergey@server:~$ printf логин:пароль | base64
0LvQvtCz0LjQvTrQv9Cw0YDQvtC70Yw=
После этого добавил строку

Код: Выделить всё

Authorization: Basic 0LvQvtCz0LjQvTrQv9Cw0YDQvtC70Yw=
и всё заработало!

В итоге у меня получился вот такой GET-запрос:

Код: Выделить всё

GET /objects/?script=espdata&idesp=ESP826600xxxxxx&hostname=ESP_IP30&bmet=_BMET_&bmep=_BMEP_&bmeh=_BMEH_&wanip=_IP_&vdd=_VDD_&freemem=_MEM_&rssi=_RSSI_ HTTP/1.1
Host: homeserver
User-Agent: ESP8266
Connection: keep-alive
Authorization: Basic 0LvQvtCz0LjQvTrQv9Cw0YDQvtC70Yw=
Accept: */*

Огромное всем спасибо! Направили меня на путь истинный :D

P.S. Т.к. смартфон находится в мобильной сети за NATом, то телефон даже не пингуется. Вот сейчас, например, IP смарта серый: 10.118.0.34, внешний IP: 85.140.76.21 (белый, но динамический). Пингую 85.140.76.21 - а в ответ тишина. Поэтому добавление IP-адреса в config.php, создание веб-сервера на смарте и т.п. - отпадают сразу.
Но хочется всё-же иметь доступ на веб-морду ЕСПшки, поэтому буду ставить OpenVPN, осталось только вспомнить как получить рут на мой смарт :)
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Аватара пользователя
savenko_egor
Сообщения: 705
Зарегистрирован: Вс авг 03, 2014 8:17 pm
Откуда: Украина, Запорожье
Благодарил (а): 108 раз
Поблагодарили: 147 раз
Контактная информация:

Re: Получение данных из внешней сети

Сообщение savenko_egor » Сб ноя 19, 2016 11:51 am

4pda Вам в помощь)
Ответить