Ethernet Shield отправка данных на сервер
- Войдите на сайт для отправки комментариев
Вс, 23/08/2015 - 15:07
Доброго дня.
Стоит задача отправки на сервер показаний датчика - сработал/несработал. Дальше на сервере уже обработать разными способами.
Объясните на пальцах как организовать отправку на ПК данных.
Вариант 1:
Ардуино работает в роли сервера. Вы обращаетесь к этому серверу с ПК посредством http-запросов для получения данных. Ардуино, обрабатывает ваши запросы и отдает нужные данные.
Вариант 2:
Ардуино работает в роли клиента. Нужен сторонний сервер. Ардуино передает на этот сервер данные, посредством http-запросов. Вы обращаетесь к этому серверу с ПК посредством http-запросов для получения данных.
про вариант№2
а если в качестве сервера будет какая нибудь програмка на winsock'е? возможно ли в ардуине подготовить данные для этого сервера?
про вариант№2
а если в качестве сервера будет какая нибудь програмка на winsock'е? возможно ли в ардуине подготовить данные для этого сервера?
про вариант№2
а если в качестве сервера будет какая нибудь програмка на winsock'е? возможно ли в ардуине подготовить данные для этого сервера?
Меня немного смущают данные (т.е. мне совершенно не понятно как они устроены), которые я буду отправлять с клиента на сервер. Сервер не веб, а просто ПК с линухом.
paz001, вам следует сначала понять, чего вы хотите.
Веб-сервер для ваших нужд можно развернуть на любом компьютере, подключенном к сети (даже локальной, был бы доступ). Не обязательно ПК - можно даже на роутере, РасПи, другой Ардуино и т.п.
paz001, вам следует сначала понять, чего вы хотите.
100% Ваша правда)
Вообще идея следующая: есть инфракрасный датчик движений. Необходимо регистрировать движение рук в зоне мониторинга и отправлять единицу на удаленный пк. Дальше эту единицу т.е. к факт срабатывания, конкатенируем со временем этой удаленной машины и все это дела сохраняем в файл гденибудь. Далее аналитическое ПО само берет из файла данные и что то сними делает.
Код клиента.
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192, 168, 1, 177 }; byte server[] = { 192, 168, 1, 62 }; int val = 1; // датчик сработал EthernetClient client; void setup() { Ethernet.begin(mac, ip); Serial.begin(9600); delay(1000); Serial.println("connecting..."); if (client.connect(server, 8080)) { Serial.println("connected"); client.println("GET /search?q=arduino HTTP/1.0"); client.println(); } else { Serial.println("connection failed"); } } void loop() { char buf[80]; // на всякий случай, вдруг отправить нужно массив данных client.println(val); // или client.print(buf) Отправляем запрос, который обработается сервером while (client.available()) { int isdata=1; char c = client.read(); // Читаем, что нам ответил Web-сервер Serial.print(c); } if (!client.connected()) { int isdata=0; Serial.println(); Serial.println("disconnecting."); client.stop(); } }Если будут какие либо предложения по реализации, то с удовольствием ознакомлюсь.
Меня немного смущают данные (т.е. мне совершенно не понятно как они устроены), которые я буду отправлять
Если будут какие либо предложения по реализации, то с удовольствием ознакомлюсь.
Это вы, типа конкурс объявляете?
Это вы, типа конкурс объявляете?
какой конкурс, помощь зала, не более
Это вы, типа конкурс объявляете?
какой конкурс, помощь зала, не более
Сделайте простой сервер на Ардуино. Возьмите скетч из примера - он вроде умеет температуру отдавать.
Любым клиентом с ПК забирайте данные с этого сервера.
<p>[/quote]</p>
<p>Меня немного смущают данные (т.е. мне совершенно не понятно как они устроены), которые я буду отправлять с клиента на сервер. Сервер не веб, а просто ПК с линухом.</p>
<p>[/quote]</p>
На линуксе вообще сервер можно написать в блокноте.
Вечером домой приду найду и выложу исходники своего старого проекта "СКУД для дворового спрт-зала"
https://www.youtube.com/watch?v=nE_Lr29Wlxs
Нашол более старую версию нежли в видео ролике выше.
Сервер.
#!/bin/bash CLIENTIP="Localhost" PortIN="27050" PortOUT="27051" declare -f LOAD function LOAD() { EX="0" #nc -l "$PortIN" | tr -d '\000' | tr -d '\\r' | while read line; do nc -l "$PortIN" | tr -d '\000' | while read line; do if [ -n "$line" ]; then if [[ "$line" > "0000" ]]; then echo "$(date) ===>>> GET $line" >> Log.txt nline="$(echo $line | sed 's/^[ \t]*//;s/[ \t]*$//')" N1="$(echo "$nline" | cut -d, -f1)" N2="$(echo "$nline" | cut -d, -f2)" N3="$(echo "$nline" | cut -d, -f3)" N4="$(echo "$nline" | cut -d, -f4)" N5="$(echo "$nline" | cut -d, -f5)" N6="$(echo "$nline" | cut -d, -f6)" N7="$(echo "$nline" | cut -d, -f7)" case $N1 in cls) clear echo "$(date) ===>>> Получена команда очистки терминала {cls}" >> Log.txt echo "$(date) ==============================================" >> Log.txt ;; end) echo "$(date) ===>>> Получена команда Выхода {end}" >> Log.txt echo "Exit" echo "$(date) ==============================================" >> Log.txt tput sgr0 break EX="1" ;; new) echo "" echo "==============================================" echo " $(date)" echo "Запись добавленна в базу" echo "$N2, $N3, $N4, $N5,$N6, $N7" >> Base.bas echo "ID - $N2" echo "Login - $N3" echo "$(date) ===>>> Получена команда добавление записи в базу {new}" >> Log.txt echo "$(date) ===>>> $N2 $N3 $N4 $N5 $N6 $N7" >> Log.txt echo "==============================================" echo "" echo "$(date) ==============================================" >> Log.txt ;; chg) echo "" echo "==============================================" echo " $(date)" echo "Запись в базе изменена" sed -i 's/^'$N2'.*/'$N2','$N3','$N4','$N5','$N6','$N7'/' Base.bas echo "ID - $N2" echo "Login - $N3" echo "$(date) ===>>> Получена команда изменения записи в базе {chg}" >> Log.txt echo "$(date) ===>>> $N2 $N3 $N4 $N5 $N6 $N7" >> Log.txt echo "==============================================" echo "" echo "$(date) ==============================================" >> Log.txt ;; wr) echo "" echo "==============================================" echo " $(date)" echo "BeckUP базы данных создан" cp Base.bas Base.bas.bkp echo "$(date) ===>>> Получена команда на создание BeckUP файла базы {wr}" >> Log.txt echo "==============================================" echo "" echo "$(date) ==============================================" >> Log.txt ;; *) METADATA="$(cat "Base.bas" | grep -e "^$nline,")" # Основная фуункция поиска в базе RFID="$(echo $METADATA | cut -d, -f1 | sed 's/^[ \t]*//;s/[ \t]*$//')" LOGIN="$(echo $METADATA | cut -d, -f2 | sed 's/^[ \t]*//;s/[ \t]*$//')" TYPE="$(echo $METADATA | cut -d, -f3 | sed 's/^[ \t]*//;s/[ \t]*$//')" DATAON="$(echo $METADATA | cut -d, -f4 | sed 's/^[ \t]*//;s/[ \t]*$//')" DATAOFF="$(echo $METADATA | cut -d, -f5 | sed 's/^[ \t]*//;s/[ \t]*$//')" COUTN="$(echo $METADATA | cut -d, -f6 | sed 's/^[ \t]*//;s/[ \t]*$//')" STATUS="NULL" DCM="1" todaydate=`date +%d.%m.%Y` AD="$(echo $DATAOFF | cut -d. -f1)" AM="$(echo $DATAOFF | cut -d. -f2)" AY="$(echo $DATAOFF | cut -d. -f3)" CD=`date +%d` CM=`date +%m` CY=`date +%Y` if [ -n "$RFID" ]; then echo "$(date) ===>>> $RFID $LOGIN $TYPE $DATAON $DATAOFF $COUTN" >> Log.txt echo "" echo "==============================================" echo " $(date)" echo "ID - $RFID" echo "Login - $LOGIN" if [ "$TYPE" -eq "0" ]; then echo "Type - Безлимитный" echo -e '\E[32;40m'"Status OPEN"; tput sgr0 echo "$TYPE,$LOGIN" | nc "$CLIENTIP" "$PortOUT" echo "$(date) ===>>> Status OPEN" >> Log.txt fi #----------------------------------------------- if [ "$TYPE" -eq "1" ]; then if [ "$CY" -le "$AY" ]; then if [ "$CM" -le "$AM" ]; then if [ "$CD" -le "$AD" ]; then echo "Type - Действует до $DATAOFF" echo -e '\E[32;40m'" $DATAON - $DATAOFF"; tput sgr0 echo -e '\E[32;40m'"Status OPEN"; tput sgr0 echo "$(date) ===>>> Status OPEN" >> Log.txt else echo "Обонемент просрочен на несколько дней" echo -e '\E[31;40m'" $DATAON - $DATAOFF"; tput sgr0 echo -e '\E[31;40m'"Status CLOSE"; tput sgr0 echo "$(date) ===>>> Status CLOSE - Обонемент просрочен на несколько дней" >> Log.txt fi else echo "Обонемент просрочен на несколько месяцев" echo -e '\E[31;40m'" $DATAON - $DATAOFF"; tput sgr0 echo -e '\E[31;40m'"Status CLOSE"; tput sgr0 echo "$(date) ===>>> Status CLOSE - Обонемент просрочен на несколько месяцев" >> Log.txt fi else echo "Обонемент просрочен на несколько лет" echo -e '\E[31;40m'" $DATAON - $DATAOFF"; tput sgr0 echo -e '\E[31;40m'"Status CLOSE"; tput sgr0 echo "$(date) ===>>> Status CLOSE - Обонемент просрочен на несколько лет" >> Log.txt fi fi #----------------------------------------------- if [ "$TYPE" -eq "2" ]; then if [ "$COUTN" -eq "0" ]; then echo "На абонементе кончились занятия" echo -e '\E[31;40m'"Status CLOSE"; tput sgr0 echo "$(date) ===>>> Status CLOSE - На абонементе кончились занятия" >> Log.txt else MODCOUTN=$[$COUTN-$DCM] echo "Type - Осталось $MODCOUTN занятий" sed -i 's/^'$RFID'.*/'$RFID','$LOGIN','$TYPE','$DATAON','$DATAOFF','$MODCOUTN'/' Base.bas echo -e '\E[32;40m'"Status OPEN"; tput sgr0 echo "$(date) ===>>> Status OPEN" >> Log.txt fi fi echo "==============================================" echo "" else echo "" echo "==============================================" echo " $(date)" echo "ID - $line" echo -e '\E[31;40m'"Не верный код карты, данные в базе не найденны"; tput sgr0 echo "$(date) ===>>> Не верный код карты, данные в базе не найденны" >> Log.txt echo "==============================================" echo "" fi RFID="" LOGIN="" TYPE="" DATAON="" DATAOFF="" COUTN="" ;; esac echo "$(date) ==============================================" >> Log.txt fi else echo "" echo "==============================================" echo " $(date)" echo -e '\E[31;40m'"Нет данных"; tput sgr0 echo "$(date) ===>>> Нет данных" >> Log.tx echo "==============================================" echo "" fi done if [ "$EX" -eq "0" ]; then LOAD else exit 0 fi } LOAD tput sgr0 exit 0Клиент на Линуксе
Клиент на Ардуино
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,57); char server[] = "192.168.1.58"; EthernetClient client; void setup() { Serial.begin(9600); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); Ethernet.begin(mac, ip); } delay(500); Serial.println("connecting..."); if (client.connect(server, 27050)) { Serial.println("connected"); client.print("798"); client.print("\n"); client.stop(); } else { Serial.println("connection failed"); } } vvoid loop() { }Образец базы данных для тестов
paz001, вам следует сначала понять, чего вы хотите.
100% Ваша правда)
Вообще идея следующая: есть инфракрасный датчик движений. Необходимо регистрировать движение рук в зоне мониторинга и отправлять единицу на удаленный пк. Дальше эту единицу т.е. к факт срабатывания, конкатенируем со временем этой удаленной машины и все это дела сохраняем в файл гденибудь. Далее аналитическое ПО само берет из файла данные и что то сними делает.
Код клиента.
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192, 168, 1, 177 }; byte server[] = { 192, 168, 1, 62 }; int val = 1; // датчик сработал EthernetClient client; void setup() { Ethernet.begin(mac, ip); Serial.begin(9600); delay(1000); Serial.println("connecting..."); if (client.connect(server, 8080)) { Serial.println("connected"); client.println("GET /search?q=arduino HTTP/1.0"); client.println(); } else { Serial.println("connection failed"); } } void loop() { char buf[80]; // на всякий случай, вдруг отправить нужно массив данных client.println(val); // или client.print(buf) Отправляем запрос, который обработается сервером while (client.available()) { int isdata=1; char c = client.read(); // Читаем, что нам ответил Web-сервер Serial.print(c); } if (!client.connected()) { int isdata=0; Serial.println(); Serial.println("disconnecting."); client.stop(); } }Если будут какие либо предложения по реализации, то с удовольствием ознакомлюсь.
собственно вам на линухе необходимо запустить только эту строчку
соответственно ардуино данные должна слать на этот порт.
Написал для вас линукс сервер который слушает порт 27050 и всё что понему приходит записывает в лог файл.
#!/bin/bash PortIN="27050" declare -f LOAD function LOAD(){ nc -l "$PortIN" | while read line; do echo $line >> logFor.log LOAD done } LOAD exit 0на диске в папке создать файл:
на экране нажимаем "A" или "I"
Вставляем в файл мой код, нажимаем Esc, вводим :w или Shift + ZZ
далее выполняем команду:
В водим пароль администратора.
Запускаем сервер:
Всё.
Теперь всё что придет на порт 27050 будет записано в лог файл который будет лежать в текущей папке.
Линукс это система где всё ограниченно лишь твоей фантазией.
Поправлю:
$ sudo chmod 777 Server.sh
Спасибо за код.
"Это - неправильные пчелы" (с) Зачем же делать файл world writable? :)
chmod +x Server.sh
Спасибо, опечатался.
собственно вам на линухе необходимо запустить только эту строчку
соответственно ардуино данные должна слать на этот порт.
Максим, большое спасибо за сорцы и видео.
Вобщем и целом мне удалось запуститься в тестовом режиме.
А скрипт из сообщения 15 не получилось запустить?
А скрипт из сообщения 15 не получилось запустить?
Говоря "удалось запуститься" имел ввиду клиентское по на ардуинке.
Мне только сегодня-завтра предоставят пк для "стендовых испытаний" и настройки датчика.
А скрипт из сообщения 15 не получилось запустить?
Говоря "удалось запуститься" имел ввиду клиентское по на ардуинке.
Мне только сегодня-завтра предоставят пк для "стендовых испытаний" и настройки датчика.
Я имею ввиду ты запустил тот скрипт который я написал в 15 сообщении, он работает в фоне и пишет в лог всё что ты кидаешь на TCP порт? Или ты только nc -l 27050 запустил проверил?