W5500_client+Atmega8_для самых начинающих.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Socket_2_ESTABLISHED:
delay_ms(1);
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем размер принятых данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x26; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RSR0 -размер принятых данных
tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RSR1 -размер принятых данных
PORTB.6=1; // SS W5500
//////////////////////////////////////////////////////////// таймаут FIFO_RX Socket_2:
tm_SOCKET++;
if (tm_SOCKET > 1000) { // цикл - 1c ждём Data
goto Socket_2_DISCON; // FIFO_RX пуст > Socket_2_DISCON
//goto TX_Socket_2; // > TX, FIN
};
/////////////////////////////////////////////////////////////////////////////////////////////
// проверка FIFO_RX:
len = x1; len = (len<<8)|x2; // размер принятых данных // 0x0000
if (len == 0x00) goto Socket_2_ESTABLISHED; // FIFO_RX пуст > ждём Data


// len = размер принятых данных // 0x0000

Без GOTO ? Это же не удобно...
:roll:

Добавлено after 13 minutes 55 seconds:
[uquote="kondeg",url="/forum/viewtopic.php?p=4066892#p4066892"]размер принятых данных = 0x1E9[/uquote]
0x1E9 = 489 байт.
Сравните с анализатором трафика. https://www.radiokot.ru/forum/viewtopic ... &start=452
Screenshot_1.jpg
(120.28 КБ) 286 скачиваний
:tea:
Реклама
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Рома у меня такой вопрос:
//////////////////////////////////////// RX_int[x] > HEX > DEC > 000
bi = RX_int[x];
RX_int[x] - этот массив мы где создали?
Реклама
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

RX_int[x] > HEX > DEC > 000 - это отправка числового значения браузеру. Это пока не нужно.

Пока достаточно просто что-нибудь ответить браузеру. Например "Привет браузер !"))

////////////////////////////////////////// Data TX W5500 HTTP (например отправим текстовую страницу для браузера):
//GET / HTTP/1.1
//unsigned char bufer_TX_W5500_HTTP[]={
//"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n>Привет браузер !|"
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++;
};

:tea:
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Т.е. ответ браузеру до этого места?
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++;
};
////////////////////////////////////////// GET /1 HTTP/1.1
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Да.


//TX_Socket_2:
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес для записи данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных
tx=0x00; SPI(); x2 = rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных
PORTB.6=1; // SS W5500
// начальный адрес для записи данных:
add = x1; add = (add<<8)|x2; // 0x0000
/////////////////////////////////////////////////////////////////////////////////////////////
// начальный адрес для записи данных:
x1 = (add>>8);
x2 = add;
// Пишем данные Socket_2 с начального адреса:
PORTB.6=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x54; SPI(); // Address + Control Registers

// сброс len
len = 0; // 0x0000


////////////////////////////////////////// Data TX W5500 HTTP (например отправим текстовую страницу для браузера):
//GET / HTTP/1.1
//unsigned char bufer_TX_W5500_HTTP[]={
//"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n>Привет браузер !|"
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++;
};
/////////////////////////////////////////// Data END



PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем указатель TX Socket_2 до увеличенного значения:
add = add + len; // add - конечный адрес переданных данных // 0x0000
// len - размер переданных данных // 0x0000
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=x1; SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных
tx=x2; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем команду передачи Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x20; SPI(); // Data -0x20 (SEND)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.


//Передача закончена.
Реклама
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Вчера попробовал отправить тестовую страницу клиенту, но ничего не вышло(клиент не видит отправленной страницы).
Сегодня буду более подробно разбирать мой код. Систематизировать, читать статусы (через UART).
Тяжеловато с GOTO.
Границы функции определен фигурными скобками, а где конец у метки goto не пойму.

Добавлено after 1 hour 5 minutes 17 seconds:
И так....
Порядок производимых мной действий:
Если чего то не хватает или наоборот лишнее, пожалуйста поправьте меня.

