Умный Дом по Ethernet

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Умный Дом по Ethernet

Сообщение Urbas81 » 12 июн 2013, 16:39

alexsis_76 писал(а):
Скорее всего будет ошибка 401, т.к размер страницы будет слишком большой,
попробывать увеличить размер буфера

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

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 12 июн 2013, 16:44

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

Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Умный Дом по Ethernet

Сообщение Urbas81 » 12 июн 2013, 16:59

alexsis_76 писал(а):посмотрите на радиокототе http://radiokot.ru/forum/viewtopic.php?f=24&t=3761 там человек портировал на CodeVision я тожеа три назад когда делал такое устройство пробывал переписать на CodeVision но ничего путного из этого не вышло примерно через минуту пропадал пинг потом забил

p.s а чем WINAVR не устроил
Спасибо, как раз оттуда я и брал исходник для СVAVR, на котором писал свои страницы, но там не все переведено из оригинала Туксграфикса, а так все работает отлично. А WINAVR как-то не использовал, максимум готовый исходник могу компильнуть, ну и по мелочи подправить, CVAVR ближе.

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 12 июн 2013, 17:26

CVAVR ближе
си он и в африке си там как я помню правил в основном типы данных, функции записи чтения EEPROM

Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Умный Дом по Ethernet

Сообщение Urbas81 » 12 июн 2013, 17:42

alexsis_76 писал(а):
CVAVR ближе
си он и в африке си там как я помню правил в основном типы данных, функции записи чтения EEPROM
Как раз те функции которые отвечают за отправку на сервер самые сложные, плюс куча вложенных функций в итоге быстро наступает тупик :mrgreen:


Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Умный Дом по Ethernet

Сообщение Urbas81 » 12 июн 2013, 17:58

alexsis_76 писал(а):эт какие
Эти
void client_browse_url(const prog_char *urlbuf,const char *urlbuf_varpart,const char *hoststr,void (*callback)(uint16_t,uint16_t,uint16_t),uint8_t *dstip,uint8_t *dstmac)

void client_http_post(const prog_char *urlbuf, const char *urlbuf_varpart,const char *hoststr, const prog_char *additionalheaderline,char *postval,void (*callback)(uint16_t,uint16_t,uint16_t),uint8_t *dstip,uint8_t *dstmac)

особенно меня загоняют в тупик функции передаваемые в функцию, и всякие *callback не пойму как это функционирует. :shock:

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 12 июн 2013, 18:27

client_browser_url(PSTR("/cgi-bin/checkip"),NULL,PSTR("tuxgraphics.org"),&browserresult);
// urlbuf_varpart is a pointer to a string buffer that contains the second
// non constant part of the url. You must keep this buffer allocated until the
// callback function is executed or until you can be sure that the server side
// has timed out.
// hoststr is the name of the host. This is needed because many sites host several
как я понял вас смущает это
const prog_char *urlbuf
особенно меня загоняют в тупик функции передаваемые в функцию, и всякие *callback не пойму как это функционирует
.это функции обратного вызова
написано
Declare a callback function: void browserresult(uint8_t statuscode,uint16_t datapos,uint16_t len){...your code}
вы должны сами ее декларировать вот она в main
void browserresult_callback(uint8_t statuscode,uint16_t datapos, uint16_t len)
{
uint16_t i=0;
uint8_t j=0;
uint8_t k=0;

char * srv_rep;
srv_rep = (char *)&(buf[datapos]);
char srv_cmd[30];
if (statuscode==0)
{
// Поскольку в этой функции у нас нет информации о том, какой именно вход сработал,
// сбрасываем таймаут по всем входам, предполагая, что если сервер ответил по одному,
// он ответит и по остальным.
for ( i = 0; i < IO_SIZE; i++ )
srv_timeout = 0;

for ( i = 0; i < len; i++ )
{
// Пропускаем все HTTP-заголовки
if ( *srv_rep == '\r' || *srv_rep == '\n' )
{
srv_rep++;
k++;
continue;
}

if ( k == 4 )
{
srv_cmd[j] = *srv_rep;
j++;
}

if ( k != 4 )
k = 0;

srv_rep++;
}

port_execute(srv_cmd);
}
// Если ответ сервера не 200, то выполняем команды по умолчанию
else
{
eeprom_read_block (temp, &ee_cmd[cur_input], 11);
if ( temp[0] != 'я' && strlen(temp) > 0 )
port_execute(temp);

}

send_eth_flag2 = 1;
}
когда отработает client_browser_url при вызове browserresult_callback аргументы функции будут содержать statuscode ответ сервера если все нормально то 200 , собственно стек умеет обрабатывать 200 и не 200 (т е все остальные)которые впрочем можно определить самому uint16_t datapos позиция первого байта полезной нагрузки uint16_t len длинна ,тут собственно показана разборка всего этого безобразия
client_http_post отправка методом post
также есть еще
uint16_t www_client_internal_datafill_callback(uint8_t fd){
char strbuf[5];
uint16_t len=0;
if (fd==www_fd){
if (browsertype==0){
// GET
len=fill_tcp_data_p(bufptr,0,PSTR("GET "));
len=fill_tcp_data_p(bufptr,len,client_urlbuf);
len=fill_tcp_data(bufptr,len,client_urlbuf_var);
// I would prefer http/1.0 but there is a funny
// bug in some apache webservers which causes
// them to send two packets (fragmented PDU)
// if we don't use HTTP/1.1 + Connection: close
len=fill_tcp_data_p(bufptr,len,PSTR(" HTTP/1.1\r\nHost: "));
len=fill_tcp_data_p(bufptr,len,client_hoststr);
len=fill_tcp_data_p(bufptr,len,PSTR("\r\nUser-Agent: tgr/1.0\r\nAccept: text/html\r\nConnection: close\r\n\r\n"));
}else{
// POST
len=fill_tcp_data_p(bufptr,0,PSTR("POST "));
len=fill_tcp_data_p(bufptr,len,client_urlbuf);
len=fill_tcp_data_p(bufptr,len,PSTR(" HTTP/1.1\r\nHost: "));
len=fill_tcp_data_p(bufptr,len,client_hoststr);
if (client_additionalheaderline){
len=fill_tcp_data_p(bufptr,len,PSTR("\r\n"));
len=fill_tcp_data_p(bufptr,len,client_additionalheaderline);
}
len=fill_tcp_data_p(bufptr,len,PSTR("\r\nUser-Agent: tgr/1.1\r\nAccept: */*\r\nConnection: close\r\n"));
len=fill_tcp_data_p(bufptr,len,PSTR("Content-Length: "));
itoa(strlen(client_postval),strbuf,10);
len=fill_tcp_data(bufptr,len,strbuf);
len=fill_tcp_data_p(bufptr,len,PSTR("\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n"));
len=fill_tcp_data(bufptr,len,client_postval);
}
return(len);
}
return(0);
}
где вы можете определить что именно будет передаваться на сервер вот
uint16_t your_client_tcp_datafill_callback(uint8_t fd){...your code;return(len_of_data_filled_in);}

]
особенно меня загоняют в тупик функции передаваемые в функцию
описаны выше все это находится в ip_arp_udp_tcp.c
Последний раз редактировалось alexsis_76 12 июн 2013, 18:57, всего редактировалось 1 раз.

ellab
Сообщения: 35
Зарегистрирован: 11 июн 2013, 16:47

Re: Умный Дом по Ethernet

Сообщение ellab » 12 июн 2013, 18:56

alexsis_76 писал(а):
Как изменить названия портов в 192.168.0.14
а дошло что вам нужно чтобы вместо этого
{"D0", "D1", "D3", "D4", "D5", "D6", "D7", "C0", "C1", "C2", "C3", "C4", "C5"}
были человеческие имена попробуйте так создайте массив имен что то типа этого
#define IO_SIZE_NAME 13
char *aion[ IO_SIZE_NAME] = {"сдесь ваши 13 имен", "имя", "имя", "имя", "имя", "имя", "имя", "имя", "имя", "имя", "имя", "имя", "имя"};
затем это plen=fill_tcp_data(buf,plen,aio);заменить на это plen=fill_tcp_data(buf,plen,aion); напишите что будет

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

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 12 июн 2013, 19:08

for ( i = 0; i < IO_SIZE; i++ )
{
plen=fill_tcp_data_p(buf,plen,PSTR("<a href=/"));
plen=fill_tcp_data(buf,plen,password);
plen=fill_tcp_data_p(buf,plen,PSTR("/?pt="));

//char temp[2];

snprintf_P(temp,sizeof(temp),PSTR("%d"),i);
plen=fill_tcp_data(buf,plen, temp);

plen=fill_tcp_data_p(buf,plen,PSTR(">"));
plen=fill_tcp_data(buf,plen,aio);
plen=fill_tcp_data_p(buf,plen,PSTR("</a> "));
}

// ! ! !
//plen=fill_tcp_data_p(buf,plen,PSTR("<br>"));
//itoa(srv_fd, temp, 10);
// plen=fill_tcp_data(buf,plen,urlpar);

}

SENDTCP:
www_server_reply(buf,plen); // send data

if ( reset_flag == 1 )
RESET();

continue;

UDP:
continue;
}

return (0);
}

в самом конце main вот эта строка
plen=fill_tcp_data(buf,plen,aio);
судя по всему зарисывает 13 названий портов в буфер ее поменяли , попробуйте удалить совсем

ellab
Сообщения: 35
Зарегистрирован: 11 июн 2013, 16:47

Re: Умный Дом по Ethernet

Сообщение ellab » 12 июн 2013, 20:38

// Available IO
#define IO_SIZE 14
// MegaD-328-7I7O Ver 2 - Ver 4 sequence
char *aio[IO_SIZE] = {"C0", "C1", "C2", "C3", "C4", "C5", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7"};
// MegaD-328-7I7O Ver 1 sequence
//char *aio[IO_SIZE] = {"C5", "D0", "C4", "D1", "C3", "C2", "D3", "B1", "D7", "D6", "D5", "C0", "D4", "C1"};
#define IO_SIZE_NAME 14
char *aion[ IO_SIZE_NAME] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"};

А тут я правильно делаю?

plen=fill_tcp_data(buf,plen,aio); нашел, менял на plen=fill_tcp_data(buf,plen,aion);
пробовал удалять эту строку, без изменений.

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 13 июн 2013, 09:04

прсле внесения изменений страница выглядет так (вложение)
добавленный код
#define name 14
char *n[name] = {"A", "B", "C", "D", "F", "6R", "J7", ".0", "A1", "882","F","6R", "J7", ".0"};
#define BUFFER_SIZE 560
plen=fill_tcp_data(buf,plen,n);

после клика по буквам появляется соответствующий порт
пробовал удалять эту строку, без изменений
я тоже,не отображаются порты только Conf
Последний раз редактировалось alexsis_76 13 июн 2013, 11:00, всего редактировалось 1 раз.

Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Умный Дом по Ethernet

Сообщение Urbas81 » 13 июн 2013, 09:18

alexsis_76

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

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 13 июн 2013, 09:20

Будут трудности обращайтесь

ellab
Сообщения: 35
Зарегистрирован: 11 июн 2013, 16:47

Re: Умный Дом по Ethernet

Сообщение ellab » 13 июн 2013, 15:29

alexsis_76, ничего не получается. Вам не сложно будет выложить исправленный main.c?

RVS
Сообщения: 3
Зарегистрирован: 15 янв 2013, 15:49

Re: Умный Дом по Ethernet

Сообщение RVS » 13 июн 2013, 15:31

А у всех нормально работает счетчик срабатываний на IN портах в последней бете прошивки? У меня почему-то в разных режимах либо ноль либо единица постоянно отображается.
Последний раз редактировалось RVS 13 июн 2013, 23:19, всего редактировалось 1 раз.


ellab
Сообщения: 35
Зарегистрирован: 11 июн 2013, 16:47

Re: Умный Дом по Ethernet

Сообщение ellab » 13 июн 2013, 21:12

alexsis_76, ОГРОМНОЕ спасибо. Все получилось! Наверное проблема была в том, что я не сказал что у меня 3.04 beta. немного поправил, но без вас ничего бы не вышло! :D

alexsis_76

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 14 июн 2013, 04:43

alexsis_76, ОГРОМНОЕ спасибо. Все получилось!
очень рад :D

ellab
Сообщения: 35
Зарегистрирован: 11 июн 2013, 16:47

Re: Умный Дом по Ethernet

Сообщение ellab » 14 июн 2013, 16:47

Но я так понимаю, что ресурсов маловато. Увеличивал BUFFER_SIZE до 1000 и 1500, но максимум 12 портов видно (с короткими названиями) остальные нет.

Ответить