Esp8266 отправка данных на сервер: отправка данных на сайт методом Get запроса / Хабр

Содержание

ESP8266. Передача данных на сайт GET-запросом.

Всем привет. Итак друзья, рассмотрев в прошлой статье подключение модулей ESP8266 друг к другу, нам осталось научиться делать два последних маневра с ними. А именно передача данных на сайт и управление модулем с сайта. Сегодня мы рассмотрим передачу на сайт. Ну что ж приступим.

Возможность просматривать удаленно информацию, например толи потребление  через розетку, то ли температуру и т.д. можно либо через  специальный сервис, предварительно пройдя регистрацию себя и модуля, например thingspeak.com ( облачный сервис, где необходимо получить свой уникальный код канала, по которому будет проходить идентификация), либо создать у себя на ПК локальный сервис. Либо же, чем мы и воспользуемся, будем передавать информацию на свой сайт или блог. Что для этого надо? Все просто, модуль переводим в режим клиента. Это мы уже умеем делать из предыдущих двух статей. И посылаем GET-запрос.
Итак ниже кусок лога настройки и передачи информации, а также приходящего ответа. !!! Дорогие читатели, хочу напомнить Вам, что в конце каждой строки отправленной АТ-команды необходимо ставить возврат каретки с переводом строки \r\n, как мы рассматривали в статье №57 (ESP8266 и AVR). Если в терминале не включена данная функция то не забудьте включить (Append CR-LF). Отправка параметра должна быть без пробела ?t=20.8. Если вдруг не работает , то количество передачи данных можно немного увеличить. Спасибо за справедливые замечания автору Guest ниже приведенных комментариев.

AT+CWMODE=3
AT+RST
AT+CWJAP=»ssid»,»password»
AT+CIPSTART=»TCP»,»ap-impulse.com»,80
CONNECT
OK
AT+CIPSEND=78
OK
> GET /termometer.php?t=20.8 HTTP/1.1
Host:ap-impulse.com
Connection: close
SEND OK

+IPD,346:HTTP/1.1 200 OK
Server: nginx

Date: Thu, 25 Feb 2016 20:50:12 GMT
Content-Type: text/html
Content-Length: 149
Connection: close
X-Powered-By: PHP/5. 3.10-1ubuntu3.21
Vary: Accept-Encoding

<html lang=»ru-RU»>
<head><meta charset=»UTF-8″>
<title>Градусник</title>
</head>
<body><br>
<img src=»thermometer.png»?t=476 >
</body>
</html>CLOSED

До знака > нам все знакомо. Единственное обратите внимание, что вместо IP которое мы указывали в предыдущей статье для обращения к другому модулю, мы указали доменное имя, также укажите имя и пароль точки доступа (роутер) и длина отправляемого сообщения. Давайте разберем строки после знака  >.  А дальше идет GET –запрос – это один из видов HTTP запроса. С помощью него браузер запрашивает любой файл веб-сервера. Данный запрос состоит только из HTTP запроса без тела. Как видите в первой строке запроса GET /termometer.php?t= 20.8 HTTP/1.1  идет ключевое слово GET, далее  путь к запрашиваемой странице, знак вопроса обозначает конец пути, далее GET параметр t= 20.8 (передаем температуру).

HTTP/1.1 — текущая версия протокола. Host:ap-impulse.com доменное имя ресурса на который передаем данные. Connection: close   даем команду закрыть соединение. Используем программу, в которой выводили температуру в браузер с помощью мк avr. Вставляем в нее выше приведенные AT комманды, в параметр t= подставляем значение тепературы с датчика и показания на сайте.

Итак далее запрос пошел в файл termometer.php, который я заранее создал и  поместил в корень блога. На самом деле путей решения очень много, и я представляю один из них.  Как видите  у нас расширение php, что означает файл будет написан на скриптовом языке общего назначения PHP (PHP Hypertext Preprocessor) и находится на стороне сервера. Данный код обрабатывается движком PHP на веб-сервере, который динамически генерирует HTML. HTML содержит содержимое веб-страницы затем отправляется в веб-браузер пользователя. Таким образом, пользователь никогда не видит реальный код PHP. Данная тема выходит за рамки данной статьи. Поэтом все что нам необходимо, так это для принятия параметра который содержится в запросе прописать следующий код в файле.

<html lang=»ru-RU»>
<head><meta charset=»UTF-8″>
<title>data collection</title>
</head>
<body><?php
if (isset ($_GET[«t»]))  { $t=$_GET[«t»]; }
echo «$t»;  //обратите внимание на кавычки, они должны быть как в строке выше
?>
</body>
</html>

Как видите здесь всего 2 строчки php скрипта,сначала принимает параметр, потом выводит.

На скриншоте слева пример отправки температуры в запросе, а также ручной ввод данных в адресной строке браузера http://www.ap-impulse.com/termometer.php?t=13, где значение 13 у нас выводится на станице (обведено красным кружочком). Код рисунков мы здесь не рассматриваем, т.к. целью было научится отправлять запросы. И последнее код сверху который начинается с  +IPD,346:HTTP/1.1 200 OK, как вы догадались это ответ, который содержит в себе 346 символов.  Для обработки контролером нам достаточно в этой строке OK. Вот таким образом можно просматривать удаленно какие-нибудь данные. Что ж мы с Вами рассмотрели все варианты работы с модулем ESP8266, кроме одного – это запрос модулю с сайта. Его мы рассмотрим попозже. Ну все друзья мы с Вами реализовали передачу данных на сайт, теперь можем подключать модуль к контроллеру сбора данных и передавать информацию. Но для этого нам потребуется написать веб интерфейс, т.е. на примере пошагово реализуем еще один небольшой проект. Научимся пользоваться веб технологиями, выводить данные наших устройств и ими же удаленно управлять. Этим мы с Вами и займемся в следующей статье. На этом и остановимся. Всем пока.

 

Просмотрено 32891 раз.

Прозрачная передача ESP8266: используйте запрос HTTP POST для отправки данных в формате json на виртуальную тестовую заглушку (HTTP-сервер)

Метод создания виртуальной тестовой заглушки HTTP заключается в следующем: Тестовая заглушка HTTP устанавливается через SoapUI для имитации удаленного HTTP-сервера.

https://blog.csdn.net/russ44/article/details/52230355

ESP8266 входит в конфигурацию прозрачной передачи: (в качестве примера возьмем скорость последовательного порта 115200 бод)

(1) Установите режим WIFI

AT + CWMODE = 3 ap + sta сосуществование

Ответ ОК

(2) Перезагрузка

AT+RST

После перезапуска мы видим, что здесь есть искаженные коды. Причина искаженных кодов заключается в том, что при первом включении модуля скорость передачи была не 115200, установленной нами, а была немного выше, из-за чего отображение последовательного порта выглядело искаженным. Способ изменился.

(3) Подключите роутер

AT + CWJAP = «ssid», «password» // ssid и пароль входящего маршрута

Ответ ОК

(4) Запрос IP устройства

AT+CIFSR

Ответить на ip-адрес устройства и другие

(5) Сервер подключения (TCP)

AT + CIPSTART = «TCP», «IP-адрес сервера», порт сервера // Входящий IP-адрес и номер порта удаленного сервера

Ответ: ОК

(6) Включите режим прозрачной передачи ESP8266

AT+CIPMODE=1

Ответ ОК

(7) Начать прозрачную передачу

AT+CIPSEND

Ответ:> // С этого момента символы, введенные в последовательный порт, будут прозрачно передаваться на сервер

Отправить данные на удаленный сервер по HTTP:

POST /test/upload/messages HTTP/1.1
Host: 192.168.12.68:8999
Content-Type: application/json
Content-Length:17
cache-control: no-cache

{"text1" : "123"}

Где / test / upload / messages является частью URL-адреса

Добавьте IP-адрес сервера и номер порта в поле Host. IP-адрес сервера 192.168.12.68 и номер порта 8999.

Итак, URL-адрес:http://192.168.12.68:8999/test/upload/messages

Поле Content-Type представляет текущий формат используемых данных, здесь application / json

Поле Content-Length представляет длину текущих данных json, которая является длиной следующей строки данных {«text1», «123»}. С помощью следующего инструмента

Текущая длина данных — 17:

http://www.bejson.com/convert/ox2str/

Далее идет пробел, это место должно присутствовать, иначе HTTP-сервер проанализирует ошибку

Следующий {«text1»: «123»} — это данные json, которые мы хотим отправить.

Затем отправьте данные json с протоколом http на тестовый сервер http через помощника последовательной отладки:

 

WiFi-IoT Firmware Builder :: TCP/UDP Клиент

_IP_
IP адрес устройства
_MEM_Свободное ОЗУ
_UPTIME_ / _UPTIMES_Время работы
_RSSI_Уровень сигнала (нет на старых SDK)
_TIME_Время
_TIMES_Время с секундами
_WEEK_День недели
_RADIO_Имя текущей интернет станции
_APDSC_APDS9960 Освещенность
_APDSR_APDS9960 Освещенность красный
_APDSG_APDS9960 Освещенность зеленый
_APDSB_APDS9960 Освещенность синий
_TSSETx_Установка термостата
_TSONx_ Состояние термостата вкл/выкл
_CCSCO2_CO2 датчика CCS811
_CCSTVOC_TVOC датчика CCS811
_LORSxy_Метрики LORA
_RTD_MAX31865 Температура
_HDCT_Температура датчика HDC1080
_HDCH_Влажность датчика HDC1080
_PMS10_PM1.0
_PMS25_PM2.5
_PMS100_PM1.00
_VL53L0X_Расстояние VL53L0X
_MByyxx_ModBus метрики
_OWT_Температура воздуха OpenWeatherMap
_OWH_Влажность воздуха OpenWeatherMap
_OWP_Давление воздуха OpenWeatherMap
_OWWIND_Скорость ветра OpenWeatherMap
_OWD_Описание погоды OpenWeatherMap
_OWC_Облачность OpenWeatherMap
_OWF_Температура по ощущениям OpenWeatherMap
_OWR3_Количество осадков 3 часа OpenWeatherMap
_OWR1_Количество осадков 1 часа OpenWeatherMap
_OWV_Видимость OpenWeatherMap
_SUNDW_Восход солнца OpenWeatherMap
_SUNUP_Заход солнца OpenWeatherMap
_SUNDAY_Продолжительность дня OpenWeatherMap
_AS5600_Угол AS5600
_GPSLAT_Широта GPS приемник
_GPSLON_Долгота GPS приемник
_GPSH_Высота GPS приемник
_GPSS_Скорость GPS приемник
_GPSC_Курс GPS приемник
_GPSN_Количество спутиков GPS приемник
_BTxR_BT HUB RSSI
_BTxT_BT HUB Температура
_BTxL_BT HUB Освещенность
_BTxF_BT HUB Плодородие
_BTxM_BT HUB Влажность(почвы)
_BTxH_BT HUB Влажность
_BTxB_BT HUB Заряд батареи
_GTR_Осадки gismeteo.ru
_GTC_Облачность gismeteo.ru
_GTWIND_Ветер gismeteo.ru
_SHTC3T_Температура SHTC3
_SHTC3H_Влажность SHTC3
_D2Dxxyy_Данные с Device to Device(D2D)
_CSEV_Напряжение на CSE7766
_CSEC_Ток на CSE7766
_CSEE_Потребление суммарно CSE7766
_CSEAP_Apparent Power CSE7766
_CSEA_Active Power CSE7766
_CSPF_Power Factor CSE7766
_ADC_Внутренний АЦП (ESP8266)
_IADCx_Внутренние АЦП (ESP32)
_LM_Температура с датчика LM75 или DS1621
_INAV_Напряжение с датчика INA219
_INAC_Ток с датчика INA219
_DHTTx_Температура датчиков DHT22 DHT11
_DHTHx_Влажность датчиков DHT22 DHT11
_BMPT_Температура датчиков BMP180/085
_BMPP_Давление датчиков BMP180/085
_CNTxI_Данные с счетчика 60
_BH_Освещенность с датчика Bh2750
_AMT_Температура с датчика AM2321
_AMH_Влажность с датчика AM2321
_DSWx_Температура датчиков DS18B20
_BMET_Температура с датчика BME280
_BMEH_Влажность с датчика BME280
_BMEP_Давление с датчика BME280
_SHTT_Температура с датчика SHT21
_SHTH_Влажность с датчика SHT21
_SHT30T_Температура с датчика SHT30
_SHT30H_Влажность с датчика SHT30
_HEAT_Температура с термопары MAX6675
_CVV_Напряжение с устройства CC/CV
_CVC_Ток с устройства CC/CV
_PMV_Напряжение с устройства Power Monitor
_PMC_Ток с устройства Power Monitor
_PMW_Мощность с устройства Power Monitor
_PMWH_Расход с устройства Power Monitor
_RFID_Данные с RFID
_SHT10T_Температура SHT1x
_SHT10H_Влажность SHT1x
_CO2_Датчики CO2 MH-Z1x
_PING_ping тест статус
_VSyx_Данные с датчиков Virtual SENS
_GTT_Температура с gismeteo.ru на сегодня
_GTH_Влажность с gismeteo.ru на сегодня
_GYT_Температура с gismeteo.ru на завтра
_GYH_Влажность с gismeteo.ru на завтра
_GTP_Давление с gismeteo.ru на сегодня
_GYP_Давление с gismeteo.ru на завтра
_GTWIND_Скорость и направление ветра gismeteo.ru сегодня
_GYWIND_Скорость и направление ветра gismeteo.ru завтра
_NMx_Принятые данные с датчиков narodmon.ru
_ADCx_Данные с АЦП PCF8591
_RTCT_Температура DS3231
_NRFxCy_Счетчик с модулей NRF24
_NRFxTy_Температура с модулей NRF24
_NRFxHy_Влажность с модулей NRF24
_NRFxAy_АПЦ с модулей NRF24
_NRFxGy_Состояние GPIO с модулей NRF24
_NRFxBy_Другие данные с модулей NRF24
_RSSIGSM_RSSI GSM
_PCFCx_Счетчик импульсов PCF8583
_PCFCTx_Счетчик импульсов PCF8583 на сегодня
_PCFCYx_Счетчик импульсов PCF8583 на вчера
_RSx_Температура с модулей RC датчик
_RSx_Влажность с модулей RC датчик
_RSx_АЦП с модулей RC датчик
_CNTx_Счетчики импульсов.
_INTx_Событие прерывания
_PWMx_Состояние ШИМ
_GPIOx_Состояние GPIO входа
_DATE_Дата. Требуется поддержка календаря
_VALDESx_Глобальные переменные конструктора кода
_SCALE_Весы HX711
_MCPA_Данные с АЦП MCP3201
_ADSx_Данные с АЦП ADS1115
_VZCO2_Датчик VZ-89T CO2
_VZTV_Датчик VZ-89T tvoc
_NLxT_Температура с датчиков NooLite
_NLxH_Влажность с датчиков NooLite
_HCSR_HC-SR04
_TSL_Данные с TSL2561
_MCMSG_Количество сообщений в электронном ящике
_MCUNS_Количество непрочитанных сообщений в электронном ящике
_UPSI_Данные с UPS Монитора. Напряжение на входе.
_UPSF_Данные с UPS Монитора. Напряжение на входе.
_UPSO_Данные с UPS Монитора. Напряжение на выходе.
_UPSH_Данные с UPS Монитора. Частота сети
_UPST_Данные с UPS Монитора. Температура в корпусе
_UPSB_Данные с UPS Монитора. Напряжение батареи.
_UPSS_Данные с UPS Монитора. Нагрузка
_MLXO_Температура объекта MLX90614
_MLXA_Температура окружающая MLX90614
_VALx_Переменные Interpreter
_VWTxy_Температура с VirtualWire
_VWHxy_Влажность с VirtualWire
_VWCxy_Счетчики с VirtualWire
_VWAxy_АЦП с VirtualWire
_VWBxy_Один байт с VirtualWire
_HLWW_HLW8012 (Sonoff POW) Мощность
_HLWV_HLW8012 (Sonoff POW) Напряжение
_HLWC_HLW8012 (Sonoff POW) Ток
_HLWWH_HLW8012 (Sonoff POW) Ватт/ч

