Arduino Mega Server

Модератор: Alex

serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Arduino Mega Server

Сообщение serghei » Чт апр 06, 2017 11:46 am

Я давно уже предложил ,но не успел ))). А назвать её " Библиотека решений для АМС" и в шапку хотя бы давать ссылки на обсуждения. Даже Вы выкладываете исправления , а через месяц их не найти ни на форуме,ни в компе.(((
Правда она будет сильно пересекаться с прикручиванием железа. У себя нашел еще одну версию управлением реле с уже готовой страницы. Не помню кто и где выкладывал. Если еще позволит форум, то тут перезалью.
Последний раз редактировалось serghei Чт апр 06, 2017 5:00 pm, всего редактировалось 1 раз.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: Arduino Mega Server

Сообщение ser009 » Чт апр 06, 2017 3:35 pm

Немного разобрался с вводом значений с Web->Arduino.
Готовлю небольшой пример управления настройками аналогового сигнала с Веба
Думаю при отладке очень удобно будет пользоваться
СпойлерПоказать
аналог настройки.JPG
аналог настройки.JPG (45.24 КБ) 11563 просмотра
Filipp15
Сообщения: 1
Зарегистрирован: Вт апр 18, 2017 10:28 am
Благодарил (а): 0
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Filipp15 » Вт апр 18, 2017 5:03 pm

После включения аутентификации AMS не доступен из интернета, как будто перестает работать переадресация портов. Это проблема в роутере или в AMS? У кого нибудь работает аутентификация с переадресацией портов?
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Сб апр 22, 2017 7:21 am

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

Суть вопроса такова: в АМС уже давно присутствует конструкция

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

// W5100
#include <Ethernet.h>
#include <EthernetUdp.h>

// W5500
//#include <Ethernet2.h>
//#include <EthernetUdp2.h> 
Что очень неудобно и желательно автоматизировать процесс переключения библиотек, например, в зависимости от значения

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

#define ETHERNET_LIBRARY 
Но не тут-то было, всеми мыслимыми и немыслимыми способами не удалось построить конструкцию из директив условной компиляции, которая переключала бы библиотеки в зависимости определения (или не определения) ETHERNET_LIBRARY.

Найдутся ли среди нас такие специалисты?
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: Arduino Mega Server

Сообщение ser009 » Сб апр 22, 2017 7:46 am

Сделай на примере авторизации.
Заведи переменную и меняй её с веб странички, после изменения перезапускай АМС.
Значения по умолчанию хранить в EEprom или на sd (у DUE нет EEPROM)

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

// 0 - W5100
// 1 - W5500
switch (ETH) {
    label 0:
      #include <Ethernet.h>
      #include <EthernetUdp.h>
      break;
    label 1:
      #include <Ethernet2.h>
      #include <EthernetUdp2.h>
      break;
    default:
      #include <Ethernet.h>
      #include <EthernetUdp.h>
  }
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Сб апр 22, 2017 8:01 am

Ответ никуда не годится — если у человека не тот шилд, то он вообще никогда не получит доступа к веб-странице, потому что АМС просто не запустится.

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

И в третьих в задаче спрашивалось о переключении при помощи директив условной компиляции.
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: Arduino Mega Server

Сообщение ser009 » Сб апр 22, 2017 8:21 am

Alex писал(а):Ответ никуда не годится — если у человека не тот шилд, то он вообще никогда не получит доступа к веб-странице, потому что АМС просто не запустится.
Значения можно хранить на SD. Можно просто поправить 0 на 1

Встречный вопрос
Что сложного закоментировать 2 строчки в коде? Тем более что все так подробно описано. Просто применяя проект на практике мало вероятно что кто-то начнет менять туда сюда шилды. Обычно поставил, настроил и забыл про него.
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Сб апр 22, 2017 8:32 am

switch (ETH) {
label 0:
#include <Ethernet.h>
#include <EthernetUdp.h>
break;
label 1:
#include <Ethernet2.h>
#include <EthernetUdp2.h>
break;
default:
#include <Ethernet.h>
#include <EthernetUdp.h>
}
Да честно говоря удивлен,#include то директива препроцессора,а switch это исполняемая инструкция,чувствуете разницу?
Наконец-то у знатоков С и системного программирования появилась возможность блеснуть своими знаниями и перейти от декларативных заявлений к делу.
Alex вы ведь писали код у Вас там прямо напичкано директивами условной компиляции,тогда у вас все работало,а почему сейчас нет?
#ifdef SD_INFO_FEATURE
sdInfoInit();
#endif
вот пример включения целого файла через директиву
#if defined(STACK_USE_REBOOT_SERVER)

#include "TCPIP Stack/TCPIP.h"


#define REBOOT_PORT 69 // UDP TFTP port


// For improved security, you might want to limit reboot capabilities
// to only users on the same IP subnet. Define REBOOT_SAME_SUBNET_ONLY
// to enable this access restriction.
#define REBOOT_SAME_SUBNET_ONLY


extern NODE_INFO remoteNode;

/*********************************************************************
* Function: void RebootTask(void)
*
* PreCondition: Stack is initialized()
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Checks for incomming traffic on port 69.
* Resets the PIC if a 'R' is received.
*
* Note: This module is primarily for use with the
* Ethernet bootloader. By resetting, the Ethernet
* bootloader can take control for a second and let
* a firmware upgrade take place.
********************************************************************/
void RebootTask(void)
{
static UDP_SOCKET MySocket = INVALID_UDP_SOCKET;
struct
{
BYTE vMACAddress[6];
DWORD dwIPAddress;
WORD wChecksum;
} BootloaderAddress;

if(MySocket == INVALID_UDP_SOCKET)
MySocket = UDPOpen(REBOOT_PORT, NULL, INVALID_UDP_PORT);

if(MySocket == INVALID_UDP_SOCKET)
return;

// Do nothing if no data is waiting
if(!UDPIsGetReady(MySocket))
return;

#if defined(REBOOT_SAME_SUBNET_ONLY)
// Respond only to name requests sent to us from nodes on the same subnet
if((remoteNode.IPAddr.Val & AppConfig.MyMask.Val) != (AppConfig.MyIPAddr.Val & AppConfig.MyMask.Val))
{
UDPDiscard();
return;
}
#endif

// Get our MAC address, IP address, and compute a checksum of them
memcpy((void*)&BootloaderAddress.vMACAddress[0], (void*)&AppConfig.MyMACAddr.v[0], sizeof(AppConfig.MyMACAddr));
BootloaderAddress.dwIPAddress = AppConfig.MyIPAddr.Val;
BootloaderAddress.wChecksum = CalcIPChecksum((BYTE*)&BootloaderAddress, sizeof(BootloaderAddress) - sizeof(BootloaderAddress.wChecksum));

// To enter the bootloader, we need to clear the /POR bit in RCON.
// Otherwise, the bootloader will immediately hand off execution
// to us.
#if defined(USE_LCD)
strcpypgm2ram((char*)LCDText, "Bootloader Reset");
LCDUpdate();
#endif
RCONbits.POR = 0;
#if defined(__18CXX)
{
WORD_VAL wvPROD;

wvPROD.Val = ((WORD)&BootloaderAddress);
PRODH = wvPROD.v[1];
PRODL = wvPROD.v[0];
}
#endif
Reset();
}

#endif //#if defined(STACK_USE_REBOOT_SERVER)
#define STACK_USE_REBOOT_SERVER
кстати только сейчас увидел ,а почему label,а не case
вроде switch case
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Сб апр 22, 2017 8:49 am

Значения можно хранить на SD. Можно просто поправить 0 на 1
Вы не понимаете: переключение с веб-страницы вообще не имеет смысла — владелец железа практически никогда не меняет свой шилд.

Потом ваш код предполагает использование компиляции (то есть для работы он должен быть уже откомпилирован) и при этом пытается управлять подключением библиотеки, которую только предстоит откомпилировать — это просто не будет работать, для этого и нужны директивы условной компиляции.
Встречный вопрос
Что сложного закоментировать 2 строчки в коде? Тем более что все так подробно описано. Просто применяя проект на практике мало вероятно что кто-то начнет менять туда сюда шилды. Обычно поставил, настроил и забыл про него.
Смотрите шире: автоматизация подключения той или иной библиотеки позволяет изменением одного макроса изменять множество параметров проекта и автоматически создавать разные сборки.

Изменением одного значения, а не лазаньем по коду и выискивание десятков мест, где нужно что-то закомментировать вручную.
Alex вы ведь писали код у Вас там прямо напичкано директивами условной компиляции,тогда у вас все работало,а почему сейчас нет?
Хороший вопрос. Это всё действительно прекрасно работает, но отказывается работать с конструкциями типа

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

#include <Ethernet.h>   
Там, где встречается #include и угловые скобки < > директивы условной компиляции перестают работать. Можете проверить сами на дистрибутиве АМС. Поэтому и вопрос к знатокам. Почему это не работает и как заставить это работать. То, что можно заставить, у меня сомнений нет. Но как?
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: Arduino Mega Server

Сообщение ser009 » Сб апр 22, 2017 9:28 am

а какие ошибки при компиляции?
Ответить