- Сброс модуля через reset
- Программный сброс
- Прописываем режим PHY(физический уровень)
- По желанию чтение статуса PHY
- Настройка логического уровня (шлюз, маска, IP, MAC) после этого отвечает на ping
- Создаем socket (записываем в него протокол и порт)
- Открываем socket (команда OPEN)
- Переключаем socket в режим прослушивания (server)
- Читаем статус socket на предмет подключения клиента к серверу
- Если статус socket = 0x17 (ESTABLISHED) то читаем размер принятых данных, которые > 0
- Читаем начальный адрес принятых данных
- Читаем данные с начального адреса socket
- Пишем указатель RxSocket да увеличенного значения
- Пишем команду завершения приема
- - - Передача пакета браузеру
- Читаем начальный адрес для записи данных
- Пишем данные socket с начального адреса
- Отправка текстовой страницы в браузер
- Пишем указатель TxSocket до увеличенного значения
- Пишем команду передачи socket
- Закрываем соединение с браузером (передаем FIN пакет)
- Закрываем socket
Реклама
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Первым делом скачайте и запустите на своём компе анализатор трафика. Например Wireshark.
Вы должны видеть всё что принимает и передаёт W5500. Каждый пакет !
Работать в слепую методом "тыка" - пустая трата времени))
анализатор.jpg
(168.71 КБ) 285 скачиваний
:tea:
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Запустил Wireshark.
Видит передачу от W5500 (129.168.0.200) до компьютера (192.168.0.105).
Как вставить в сообщение изображение этих данных?

Добавлено after 16 minutes 15 seconds:
Изображение

Вроде бы вставил изображение анализатора.

Добавлено after 28 minutes 43 seconds:
Роман. Может быть я что то упустил в Вашем коде, напишите код отправки текстового сообщения в браузер еще раз или по шагам что я должен написать, что бы отправить ее.
По статусу W5500 вижу, что он определяет подключение к нему, отправляет страницу (так как я это понял из Вашего кода), после отправки закрывает socket.
Заранее благодарен.
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Ну вот. Другое дело.
:tea:
На анализаторе видим что мой W5500 передаёт браузеру пакет 87 байт.
Screenshot_2.jpg
(83.08 КБ) 259 скачиваний
На вашем анализаторе мы видим что ваш W5500 передаёт браузеру пакет 1514 байт.
Screenshot_1.jpg
(38.1 КБ) 247 скачиваний
Вывод: ошибка передающего буфера вашего W5500.

Разберём подробно как работает передающий буфер W5500.
:tea:
Всего в W5500 8 штук сокетов. В каждом сокете один передающий буфер TX и один приёмный буфер RX.
Соответственно всего в W5500 8 буферов.
Нас интересует сокет номер 2 и соответственно передающий буфер TX номер 2.
Screenshot_1.jpg
(81.81 КБ) 248 скачиваний
Буфер RX и буфер TX - это КОЛЬЦЕВОЙ буфер. https://ru.wikipedia.org/wiki/Кольцевой_буфер

Работа с кольцевым буфером имеет свои особенности чтения/записи.

Грубо говоря (по простому) у кольцевого буфера есть начало и конец.
Screenshot_2.jpg
(33.75 КБ) 222 скачивания
Порядок работы с кольцевым передающим буфером TX такой:

1- Читаем начальный адрес add (0x0000...0xFFFF) для записи данных в кольцевой передающий буфер TX Socket_2:

//TX_Socket_2:
/////////////////////////////////////////////////////////////////////////////////////////////
// Читаем начальный адрес для записи данных Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x48; SPI(); // Address + Control Registers
tx=0x00; SPI(); x1 = rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных
tx=0x00; SPI(); x2 = rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных
PORTB.6=1; // SS W5500
// начальный адрес для записи данных:
add = x1; add = (add<<8)|x2; // add (0x0000...0xFFFF)


//add - начальный адрес для записи данных (0x0000...0xFFFF)
Screenshot_3.jpg
(36.97 КБ) 236 скачиваний
/////////////////////////////////////////////////////////////////////////////////////////////
// начальный адрес для записи данных:
x1 = (add>>8);
x2 = add;


2- Пишем данные в кольцевой передающий буфер TX Socket_2 с начального адреса add (0x0000...0xFFFF):
Screenshot_4.jpg
(40.96 КБ) 218 скачиваний
// Пишем данные Socket_2 с начального адреса add (0x0000...0xFFFF):
PORTB.6=0; // SS W5500
tx=x1; SPI(); tx=x2; SPI(); tx=0x54; SPI(); // Address + Control Registers

// сброс len (0x0000...0xFFFF) - длина передаваемых данных
len = 0; // len (0x0000...0xFFFF)


////////////////////////////////////////// Data TX W5500 HTTP (например отправим текстовую страницу для браузера):
//GET / HTTP/1.1
//unsigned char bufer_TX_W5500_HTTP[]={
//"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n>Привет браузер !|"
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};
/////////////////////////////////////////// Data END


3- Пишем конечный адрес (указатель) в кольцевой передающий буфер TX Socket_2:
//начальный адрес (add) + длина данных (len) = конечный адрес (add)
Screenshot_5.jpg
(51.71 КБ) 234 скачивания
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем указатель TX Socket_2 до увеличенного значения:
add = add + len;
// add - конечный адрес передаваемых данных // (0x0000...0xFFFF)
// len - размер передаваемых данных // (0x0000...0xFFFF)
x1 = (add>>8);
x2 = add;
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x24; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=x1; SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных
tx=x2; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных
PORTB.6=1; // SS W5500


4- Пишем команду передачи (SEND) для кольцевого передающего буфера TX Socket_2:


/////////////////////////////////////////////////////////////////////////////////////////////
// Пишем команду передачи Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x20; SPI(); // Data -0x20 (SEND)
PORTB.6=1; // SS W5500
/////////////////////////////////////////////////////////////////////////////////////////////
//if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.


//Передача закончена.

Вывод:
Пакет из кольцевого передающего буфера TX Socket_2 с начальным адресов add (0x0000...0xFFFF) и конечным адресом add (0x0000...0xFFFF) + len (0x0000...0xFFFF) будет передан браузеру.
Всё))
:tea:

*Поправка.
-Если мы например запишем конечный адрес add (0x0000...0xFFFF) (указатель) меньше len (0x0000...0xFFFF) - размер передаваемых данных, то пакет будет передан не весь, а только до конечного адреса add (0x0000...0xFFFF) (указателя)...))
-Если мы запишем конечный адрес add (0x0000...0xFFFF) (указатель) больше len (0x0000...0xFFFF) - размер передаваемых данных, то пакет будет передан вместе с мусором от прошлого пакета...))

Поэтому надо точно указывать начальный и конечный адрес (указатель).
:tea:
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Роман здравствуйте.
Просто не знаю как Вас благодарить.
Все получилось. W5500 отправляет в браузер тестовую страницу без проблем.

Не так страшно все оказалось.
Тем более Вами расписано все очень подробно. Думаю многим начинающим Ваша помощь
сократит большое количество головных болей :))
Еще ошибка была в моем коде, из за чего и выдавал буфер мусор.
Дело в том, что у меня первоначально тип переменной add был uint8_t (char), поэтому и не "влазили"
в нее все данные. Еще раз спасибо Вам за разъяснения!
Рома у меня вопрос. Для проверки значений регистров W5500 как например

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

if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.
Нам необходимо эти (этот) регистр прочитать?
Т.е. каждый раз при проверке мы их читаем а потом проверяем?
Ну и напоследок, не теряя бодрости духа, вернемся к моему первоначальному замыслу...
К Atmega+W5500_client.
Какой порядок действия в этом случае?
К примеру: переменная a=7 как это значение отправить на server по адресу 192.168.0.200
Как это делается в строке браузера я примерно знаю:

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

192.168.0.200/data.php?a=7
А как это сделать через W5500_client не понимаю.
Вложения
передача.png
(21.47 КБ) 229 скачиваний
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Покажите ещё раз анализатор чтоб убедиться что всё правильно работает.
Должно быть так
Screenshot_2.jpg
(83.08 КБ) 234 скачивания
>SYN
>SYN ACK
>ACK
>GET
>TCP
>FIN ACK
>ACK
>FIN ACK
>ACK
kondeg писал(а):if (Sn_CR == 0x00); // По окончанию передачи регистр -Sn_CR будет = 0x00.
Нам необходимо эти (этот) регистр прочитать?
Нет. Это регистр команд. В него пишем команду передачи - 0x20 (SEND). Когда все данные из передающего буфера будут переданы статус регистра команд сбросится в ноль - 0x00. Таким образом W5500 нам сообщает что все данные переданы т.е. команда 0x20 (SEND) выполнена.
Но дело в том, что передача передающего буфера происходит очень быстро. Поэтому пока мы пишем другие регистры, регистр команд за это время уже сбросится в ноль - 0x00.
Поэтому его читать не нужно.
[uquote="kondeg",url="/forum/viewtopic.php?p=4067405#p4067405"]Тяжеловато с GOTO.[/uquote]
Безусловный переход. Наоборот проще. Не нужно ждать завершения циклов и т.д.))

И так....
Порядок производимых действий:

Для W5500_server:
- Сброс W5500 через reset
- Программный сброс PHY(физический уровень)
- Прописываем режим PHY(физический уровень)
- Настройка логического уровня (шлюз, маска, IP, MAC) после этого отвечает на ping
- Создаем socket (записываем в него протокол и порт)

- Открываем socket (команда OPEN)
- Переключаем socket в режим прослушивания (LISTEN)
- Читаем статус socket (или читаем вывод INT W5500) на предмет подключения клиента к серверу .

- Если статус socket != 0x14 (Если статус не LISTEN, а какой-то другой) то читаем размер принятых данных, которые > 0 (да/нет ?)
(Так проще. Дело в том, что у сокета много режимов/статусов. Чтобы не проверять каждый статус по отдельности мы просто спрашиваем - статус LISTEN ? или не LISTEN ? Если статус не LISTEN, значит статус ESTABLISHED или какой другой. Какой именно статус - нам не интересно. Мы сразу переходим в режим ESTABLISHED. Остальные статусы сокета нас не интересуют.)

//режим ESTABLISHED:
- Читаем начальный адрес буфера RX
- Читаем данные с начального адреса буфера RX
- Пишем указатель буфера RX до увеличенного значения
- Пишем команду завершения приема буфера RX

- - - Передача пакета браузеру
- Читаем начальный адрес буфера TX
- Пишем данные с начального адреса буфера TX
- Пишем указатель буфера TX до увеличенного значения
- Пишем команду передачи буфера TX (команда SEND)
- Закрываем соединение с браузером (передаем FIN пакет)

- или Закрываем socket и переходим к пункту - Открываем socket (команда OPEN).
- или не закрываем сокет и переходим к пункту - Переключаем socket в режим прослушивания (LISTEN).
Вроде так))
:tea:
[uquote="kondeg",url="/forum/viewtopic.php?p=4067942#p4067942"]К примеру: переменная a=7 как это значение отправить на server по адресу 192.168.0.200
Как это делается в строке браузера я примерно знаю:

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

192.168.0.200/data.php?a=7
А как это сделать через W5500_client не понимаю.[/uquote]
не помню)) Это было давно)) :roll: Сейчас вспомним))

W5500_client должен прикинуться браузером))

Контролировать работу W5500 в режиме W5500_client надо тоже по анализатору.

И так....
Порядок производимых действий:
W5500_client:
- Сброс W5500 через reset
- Программный сброс PHY(физический уровень)
- Прописываем режим PHY(физический уровень)
- Настройка логического уровня (шлюз, маска, IP, MAC) после этого отвечает на ping
- Создаем socket (записываем в него протокол и порт)

- Открываем socket (команда OPEN)

- - - Передача пакета серверу

- пишем IP (Destination), порт (Destination) сервера
(для сервера HTTP порт 80, для сервера HTTPS порт 443, и т.д.)

PORTB.6=0; // SS W5500
// (для команды SEND c автоматическим ARP-запросом):
tx=0x00; SPI(); tx=0x0C; SPI(); tx=0x4C; SPI(); //(MAC = ARP), IP, порт
//IP_server: 192.168.0.200
tx=192; SPI(); // Data // Destination IP Address (Sn_DIPR0)(0x000C - Address)
tx=168; SPI(); // Data // Destination IP Address (Sn_DIPR1)(0x000D - Address)
tx=0; SPI(); // Data // Destination IP Address (Sn_DIPR2)(0x000E - Address)
tx=200; SPI(); // Data // Destination IP Address (Sn_DIPR3)(0x000F - Address)
// порт_server: 80
tx=0x00; SPI(); // Data // Destination Port (Sn_DPORT0)(0x0010 - Address) -порт 80
tx=0x50; SPI(); // Data // Destination Port (Sn_DPORT1)(0x0011 - Address) -порт 80
PORTB.6=1; // SS W5500

- Пишем команду подключения к серверу (команда CONNECT)
// пишем команду CONNECT Socket_2:
PORTB.6=0; // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address + Control Registers
tx=0x04; SPI(); // Data -0x04 (CONNECT)
PORTB.6=1; // SS W5500

//W5500_client подключается к серверу...
//>SYN
//>SYN ACK
//>ACK
//W5500_client подключился к серверу.

> После подключения к серверу сокет 2 перейдёт в режим ESTABLISHED.
- Ждём пока сокет 2 перейдёт в режим ESTABLISHED...

//режим ESTABLISHED:
- Читаем начальный адрес буфера TX
- Пишем данные с начального адреса буфера TX

> Наш W5500_client должен прикинуться браузером.
http://we.easyelectronics.ru/electro-an ... i-cgi.html
Для этого W5500_client должен передать серверу примерно такой пакет:
передача пакета серверу.jpg
(31.72 КБ) 230 скачиваний
/////////////////////////////////////////////////////
//unsigned char bufer_TX_W5500_HTTP[]={
//"GET /data.php?a=7 HTTP/1.1\r\nHost: 192.168.0.200\r\nUser-Agent: ................. \r\n\r\n|" //
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};
/////////////////////////////////////////////////////
Сервер подумает что наш W5500_client - это браузер)) Мы обманули сервер))

- Пишем указатель буфера TX до увеличенного значения

- Пишем команду передачи буфера TX (команда SEND)

> Сервер прочитает наш пакет и ответит нашему W5500_client таким пакетом:
ответ сервера.jpg
(6.7 КБ) 228 скачиваний
Мы можем прочитать ответ сервера.
А можем не читать ответ сервера, а просто подождать пока сервер закроет соединение (отправит нам пакет FIN).
Это по желанию.

- Ждём когда сервер закроет соединение (принимаем пакет FIN от сервера).

- или Закрываем socket и переходим к пункту - Открываем socket (команда OPEN).
- или не закрываем сокет и переходим к пункту - - - Передача пакета серверу.
Вроде как-то так))
:roll:
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Покажите ещё раз анализатор чтоб убедиться что всё правильно работает.
Это данные анализатора во время работы W5500_server + client

Изображение

Изображение правда не четкое. Не могу разобраться, как делать вложения как у Вас в сообщениях.....
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

kondeg писал(а):Не могу разобраться, как делать вложения как у Вас в сообщениях.....
Screenshot_2.jpg
(85.33 КБ) 206 скачиваний
Screenshot_3.jpg
(89.54 КБ) 204 скачивания
Вот нормальная работа W5500
Screenshot_1.jpg
(118.77 КБ) 232 скачивания
У Вас на анализаторе:
-ПК 192.168.0.105 отправляет запрос соединения (пакет SYN)
-W5500 192.168.0.200 отправляет сброс (пакет RST, ACK). Сокет W5500 закрыт или занят.
Браузер не может подключиться к W5500.

Хотель бы посмотреть весь процесс общения ПК и W5500 с самого начала))
:tea:
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Рома прошу прощения за задержку с ответом. Разбирался с фильтрами в Wireshark.....
Вот что получилось.....
Подключился, получил сообщение от server. Это данные анализатора:
W5500_server_and_client.jpg
(227.79 КБ) 200 скачиваний
Добавлено after 46 minutes 23 seconds:
Вот данные после немного подправленного кода:
W5500_server_client_imgjpg.jpg
(221.03 КБ) 204 скачивания
Добавлено after 6 minutes 38 seconds:
Не могу разобраться, как делать вложения как у Вас в сообщениях.....
Понял почему изображение не всегда вставлялось. Размер был больше положенного.