Обмен данными между устройствами ESP8266

В прошивке ESP Easy есть возможность передачи данных с одного устройства на другое, не используя MQTT сервер. Можно организовать UDP сеть между ESP модулями и устройствами Sonoff. 

Пример 1: Передача данных с датчика температуры, который находиться на улице. Датчик передает данные на второй модуль с дисплеем, который, в свою очередь, находится дома.

Пример 2: Вчера я показал как просто создавать автоматизации в самой ESP Easy. Так вот, мы передаем данные с одного модуля, и строим автоматизации уже на втором. 

Примеров может быть огромное количество, описывать их не буду, думаю каждый из Вас сможет найти этому свое применение. 

Настройка сети

Как прошивать модули ESP8266 прошивкой ESP_Easy рассказывать я не стану, все это есть в моих предыдущих статьях. Перейдем сразу к настройке сети между модулями. 

Первым делом необходимо установить порт UDP на всех устройствах, для этого идем «Tools» -> «Advanced» -> «UDP port:» ставим значение 65500.

Далее во вкладке «Controllers», на пустом месте (у меня 2 пункт, первый MQTT сервер) нажимаем кнопку «Edit», выбираем «ESPEasy P2P Networking» и ставим галочку «Enabled», проделываем это также на всех устройствах.

Перезагружаем все наши ESP8266 устройства. Отрываем вкладку Main и видим перечень устройств, которые объединились в сеть, их ip адреса и Unit.

Передача данных

Прямо из этого списка переходим на устройство, которое будет отправлять данные. Во вкладке «Devices» создаем привычное нам устройство (желательно под позицией 12), в разделе «Data Acquisition», ставим галочку «Send to Controller» напротив нашего контроллера P2P.

Прием данных

После того как мы создали данное устройство, на всех модулях ESP8266 автоматически появится такое же устройство, с тем же именем и тем же порядковым номером. Дополнительно для получения данных ничего настраивать не нужно.

ESP8266 без веб-страницы

Да, вы можете отправлять данные на ESP8266 без использования веб-сервера, но вы можете использовать один или использовать что-то функционально связанное с ним.

ESP8266 — это довольно универсальное вычислительное устройство с WiFi-радио и сетевым стеком, следовательно, вы можете реализовать практически любой разумный протокол, который вы хотите описать в коде.

Тем не менее, стало довольно популярным применение протоколов, которые выглядят и действуют как миниатюрные веб-страницы, предназначенные для потребления человеком.

то есть вместо того, чтобы ваш клиент подключался и делал что-то вроде

GET /index.html HTTP/1.1

это может сказать

GET /gpio/15/value HTTP/1.1

Где URL относится не к конкретному документу, а к некоторому фрагменту данных на устройстве, к которому вы хотите получить доступ. Вы можете сделать то же самое для POST, PATCH, и DELETEт.д. запросов.

Если вы не создаете страницу для потребления человеком, обычно данные, которыми вы обмениваетесь, не будут HTML-страницами. Часто это может быть что-то вроде JSON. Так например

GET /gpio/15/value HTTP/1.1

может вызвать ответ как

{"gpio": 15, "direction": "in", "value": 0}

Точно так же вы можете сделать конечную точку, где ваш клиент может установить GPIO, сказав

POST /gpio/15 HTTP/1.1
{"direction": "out", "value": 1}

Это в некоторой степени семантический или специфический для реализации вопрос, если программа, отвечающая на такие запросы, является «веб-сервером» — это может быть веб-сервер, который выполняет различные вспомогательные задачи для работы с данными и gpi (во многом динамически сервер, обслуживающий страницы) генерировать часть своего контента из запросов к базе данных), или это может быть специальная программа, которая одновременно работает с данными и знает, как общаться по HTTP.

И, конечно, использование HTTP для обмена полезными нагрузками JSON — это только один из многих способов сделать что-то — просто он в настоящее время является популярным, который повторно использует многие концепции, подобные веб-серверу, и может в некоторой степени даже разрешить использование веб-браузера. для тестирования.


Также стоит помнить, что такая схема лучше всего работает локально, когда телефон и ESP8266 являются клиентами одной домашней WiFi-сети. Если телефон не «дома» или есть, но находится только в мобильной сети, то, чтобы телефон достигал ESP8266, это означало бы разрешение внешних запросов в домашнюю сеть, чего желательно избегать. В этом случае довольно популярно использовать протокол, когда устройство ESP8266 и телефон независимо обращаются к внешнему серверу ретрансляции, который передает сообщения между ними. MQTT является примером схемы, часто используемой для системы с архитектурой ретрансляции на сервере.

отправка данных в серию метрик OVHcloud от Arduino / Дата-центры OVH / Hosting Kitchen

Прошлой весной я построил дровяную печь в своем саду. Я хотел иметь один в течение многих лет, и я наконец решил сделать это. Чтобы использовать его, я в течение двух часов разжигаю внутри большой огонь, удаляю все угли, и затем он готов к приготовлению пищи. Печь накапливает тепло во время пожара, а затем выпускает его.

После удаления углей, я должен расставить приоритеты для посуды, которую я хочу приготовить, так как температура падает:

  • Пицца: 280 C
  • Хлеб: 250 С
  • Рисовый пудинг: 180 C
  • Безе: 100 C
Я построил первую версию термометра с Arduino, чтобы иметь возможность проверить температуру. Этот термометр, изготовленный из термопары (то есть датчика, который измеряет высокие температуры), отображает внутреннюю температуру на небольшом ЖК-экране.

Следующим шагом было предвидеть, когда начинать посуду в духовку. Наблюдать за падением температуры в течение нескольких часов не было хорошей идеей. Мне нужна была тепловая диаграмма моей духовки! Тепловая диаграмма — это просто диаграмма температуры за определенный период времени. Но записывать температуру на бумаге каждые десять минут… подождите… это будет длиться более 30 часов.

Пожалуйста, дайте мне спать!

Это требует некоторой автоматизации. К счастью, у OVHcloud есть решение: Metrics Data Platform: www.ovh.com/fr/data-platforms/metrics/

