Сбор данных измерений Arduino.

Тема в разделе "Проводная и беспроводная связь", создана пользователем maxpl, 13 дек 2014.

  1. maxpl

    maxpl Нуб

    Привет всем.
    Собрал на Ардуино Уно проектик по измерению параметров домашней электросети, напряжение, ток потребления, мощность потребления (расчетная).
    Добавил шилд Ethernet.
    Хочу складывать результаты измерений в какую-то локальную базу. Для базы есть неттоп на котором стоит Ubuntu 14.04 и поднят SQL. Что-то тяжелое ставить для этого не хочется, думаю реально обойтись скриптом, который мониторит поступающие на заданный порт данные и складывает в базу, далее выводит последние значения на веб-интерфейс и позволяет строить график выбранного значения за указанный период.
    Пробовал поднять MajorDomo, но не смог довести его до работоспособного вида, там в линуксовой версии еще сыровато все, хотя кто с Линуксом на ТЫ конечно поднимают его. Но опять же в нем много лишнего, которым я не буду пользоваться, мне нужна голая статистика.
     
  2. Alex19

    Alex19 Гуру

    Не очень понятно, а в чем проблема.

    Serial (COM), Ethernet (UDP, TCP), просто передаете данные в формате к примеру ?10;12!

    Где ? - начало пакета
    10 - команда
    ; - разделитель
    12 - параметр
    ! - конец пакета

    Можно вставить дополнительные проверки пакета, четность, размер и т.д.

    Вариант Serial,UDP, TCP
    Пишите программу под Линуксом, разбираете пакет и в зависимости от команды, добавляете строку с данными в базу данных. Там же, на этом неттопе подымаете какой-то веб сервер с Вашим сайтом, который просто смотрит в базу данных.

    Вариант TCP
    Подымаете на неттопе веб сервис и передаете туда этот пакет, он записывает в базу. А дальше как в 1 варианте - веб сервер с Вашим сайтом, который просто смотрит в базу данных.

    Увы с Линуксом не знаком, не подскажу.
     
    Последнее редактирование: 15 дек 2014
  3. maxpl

    maxpl Нуб

    Как передавать я знаю и это настроено. Вопрос был в софте на стороне сбора данных. Сам я тоже не знаком с программированием на PHP или Perl. Но думаю в моем случае можно было бы обойтись 1-2 скриптами.
     
  4. Alex19

    Alex19 Гуру

    Теперь понятно, может быть, кто разбирается подскажет.
    Удачи!
     
  5. Код (Text):
    <?
    $sql_data="select * from db_data_rus ORDER BY RECORD_ID DESC LIMIT 1";
    $result_data=mysql_query($sql_data);
    while ($row_data=mysql_fetch_array($result_data))
        {
            echo $data_id=$row_data["RECORD_ID"];
            echo $data_name=$row_data["NAME"];
            echo $data_value=$row_data["VALUE"];
        }
    ?>
    Вот тебе скрипт, который выведет тебе из базы последнее добавленное значение. Вставь только свои поля. Если конечно ты поставил на НЕТТОП PHP и MYSQL
     
  6. maxpl

    maxpl Нуб

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

    NR55RU Гик

    Самый простой способ:

    Установите веб-сверер в кучу с PHP (например) и SQL.
    Как я понял Ethernet на Arduino у вас есть, чудесно, TCP/IP и HTTP ваши друзья.
    Как только вам требуется отправить новые данные на сервер с Arduino, просто формируйте строку запроса в формате HTTP, который представляет собой ничто иное как тупо обычную строчку требуемого формата, там например в POST данных передадите и наименование данных и значения. И по TCP/IP отправите свой запрос с Arduino на сервер, так же как это делает любой браузер.

    Веб-сервер их примит, PHP сделает все за вас и распарсит запрос предоставив вам ваши данные в виде готовых переменных в $_POST массиве, которые вы благополучно сложите в базу данных, и с помощью то же PHP благополучно их оттуда достанете и выдадите браузеру.

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

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

    И да, еще мини плюс, тестировать свой скрипт складывания данных в базу вы сможете через браузер, таким образом установив все на сервере и написав скрипты, вы сперва все протестируете что бы работала как вам нужно, а потом уже научите Arduino кидать данные вашему скрипту вместо вас :)
     
  8. maxpl

    maxpl Нуб

    Что-то уже второй раз ловлю себя на мысли что пишу НЕ ПО РУССКИ!!! :) Написано же еще в первом сообщении. Стоит SQL, после установки MajorDomo снес только его, соответственно остался Web-сервер и PHP.
    Я не знаю РНР, соответственно не могу написать обработчик который будет раскладывать поступающие с Ардуины данные, которые она будет валить на заданный порт (не пишите как это сделать со стороны Ардуины, уже сделано)
     
  9. PHP знать особо не нужно, есть готовые скрипты. Все в голове хранить это бессмысленно, дабы не забивать голову всяким мусором, для этого есть интернет.

    Если данные поступают методами POST или GET. то можешь написать простой обработчик событий.

    Вот тебе обработчик для метода GET например http://192.168.0.1/?data=100&number=10&val=500

    Код (Text):

    <?

    $data=$_GET["data"];
    $number=$_GET["number"];
    $val=$_GET["val"];

    $sql="insert into my_base_rus (RECORD_DATA,RECOR_NUMBER,RECORD_VAL) VALUES ('$data','$number','$val')";
    $result=mysql_query($sql);
           
    ?>
    Вот тебе простой скрипт на PHP сбора данных в базу данных.

    Если данные передаются из формы методом POST поменяешь $_GET[""] на $_POST[""]

    PS. Кстати, мы постоянно используем нет топы Foxconne и 4 гига памяти. И убунта тормозит на нем, по сравнению с виндой. И на винду мы ставим denwer и раскладываем FTP. Под Linux мало кто умеет программировать. В винде больше все таки возможностей. А на сервера ставим Freebsd.

    Напиши, что конкретно ты хочешь, чтобы падало в базу... Помогу со скриптами php
     
  10. NR55RU

    NR55RU Гик

    maxpl
    Я понял это из вашего первого поста что PHP вы не знаете, в *nix программировать не умеете. Я все прекрасно понял. :)
    И учтивая то что вы создали эту тему, вы не знаете как вообще это сделать, я вам и предложил наиболее простой вариант из возможных, который потребует от вас минимум изучения чего-либо.
    Другой вариант - написать на C/C++ пару демонов для *nixа. Думаю этот вариант вас еще меньше устроит :)

    Если вы смогли написать скетч для ардуина значит у вас есть базовые знания С/С++ а PHP это фактически до безобразия упрощенный C++ (в разумных рамках).
    Более того, учтивая простоту вашей задачи, на любом PHP форуме если вам самому лень, вам напишут эти обработчики, просто вежливо попросите. Вон даже Фисташка вам предложил помочь. :)
    Отсюда, учитывая тот факт что те средства что я вам посоветовал очень распространены и много людей с ними работают, вы легко получите помощь и консультацию или найдете информацию в интернете как сделать то или то.

    Фисташка Трям:
    Согласно стандарту HTTP, GET запросы могут использоваться только для ЧТЕНИЯ данных но никогда для изменения, применяя GET для изменения/добавления/удаления данных, вы открываете возможную дырку для ряда атак. :)
     
  11. maxpl

    maxpl Нуб

    Ну смотря чем Убунту грузить. :) Когда у меня на неттопе с атомом и 2Гб памяти Крутилась только торрентокачалка, его вообще не слышно было, был холодный и вентилятор практически не включался. Когда поставил Мажордомо, т.е. был поставлен PHP, WEB-сервер, SQL. Обратил внимание что индикатор дичка горел практически постоянно и вентилятор на полную катушку включался, но тормозов не было. Когда грохнул Мажордом, то индикатор диска погас и вентилятор перешел на чуть слышную работу.
    Для моей задачи большая производительность не нужна. Буду посылать данные изменения не чаще 1 раз в минуту, чаще смысла нет.
    Т.е. при ссылке http://192.168.0.1/?data=100&number=10&val=500 получается идет не посылка данных на какой то порт, который мониторится, а непосредственно PHP скрипту который крутится под WEB-сервером??
     
  12. rav_75

    rav_75 Гик

    ПХП как бы без разницы, откуда Вы взяли данные и куда засунули, тут уже головой думать нужно.:)
    Вообще для SQL инъекции нет разницы, запрос на выборку у вас или добавление/удаление. Так же нет разницы, используете вы POST или GET метод для передачи данных. Элементарная проверка входящих данных, использование приведения типов, экранирование/преобразование спецсимволов (mysql_real_escape_string(), htmlspecialchars()), использование регулярных выражений на стороне сервера позволит спать относительно спокойно.
    Другой вопрос, как на arduino собрать POST запрос?
    Немного не понимаю, что Вы имеете ввиду. Вы обращаетесь по адресу 192.168.0.1 на порт 80 (дефолтный для веб сервера) используя протокол http. Веб сервер, слушающий 80 порт, передает ваши данные (data=100&number=10&val=500) индексному файлу (т.к. не указан другой) и выдает Вам результат. Вроде как-то так.
     
  13. NR55RU

    NR55RU Гик


    А речь не идет про SQL-инъекцию речь идет об атаках вида "XSRF". :)
    Пример абсурдный, тупой и простой. Хотя пожалуй он не такой и абсурдный, на многих сайтах где программисты пишут как им удобнее а ни как правильно, и протоколы интерпретируют как "php без разницы" а ни как нужно это еще случается.

    Допустим у вас сервер почты ну типа маил.ру, и у вас есть допустим такая ссылка name.ru/index.php?action=deletetrash которая удаляет например всю почту в мусоре.
    Все что мне надо сделать это послать всем вашим пользователям рассылку с красивой ссылкой, вам открытка жми сюда под которую положить выше-указную ссылку и так как пользователь авторизован, нажав на эту ссылку, ваша система послушно выполнит команду удаления мусора.
    И заметьте все ваши проверки входящих данных не помогут, ибо придет валидная команда от авторизованного пользователя, вот вам и "php без разницы":)
    Ничего страшно, мусор туда ему и дорога, но люди так управляют куда более серьезными вещами.
    Буквально пример воспринимать не надо, это лишь общая прсотешая тупая ситуация, но думаю мысль вы поняли :)
    Не стану много писать, видимо вы не знаете что из себя представляет HTTP запрос в том виде в ктором он отправляется браузером и получается сервером, я просто дам вам очень хорошую ссылку на RFC 2068 — Протокол Передачи Гипертекста - HTTP/1.1 на русском :)
    В итоге, запихать данные на ардуино в POST так же просто как и в GET :)
     
    Последнее редактирование: 22 дек 2014
  14. rav_75

    rav_75 Гик

    "Остапа понесло..." :D Простите великодушно, ни в коем разе не хочу Вас обидеть, с большим уважением и вниманием отношусь к Вам и Вашим постам... Но давайте будем объективны: какие атаки на домашнем сервере в локальной (закрытой) сети, тем более если там всего лишь хранятся показания температуры и т.д.?
    Простите, приведу тоже тупой пример.
    Допустим даже мой сервер доступен в интернете, на нем апач, пхп и mysql. В базе 1 таблица с полями id, date_time, temp и текстовое поле text в котором я пишу заметки, типа "Сегодня хорошая погода".
    Что Вы там собираетесь атаковать и, главный вопрос, зачем? И проверки тут очень замечательно будут работать, никуда Вы ни ссылку не впихнете, ни скрипт.
    Подчеркну еще раз, что речь не идет о крупных корпоративных порталах, торговых площадках, соцсетях и т.д. где пользователям разрешено делиться всяким разным контентом. У нас задачи другие.
    В общем, что хочу сказать: я Вас понял, Вы говорите правильные вещи, и я даже с Вами не спорил. И даже написал, что надо думать когда и где, хотя в принципе такая конструкция работать будет. А Вы выдернули полпредложения из контекста и начали меня "атаковать" :D
    Да, Вы правы, не знаю, не до того мне немного :D Спасибо за ссылку, почитаю на праздниках. Только вопрос был
    :D Если можно пример, спрашиваю потому как форум. Отсылать к талмуду на 160 страниц если там все легко и просто как-то знаете-ли...
    Сорри за оффтоп..
     
  15. NR55RU

    NR55RU Гик

    rav_75

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

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

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

    NR55RU Гик

    Я все же дам вам еще одну ссылку ладно, она поменьше .. намного.. и там как раз есть примеры как выглядят запросы (ближе к концу страницы) о чем вы и спрашиваете. :)
    Жмак сюда
     
    rav_75 нравится это.
  17. rav_75

    rav_75 Гик

    NR55RU , и все-таки Вы обиделись ) Простите еще раз, не хотел. Больше не буду шутить. Если Вы не заметили, я ни разу не написал, что Вы неправы, но считаю, что именно в данном случае Вы делаете из мухи слона, что и пытался донести, но видимо как-то не донес ))
    За ссыль спасибо! Сам не нагуглил. Видимо я плохо гуглю ))
     
  18. Мдя уж, Я написал, как можно получать данные из строки браузера и привел простой пример.
    Как защититься от SQL инъекции и как обрабатывать такие запросы, можно вынести в отдельную тему. Существуют регулярки и так далее. Это выходит за рамки поста...

    Чего хочет автор?

    Можно по Cron'у на убунту вызавать скрипт, который будет залезать на Arduino с шилдом, и тащить от него данные и складывать в базу. Я сделал бы так.

    По адресу шилда http://192.168.0.1/ выводил данные ввиде строки. в формате csv например. В скрипте парсил бы строку функцией explode и добавлял в базу.

    Если нужна еще помощь пишите в личку тогда уже.