Страница 1 из 2

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

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

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

Есть какие-нибудь идеи как получить данные из внешки на домашний сервер? Может кто-то реализовывал уже подобное?

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

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

Или я чего-то не так понимаю, или я реально накидал кучу толковых идей)) С ночи сегодня, не спал, потому не ругайтесь если что))

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

Добавлено: Пт ноя 18, 2016 6:45 pm
sergejey
Ещё вариант решения. В данном случае необходимо будет настроить датчики, чтобы они на определённый URL слали данные.

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

Добавлено: Пт ноя 18, 2016 6:57 pm
olehs
Ko/|xo3HUk писал(а): GET-запросы не позволяют проводить аутентификацию, только POST-запросы.
Это ограничение прошивки? А если использовать TCP/UDP Клиент и самому формировать заголовок Авторизации?

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

Добавлено: Пт ноя 18, 2016 8:39 pm
Ko/|xo3HUk
Ого! Столько идей сразу! Мозговой штурм начался :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 авторизоваться - ткните носом, пожалуйста, где про это почитать

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

Добавлено: Пт ноя 18, 2016 8:50 pm
olehs
GET и POST авторизуются одинаково - через заголовок Authorization, например

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

Authorization: Basic ZWx1c3VhcmlvOnlsYWNsYXZl
В примерах TCP клиента показано, как формировать заголовки

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

Добавлено: Сб ноя 19, 2016 5:42 am
Akorolev
О мысль а если им статика, то может просто в config.php исключения поставить на то ип?

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

Добавлено: Сб ноя 19, 2016 8:22 am
MaksMS82
Наверно проще тут использовать TCP клиент все же https://wifi-iot.com/?m=wiki&id=29&lang=ru

Там добавить строку Authorization: Basic ХХХХХХХХХХХХХХХХХ в заголовки, где ХХХХХХХХХХХХХХХХХ это логин:пароль в base64

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

Добавлено: Сб ноя 19, 2016 11:47 am
Ko/|xo3HUk
Получилось!!!
Использовал 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, осталось только вспомнить как получить рут на мой смарт :)

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

Добавлено: Сб ноя 19, 2016 11:51 am
savenko_egor
4pda Вам в помощь)