Аппаратное обеспечение
Цель проекта — подключить датчик к Arduino, который будет отправлять данные на платформу данных OVHcloud Metrics (https://www.ovh.com/fr/data-platforms/metrics/) через сеть. По сути, Arduino будет использовать локальную сеть Wi-Fi для передачи данных о температуре на серверы OVHcloud.

Вы знаете ESP8266? Это недорогой (менее 2 €!) Wi-Fi микрочип с полным стеком TCP / IP и возможностью микроконтроллера.

Функциональная схема ESP8266

Реализация: Wemos
ESP8266 не так прост в использовании:

Должен питаться от 3,3 В (не слишком много, иначе он сгорит)
Нет USB

Вот почему для нас лучше использовать решение, которое реализует ESP8266. Вот этот Вемос!

  • Питание от 5 В (6 В до сих пор в порядке)
  • USB для последовательной связи (для отладки)
  • Может быть запрограммирован через USB
  • Может быть запрограммирован с Arduino IDE
  • Стоит менее 3 €
Подготовьте вашу Arduino IDE
Установите интегрированную среду разработки

Прежде всего, вам нужно установить Arduino IDE. Это бесплатно и доступно для любой платформы (Mac, Windows, Linux). Перейдите по адресу www.arduino.cc/en/main/software и загрузите версию, соответствующую вашей платформе. На момент написания текущей версии 1.8.10.

Дополнительная конфигурация для ESP8266
Когда вы устанавливаете Arduino IDE, он сможет программировать только официальные Arduinos. Давайте добавим прошивку и библиотеки для ESP8266

Запустите Arduino и откройте окно «Настройки» («Файл»> «Настройки»).

Введите arduino.esp8266.com/stable/package_esp8266com_index.json в поле «Дополнительные URL-адреса менеджера доски объявлений». Вы можете добавить несколько URL, разделяя их запятыми.

Теперь откройте «Диспетчер плат» в меню «Инструменты»> «Плата» и установите платформу esp8266 (не забудьте выбрать плату ESP8266 в меню «Инструменты> Плата» после установки).

Теперь вы готовы!

Заказать платформу данных метрик

Перейдите на веб-сайт Платформы данных OVHcloud Metrics: www.ovh.com/fr/data-platforms/metrics/. Нажмите на бесплатную пробную версию и завершите ваш заказ. Если у вас нет учетной записи, просто создайте ее. В этом испытании у вас будет 12 метрик (то есть 12 наборов записей). В этом примере мы будем использовать только один.

Получить свой токен

Перейдите в панель управления OVH: www.ovh.com/manager/cloud/#/. На левой панели вы должны иметь метрики и новый сервис внутри.

На вкладке «Токены» вы можете скопировать токен записи. Оставь, как нам понадобится позже.

Обратите внимание, что для настройки Grafana вам понадобится токен чтения.

Получить хост платформы Metrics Data

Хост вашей Metrics Data Platform указан в описании вашей услуги. На вкладке «Платформы» скопируйте хост opentsdb. Оставь, как нам понадобится позже.

Глубже в программу
Теперь давайте посмотрим на пример. Вот код, который отправляет статические данные в платформу данных OVHcloud Metrics. Вы можете использовать его с вашим датчиком. Вы просто должны закодировать меру датчика. При запуске Wemos будет:

Попробуй подключить к тебе сеть wifi
В случае успеха отправьте данные на платформу данных OVHcloud Metrics.
Весь исходный код доступен на моем github: github.com/landru29/ovh_metrics_wemos

Есть шесть основных файлов:

  • ovh_metrics_wemos.ino: основной файл
  • wifi.cpp: класс, реализующий процесс подключения к wifi через WPS (Wifi Protected Setup)
  • wifi.h: заголовочный файл для wifi
  • metrics.cpp: класс, который отправляет данные метрик в OVHcloud Metrics Data Platform через HTTPS
  • metrics.h: заголовочный файл для метрик
  • config.h.sample: модель для создания вашего файла конфигурации (см. ниже)

Создайте свой файл конфигурации
Если вы попытаетесь скомпилировать программу, вы получите ошибки, так как некоторые определения отсутствуют. Нам нужно объявить их в файле: config.h.

Скопируйте config.h.sample в config.h
Скопируйте токен записи, который вы получили в пункте 5.1 (#define TOKEN «xxxxxx»)
Скопируйте хост, который вы получили в пункте 5.2 (#define HOST «xxxxxx»)
Получить отпечаток сертификата
Поскольку Wemos будет запрашивать через HTTPS, нам понадобится отпечаток сертификата. Вам понадобится хост, который вы только что выбрали на вкладке «Платформы», а затем:

Пользователи Linux
Просто запустите этот маленький скрипт:

HOST=opentsdb.gra1.metrics.ovh.net; echo | openssl s_client -showcerts -servername ${HOST} -connect ${HOST}:443 2>/dev/null | openssl x509 -noout -fingerprint -sha1 -inform pem | sed -e "s/.*=//g" | sed -e "s/\:/ /g"

Скопируйте результат в ваш config.h (#define FINGERPRINT «xx xx ..»).

Пользователи MAC
Просто запустите этот маленький скрипт:

HOST=opentsdb.gra1.metrics.ovh.net; echo | openssl s_client -showcerts -servername ${HOST} -connect ${HOST}:443 2>/dev/null | openssl x509 -noout -fingerprint -sha1 -inform pem | sed -e "s/.*=//g" | sed -e "s/\:/ /g"

Скопируйте результат в ваш config.h (#define FINGERPRINT «xx xx ..»).

Пользователи Windows
В вашем браузере перейдите на opentsdb.gra1.metrics.ovh.net. Нажмите на замок рядом с URL, чтобы отобразить отпечаток сертификата. Замените все символы «:» одним пробелом.

Скомпилируйте проект и загрузите его на Wemos
Откройте файл .ino в IDE Arduino (у вас должно быть шесть вкладок в проекте)
Подключите Wemos к вашему компьютеру
Выберите порт из Сервис> Порт
В верхнем левом углу нажмите на стрелку, чтобы загрузить программу
После загрузки вы можете открыть последовательный монитор: Инструменты> Последовательный монитор
Прямо сейчас программа должна выйти из строя, так как Wemos не сможет подключиться к вашей сети Wi-Fi.

Запустите программу
Как мы уже видели, при первом запуске происходит сбой. Это потому, что вам нужно установить WPS-соединение, поэтому в зависимости от вашего интернет-модема вам нужно будет запустить WPS-транзакцию. Это может быть физическая кнопка на модеме или программная операция, запускаемая на консоли (https://en.wikipedia.org/wiki/Wi-Fi_Protected_Setup).

Когда процесс запускается на стороне модема, у вас есть что-то около 30 секунд для питания Wemos.

Подключите свой Wemos через USB => программа работает
Выберите порт из меню «Инструменты»> «Порт» (возможно, он изменился)
Откройте последовательный монитор: Инструменты> Последовательный монитор
Теперь вы можете следить за процессом.

Wi-Fi соединение
В последовательном мониторе (настройте битрейт на 9600) вы должны получить:

Попробуйте подключиться

Try to connect
 
WPS config start
Trying to connect to <your modem> with saved config ...|SUCCESS
IP address: 192.168.xx.xx

Если соединение Wi-Fi было успешным, последовательная консоль должна отображать локальный IP-адрес (192.168.xx.xx), в противном случае это не удалось. Попробуйте еще раз, запустив WPS на вашем модеме и перезапустив Wemos (отключите и снова подключите его).

Отправка данных в платформу данных OVHcloud Metrics
Теперь Wemos размещает запрос на сервере OVHcloud. Последовательная консоль показывает вам JSON, который она отправит:

------------------------------------------------
POST opentsdb.gra1.metrics.ovh.net/api/put
[{"metric": "universe","value":42,"tags":{}}]
------------------------------------------------
beginResult: 0
http: 204
response: xxxx

Если beginResult отрицательный, соединение с сервером OVHcloud не удалось. Это может означать, что отпечаток пальца не так.

Если http не 2xx (это должно быть 204), сервер не может обработать ваш запрос. Это может означать, что ЖЕТОН неправильный.

У тебя есть 204? Большой! Это успех. Давайте проверим это на Графане…

Настроить Графана

Перейдите в OVHcloud Графана: grafana.metrics.ovh.net/login. Войдите в свою учетную запись OVHcloud.

Настройте источник данных
Нажмите «Добавить источник данных».

Имя: выберите один
Тип: OpenTSDB
URL: https: // <хост, который вы получили от своего менеджера (см. Ниже)>
Доступ: прямой
Проверьте «Базовый Аут»
Пользователь: metrics
Пароль: <прочитать токен у вашего менеджера (см. Ниже)>
Нажмите на кнопку «Добавить»…
… и сохранить его.

Создайте свой первый график
Вернитесь на grafana.metrics.ovh.net/ и нажмите «Новая панель».


Выберите свою метрику в поле «имя метрики». Программное обеспечение должно предлагать имя юниверса (имя, указанное в программе Arduino). Если это не так, это означает, что метрики были неправильно отправлены Wemos. Закройте панель «Редактировать» (нажмите крестик справа) и сохраните свою конфигурацию (в верхнем левом углу окна).

Анализ результатов
Рост температуры
Первый результат для анализа — повышение температуры. Датчик лежал на кирпичах духовки. Желтая диаграмма — это температура духовки, а зеленая — температура окружающей среды.

Между 11:05 и 11:10 наблюдается шаг около 85 ° C. Кажется, это была влажность сушащейся духовки.
Затем происходит падение температуры, поэтому я добавил еще дров в духовку (то есть ввел холодные продукты).
Около 11:20 склон светлее, и я понятия не имею, почему. Огонь недостаточно сильный? Влага глубже в кирпичах?

Падение температуры
В этот момент я переместил все угли в заднюю часть духовки и поместил датчик в место, где горел огонь. Вот почему график начинается при 400 ° C.

Падение температуры выглядит примерно так: F (t) = A / t
Примерно в 15:40 я поменял блок питания телефона, подключенного к источнику питания на 230 В, на автомобильный аккумулятор с регулятором напряжения (что казалось дерьмовым)
Температура окружающей среды довольно высокая с 15:00 до 17:00. Был солнечный день, поэтому солнце нагревало цепь.

www.ovh.com/blog/iot-pushing-data-to-ovhcloud-metrics-timeseries-from-arduino/

Часть 1. Радиосистема управления освещением(исправлено)

Cхема подключения WiFi модуля ESP8266 к Светильнику:


Рис.2. Cхема подключения WiFi модуля ESP8266 к Светильнику. 

   

Модуль ESP8266 – предназначен для осуществления беспроводной приема/передачи данных от Т к ТД

ИП –источник питания. Предназначена для преобразования входного напряжения, которое необходимо для питания светильников. Для включения WiFi модуля питание подается на вывод CH_PD,который связан с чипом включения, через оптопару. Цепь с оптопарой  использована для ручного включения-выключения каналов ламп светильников выключателем. Переключение каналов происходит при каждом изменении положения выключателя по-кругу. 

Управление мощностью светильника в схеме осуществляется ШИМ-сигналом с ESP модуля, который дёргает оптопару, разряжающую задающий мощность конденсатор до определённого уровня. Данная технология позволяет управлять яркостью свечения с помощью импульсов постоянного тока различной скважности, подающихся на светодиод с высокой частотой. Фактически, светодиоды очень быстро включаются и выключаются согласно заданной программе, что визуально воспринимается как изменение яркости свечения светодиодов.При одновременном свечении светодиодов разные цвета смешиваются, в результате чего получается новый цвет. 

При этом на сигнал управления накладываются следующие ограничения:

·        амплитуда сигнала управления должна быть не более 10 В,

·        частота управляющего сигнала выбирается из диапазона 100 Гц…3 кГц,

·        длительность импульса управления должна быть не меньше 10% от периода следования импульсов.

    

 

Рис.3. Регулировочная характеристика источника питания с ШИМ-управлением

Подключение модуля ESP8266 к ПК:


Рис.4. Подключение модуля ESP8266 к ПК

ИП-источник питания, предназначен для преобразования входного напряжения в необходимое для питания модуля ESP8266, источник питания подключается через оптопару, которая предохраняет модуль от возможного скачка напряжения.

USB-TTL контроллер, предназначен для подключения модуля к ПК.

ПК-персональный компьютер предназначен для первоначальной настройки модуля ESP8266.

Возможно 2 варианта использования модуля:
1. Использование в качестве TCP-клиента.

2. Использование в качестве TCP-сервер.

На плате ESP-01 можно запустить TCP-сервер для приема-отправки данных или она может выступать TCP-клиентом для приема-отправки данных на сервер.
Для запуска TCP-сервера выполним следующие команды:

1. Устанавливаем режим передачи командой

AT+CIPMODE=<mode>

mode = 0 — not data mode (сервер может отправлять данные клиенту и может принимать данные от клиента)
mode = 1 — data mode (сервер не может отправлять данные клиенту, но может принимать данные от клиента)

2. Устанавливаем возможность множественных соединений:

AT+CIPMUX=<mode>

mode 0 — single connection
mode 1 — multiple connection 

3. Запускаем сервер на порту 8888:

AT+CIPSERVER= <mode>[,<port>]

mode 0 — to close server
mode 1 — to open server

4.Отправляем данные с ESP-01 на ПК
Для режима Single connection (+CIPMUX=0) отправка идет так:

AT+CIPSEND=<length>

Для режима Multiple connection (+CIPMUX=1) отправка идет так:

AT+CIPSEND=<id>,<length>

После выполнения AT+CIPSEND нужно ввести текст, завершение ввода и отправка осуществляется по Enter.

Настройка режима TCP-клиента

1.Устанавливаем режим передачи командой

AT+CIPMODE=<mode>

mode = 0 — not data mode (клиент может отправлять данные серверу и может принимать данные от сервера)
mode = 1 — data mode (клиент не может отправлять данные серверу, но может принимать данные от сервера)

2. Режим соединений ставим Multiple connection: AT+CIPMUX=1
3. На ПК в SocketTest запускаем сервер на порту 8888
4. Запускаем клиента на ESP-01
Для режима Single connection (+CIPMUX=0) формат такой

AT+CIPSTART=<type>,<addr>,<port>

Для режима Multiple connection (+CIPMUX=1) формат такой

AT+CIPSTART=<id><type>,<addr>,<port>
5. Отправляем данные с ESP-01 на ПК
Для режима Single connection (+CIPMUX=0) отправка идет так:
AT+CIPSEND=<length>
Для режима Multiple connection (+CIPMUX=1) отправка идет так:
AT+CIPSEND=<id>,<length>
После выполнения AT+CIPSEND нужно ввести текст, завершение ввода и отправка осуществляется по Enter.

  ПП — программа пользователя,заложена на ПК. Предназначена для графическое отображение сведений о светильниках, и средство управления системой пользователем.

Для реализации взаимодействия  ТД и Т необходим сценарий, которому будет следовать ТД в различных ситуациях. Этот сценарий будет расположен в модуле управления. Так же в МУ присутствует информационная система, в которой хранятся различные журналы с данными. ИС  содержит:

— ID T.  Журнал идентификаторов всех Т, которые могут управляться дистанционно. Наличие данного журнала необходимо с целью адресной и групповой доставки сообщений.

— Память данных. Здесь хранится журнал данных телеметрии, которая передается от Т к  ТД. (температура излучающей панели и источника питания, ток потребления лампы и ID Т). Данный журнал может вместить в себя данные со всех терминалов за определенный промежуток времени, выбранный пользователем.

 

Проработаем способа доставки информационных/служебных сообщений системы по схеме: событие — сообщения для передачи — инициатор сеанса связи – запрос/захват канального ресурса — доставка сообщения (сеть) — получатель сообщения.

В зависимости от события пользователь может выбрать все светильники, группу светильников или определенное устройство освещения. Тогда сообщение для передачи терминалу  будут содержать команды управления освещением, имеющий адресный, групповой или широковещательный характер. В ПО формируется сообщение содержащее адрес, номер команды, которую выбрал пользователь для светильника. Это сообщение необходимо передать выбранным терминалам. С ТД на выбранные Т отправляется уведомление о наличии команды для исполнения и запрос о готовности её принять. Терминал не все время находится в режиме ожидания команд. 

При доставке сообщений в передающемся пакете будет указываться тип адресации:

·        Если команда предназначена конкретному светильнику, то в поле «Тип адресации» будет указано значение «А»-адресное сообщение. Это свидетельствует о том, что команда предназначена конкретному светильнику.  А в поле «Адрес» будет указываться ID терминала.

·        Если команда предназначена для группы светильников, то в поле «Тип адресации» будет указано значение «G», что соответствует групповой адресации. Сведения о том какие светильники объединены в группы содержатся в ПО, а так же ID все входящих в группу светильников. А в поле «Адрес» будет содержаться адрес всей группы.

·        Если команда предназначена для всех светильников, то поле «Адреса» будет отсутствовать, а в поле «Тип адресации» будет указано значение «В», что соответствует широковещательной адресации.

Список используемой литературы:

1.     http://omoled.ru/publications/view/461

2.     http://homes-smart.ru/index.php/oborudovanie/bez-provodov-wi-fi/sverkhdeshevyj-wi-fi-modul-esp8266

3.     http://www.svyazexport.com/catalog/lighting.php

4.     http://www.russianelectronics.ru/engineer-r/review/2195/doc/53572/ 

    http://geektimes.ru/post/241054/ 

http://prosto-wlan.blogspot.ru/2015/02/wifi-esp8266.html 

 http://www.terenceang.com/archives/31

 

ESP8266 Отправка данных по Wi-Fi на другой ESP8266 — Robot Zero One Робот Zero One

Простое руководство по отправке данных с одного ESP8266 на другой по Wi-Fi с использованием одноранговой сети от устройства к устройству без использования маршрутизатора Wi-Fi.

Библиотека ESP8266WebServer позволяет запускать ESP8266 в качестве базового веб-сервера и точки доступа. Он может обрабатывать данные, полученные от удаленного датчика по Wi-Fi, без подключения устройств к сети или маршрутизатору.

Для этого урока я использую две платы NodeMCU от eBay, но вы можете сделать это с любой платой на базе ESP8266.Чтобы имитировать выходной сигнал датчика, я использую потенциометр подстроечного потенциометра, подобный приведенному на eBay. Я также использую два небольших OLED-экрана с AliExpress, чтобы вы могли легко видеть данные, но они вам не нужны, если вы хотите видеть результаты на последовательном мониторе.

Как вы можете видеть на видео ниже, когда потенциометр регулируется, значение, отображаемое на OLED передающем модуле, изменяется, отражая изменение напряжения на контакте A0. На приемнике значение на OLED обновляется по мере получения данных от передатчика.

Если у вас еще нет Arduino IDE, настроенной для диапазона ESP8266, вы можете найти руководство здесь — https://robotzero.one/heltec-wifi-kit-8/ в разделе Настройка Arduino IDE для ESP8266 Диапазон.

Я использую эти настройки в IDE (меню «Инструменты»).

Схема подключения передатчика и приемника идентична, за исключением того, что передающее устройство имеет потенциометр, подключенный к контактам питания и аналогового считывания (A0). Возможно, вам потребуется подключить вывод A0 через резистор на некоторых платах, поскольку они считывают только до 1 В.

Схема подключения Wi-Fi

ESP8266 к ESP8266

ESP8266 — ESP8266 Макет Wi-Fi

Если он еще не установлен, вам нужно будет установить библиотеку дисплея U8g2 (для OLED). Ее можно установить с помощью диспетчера библиотек Arduino IDE — откройте Sketch> Включить библиотеку> Управление библиотеками и найдите, а затем установите U8g2.

Вот эскиз передатчика. Есть более подробная версия, если вы хотите увидеть вывод на последовательном мониторе или вам нужно здесь отладить.

 #include 
#include 

// Список конструкторов U8g2 -  https://github.com/olikraus/u8g2/wiki/u8g2setupcpp#introduction 
U8G2_SSD1306_128X64_NONAME_F_SW_I2C  u8g2  (U8G2_R0, / * часы = * / 5, / * данные = * / 4);

const char * ssid = "poopssid";
const char * password = "pingu4prez";

const int analogInPin = 0; // Аналоговый входной контакт, к которому подключен потенциометр
int sensorValue = 0; // значение, считываемое с потенциометра
int outputValue = 0; // значение отправлено на сервер

void setup () {
  Серийный .begin (115200);
 задержка (10);

 // Явно устанавливаем ESP8266 как WiFi-клиент
  WiFi . Режим (WIFI_STA);
  WiFi  .begin (ssid, пароль);

 while ( WiFi  .status ()! = WL_CONNECTED) {
 задержка (500);
 }

  u8g2 . Начать ();
  u8g2  .setFont (u8g2_font_logisoso62_tn);
  u8g2  .setFontMode (0); // включить прозрачный режим, который быстрее
}

void loop () {
 // считываем аналог по значению:
 sensorValue = analogRead (A0);
 // сопоставить диапазон.Потолок изменяется от 3 до 1023. Таким образом, отправляемое значение находится в диапазоне от 0 до 999, чтобы соответствовать OLED-дисплею.
 outputValue = map (sensorValue, 3, 1023, 0, 999);

 char intToPrint [5];
 itoa (outputValue, intToPrint, 10); // преобразование целого числа в строку для библиотеки OLED
  u8g2  .firstPage ();
  u8g2  .drawUTF8 (0, 64, intToPrint);
  u8g2  .nextPage ();

 // Используйте класс WiFiClient для создания TCP-соединений
 Клиент WiFiClient;
 const char * host = "192.168.4.1";
 const int httpPort = 80;

 если (! client.connect (host, httpPort)) {
  Serial  .println («соединение не удалось»);
 возвращение;
 }

 // Теперь мы создаем URI для запроса. Что-то вроде / data /? Sensor_reading = 123
 Строка url = "/ data /";
 url + = "? sensor_reading =";
 url + = intToPrint;

 // Это отправит запрос на сервер
 client.print (String ("GET") + url + "HTTP / 1.1 \ r \ n" +
 "Хост:" + хост + "\ r \ n" +
 «Подключение: закрыть \ r \ n \ r \ n»);
 беззнаковый длинный таймаут = millis ();
 while (client.available () == 0) {
 if (millis () - timeout> 5000) {
  Серийный .println (">>> Тайм-аут клиента!");
 client.stop ();
 возвращение;
 }
 }

 задержка (500);
}
 

На сервере (приемнике) скетч выглядит так. Опять же, если вам нужна версия с последовательными выходами, чтобы увидеть более подробную информацию, вы можете скачать ее здесь.

 #include 
#include < ESP8266WebServer  .h>
#include 

// Список конструкторов U8g2 -  https://github.com/olikraus/u8g2/wiki/u8g2setupcpp#introduction 
U8G2_SSD1306_128X64_NONAME_F_SW_I2C  u8g2  (U8G2_R0, / * часы = * / 5, / * данные = * / 4);

const char * ssid = "poopssid";
const char * password = "pingu4prez";

  ESP8266WebServer  сервер (80);

void handleSentVar () {
 если (server.hasArg ("sensor_reading")) {// это переменная, отправленная от клиента
 int readInt = server.arg ("чтение_сенсора"). toInt ();
 char readingToPrint [5];
 itoa (ReadInt, ReadToPrint, 10); // преобразование целого числа в строку для библиотеки OLED
  u8g2  .firstPage ();
  u8g2  .drawUTF8 (0, 64, readingToPrint);
  u8g2  .nextPage ();
 server.send (200, «текст / html», «Данные получены»);
 }
}

void setup () {
 задержка (1000);

  u8g2 . Начать ();
  у8г2 .setFont (u8g2_font_logisoso62_tn);
  u8g2  .setFontMode (0); // включить прозрачный режим, который быстрее

  WiFi  .softAP (ssid, пароль);
  IP-адрес  myIP =  WiFi  .softAPIP ();

 server.on ("/ данные /", HTTP_GET, handleSentVar); // когда сервер получает запрос с / data / в строке, запускаем функцию handleSentVar
 server.begin ();
}

void loop () {
 server.handleClient ();
}

 

Надеюсь, это руководство поможет вам начать в правильном направлении с использованием Wi-Fi на этих устройствах.Я видел другие руководства, которые усложняли вещи намного сложнее, чем они должны были быть.

Если вы нашли что-то полезное выше, скажите спасибо, купив мне здесь кофе …

Просмотры сообщений: 88 204

ESP8266: отправка и получение данных

Модуль Wi-Fi

ESP8266 может быть настроен как станция / клиент или точка доступа.После того, как модуль ESP8266 настроен в одном или обоих режимах одновременно, его можно использовать для связи с другими точками доступа или клиентами. Модуль ESP8266 может обрабатывать несколько подключений, если настроен, и отправлять / получать данные.

Настроить сервер ESP8266

Получите локальный IP-адрес.

 AT + CIFSR 

Настройте TCP-сервер.

 AT + CIPSERVER = 1 

Значение 1 создает сервер, а 0 удаляет сервер, и в этом случае модуль необходимо перезапустить.Порт может быть дополнительно указан в качестве второго аргумента, в противном случае используется порт по умолчанию 333 .

Установить режим подключения.

 AT + CIPMUX = 1 

Режим одиночного соединения устанавливается со значением 0 , тогда как режим множественного соединения устанавливается со значением 1 . Этот режим можно изменить только после отключения всех подключений. Если сервер запущен, требуется перезагрузка.

Установить режим передачи.

 AT + CIPMODE = 0 

Значение по умолчанию 1 устанавливает передачу в режим передачи без прикрас, а 0 устанавливает его в нормальный режим.

Получить текущий тайм-аут сервера.

 AT + CIPSTO? 

Установить тайм-аут сервера.

 AT + CIPSTO = 10 

Значение тайм-аута сервера может находиться в диапазоне от 0 до 7200 секунд. Значение по умолчанию — 10 секунд.

Запустите TCP или UDP-соединение в режиме одиночного соединения.

 AT + CIPSTART = "TCP", "192.168.0.65", 333 

Тип подключения может быть TCP или UDP . 192.168.0.65 — это IP-адрес сервера удаления, к которому выполняется соединение. 333 — порт того же удаленного сервера.

Запуск TCP или UDP-соединения в режиме множественного соединения.

 AT + CIPSTART = 1, «TCP», «192.168.0.65», 333 

Первый аргумент — это id соединения. Все остальные аргументы идентичны режиму одиночного соединения.

Отправить данные

Отправлять данные в режиме одиночного соединения.

 AT + CIPSEND = 15 

В режиме одиночного соединения требуется только длина данных в байтах. Максимальная длина 2048 байт. За командой отправки должны сразу же следовать фактические данные, которые соответствуют указанной длине.

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

 AT + CIPSEND = 1,15 

В режиме множественного соединения первым параметром является id соединения, за которым следует длина в байтах.

Получение данных

Получение данных в режиме одиночного соединения.

 + IPD, 4: данные 

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

Получение данных в режиме множественного подключения.

 + IPD, 1,4: данные 

Помимо длины и данных в качестве первого аргумента необходимо указать идентификатор соединения.

Закройте TCP или UDP-соединение в режиме одиночного соединения.

 AT + ЗАКРЫТЬ 

Закройте TCP или UDP-соединение в режиме нескольких подключений.

 AT + ЗАКРЫТЬ = 1 

Чтобы закрыть все соединения, можно использовать значение 5 , в противном случае необходимо указать соединение с идентификатором .

Проверить текущий статус подключения.

 AT + CIPSTATUS 

Текущее состояние модуля определяется значением СОСТОЯНИЯ, которое может быть 2 для IP-адреса, 3 для подключенного и 4 для отключенного.В режиме множественного подключения также отображается id подключения. Тип подключения будет TCP или UDP . Также указаны адрес ip и порт соединения. Последняя переменная представляет режим модуля, 0 для клиентского режима или 1 для серверного режима.

Связанные

5.Сеть — сокеты TCP — документация MicroPython 1.17

Строительным блоком большей части Интернета является сокет TCP. Эти розетки обеспечить надежный поток байтов между подключенными сетевыми устройствами. В этой части руководства будет показано, как использовать сокеты TCP в нескольких различных случаи.

5.1. Звездные войны: Asciimation

Проще всего загрузить данные из Интернета. В этом случае мы будем использовать сервис «Звездные войны Asciimation», предоставляемый мигалками.нл Веб-сайт. Он использует протокол telnet на порту 23 для потоковой передачи данных всем, кто соединяет. Его очень просто использовать, потому что вам не нужно пройти аутентификацию (указать имя пользователя или пароль), вы можете просто начать загрузку данных сразу.

Первое, что нужно сделать, это убедиться, что у нас есть модуль сокета:

Затем получите IP-адрес сервера:

 >>> addr_info = socket.getaddrinfo ("полотенце.blinkenlights.nl", 23)
 

Функция getaddrinfo фактически возвращает список адресов, и каждый адрес содержит больше информации, чем нам нужно.Мы хотим получить только первый действующий адрес, а затем просто IP-адрес и порт сервера. Для этого используйте:

 >>> адрес = адрес_инфо [0] [- 1]
 

Если вы введете в командной строке addr_info и addr , вы увидите, что именно информация, которую они хранят.

Используя IP-адрес, мы можем создать сокет и подключиться к серверу:

 >>> s = socket.socket ()
>>> s.connect (адрес)
 

Теперь, когда мы подключены, мы можем загрузить и отобразить данные:

 >>> пока True:
... data = s.recv (500)
... print (str (данные, 'utf8'), end = '')
...
 

Когда этот цикл выполняется, он должен начать показывать анимацию (используйте ctrl-C для прервать его).

Вы также должны иметь возможность запускать этот же код на своем ПК с помощью обычного Python, если вы хотите попробовать это там.

5.2. HTTP-запрос GET

В следующем примере показано, как загрузить веб-страницу. HTTP использует порт 80, и вы сначала необходимо отправить запрос «GET», прежде чем вы сможете что-либо скачать. Как часть запроса вам необходимо указать страницу для извлечения.

Давайте определим функцию, которая может загружать и распечатывать URL:

 def http_get (url):
    импортный сокет
    _, _, хост, путь = url.split ('/', 3)
    addr = socket.getaddrinfo (хост, 80) [0] [- 1]
    s = socket.socket ()
    s.connect (адрес)
    s.send (bytes ('GET /% s HTTP / 1.0 \ r \ nHost:% s \ r \ n \ r \ n'% (путь, хост), 'utf8'))
    в то время как True:
        данные = s.recv (100)
        если данные:
            print (str (данные, 'utf8'), конец = '')
        еще:
            перерыв
    s.close ()
 

Тогда можете попробовать:

 >>> http_get ('http: // micropython.org / ks / test.html ')
 

Это должно получить веб-страницу и распечатать HTML на консоли.

MicroPython на ESP8266: отправка данных в ThingSpeak

Когда вы играете с новым микроконтроллером, первое, что вы обычно делаете, это включаете светодиод. Это классическое «Hello World!» проект для микроконтроллеров. Именно так я поступил, когда впервые играл с ESP8266 и MicroPython. Давайте продолжим и реализуем еще один классический проект — измерение температуры и влажности с помощью датчика DHT22.Но мы не хотим молчать, поэтому собираемся поделиться этими столь важными данными в Интернете. ThingSpeak поможет нам в этом. Давайте добавим нового воина в армию Internet of Shit!

Аппаратное обеспечение и схема: ESP8266 (ESP-07) и DHT22

Этот проект основан на моей предыдущей публикации — Начало работы с ESP8266 и MicroPython. Итак, все, что я там описал, применимо и здесь.

Также обратите внимание, что может быть лучше использовать ESP8266, у которого более 512 КБ флэш-памяти. Похоже, что ограниченные версии MicroPython могут работать некорректно (см. Проблемы с запуском MicroPython на ESP8266 с 512 КБ).

Для этого проекта мы собираемся использовать ESP-07 версию ESP8266. Вы также можете использовать ESP-12 без каких-либо изменений для схемы ниже. Но если вы используете другие модификации ESP8266, то вам может потребоваться немного доработать схему ниже.

Вот схема, которую я использовал:

Схема аналогична той из моего предыдущего поста. Вот что я добавил:

    Датчик DHT22
  • и резистор R6.
  • Переключатель на GPIO5, который используется для включения режима конфигурации , который я объясню ниже.
  • Переключатель на GPIO4, который не используется. Добавил на всякий случай, потому что у меня был блок с двумя переключателями.

Мы используем датчик DHT22 для измерения температуры и влажности. Вы также можете использовать DHT11. Вероятно, это самый популярный датчик для проектов DIY, поэтому команда MicroPython любезно добавила поддержку этого датчика прямо из коробки. Если вы никогда не видели этот датчик, DHT22 выглядит так:

Вот как выглядит устройство:

Запуск точки доступа Wi-Fi на ESP8266

Мы закончили с оборудованием, давайте поговорим о программном обеспечении.Я выложил исходники в репо на https://github.com/artem-smotrakov/yellow-duck

 $ git clone https://github.com/artem-smotrakov/yellow-duck 

Поскольку мы собираемся отправлять данные о температуре и влажности в ThingSpeak, нам нужно подключить нашу плату ESP8266 к Wi-Fi. Для этого ESP8266 нужен SSID и пароль. Самый очевидный способ — жестко запрограммировать SSID и пароль. Вот как вы можете подключиться к Wi-Fi с помощью MicroPython:

Но жестко задавать настройки Wi-Fi неудобно.Если SSID / пароль изменится, нам нужно будет изменить источники и снова загрузить его на доску. Вместо жесткого кодирования SSID / пароля мы можем сделать следующее:

  • Добавьте переключатель режима конфигурации на GPIO5 (см. Схему выше), который включает режим конфигурации.
  • Когда плата запускается, она проверяет, включен ли переключатель режима конфигурации (см. Функцию is_config_mode ).
  • В случае, если включен режим конфигурации, плата устанавливает точку доступа Wi-Fi и запускает локальный веб-сервер (см. Функции start_access_point и start_local_server ).
  • Когда пользователь подключается к этой точке доступа Wi-Fi, веб-сервер предлагает установить SSID и пароль для сети Wi-Fi, которые затем следует использовать.
  • Когда пользователь предоставляет SSID / пароль, веб-сервер сохраняет его в файле конфигурации на ESP8266 и перезагружает плату (см. Функции write_wifi_config и reboot ).
  • На этом этапе пользователь также должен выключить режим конфигурации .
  • После перезагрузки плата подключается к указанной сети Wi-Fi (см. Функцию connect_to_wifi ).
  • В случае успешного подключения включает LD1 (см. Функцию turn_on_wifi_led ).

Итак, если мы хотим использовать устройство в другой сети Wi-Fi или только что изменили пароль Wi-Fi, нам не нужно повторно прошивать устройство.

После успешного подключения к Wi-Fi устройство начинает измерять температуру и влажность с заданным интервалом. Как я упоминал ранее, MicroPython поддерживает датчики DHT11 и DHT22 из коробки. Мы просто используем дхт.DHT22 , см. mesure_tempera_and_humidity :

Это довольно просто. Затем нам нужно отправить данные в Интернет. Мы собираемся использовать ThingSpeak, красивую и бесплатную платформу для сбора, анализа и визуализации данных с устройств Интернета вещей. ThingSpeak предоставляет RestFUL API для устройств IoT. Во-первых, вам необходимо создать учетную запись на ThingSpeak. Далее вам нужно создать канал. После этого вы получите ключ API для публикации данных на вашем канале. Затем этот ключ API следует использовать для отправки данных в ThingSpeak.Не забудьте включить в канале два поля: одно для температуры, а другое для влажности.

Вот как мы отправляем данные в ThingSpeak:

У нас та же проблема, что и с SSID / паролем - нам нужно предоставить ключ API, но мы не хотим его жестко кодировать. Решение то же - устройство предлагает пользователю указать ключ API в режиме конфигурации .

Как вы могли заметить, здесь мы используем TLS - см. Выше вызов ssl.wrap_socket , который объединяет обычный сокет с сокетом TLS.Честно говоря, я был немного удивлен, когда узнал, что MicroPython для ESP8266 поддерживает TLS. Но в этом есть один нюанс. Даже если здесь используется TLS, MicroPython для ESP8266 не поддерживает проверку сертификата сервера (по крайней мере, версия 1.8.7 не поддерживает это). Таким образом, мы в относительной безопасности, если злоумышленник может просто перехватить соединение, потому что все данные будут зашифрованы. Но если злоумышленник может изменить трафик, тогда у нас возникнут проблемы, потому что сертификат сервера может быть заменен вредоносным, чтобы злоумышленник мог расшифровать и изменить данные.

Вы могли заметить в коде ряд вызовов . Это просто для отладки. Вы можете подключиться к ESP8266 через USB-последовательный адаптер и увидеть эти отладочные сообщения.

Визуализации на ThingSpeak

Если все прошло гладко, устройство начнет отправлять данные в ThingSpeak. Затем ThingSpeak позволяет визуализировать данные и анализировать их с помощью MatLab. Самый простой способ - нарисовать такую ​​диаграмму:

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

https://thingspeak.com/channels/230189

Ссылки

Удачи!

Если вы обнаружили орфографическую ошибку, сообщите нам об этом, выделив этот текст и нажав Ctrl + Enter .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *