Memcached для Arduino

LEOWRS
Offline
Зарегистрирован: 08.08.2018

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

Memcached - это кросплатформенный сервер для хранения hash-таблиц в оперативной памяти, обычно используется (от facebook до городских форумов) для кэширования запросов, но в случае с ардуино может стать хранилищем-посредником.

Установка и настройка всюду, от винды до FreeBSD проще простого, в памяти сам по себе этот сервер жрет порядка 1Мб, что может быть кричино, если мозгом умного дома, к примеру, работает Rasberry или купленный на вес старый пентиум. В отличие от Apache не создает мегаклонов, и в общем экономичнее и проще, чем даже связка Nginx+PHP-fpm.

Установка под винду https://commaster.net/content/installing-memcached-windows кому интересно, под nix и BSD думаю кто занимается легко найдет.

Практически все языки имеют библиотеки для работы с этим сервером, но в принципе нет большой проблемы работать с ним через socket https://blog.elijaa.org/2010/05/21/memcached-telnet-command-summary/

Идея такая.

1. Если надо передать данные с датчиков, например температуру, открываем через сокет ардуиной мэмкешед, и записываем по ключу типа "sleeproomtemp=18.6", когда надо веб сервер хоть на php, хоть на python, хоть приложение на Delphi или Android вытаскивает и визуализирует со всеми наворотами это значение. Если очень хочется в тот же MySQL писать график температуры, ну или еще чего, тоже не проблема, пишем легкий скрипт на то же perl который запускается по cron раз в минуту, смотрит число в memcached и записывает куда и как ему нравится.

2. По части управления, ардуина вполне может держать постоянно открытым порт memcached и читать оттуда значения управляющих комманд, например вычитывая ключ "boilertemp=70" понимать, что если текущая температура ниже заданой, надо включить релюху на тэн, если ниже, отключить тэн, а PHP скрипту остается лишь заданное в веб-интерфейсе значение менять в кэше. Опять же в случае с бойлером, PHP через хэш говорит boilertemp=70, если я собрался ванну принять, ардуина отдает текущее значение туда же "currentboilertemp=50" и по элементарной формуле мне PHP скрипт напишет сколько еще времени до нагрева бойлера до 70 градусов, а если надо, то увидев 70, отправит сообщение что типа бойлер нагрелся достаточно чтобы ванну набрать.

ИМХО такой вариант будет намного легче по ресурсам, и во многих случаях универсальнее, при этом я искренне не понял, или не нашел, почему есть под тот же ESP библиотека HTTPClient но нет SocketClient, тогда как Socket является основой для HTTP.

По части управления получится некоторая задержка, на время, пока у Arduino не дойдет цикл до опроса управляющей команды, и может получиться задержка, но с другой стороны, поднимать на Arduino web-server который обрабатывает запросы, которые кстати тоже может протупить будучи занят, и клиент его не дождется, не лучше. А так получается схема PHP через веб ставить задачу, и забывает, после чего ардуина приходит смотреть список задач, получает и выполняет.

Тут в одной теме было как через json минимизировать отдачу данных для веб интерфейса, ИМХО эта схема решает эту задачу намного лучше, не говоря уже про вопрос на форуме "как заполучить файл с данными с сервера" и как их парсить...

b707
Offline
Зарегистрирован: 26.05.2017

и что в этой идее нового? я думал все так и делают, только не знал, что это называется memcached :)

У меня на линуксе крутится самодельный сервер на перле, которому все ардуины отсылают данные, а уже он, когда надо - выкладывает их в сеть...  или кладет в БД... или отдает по запросу другим приложениям. Весь код, написанный с нуля совершенно тупым стилем "шаблон -> действие" занимает строчек 200... если взяться и переписать, можно и короче... но лень :)

LEOWRS
Offline
Зарегистрирован: 08.08.2018

b707 пишет:
и что в этой идее нового? я думал все так и делают, только не знал, что это называется memcached :)

У меня на линуксе крутится самодельный сервер на перле, которому все ардуины отсылают данные, а уже он, когда надо - выкладывает их в сеть...  или кладет в БД... или отдает по запросу другим приложениям. Весь код, написанный с нуля совершенно тупым стилем "шаблон -> действие" занимает строчек 200... если взяться и переписать, можно и короче... но лень :)

Повторюсь, в теме Arduino я чайник, так что прошу не судить строго. На тему того, что это же можно сделать, написав на perl демона, который так же слушает порт и по сокету общается - не спорю, можно, просто это те же 200 строк кода, с меньшей стабильностью, полагаю с меньшей функциональностью, хотя и с большей гибкостью (что-то избранное в базу, что-то в памяти держать можно), но тут готовая, проверенная годами система хеширования в памяти данных, поставить которую можно за минуту без особых знаний, а знаний админских фишек и программирования, судя по вопросам на форуме не у всех 20-30 лет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ключевое слово тут "пишем".

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

LEOWRS
Offline
Зарегистрирован: 08.08.2018

sadman41 пишет:
Ключевое слово тут "пишем".

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

Честно говоря мне первое знакомство в atmega и esp немного напомнило первое знакомство с АГАТ-9, разница в том, что к АГАТу было отэренной документации около 10кг без интернета и форумов, а к модулю который попался, ноль документации и уйма инфы в инете, 99% из которой, ИМХО шлак, именно в режиме скачать тут, нажать сюда, без понимая процесса и это вернуло в состояние, "думай, ищи, догадывайся, пробуй", чего я очень давно не видел в программировании, и чему, реально рад.

Думаю среди ардуинщиков, в том числе и школьного возраста, найдутся те, кому интересно не просто "нажми на кнопку - получишь результат", а разобаться как эта кнопка работает, и судя по тому, что я читал про ардуино, именно это и было целью авторов проекта изначально, потому что тенденция, когда мега-супер-кодер лихо работает с вебом, напрочь не понимая что такое TCP-IP и что такое Socket - это путь к тотальной деградации профессии, и я тут еще добавлю, 99% преподавателей ВУЗов нынче не лучше.

Вообще тема вся эта очень объемная, далеко за пределами втыкания маму в папу, как пример, читая форумы сильно поржал, что у народа датчики влажности почвы вылетают за месяц в дерьмо превращаются, а это банальная химия-физика, называется - нахрена ты постоянно под напряжением держишь датчик влажности, подавай напряжение когда он нужен, грубо на 1 секунду раз в минуту, и 3 месяца превратятся в 15 лет, реально конечно дай бог 10 лет, но всё же не 3 месяца...

b707
Offline
Зарегистрирован: 26.05.2017

LEOWRS пишет:

это вернуло в состояние, "думай, ищи, догадывайся, пробуй", чего я очень давно не видел в программировании, и чему, реально рад.

нечего там догадываться - для каждого контроллера Атмега в инете доступен подробнейший даташит производителя, порядка 1500 страниц на английском... сиди и изучай. Если распечатать на бумаге даташиты нескольких МК - как раз и получится "10кг документации" - все как вы любите.