Добавлено after 4 hours 58 minutes 12 seconds:
Просидел Рома я сегодня весь день над сервером (программой), а что бы как у тебя анализатор (чисто)не показал.
Вот что пишет после отправки браузеру.
W5500_server.jpg
(235.66 КБ) 198 скачиваний
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Теперь нормально.

С этим браузером Анализатор чисто не покажет. Потому что Браузер отправляет сразу два пакета SYN на порт 61183 и порт 50633.
А у W5500 открыт только один сокет номер 2. Поэтому W5500 пакет SYN на порт 50633 сбрасывает.
W5500_server_and_client.jpg
(234.7 КБ) 190 скачиваний
Современные браузеры открывают сразу несколько соединений с сервером.
Чтобы W5500 могла работать с современным браузером надо открывать несколько сокетов))
Но нам это не нужно))

А чтобы было красиво как у меня, нужен другой браузер. Например старая Опера и т.д.
Вот например браузер Опера отправляет один пакет SYN на порт 4637
браузер Опера.jpg
(92.47 КБ) 203 скачивания
Короче всё нормально. Можно делать W5500_client.
:tea:
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Заканчивается рабочий день. Буду потихоньку домой собираться.
Попробовал сейчас ,на исходе рабочего времени, W5500 в режиме clien (до того места где статус меняется на (0x17).
Меняется. :))
Анализатор , как ты и говорил, показывает:
//>SYN
//>SYN ACK
//>ACK
Спасибо Рома тебе бОльшое.
Завтра, не теряя бодрости духа, продолжу.
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Здравствуй Рома.
Привет всем.
Вчера, в воскресенье, отправил данные на сервер.
Событие для меня. Дай Бог Роману здоровья и благополучия. Разложил для меня и таких как я этот модуль по полочкам.
Правда под конец воскресного дня, немного позволил себе вольность и , опираясь на свои знания, некоторую часть функции отправки данных на сервер переписал немного по другому. Но суть от этого не поменялось.
Итак...
Код:

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

/////////////////////////////////////////////////////
//unsigned char bufer_TX_W5500_HTTP[]={
//"GET /data.php?a=7 HTTP/1.1\r\nHost: 192.168.0.200\r\nUser-Agent: ................. \r\n\r\n|" //
//};
//bufer_TX_W5500_HTTP
for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};
/////////////////////////////////////////////////////
Я написал через указатель:

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

//передача строкового значения
	   void buffer_TX_string_W5500_HTTP(char *str)
	   {
		   while(*str !='\0')
		   {
			   SPI(*str++);
			   len++;
		   }
	   }
И вызываем эту функцию в нужном нам месте:

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

buffer_TX_string_W5500_HTTP("GET /data.php?a=");
	buffer_TX_string_W5500_HTTP(" HTTP/1.1\r\nHost: 192.168.0.105\r\n\r\n");
Для чего я так сделал.
Что бы передавать не только строковое но и числовое значение(в виде строкового), нам нужно строку отправки на сервер разделить, что бы вставить числовое значение.
Вот для этого я использовал функцию передачи числа, через строку:

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

//передача числового значения 
void buffer_TX_data_W5500_HTTP(int data)
 {
  char tmp[10];
itoa(data, tmp, 10);  // для использования функции itoa() подключаем #include <stdlib.h>
 buffer_TX_string_W5500_HTTP(tmp);
 }
И тогда передаваемая строка с числовым значение будет иметь вид:

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

////////////////////////////////////////
uint8_t temperatura(void)
{
// некоторое действие
// например результат работы датчика
//температуры ds18b20
	return ds18b20_temperatura();
}
///////////////////////////////////////
buffer_TX_string_W5500_HTTP("GET /data.php?a=");
buffer_TX_data_W5500_HTTP(temperatura());
buffer_TX_string_W5500_HTTP(" HTTP/1.1\r\nHost: 192.168.0.105\r\n\r\n");
Вот как то так.....