А по видео на Ютубе только школьники программирование "изучают"

LEOWRS
Offline
Зарегистрирован: 08.08.2018

b707 пишет:

LEOWRS пишет:

это вернуло в состояние, "думай, ищи, догадывайся, пробуй", чего я очень давно не видел в программировании, и чему, реально рад.

нечего там догадываться - для каждого контроллера Атмега в инете доступен подробнейший даташит производителя, порядка 1500 страниц на английском... сиди и изучай. Если распечатать на бумаге даташиты нескольких МК - как раз и получится "10кг документации" - все как вы любите.

А по видео на Ютубе только школьники программирование "изучают"

С мегой кстати вопросов то и не было, по ней и датаshit найти не проблема, вопрос изначально был "как что на этой плате воспринимает mega ESP" а этого в мануалах как бы нет, по ESP есть, по mega килограммами, а по плате только джамперы... С самим EPS были кое какие грабли, в частности эта тварь оказывается скетчи принимает только через DOUT, а всё что зашито дефолтным QIO валится в ошибку,  не говоря уже что на 57600 сообщение о битой контрольной сумме, оказывается является нормальным приветствием, а не ошибкой и всё это в режиме инета документировано в десятке вариантов, один пишет "flash check sum error" - что сгорела плата или флэш подох, другой, более продвинутый, пишет "не парься, у китайцев Checksum ERR, переводится как здрасти", более продвинутый дает код, который показывает, что если была залита прошивка по объему больше предыдущей, то контрольная будет сбоить всегда, потом что китайцы забыли учесть длинну бинарника, да еще и or использовали...

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

LEOWRS
Offline
Зарегистрирован: 08.08.2018

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

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include "DHT.h"
#define DHTPIN 4
DHT dht(DHTPIN, DHT11);

const char* ssid = "CCCP";
const char* ssidpassword = NULL;
const char* memcachedhost = "192.168.88.100";

WiFiClient client;

void setup()
{
  Serial.begin(115200);
  Serial.println();

  WiFi.begin(ssid, ssidpassword);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
  
  //Коннектимся к мемкэшед, порт поумолчанию 11211
  if (client.connect(memcachedhost, 11211)) {
      Serial.println("Memcached connected");
  }
}

void loop() {
  delay(1000);
  //Считываем влажность
  float h = dht.readHumidity();
  // Считываем температуру
  float t = dht.readTemperature();
  // Проверка удачно прошло ли считывание.
  if (isnan(h) || isnan(t)) {
    Serial.println("Не удается считать показания");
  } else {
    Serial.print ("Humidity: ");
    Serial.print (h);
    Serial.print ("%\t");
    Serial.print ("Temperature: ");
    Serial.print (t);
    Serial.println (" *C");
    memset("cabh",String(h),60);
    memset("cabt",String(t),60);
  }
}

void memset(String key, String val, int expire)
{
  client.println("set "+String(key)+String(" 0 ")+String(expire)+" "+String(val).length());
  client.println(val);
}

По порядку. На локальной машине поднят memcached в локальной сети с флагом -l 0.0.0.0 это не всегда нужно, но есть варианты которые не слушают ничего кроме 172.0.0.1.

Коннект к серверу протейший client.connect(memcachedhost, 11211) никаких протоколов авторизации у memcached нет, после этого классический пример с замером температуры и влажности добавлен вызовом функции memset("cabh",String(h),60);

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

На PHP эти данные читаются не многим сложнее

<?php
$memcached = new Memcached;
$memcached->addServer('localhost', 11211) or die ("Could not connect");
if (($cabh = $memcached->get('cabh')) === false) {echo 'Отвалилась влажность'} else {echo 'Влажность в кабинете: '.$cabh.'%';}
if (($cabt = $memcached->get('cabt')) === false) {echo 'Отвалилась температура'} else {echo 'Температура в кабинете: '.$cabt.'C';}
?>

 

b707
Offline
Зарегистрирован: 26.05.2017

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

И второе - избегайте использовать String . На фоне остального кода работа со Стрингами ради передачи двух параметров выглядит по лоховски :)

negavoid
Offline
Зарегистрирован: 09.07.2016

Ооо, уже редис к ардуине прикручивают :) Чё уж там, давайте сразу на петабайтные бакеты амазона данные с бедного датчика заливать.

LEOWRS
Offline
Зарегистрирован: 08.08.2018

b707 пишет:

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

И второе - избегайте использовать String . На фоне остального кода работа со Стрингами ради передачи двух параметров выглядит по лоховски :)

Верю, понимаю, знаю, но тут примерно тот же случай, как когда я приезжаю в Россию и беру отцовскую Ниву у которой вторая передача давно приказала долго жить и тросик сцепления растянут как президентский срок... Как результат после аудюхи с автоматом первое время при 20-летнем стаже на русском джипе выгляжу лохом и уже даже не стесняюсь.

Тут по сути тот же случай, привыкнув к тому как тот же PHP плюёт на типы переменных и вообще с прибором клал на их объявление, к C-подобному arduino надо приноровиться, особенно с типами переменных, так как пока у меня голова отъезжает что char может содержать больше 1 символа и до конца не вкурил как устроен string, который по уму должен быть array of char но что делать если char может "hello" принять полноценно.

Привыкну, по уму бы конечно фишку с memcached сделать в виде модуля-библиотеки, но это чуть позже, пока код слегка модифицировал.

void memcached_set(String key, String val, int expire, int debug)
{
  String cmd="set "+String(key)+String(" 0 ")+String(expire)+" "+String(val).length();
  client.println(cmd);
  client.println(val);
  if (debug==1)
  {
    Serial.print("mem >>> ");
    Serial.println (cmd);    
    Serial.print("mem >>> ");
    Serial.println (val);    
    Serial.print("mem <<< ");
    Serial.println (client.readStringUntil('\n'));
  }
}

Соответственно и вызов функции чуть изменился, на

memcached_set("cabh",String(h),60,1);

Опять же пока не раскопал, как, и можно ли, делать дефолтные необязательные параметры у процедур и функций, типа memcached_set(String key, String val, int expire, int debug=0), такая конструкция не прокатила.

При этом заметил, что как Client.print, так и Serial.print, кладут на тип передаваемых данных, то есть для них нет проблем привести любой тип переменных к String и в порт плюнуть, и возникает мысль, что грабли с объявлением переменных и конфликты типов данных разработчики Arduino сделали специально.

LEOWRS
Offline
Зарегистрирован: 08.08.2018

negavoid пишет:

Ооо, уже редис к ардуине прикручивают :) Чё уж там, давайте сразу на петабайтные бакеты амазона данные с бедного датчика заливать.

Причем тут редис? Сампл на PHP я написал просто как пример чтения данных из memcached на сервере, в который ардуина заметно легче отправляет данные, чем тем же http post и намного стабилее, чем обращения к самописному перловому демону, хотите читайте показания температуры telnet-ом, хотите сделайте на perl опросник температуры, загоните в crontab и пишите в базу, memcached в данном случае, ИМХО, просто удобный посредник.

LEOWRS
Offline
Зарегистрирован: 08.08.2018

Прошу прощения, погуглил, оказывает Redis - это аналогичная Memcached (2003 года), разработка 2009. Но тогда у меня вопрос, а что плохого если относительно слабый "датчик" будет общаться не через GET-POST, а через сокет c no-sql базой? Что плохого в том, чтобы заставить датчик не вставать веб-сервером, для управления, тратя массу ресурсов, а по возможности из той же базы получать управляющие команды и передавать данные, как положено тупому датчику "я отправил, а Вы там разбирайтесь"?

sadman41
Offline
Зарегистрирован: 19.10.2016

LEOWRS пишет:

у меня голова отъезжает что char может содержать больше 1 символа

Не может. Более одного символа содержит char[], т.е. array of char.

LEOWRS пишет:

Опять же пока не раскопал, как, и можно ли, делать дефолтные необязательные параметры у процедур и функций, типа memcached_set(String key, String val, int expire, int debug=0), такая конструкция не прокатила.

Странно. Всегда так делаю.

 

LEOWRS пишет:

При этом заметил, что как Client.print, так и Serial.print, кладут на тип передаваемых данных, то есть для них нет проблем привести любой тип переменных к String и в порт плюнуть, 

Не кладут. Проблемы есть. У родителя Serial и всяких там *client написано несколько функций с одним именем (см "Си overload"), каждая из которых принимает свой тип данных. Компилятор выбирает подходящую, исходя из того, чем вы пытаетесь кормить функцию и подставляет ее в результирующий программный код. А вам кажется, что это автоматическое приведение типов.

LEOWRS пишет:
и возникает мысль, что грабли с объявлением переменных и конфликты типов данных разработчики Arduino сделали специально.

Они, конечно, много сделали непонятного, но в данном случае обвинения необоснованы. Язык Си не позволяет вольностей. Вернее - иногда позволяет, но для этого необходимо попотеть.

negavoid
Offline
Зарегистрирован: 09.07.2016

Можно, конечно, пользоваться и noSql базой для приёма данных с датчика, да можно и сразу к мускулу коннектиться, никто же не запрещает. Только получается ненужный оверхед. А погуглите-ка ещё про такое слово MQTT.

Ещё хочу немножко PS про php - он вовсе не кладёт с прибором на типизацию, да и в 7 версии пришли к тому, от чего уходили - возврат к жестким типам, ну а в продакшене ещё начиная с 5 версии все стараются жестко прописывать типы в phdoc. Потому что ослабленная типизация и автоматическое приведение типов приводит в больших проектах к очень трудновылавливаемым ошибкам. И разработчики ардуино не делали специальных подлянок, у всего этого ноги растут из далёких 70х годов, и надо сказать, совершенно логично и справедливо растут. Больше чтения, больше практики на си - и вы тоже это осознаете.

macros
Offline
Зарегистрирован: 07.11.2016

LEOWRS пишет:

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

Если я правильно понял, то Memcached изначально разрабатывался как локальный помошник вебсервера.

Поэтому не пердусмотрено шифрование трафика и авторизация, следовательно применение сервиса в сфере IoT очень ограничено.

b707
Offline
Зарегистрирован: 26.05.2017

LEOWRS пишет:

 Что плохого в том, чтобы заставить датчик не вставать веб-сервером, для управления, тратя массу ресурсов, а по возможности из той же базы получать управляющие команды и передавать данные, как положено тупому датчику "я отправил, а Вы там разбирайтесь"?

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

LEOWRS
Offline
Зарегистрирован: 08.08.2018

b707 пишет:
честно говоря, не понял, где вы видели, чтобы тупые датчики "вставали вебсервером"? Сплошь и рядом датчики просто отправляют свои данные через веб-интерфейс на сервер - на локальный или на известные сервисы типа народмона или thingspeak-а. Так что я совершенно не понимаю, в чем принципиальная новизна вашего подхода... все так и делают давно.

А как же ардуины принимают команды? Ну типа хочу я бойлер из режима "незамерзайки" до режима "+70" довести, чтобы ванну принять, как это происходит?

LEOWRS
Offline
Зарегистрирован: 08.08.2018

ИМХО, отвечая на свой же вопрос, есть два варианта:

1. Либо ардуина уходит в режим сервера которому можно дать команду, но есть это HTTP сервер, это трэш, так как это ресурсы, плюс ардуина может быть занята.

2. Та же ардуина, с того же memcached по тупому считывает данные типа maxtempboiler1, сравнивает с датчиком и если датчик ниже, то подает питание на реюху.

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

b707
Offline
Зарегистрирован: 26.05.2017

LEOWRS пишет:

2. Та же ардуина, с того же memcached по тупому считывает данные типа maxtempboiler1, сравнивает с датчиком и если датчик ниже, то подает питание на реюху.

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

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Дорогой энтузиаст!

Ардуинщики бывают нескольких типов:

1. Программисты (П), это самые продвинутые. П в этой ситуации использует ресурсы ЕСП8266, в котором памяти овердохуя и частота повыше, для того, чтобы накалякать свой протокол с шахматами и б...библиотекаршами. С шифрованием, преобразованием в строки, сжирающие память, если делать эту херню на Ардуино и пр. И серверную часть напишет... вернее тут, как раз, использует что-то стандартное в связке с БД.

Ясно, что это не твои клиенты. У П нет нужды в использовании такого костыля.

2. полные чайники - пишут только копипастом из примеров. Примеры все - HTTP и народный мониторинг или типа того. Это совсем не твои клиенты. У них нет никакой возможности использовать этот костыль, даже понять, что это и зачем.

3.недопрограмисты, не обижайся только, плз, пришедшие из Веб-разработки. На С++ смотрят с широко раскрытыми глазами, процедурный С - вообще что-то запредельно древнее, как дерьмо мамонта. Узнаются "на раз" по использованию String. Это основной признак веб-прогера... програмистом это нельзя называть.

Ну вот этот  слой, возможно, и заинтересуется, но они все ведь что? - они все гении! У них по три головы: Джобс, Гейтс и Цукерберг! ;) ;) ;)

Им, чаще всего, будет "в падлу" воспользоваться твоим советом, каждый найдет еще какую приблуду, которую он, в своей практике из двух, нет, даже ТРЕХ заказах на разработку инет-магазинов и одного порносайта, использовал. Гы!

Еще раз прости, просто програмисты не очень нежно относятся к веб-разработчикам... это "цеховая неприязнь". ;)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

И как программист и как веб-разработчик поддержу тут чуть больше чем полностью. А столкнувшись с преподаванием (кстати, как там ваша школа в мск - получилось?) теперь уже и даже понимаю откуда берется эта "цеховая неприязнь". Всё банально и просто:

Обучение с "низким порогом вхождения" (бег по вершкам), создает тяжелую травму мозга у обучающегося, в виде неприятия строгой типизации (управления памятью и прочие "трудности" строгих языков) в силу непонимания зачем оно надо (ну как жеж! ПХП, JS, Лего-скретч .. куча всего могут, а тут никак!). Бег по вершкам также исключает последующее легкое вникание в "азы" профессии (оптимизация в т.ч. алгоритмическая, битовая арифметика, регистры и пр. асм. штучки). И да, верхогляды легко разпознаются по использованию не только класса String, но и темплейтов, виртуальных функций в микроконтроллерах, везде где оно "ни разу не надо было", зато "во как могу!".

Очень сложно (и таких жалоб от преподавателей - полно!) "потом" объяснять пропущенный пласт знаний, когда сверху уже всё покрыто плотной коркой опыта.

P.S. но. как способ отсечь в круг профессионалов только некоторых - очень действенный этот метод: "обезьяний метод обучения" - "смотри как всё просто: делай так, а почему - не твое дело".

 

LEOWRS
Offline
Зарегистрирован: 08.08.2018
wdrakula, никаких обид, однако отмечу, что я тему поднял как идею, а не в режиме "зацените мой крутой код", а Вы всё свели к качеству кодеров. Мне ардуинка с EPS попалась позавчера, и было бы странно, если я выдал фото печатной платы готовой с идеальным кодом.
 
Совершенно не спорю, что код выглядит так же изящно как и куча соплей на макетке. По написанному коду я сам могу 100500 замечаний сделать, начиная от отсутствия нормального анализа ответа сервера и вообще проверки на предмет не порвался ли сокет, заканчивая не менее лоханским, нежели string, использование '\n', что не критично в отладке, но вылезло при чтении данных. При этом стандартная readStringUntil не дает отсекать по '\r\n' и конечно по уму надо писать нормальную функцию readln которая побайтово будет собирать данные и смотреть за хвостом, но в данном случае это просто не нужно, поскольку задача кода была показать идею, а не полноценную библиотеку для memcached написать, с копрессией, бинарными данными и т.п.
 
b707, сама идея где-то хранить данные в принципе не оригинальна со времен бересты, вопрос в удобстве хранилища, и в этом смысле для умного дома, коий в качестве хобби имею мысль потихоньку сделать, memcached имеет массу плюсов.
 
В качестве головного мозга в доме я планирую использовать Raspberry Pi, который потянет всё что нужно, если сдохнет, не жалко выкинуть и переставив SD карту в другую плату (если дом разрастется, купить резервную), но при этом ресурсы его не так уж велики, а значит по возможности их надо экономить. Учитывая, что роль диска там выполняет SD карта, любое излишнее обращение к файловой системе - зло.
 
И в этом плане я у варианта использовать memcached вижу прилично плюсов:
 
1. Нулевая нагрузка на файловую систему.
 
2. Близкий к нулю расход оперативной памяти, сам по себе memcached жрет порядка 1Мб, и ему за глаза и за уши 1Мб для хранения данных для умного дома, итого 2Мб, то 0.2% от памяти Raspberry.
 
3. Нулевая авторизация, а соответственно меньше трафика и нагрузки, как на "датчики", так и на "головной мозг". Кстати кто-то заморочился сделать клиента для MySQL под Arduino https://github.com/ChuckBell/MySQL_Connector_Arduino что кстати относительно управления по HTTP(S) где скрипты всё равно полезут в базу, возможно и не такая плохая идея, но факт на порядок более ресурсоёмкая.
 
4. Практически нет лимита на коннекты, по дефолту у memcached 1024 лимит, который легко увеличивается и главное, новый коннект не пораждает в памяти увесистого потомка, как у MySQL. То есть все "датчики", "утюги" и "бойлеры" могут без проблем постоянно с ним быть на связи.
 
5. Время хранения переменных, тот самый expire. Плюс не большой, но удобный. Как я ранее писал, если "датчик" отдает данные, то поставив лимит 60 секунд на их хранение легко обнаружить, что датчик лег, без необходимости фиксировать и анализировать дату последней передачи, мелочь, а приятно. Тоже самое по части управления, если мне что-то надо включить на 30 минут, например полив секции газона, я записываю "polivalka1=ON, expire=1800" и ни с какой стороны не болит голова с контролем времени выполнения задания.
 
6. Универсальность. На php можно общаться с ним для веб-интерфейса, если нужно собирать статистику датчиков типа температуры, влажности, расхода воды, направления и силы ветра, пишется на perl скрипт, запихивается в crontab и ободрав данные, одной сессией с SQL запихивается всё в базу, при этом зная названия ключей, в принципе можно с планшета в telnet управлять всем этим хозяйством, на случай если сдох "головной мозг".
Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Если как "идея для своего умного дома", то на вкус и цвет у каждого свои фломастеры. В смысле, абсолютно пофиг как пирог из технологий Вы примените для себялюбимого. Что проще, к чему есть навыки и опыт .. да пжалста! :)

Если как идея для тиражирования, то:

6. "универсальность": её тут не просматривается никак, в силу сборки в одно целое множества языков и решений: PHP, Perl, SQL, bash .. чем больше симбиоз, тем он сложнее и менее устойчив. Сравните: датчики через ESP-ку общаются с малинкой по IP соединению (а то и вовсе по UDP), где каждый из них по мере надобности может выступать сервером/клиентом. Малинка получаемые данные хранит тупо в массиве и периодически сбрасывает на SD карте в виде файла жестко заданной структуры. По тому же IP (телнету) может сваливать это на "большой домашний комп", который это может пихать хоть в Скуль, хоть в Эксель и даже с красивыми картинками .. впрочем, опять же есть processing. .. и никакой универсальности в виде моря технологий и языков. Одын сплошной Си. :)

5. В альтернативном примере легко решается малинкой проверкой времени хранения в своем массивчике.. и может став клиентом перезапросить у ESP-ки новый замер, проверку оборудования и т.д. Все что захочется. Нет никакой надобности клиенту (ESP) периодически опрашивать ПХП-сервер на малинке..

4. Никакого "лимита на коннекты".. :)

3. Никакой авторизации. Прямое общение между микроконтроллером и малинкой-сборщиком.

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

P.S. Просто "в самом низу" всех мемкашей, просто каш, скулей и даже .. файлов лежат самые обыкновенные массивы и разного рода malloc(). Для таких простых задач как сбор и хранение данных с датчиков ничего из того что "помазано поверх" - в общем-то не требуется. Но, как пример, непонимания иерархии технологий к посту wdrakula - просто идеальный топик.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

 ТС, уважаемый!

 Качни исходник memcached. Он написан на процедурном С. Даже без ООП.

Вот так, примерно, пишут программы. ;) ;) ;) Несколько замечаний:

1. Для целей "умного дома" или еще чего, "умного", очень много избыточных возможностей. Реально проще написать свой сервер, пусть с похожим, но урезанным функционалом, но добавить криптозащиту и контроль целостности.