Но остался не решенным вопрос присвоения не числового значения ip_адреса сервера, а буквенного,
к примеру: mysite.ru
Как с эти быть пока не ясно.
Ну вот вкратце как то так.
Спасибо Роману БОЛЬШОЕ еще раз.

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

Добавлено after 2 hours 43 minutes 23 seconds:
Но остался не решенным вопрос присвоения не числового значения ip_адреса сервера, а буквенного,
к примеру: mysite.ru Как с эти быть пока не ясно.
Может быть есть какая нибудь программа или функция, которая преобразует доменное имя в ip адрес, что бы его можно было записать в регистр W5500 как в этом случае

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

SS_0;
	SPI(0x00); SPI(0x0C); SPI(0x4C);
	//ip 
	  SPI(192); SPI(168); SPI(0); SPI(105);
	//port
	SPI(0x00); SPI(0x50);
	SS_1;
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Показывайте анализатор как W5500 работает с реальным сервером.
kondeg писал(а):часть функции отправки данных на сервер переписал немного по другому.
А я пишу строки по частям

1. Начало строки
//unsigned char bufer_TX_W5500_HTTP_1[]={
//"GET /data.php?a=|" //
//};
//bufer_TX_W5500_HTTP_1
for (x=0; bufer_TX_W5500_HTTP_1[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP_1[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};

2. данные
tx=ds18b20_temperatura(); SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных

3. Конец строки
//unsigned char bufer_TX_W5500_HTTP_3[]={
//" HTTP/1.1\r\nHost: 192.168.0.200\r\nUser-Agent: ................. \r\n\r\n|" //
//};
//bufer_TX_W5500_HTTP_3
for (x=0; bufer_TX_W5500_HTTP_3[x] != '|' ; x++) {
tx=bufer_TX_W5500_HTTP_3[x]; SPI(); len++; // len (0x0000...0xFFFF) - длина передаваемых данных
};

На выходе W5500 имеем полную строку.
GET /data.php?a=7 HTTP/1.1\r\nHost: 192.168.0.200\r\nUser-Agent: .................

Добавлено after 7 minutes 12 seconds:
[uquote="kondeg",url="/forum/viewtopic.php?p=4069321#p4069321"]Может быть есть какая нибудь программа или функция, которая преобразует доменное имя в ip адрес, что бы его можно было записать в регистр W5500 как в этом случае

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

SS_0;
	SPI(0x00); SPI(0x0C); SPI(0x4C);
	//ip 
	  SPI(192); SPI(168); SPI(0); SPI(105);
	//port
	SPI(0x00); SPI(0x50);
	SS_1;
[/uquote]
Функции такой нет.
Есть протокол DNS, который преобразует доменное имя в ip адрес.
В W5500 нет встроенного протокола DNS. Надо писать самому.
DNS работает по протоколу UDP. В W5500 есть встроенный протокол UDP.
Screenshot_1.jpg
(31.09 КБ) 195 скачиваний
Написать DNS в принципе не проблема.
:tea:
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср фев 11, 2015 01:18:12
Откуда: г. Уссурийск

Сообщение kondeg »

Здравствуй Роман.
Привет всем.
Опять радость у меня на лице :))
Наконец то удалось отправить данные на мой реальный сайт (не локальный).
Опять же помогла посоветованная Ромой программа_анализатор Wireshark.
Через фильтр по URL и по GET запросу увидел ip моего сайта.
Изображение Изображение
Хотя прекрасно помню, что через ping в командной строке показывал тот же ip адрес.
По всей видимости к концу вахты стал невнимательным.
И еще. Вчера пытался подключится к сайте без ожидания подключения.
Сегодня поставил задержку в 10 секунд и соединение прошло отлично (потом переписал код через (for (if_else)) ожидать соединение не более 10 сек).
Это место в коде, где менял адреса для сайта:

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

//buffer_TX_string_W5500_HTTP(" HTTP/1.1\r\nHost: 192.168.0.105\r\n\r\n");
	buffer_TX_string_W5500_HTTP(" HTTP/1.1\r\nHost: pogoda19.ru\r\n\r\n");

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