2. Из разряда веб-разработчиков в програмисты перейти можно, если ты можешь спокойно читать и понимать код исходников memcached. ;)

LEOWRS
Offline
Зарегистрирован: 08.08.2018

wdrakula, еще раз, я описал идею без претензии сделать идеальный код или написать библиотеку, или переписать имеющуюся. Писать на коленке свой сервер с блэкжеками, да еще и шифрованием когда речь идет о доме, который проще закрыть фаеволом - извините, бред полнейший. На тему избыточности функционала мемкэшеда, тоже не слишком логичное зявление, учитывая, потребяемые ресурсы. Избыточно температуру передавать серверу, который живет под апачем, у которого потомок голой весит от 8мб, если сильно попотесть, после чего потомок запускает PHP как процесс, тот в свою очередь зепляет десяток файлов, после чего подгружает скрипт, тоже с файов, который интерпретируясь, как положено PHP лезет в базу MySQL чтобы записать эту сраную температуру с датчика, это я конечно худший вариант описал, но найдите мне, если Вы такой гуру, более экономичный чем через сокеты плевать данные в memcached? Не абстрактными фразами, типа есть не хуже, а с описанием конкретной связки, можете?

b707
Offline
Зарегистрирован: 26.05.2017

LEOWRS пишет:

найдите мне, если Вы такой гуру, более экономичный чем через сокеты плевать данные в memcached? Не абстрактными фразами, типа есть не хуже, а с описанием конкретной связки, можете?

Более экономичный, говорите? - извольте. Начать с того, что "через сокеты плевать данные в memcached" - требует на каждом сраном датчике иметь подключение к локалке, что сразу означает, что никакой этот вариант не экономичный.

Экономичный вариант - это маленькие мобильные датчики, общающиеся с центром по радиоканалу - с помощью копеечных модулей 433МГц,  чуть более дорогих NRF24 или дальнобойных HC-12, А вот уже центр либо сам анализирует данные и раздает команды, либо скидывает их в сеть. И мемкеш тут совсем не помошник. Можно, конечно, и через memcached это делать, но альтернатив просто море. Я предпочитаю скидывать данные на простенький самодельный сокет-сервер, писанный на Перле. Если для вас "писать на коленке свой серевр - бред полнейший" - то это просто потому, что вы не работали с сетевым протоколом и можете пользоваться только готовым. На самом деле "писанный на коленке сервер" собран за день - и пока полностью покрывает мои скромные запросы. Понадобится больше - просто допишу нужное и все. Преимущество самоделки.

LEOWRS
Offline
Зарегистрирован: 08.08.2018

b707 пишет:
Более экономичный, говорите? - извольте. Начать с того, что "через сокеты плевать данные в memcached" - требует на каждом сраном датчике иметь подключение к локалке, что сразу означает, что никакой этот вариант не экономичный.

Экономичный вариант - это маленькие мобильные датчики, общающиеся с центром по радиоканалу - с помощью копеечных модулей 433МГц,  чуть более дорогих NRF24 или дальнобойных HC-12, А вот уже центр либо сам анализирует данные и раздает команды, либо скидывает их в сеть. И мемкеш тут совсем не помошник. Можно, конечно, и через memcached это делать, но альтернатив просто море. Я предпочитаю скидывать данные на простенький самодельный сокет-сервер, писанный на Перле. Если для вас "писать на коленке свой серевр - бред полнейший" - то это просто потому, что вы не работали с сетевым протоколом и можете пользоваться только готовым. На самом деле "писанный на коленке сервер" собран за день - и пока полностью покрывает мои скромные запросы. Понадобится больше - просто допишу нужное и все. Преимущество самоделки.

Тема то создана в разделе "программирование", и когда я писал "дешевле", подразумевал расход памяти и процессора, а никак не рубли, доллары или евры.

И кстати не факт, что радиоканал получится дешевле в смысле денег. Копеечные модули очень ограничены по дальности, более дорогие NRF24 по цене может и вариант, если где-то надо что-то типа звонка на колитку у забора соорудить, и там экономия скорее актуальна будет по питанию, а не по финансам... HC-12 Ваш по цене стоит столько же, сколько ESP8266. При этом на ESP можно навесить авоську датчиков, и релюх, залить программу и работать по сети, в частности, в отличие от радиоканала, контролируя на уровне "датчика" дошел ли сигнал до получателя. Так что финансовая экономия спорна, и зависит от задачи. И кстати совершенно без шуток вопрос - если HC-12 или аналогичный по мощности модуль постоянно что-то будет передавать, не окревеют ли другие устройства, работающие на 433?

Теперь относительно самописных сокет-серверов на перл, зря Вы полагаете, что я не могу таковой реализовать, первый мною был написан лет 10 назад для связи с приложением под Symbian для понтовой тогда Nokia E90, а нынче каждый кто не забанен в гугле может набрать "perl multithreaded socket server example" и доделать что ему нужно и как нужно. Но Perl сам по себе тяжел на запуск, если делать многопоточный sock сервер, неибежно через fork перл будет плодить дочерние процессы, причем в зависимости от конфигурации, ждет каждый процесс до 70Мб оперативки, не считая веса родителя. При этом perl интерпретатор, то есть по скорости априори уступает. И при всём при этом, полученные самописным перловым сервером данные всё равно надо куда-то записывать, если в файл, то это нагрузка на диск, если в базу, то как минимум на процессор и память, а если хранилище типа MySQL то на всё сразу, хотя есть вариант на perl в качестве хранилича использовать тот самый memcached, в базу записывая лишь то, что нужно для статистики, но тогда возвращаемся к вопросу - нахрена нужен тяжелый и медленный perl в качестве посредника между "датчиком" и memcached? :)

Относительно стабильности, возможно у Вас замечательный самописный скрипт, но всё таки чисто теоретически, едва ли он стабильнее чем memcached, крайняя версия которого вышла 3 дня назад, и которую допиливает напильником сообщество программистов с 2003 года...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

то, что стадо не знакомых с друг другом программистов, над которым нет общего начальства с батогами, допиливает 15 лет, по определению не может быть "стабильным". 

b707
Offline
Зарегистрирован: 26.05.2017

LEOWRS пишет:

когда я писал "дешевле", подразумевал расход памяти и процессора, а никак не рубли, доллары или евры.

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

Вы спрашиваете - "покажите мне такой же экономичный вариант?" - на что можно ответить "А нафига эта экномия?" :) Нафига экономить на спичках, когда можно за копейки взять проц помощнее и памяти чуть больше? Или вообще собирать данные с датчиков самой дешевой ардуиной. воткнутой в USB на уже имеющемся компе? В моем случае перл-сервер для сбора данных запускается на линукс серваке с i7 и 16Гигами памяти - и поэтому мне глубоко пофиг на "тяжеловесность" перла и нет смысла переходить на "экономичный мемкеш"

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

LEOWRS, Вы как-то обошли молчанием это:

"датчики через ESP-ку общаются с малинкой по IP соединению (а то и вовсе по UDP), где каждый из них по мере надобности может выступать сервером/клиентом. Малинка получаемые данные хранит тупо в массиве и периодически сбрасывает на SD карте в виде файла жестко заданной структуры. По тому же IP (телнету) может сваливать это на "большой домашний комп", который это может пихать хоть в Скуль, хоть в Эксель и даже с красивыми картинками .. впрочем, опять же есть processing. .. и никакой универсальности в виде моря технологий и языков. Одын сплошной Си. :)"

Чем оно Вас не устроило? ESP2866 вполне нормально работает с TCP соединениями напрямую, memcached не нужен .. что мешает?

http://narodstream.ru/avr-urok-48-lan-enc28j60-tcp-server-ustanavlivaem-... как урок применения TCP..

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DetSimen пишет:

то, что стадо не знакомых с друг другом программистов, над которым нет общего начальства с батогами, допиливает 15 лет, по определению не может быть "стабильным". 

Дед! Я понимаю... в пылу полемики и т.д. Но ты написал - херню. Linux или FreeBSD сервер по любому стабильнее Винды. Иначе Инет бы строили на Винде. ;) ;) ;)

Как-то-так. И memcached очень хороший продукт. И даже использовать в "умном доме" его - вполне разумно. Пафос глумления в том, что недопрограммист считает свою находку охуенным открытием! ;) На попытки объяснить, что таких решений вагон и маленькая тележка - реагирует неадекватно, в стиле "атЫдакАжь!".

----------

Судя по другой его теме -  анализа протокола пульта кондея - чел не читает по аглицки. Про протоколы кондея, их варианты, набор команд и кодов и прочее и прочее на англоязычных форумах, даже на главном форуме ардуино (arduino.cc) написаны мегабайты текстов, кодов, примеров.

----------------------------------------------------

2ТС:

Хорошо использовать  memcached, вполне себе решение, хочешь - используй, только митинговать кончай!

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

wdrakula, беру свои слова взат.  

sadman41
Offline
Зарегистрирован: 19.10.2016

wdrakula пишет:

Дед! Я понимаю... в пылу полемики и т.д. Но ты написал - херню. Linux или FreeBSD сервер по любому стабильнее Винды. Иначе Инет бы строили на Винде. ;) ;) ;)

У меня, к примеру, почтовка, днс крутится в дебиане, а дебиан в Hyper-V. Вопрос - на чем построен мой интернет?

LEOWRS
Offline
Зарегистрирован: 08.08.2018

b707, в режиме экономии, ключевая фишка "в другой теме". Да, сегодня если не планшеты, то простенькие "бухгалтерские" компьютеры превосходят суперкомпьютеры 90ых - это факт, но если мы говорим об умном доме, то я предпочитаю взять малинку за 3000 рублей, у которой ресурсы ограничены, а не ставить всё на рабочую машину, которая у меня тем более ноут, с которым реально завтра надо уехать, и не важно, что там 7i с 32Гб которому конечно срать на нагрузку перловки с высокой колокольни. При этом ставить i7 машину под мозги умного дома, уж простите - непозволительная роскошь.

Arhat109-2, сама по себе малинка как и сам по себе ESP8266 ничего ни от кого не получают и никуда не отправляют. Напрямую TCP тоже ничего даже теоретически не делает, это транспортный протокол. В этом смысле фраза "ESP2866 вполне нормально работает с TCP соединениями напрямую, memcached не нужен .. что мешает?" мягко говоря странно звучит, на малинке должна быть поднята ось, на которой запущено приложение, слушающее TCP и что-то делающее с данными, да и ESP прошивка решает, что взять и куда через что отправить.

wdrakula, перечитайте еще раз топикстарт. Я утверждал что нет подобного? Я вообще что-то утверждал? Я лишь предложил обсудить вариант, и конструктива то немного вышло. Вы сами пишите, что да, Memcached неплохой посредник, а библиотека под memcached под ардуину есть? Нет. На этом форуме гугл по запросу "site:arduino.ru memcached" что выдает кроме этой темы? Ничего. При этом никакого пафоса с моей стороны как раз нет, я просто не очень понимаю пафос в режиме "а я бля, написал сам на перле, а мне похрену сколько жрет ресурсов это дело", это что-то конструтивный диалог?

В очередной раз лично Вы повторили "таких решений вагон", хотя я ранее спрашивал "покажите мне такой же экономичный вариант?" - и Вы, судя по тому, что DetSimen, откровенно напыживший на тему коллективной opensource разработки извинился, будучи авторитетом, предложили реально хоть один из вариантов решений, которых по Вашему утверждению "вагон" дали? Нет...

Вы увидали код, написанный на коленке в первый день знакомства с ардуиной и повесили ярлык "недопрограммист", добавив "не знающий английский", второе особенно забавно, и тут пустословство легко проверяется, нагуглите и дайте ссылку на протокол работы пульта ZH LW 03 в буржунете... Это странно, особенно учитвая что я живу заграницей и общаюсь 50-50 на английском, но факт, производитель изначальный Chigo, на упомянутом arduino.cc есть его упоминание в форуме в режиме "записал сигнал - не работает", но не более того, а у меня, хоть я и недопрограммист, на третий день заработало в режиме формирования сигнала, а не тупая "запись-воспроизведение".

Чесслово, я на этот форум пришел не чтобы сраться, для жетского срача есть политические форумы. Я думал, что подняв тему того же memcached получу альтернативные решения, мнения или советы, а получил то что тут есть. Подняв тему декодирования пульта, получил "а нахрена, мы тут все гуру-программисты, мы пишем сигнал и воспроизводим, не думая что он означает". Это печально - пока, моя небольшая практика в этом форуме говорит о том, что если ты что-то сделал чуть не так, тебя обосрут в режиме "ты лошара недопрограммист", а сделай что-то, что читателю непонятно, получаешь в ответ "на йух это надо?". А я рассчитывал, что гуру помогут, чайники попытаются вникнуть, полагая что тема ардуины это не террариум единомышленников, где каждый каждого готов сожрать за бабло, как, например, среди политтехнологов, а всё таки хобби, я ошибся?

LEOWRS
Offline
Зарегистрирован: 08.08.2018

sadman41 пишет:

wdrakula пишет:

Дед! Я понимаю... в пылу полемики и т.д. Но ты написал - херню. Linux или FreeBSD сервер по любому стабильнее Винды. Иначе Инет бы строили на Винде. ;) ;) ;)

У меня, к примеру, почтовка, днс крутится в дебиане, а дебиан в Hyper-V. Вопрос - на чем построен мой интернет?

Вопрос некорректен по сути. Интернет построен на согласованных протоколах, и не важно где поднят TCP под виндой или под фряхой, и не важно что по этому TCP в порт 80 отвечает как HTML, Nginx или Apache, и тем более не важно под чем они, будучи кросплатформенными, работают. Собственно и посыл "инет бы строили на Винде" тоже крайне неверный, да, 99% нагруженных серверов в инете работают не под ISS, а под Apache и Nginx, медленно но верно перетекая с одного на второй, а в качестве операционки, та же FreeBSD может и не лидер по количеству установок, но ИМХО лидер по количеству обрабатываемых запросов в инете. И еще прикол, Microsoft не так давно на полном серьезе заявлял, что их IIS самый распростаненный сервер, забывая сказать, что они посчитали все установленные, не посчитав активные, а ставится он по дефолту на каждый бухгалтерский сервер.

sadman41
Offline
Зарегистрирован: 19.10.2016

LEOWRS пишет:

sadman41 пишет:

wdrakula пишет:

Дед! Я понимаю... в пылу полемики и т.д. Но ты написал - херню. Linux или FreeBSD сервер по любому стабильнее Винды. Иначе Инет бы строили на Винде. ;) ;) ;)

У меня, к примеру, почтовка, днс крутится в дебиане, а дебиан в Hyper-V. Вопрос - на чем построен мой интернет?

Вопрос некорректен по сути.

Вопрос написан под утверждение о том, что операционка A стабильнее операционки B, потому что C.

macros
Offline
Зарегистрирован: 07.11.2016

LEOWRS пишет:

Я думал, что подняв тему того же memcached получу альтернативные решения, мнения или советы, а получил то что тут есть. 

Про альтернативы:

Выше писали про MQTT, еще наверное можно рассмотреть blynk.cc

LEOWRS
Offline
Зарегистрирован: 08.08.2018

sadman41, тут мы уже уходим в другую плоскость. Почта и на винде может работать неплохо, и веб сервер на слабом железе на IIS потянет, вопрос до какого количества клиентов - там где менее стабильная ось ляжет вместе с сервисами на 1000 клиентах, при аналогичном железе более стабильная, да еще и неплохо протюненная будет жить и здравствовать на 1000000 клиентах. И в этом смысле разговоры о том, что у меня 2 почтовых аккаунта и 3 клиента по к Апачу замечательно живут чуть ли не под DOSом, не имеют смысла, когда говорим о стабильности. Еще момент сколько система может жить в автономке, я вот зашел на один из серверов своих, там под фряхой "System uptime 252 days" - буду честен, у неё в кроне раз в месяц стоит сукище обновить и nginx перепустить, но в целом именно в этом смысл стабильности, а не в том, что вчера запущенная винда обрабатывая 3 клиента в сутки не окревела...

LEOWRS
Offline
Зарегистрирован: 08.08.2018

macros пишет:

LEOWRS пишет:

Я думал, что подняв тему того же memcached получу альтернативные решения, мнения или советы, а получил то что тут есть. 

Про альтернативы:

Выше писали про MQTT, еще наверное можно рассмотреть blynk.cc

MQTT - это упрощенный протокол передачи данных, хранить то где? :)

LEOWRS
Offline
Зарегистрирован: 08.08.2018

Без обид, но в дискуссии, когда "недопрограммисту" пишут, что аналогом MEMCACHED, который является хранилищем данным, работающем по TCP является протокол MQTT который не явзяется хранилищем - хочется убиться... Ну запустите MQTT ну передайте... куда? ну считайте по нему - откуда? Реально может я и деградировал как программист за последние годы, но я реально не понимаю когда в споре о хранилище данных пихают тему с транспортом данных...

sadman41
Offline
Зарегистрирован: 19.10.2016

Справедливости ради: MQTT broker хранит данные при QOS=2 до того момента, как их не получит подписчик. Во всяком случае так обещано.

macros
Offline
Зарегистрирован: 07.11.2016

LEOWRS пишет:

MQTT - это упрощенный протокол передачи данных, хранить то где? :)

Там выше вам предлогали погуглить:)

b707
Offline
Зарегистрирован: 26.05.2017

LEOWRS пишет:

Без обид, но в дискуссии, когда "недопрограммисту" пишут, что аналогом MEMCACHED, который является хранилищем данным, работающем по TCP является протокол MQTT который не явзяется хранилищем

мемкеш, насколько я понял, не является самостоятельным хранилищем - а только временнным кешем... в соответсвии с названием. То есть использовать его как самостоятельный агент вообще нельзя, только вместе, например с тем же MQTT. с базой данных. с файловыми массивами.

А MQTT в более широком смысле(не как протокол, а как технология) подразумевает не только транспорт, но и хранение.

b707
Offline
Зарегистрирован: 26.05.2017

LEOWRS - по самой дискуссии согласен с Дракулой. Своим упорным стремлением доказать, что мемкеш - лучший вариант на все времена вы превращаете дискуссию во флейм. Аргументы, что многие из нас ничего не слыхали про мемкеш и. тем не менее - прекрасно обходились без него - на вас не действуют. Вы напоминаете навязчивых религиозных проповедников, с которыми бесполезно  дискутировать - их можно только выставить за дверь :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

LEOWRS пишет:

MQTT - это упрощенный протокол передачи данных, хранить то где? :)

Чукча не читатель, чукча писатель? Ну прочитай уже про QoS в MQTT, и про MQTT-брокеры, наконец. И пойми, что сморозил откровенную херню. Всё там прекрасно хранится, хоть до посинения. А самый главный пойнт этого дела в том, что НИГДЕ не прописано, КАК И ГДЕ хранить - это дело сугубо брокера: хочет - хоть на дискетках пусть хранит, всем похер, главное - соответствовать описанию протокола MQTT и QoS в частности. Чуешь, к чему веду? Туда можно чёрта лысого прикрутить, тот же memcached.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ТС, дорогой.

Я внятно написал, что решение твое нормальное. Чего ты хочешь, медаль?

По кондей - написаны горы анализаторов и есть краудфондинговый сайт, где за малую денюжку определяют твой протокол. Возможно там и твой кондей нашелся бы. И главное - написано про структуру пакетов, метод анализа и прочее. Ты всё сделал правильно и получил результат, молодец. Еще одну медаль? Алчен? ;) ;) ;) Просто хвастать нравится? Обрати внимание,  как ту же тему донесли на arduino.cc: человек провел исследование и рассказал другим КАК можно провести анализ своего пульта. То есть не пусто хвастовство, а польза для форума. Разницу понимаешь?

То, что тебе ответили про запись кнопки - ну и что? Ну неправильно ответили, самоутвердиться нужно немедленно?

Еще раз про мемкашед:

Если видишь такое решение подходящим тебе - пиши так.

Я - не строю "умный дом", мне концепция смешна, но это личное... так сказать хамбл опиньен. Если бы строил - то не использовал бы лишние прокладки. Малинка, а скорее апельсинка (дешевле и больше нравится) - супервайзером над исполнительными контроллерами и датчиками на самописном софте с хранением в мускуле (например). Далее  она напрямую уже с облаком связана. В облаке - уже комбинация умного дома и архива видеонаблюдения и удобным интерфейсом. Офлайн управление, скорее всего - почти никакое,  легче дублировать инет-канал, у меня (например) сейчас их три.