/ip и port назначения (server)+
void Destination_Ip_Port_Server(void)
{
	SS_0;
	SPI(0x00); SPI(0x0C); SPI(0x4C);
	//ip 
	//SPI(192); SPI(168); SPI(0); SPI(105);
	  SPI(31); SPI(31); SPI(196); SPI(28);
	//port
	SPI(0x00); SPI(0x50);
	SS_1;
}
Ну а все остальное Рома доходчиво объяснил выше.
Не устану его благодарить....
Рома спасибо тебе большое за твою помощь, за твои знания, терпение!!!!
Ну и пожелание таким как я:
Рома в своем тексте указывал не пайку проводом между выводами м.к. и W5500.
Не пренебрегайте эти советом.
Я пол дня потерял только из-за того, что был плохой контакт по питанию W5500. Модуль выдавал ошибку подключения. Код три раза пересматривал. А оказался плохой зажим контакта в монтажном проводе.
Изображение
Понимаю, что все не эстетично выглядит, зато дешево, надежно и практично :))
А это мой модуль на arduino с импровизированным теплоотводом. Работает уже несколько месяцев без перерыва и проблем. Запитан от 5V (знаю, что должен работать от 3.3V)
Изображение
Теплоотвод примотан нитками (что было на тот момент под рукой).
Еще раз спасибо БОЛЬШОЕ Роману!!!!
Весь код выложу чуть позже (обязательно выложу).
Сегодня заканчивается рабочая неделя и ухожу на неделю на отдых.
Младший сын несколько дней назад защитил диплом электромеханика Морского госуниверситета.
Жизнь идет своим чередом, хотя время неумолимо....
Вот как то так.
С уважением ко всем ,прочитавшим это, Константин.

Добавлено after 4 hours 17 minutes 9 seconds:
Но вот под конец дня заметил очень интересный нюанс:
ближе к 17-00 часам мой модуль перестал подключаться к моему сайту по ip, хотя днем исправно слал все данные с периодичностью в несколько секунд.
Решил попробовать на arduino по ip переслать данные....
Ничего не вышло....
А когда указал в arduino доменное имя, то стало все работать.
Вот думаю, может быть в нашем сервере на предприятии стоят какие нибудь расписания?
Попробую завтра днем еще раз по ip подключится.
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

kondeg писал(а):Наконец то удалось отправить данные на мой реальный сайт (не локальный).
Показывайте Wireshark без фильтров. Чтоб видеть как всё работает))
ip сайта можно глянуть в командной строке через PING или через Wireshark или через браузер))

Зачем питать W5500 от 5V ? Он сгореть может))
Для W5500 теплоотвод не нужен. W5500 - это улучшенная версия Изернет модуля с низким потреблением.
По умолчанию PHY работает 100 МБит/c. При этом ток 3,3 V - 135 mA.
При переключении физики PHY на 10 МБит/c. Потребление меньше 3,3 V - 80 mA.
При этом W5500 совсем не греется (чуть тепленький).
Поэтому W5500 радиатор не нужен.

Это старым модулям нужен был радиатор... Всяким там W5100 и Enc28J60 и т.д. У них ток 3,3 V ~150...180 mA.
:tea:

Добавлено after 5 minutes 15 seconds:
[uquote="kondeg",url="/forum/viewtopic.php?p=4069787#p4069787"]к 17-00 часам мой модуль перестал подключаться к моему сайту по ip, хотя днем исправно слал все данные с периодичностью в несколько секунд.
Решил попробовать на arduino по ip переслать данные....
Ничего не вышло....
А когда указал в arduino доменное имя, то стало все работать.
Вот думаю, может быть в нашем сервере на предприятии стоят какие нибудь расписания?[/uquote]
Это что-то новенькое))
А в чём разница подключения по доменному имени и по IP ?
Разница в том, что по доменному имени работает протокол DNS, а по IP нет.
По доменному имени ардуино сначала отправляет DNS запрос на DNS сервер. А потом подключается к серверу.
А что там в вашем сервере на предприятии... знает только сисадмин вашего предприятия))
Хотя всё можно вычислить)) У нас же есть Wireshark ! ))
:tea:
Ответить

Вернуться в «Периферия»