------------------------

Еще раз: решение с мемкашед - нормально. Лично у меня претензии уровня "вкусовщины": сам мемсашед предназначен для ускорения работы связки, его можно использовать и для других целей, но нахера? А скорость в "умном доме" в рог не уперлась. В супервайзере, даже если он на апельсинке, ресурсов хватит на мускул. Уменьшение обращений к диску на СДкарте - аргумент так-себе. Купи карту получше - это раз и даже средней хватит не на один год - это два.

Может не до конца понятно написал - смысла в прокладке нет. В типовом использовании - это скорость, а тут что? Упрощение протокола - я уже объяснил - не аргумент, кто будет писать - не нуждается, а кто нуждаесть - не поймет что это и зачем.

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

Но пиши, кидай на гитхаб, найдутся пользователи... Хотя, при наличии тонны библиотек, напимер, для сериал овер TCP, каждый новичек нихера не понимает, что ему искать и где. Поэтому и говорю о бесплодности.... но ты все равно пиши... Если есть желание осчастливить кого-то, то этот гештальт нужно обязательно закрыть... иф ю ноу вот ай мин. ;) ;) ;)

.....

ладно, сорри, заболтался я...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DIYMan пишет:

 КАК И ГДЕ хранить - это дело сугубо брокера: хочет - хоть на дискетках пусть хранит, всем похер, главное - соответствовать описанию протокола MQTT и QoS в частности. Чуешь, к чему веду? Туда можно чёрта лысого прикрутить, тот же memcached.

+100500

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

LEOWRS пишет:
...

Arhat109-2, сама по себе малинка как и сам по себе ESP8266 ничего ни от кого не получают и никуда не отправляют. Напрямую TCP тоже ничего даже теоретически не делает, это транспортный протокол. В этом смысле фраза "ESP2866 вполне нормально работает с TCP соединениями напрямую, memcached не нужен .. что мешает?" мягко говоря странно звучит, на малинке должна быть поднята ось, на которой запущено приложение, слушающее TCP и что-то делающее с данными, да и ESP прошивка решает, что взять и куда через что отправить.

...

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

У Вас есть "комплект датчиков". Или они сами шибко умные (что дорого) и свистят куда-то по радиоканалу или протоколу (тому же TCP), то есть в каждый встроена своя ESP или это тупые, дешевые датчики типа DHT22, которые напрямую подсоединены к микроконтроллеру (имелась ввиду та же самая ESP как пример, можно взять даже 328-ю НАНО или МИКРО). Но где-то в системе ЕСТЬ микроконтроллер, собирающий с датчика данные. Или они у Вас в сферическом вакууме?

Так вот, этот микроконтроллер с датчиками ВПОЛНЕ МОЖЕТ организовать свисток на систему сбора данных по протоколу  TCP (или и вовсе UDP). Для этого НЕ НУЖНА ОС. Просто надо ЗНАТЬ структуру пакета и модель OSI. И принимать этот пакет можно и без малинки (она как средство сбора была в примере), НА ЛЮБОЙ компьютер, знающий протокол. В т.ч. и без ОС точно также.

Но, если для создания соединения по TCP/UDP Вам обязательно нужна ОС .. то я - пас.

По выделенному: Вы получили совет. Просто в силу своих недознаний не способны его оценить, хотя бы "как-то". Вам предложили помощь НЕСКОЛЬКО авторов. Уж "гуру они или нет .. они сами разберутся". Но, Вы действительно ошиблись, потому что ожидали, что Вас поддержат в этом месиве стеков, технологий и решений. Уж звиняйте, но таковых не оказалось.

LEOWRS
Offline
Зарегистрирован: 08.08.2018

b707 пишет:
мемкеш, насколько я понял, не является самостоятельным хранилищем - а только временнным кешем... в соответсвии с названием.

И да, и нет, срок хранения у него от 1 секунды до 30 дней, разумеется при условии, что не будет перезапуска сервиса. Так что для оперативных, не требующих сохранности данных, он вполне себе хранилище. 

Arhat109-2, кажестся мы по разному понимаем значение термина ОС. В моем понимании ОС - это то, что позволяет приложению работать на железе, будь то тетрис под DOS на 286, Photophop под Windows на компе, Nginx под FreeBSD на сервере или Ваш скетч под NodeMCU на ESP8266.

wdrakula, по теме пользы для форума или хваставства в теме декодирования кондея и того, что "человек провел исследование и рассказал другим КАК можно провести анализ своего пульта", а ни это ли я сделал? Я описал пошагово алгоритм как делал, и да, конечно не рассказал как читать через примеры из iremote и как посмотрев на пики данных превратить в нули и единицы, но именно в этой ветке к этому и приучили, в режиме "чайники всё равно не поймут и не повторят", а понимающим эти детали не нужны. И там, так же как в этой ветке, всё свелось к ответам типа "да нахрена это надо?". Не надо, так не надо, нравится людям записывать и воспроизводить команды вместе с помехами, не понимая смысла и не разбираясь в сигнале - их право.

Поднял на сервере и поизучал mosquitto слегка, по функционалу MQTT навороченнее и как результат более ресурсоёмкий. Под FreeBSD совершенно голый свежеустановленный mosquitto отожрал в памяти 38Мб, против 1Мб у memcached, по функционалу у брокера mosquitto намного богаче, но 99% этого фукционала просто не нужны в режиме домашней сети. В качестве хранилища данных mosquitto использует файлы, и так же в файлах у него acl, то есть чтобы принять данные от той же Arduino будет минимум два обращения к диску на банальную запись данных о температуре, от чего как раз и хотелось уйти при использовании малинки.

Еще, если я верно понял, подписанному на сообщение клиенту брокер MQTT будет рассылать данные вне зависимости нужны они ему или нет, что возможно в некоторых случаях хорошо, но лично у меня идея была в том, чтобы используя memcached в качестве брокера я мог на веб странице вывести актуальные данные в реальном времени (с обновлением хоть каждую секунду от датчиков через EPS), а статистику собирать к примеру раз в 10 минут, запуская в кроне перловый скрипт, который бы опрашивал данные, если они есть то запихивал их в тот же MySQL, если нет данных, уведомлял на почту или как-то еще о проблемах в системе.

В общем вполне возможно я не прав, непонимая прелестей использования MQTT клиентом, но то, что по нагрузке на сервер как минимум в реализации брокера mosquito он ничуть не легче, а возможно даже тяжелее MySQL будет - это факт.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

LEOWRS пишет:

Arhat109-2, кажестся мы по разному понимаем значение термина ОС. В моем понимании ОС - это то, что позволяет приложению работать на железе, будь то тетрис под DOS на 286, Photophop под Windows на компе, Nginx под FreeBSD на сервере или Ваш скетч под NodeMCU на ESP8266.

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

Я Вам ещё секрет открою: на сборной станции, кроме стека TCP откройте для себя хранение в .. массивах. И даже 1 мб memcached не понадобится.