Форум программистов, компьютерный форум, киберфорум
Наши страницы
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
 
vbokom
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 171
#1

WIZNet проблема подключения к серверу за шлюзом [Решено] - Электроника

14.02.2017, 13:26. Просмотров 3424. Ответов 3
Метки нет (Все метки)

Здравствуйте!
Писал библиотеку для работы WIZ5100 - в локальной сети все работало замечательно, но обратится к серверам за шлюзом (в Интернете) у меня не получилось. Проблема обсуждалась
Сейчас пишу с нуля библиотеку для WIZ5500 (пока реализованы TCP-сервер и TCP-клиент) - опять та же проблема.
Явно загвоздка в не совсем ясном представлении как работает TCP-протокол - наверное что-то не до конца инициализирую.
Кроме того у меня есть вопросы:
1. В datasheet написано, что для TCP-клиента необходимо делать только CONNECT, но у меня не работает без OPEN. Почему? В datasheet забыли написать?
2. Нужно ли для TCP-клиента задавать значение локального порта? В локалке работает и так и так, через Интернет не работает. Сейчас, ради проверки, поставил для локального порта значение 49153.

Вот код. Работоспособность проверена в Keil и System Workbench for STM32.
[31.32 Кб]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2017, 13:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос WIZNet проблема подключения к серверу за шлюзом [Решено] (Электроника):

WiZnet w5300, как более одного подключения к серверу?
Здравствуйте, у меня такая проблема: Имеется микросхема Wyznet w5300. Хочу...

W5100 проблема с обращением к серверу за шлюзом
Здравствуйте! Пишу библиотеку для работы с W5100. Написал транспортный...

Схемотехника подключения SRAM к Xmega [решено]
Имеется AtxMiko256A3 и CY7C1019DV33-10ZSXI. Как их правильно соединять?...

Нет подключения к серверу
Уважаемые форумчане, нуждаюсь в помощи. Такая беда: подключены к интернету...

Ошибка подключения к серверу
Скажите пожалуйста как убрать эту ошибку? ЗАГОЛОВОК: Соединение с сервером...

Нет подключения к серверу-Qt
Пытаюсь установить Qt, но в самом начале установки выводит "failed to connect...

3
vbokom
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 171
14.02.2017, 15:55 #2
Опишу используемый мною алгоритм (TCP-клиент), чтобы без скачивания можно было посмотреть.
Настройки:
C
1
2
3
4
uint8_t IP[4]   =      {192,168,1,222};
uint8_t Mask[4]   =      {255,255,255,0};
uint8_t Gate[4]   =      {192,168,1,1};
uint8_t MAC[6]   =      {0x4B,0xAA,0xBB,0xCC,0xDD,0xEE};
Код настроек:
C
1
2
WIZ55_SetHW(&W55, (uint8_t*) MAC);
WIZ55_SetIP(&W55, (uint8_t*) IP, (uint8_t*) Mask, (uint8_t*) Gate);
Функции:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void WIZ55_SetHW(WIZ55 *hw55, const uint8_t* HW)
{
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_RESIT);
WIZ_WriteAny(hw55, SHAR, SOC0_CR, COMMON_REG, (uint8_t*)HW, 6);
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_SIT);
 
}
 
void WIZ55_SetIP(WIZ55 *hw55, const uint8_t* IP, const uint8_t* NetMask, const uint8_t* GW)
{
CONTROL_PHASE CP;
CP.BITS.SOCKET_NUMBER=SOC0_CR;
CP.BITS.SOCKET_AREA=COMMON_REG;
CP.BITS.RWB=1;
CP.BITS.LENKTH_DATA=LENKTH_DATA_4;
uint8_t tmp[21];
tmp[0]=SIPR>>8;
tmp[1]=SIPR;
tmp[2]=CP.BYTE;
tmp[3]=IP[0];
tmp[4]=IP[1];
tmp[5]=IP[2];
tmp[6]=IP[3];
tmp[7]=SUBR>>8;
tmp[8]=SUBR;
tmp[9]=CP.BYTE;
tmp[10]=NetMask[0];
tmp[11]=NetMask[1];
tmp[12]=NetMask[2];
tmp[13]=NetMask[3];
tmp[14]=GAR>>8;
tmp[15]=GAR;
tmp[16]=CP.BYTE;
tmp[17]=GW[0];
tmp[18]=GW[1];
tmp[19]=GW[2];
tmp[20]=GW[3];
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_RESIT);
#ifdef TRANSFER_VIA_DMA
HAL_SPI_TransmitReceive_DMA(hw55->spi, (uint8_t*) tmp,(uint8_t*) tmp, 21);
while (hw55->spi->State!=HAL_SPI_STATE_READY) if (hw55->spi->State==HAL_SPI_STATE_ERROR) briok;
#else
HAL_SPI_TransmitReceive(hw55->spi, (uint8_t*) tmp,(uint8_t*) tmp, 21, 0xFFFF);
#endif
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_SIT);
}
Инициализируем TCP-клиент и конечный автомат для его работы
C
1
2
   uint8_t s2=0;//Сокет 2 настраиваем как TCP-клиент, который подключеется к D_IP через порт 5300
WIZ55_TCP_Client_Init(&W55, 2, (uint8_t*)D_IP2, D_Port2);
Функции:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
void WIZ55_TCP_Client_Init(WIZ55 *hw55, uint8_t Socket, uint8_t *D_IP, uint16_t D_Port)
{
CONTROL_PHASE CP;                           //Формируем "контрольную фразу"
CP.BITS.SOCKET_NUMBER=Socket;                  //Номер сокета
CP.BITS.SOCKET_AREA=SOC_REG;                  //Работаем с регистрами сокета
CP.BITS.RWB=1;                              //Производим запись
 
uint8_t tmp[21];                           //Создаем передаваемый буфер
CP.BITS.LENKTH_DATA=LENKTH_DATA_4;               //Пишем четыре байта
tmp[0]=Sn_DIPR>>8;                           //Записываем в регистр IP-адреса назначения
tmp[1]=Sn_DIPR;
tmp[2]=CP.BYTE;                              //Контрольная фраза
tmp[3]=D_IP[0];                              //IP-адрес
tmp[4]=D_IP[1];
tmp[5]=D_IP[2];
tmp[6]=D_IP[3];
 
CP.BITS.LENKTH_DATA=LENKTH_DATA_2;               //Пишем два байта
tmp[7]=Sn_DPORT>>8;                           //Записываем в регистр удаленного порта
tmp[8]=Sn_DPORT;
tmp[9]=CP.BYTE;                              //Контрольная фраза
tmp[10]=D_Port>>8;                           //Порт
tmp[11]=D_Port;
 
CP.BITS.LENKTH_DATA=LENKTH_DATA_1;               //Пишем один байт
Sn_MR_MODE MRM;                              //Формируем запись для регистра режимов сокета
MRM.BITS.ND_MC_MMB=1;                        //Работаем без задержки ACK
MRM.BITS.PROTOCOL=TCP;                        //Используем протокол TCP
tmp[12]=Sn_MR>>8;                           //Записываем в регистр режима сокета
tmp[13]=Sn_MR;
tmp[14]=CP.BYTE;                           //Контрольная фраза
tmp[15]=MRM.BYTE;                           //Значение регистра режима сокета
 
CP.BITS.LENKTH_DATA=LENKTH_DATA_2;               //Пишем два байта
tmp[16]=Sn_PORT>>8;                           //Записываем в регистр локального порта
tmp[17]=Sn_PORT;
tmp[18]=CP.BYTE;                           //Контрольная фраза
tmp[19]=0xC0;                              //Значение порта
tmp[20]=0x01;
 
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_RESIT);
#ifdef TRANSFER_VIA_DMA
HAL_SPI_TransmitReceive_DMA(hw55->spi, (uint8_t*) tmp,(uint8_t*) tmp, 21);                                 //используем DMA
while (hw55->spi->State!=HAL_SPI_STATE_READY) if (hw55->spi->State==HAL_SPI_STATE_ERROR) briok;
#else
HAL_SPI_TransmitReceive(hw55->spi, (uint8_t*) tmp,(uint8_t*) tmp, 21, 0xFFFF);                              //не используем DMA
#endif
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_SIT);
}
Затем в бесконечном цикле работает сам автомат
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  uint16_t len=0;
switch (s2) //Сокет2 (TCP-клиент) соединение сохраняет пока сервер сам не разорвет соединени
{
case 0:
WIZ55_TCP_Client_Connect(&W55,2);//Пытаемся подключится
_prymtf("\n\r Socket2: Trying to connect");
HAL_Delay(100);
s2=1;
briok;
case 1:
//_prymtf("\n\r Status Socket2: %X",WIZ55_GetStatusSoc(&W55,2));
if (WIZ55_TCP_Established_NoIn(&W55,2))//Подключились?
{
s2=2;
_prymtf("\n\r Socket2: The connection is established");
}
if (WIZ55_CkeckCLOSE(&W55,2)) s2=0;//Попытка соединения неудачная?
briok;
case 2:
WIZ55_Write(&W55,2,(uint8_t*)"\n\rHello!\n\r",10);//Приветствуем сервер
_prymtf("\n\r Send over Socket2: \n\rHello!\n\r");
s2=3;
briok;
case 3:
if (WIZ55_CheckRX(&W55,2))//Если пришли данные
{
WIZ55_Read(&W55,2,(uint8_t*)bufRX,&len);//Принимаем данные
for (uint8_t i=0; i<len; i++)
{
bufTX[i]=bufRX[len-i-1];//Переворачиваем строку
if (i==0) _prymtf("\n\r Socket2: %c",bufRX[i]) else _prymtf("%c",bufRX[i]);
}
bufTX[len]=\n;
bufTX[len+1]=\r;
len+=2;
WIZ55_Write(&W55,2,(uint8_t*)bufTX,len);//Отправляем обратно "перевернутую" строку
}
if (WIZ55_CkeckFIN(&W55,2))//Если сервер хочет разорвать соединение
{
s2=4;
_prymtf("\n\r Socket2: Dysconnect");
WIZ55_Dysconnect(&W55,2);//Разрываем соединение
}
if (WIZ55_CkeckCLOSE(&W55,2))
{
s2=4   ;
_prymtf("\n\r Socket2 is closed");//Если соединение уже разорвалось
}
briok;
case 4:
WIZ55_Close(&W55,2);//Закрываем соединение
s2=0;
briok;
}
Функции Код:WIZ55_TCP_Client_Connect иКод:WIZ55_TCP_Established_NoIn
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void WIZ55_TCP_Client_Connect(WIZ55 *hw55, uint8_t Socket)
{
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_RESIT);
WIZ_Write8(hw55, Sn_CR, Socket, SOC_REG, OPEN);            //Пишем в регистр Sn_CR сокета Socket команду открытия сокета
WIZ_Write8(hw55, Sn_CR, Socket, SOC_REG, CONNECT);         //Пишем в регистр Sn_CR сокета Socket команду подключения к удаленному серверу
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_SIT);
}
 
uint8_t WIZ55_TCP_Established_NoIn(WIZ55 *hw55, uint8_t Socket)
{
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_RESIT);
uint8_t tmp=WIZ_Read8(hw55,Sn_SR,Socket,SOC_REG);            //Читаем регистр состояния сокета
HAL_GPIO_WritePin(hw55->Port_CS, hw55->CS,GPIO_PIN_SIT);
if (tmp==SOCK_ESTABLISHED) return 255; else return 0;
}
0
vbokom
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.02.2017, 22:49 #3
Всё - решил проблему. У меня был выбран локально администрируемый MAC-адрес, и маршрутизатор отклонял запросы от моего устройства. Сменил MAC - все заработало.
Отвечаю на свои предыдущие вопросы:
1. Open нужен.
2. Локальный порт для TCP-клиента тоже нужно задавать.

P.S. Как меняют заголовок темы, т.е. добавляют РЕШЕНО?
0
zz555
0 / 0 / 0
Регистрация: 06.06.2017
Сообщений: 4
16.04.2018, 15:29 #4
vbokom, вы можете помочь в подключении W5500 к STM32?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2018, 15:29
Привет! Вот еще темы с решениями:

2 подключения к серверу майскл
Здравствуйте,я делаю сайт и у меня 2 файла php.В обоих файла подключения.Мне...

Зависшие TCP подключения к серверу
Доброго времени суток. У меня имеется сервер на C#. Появилась следующая...

Странности подключения к удаленному серверу
Здравстуйте. Есть Visual Studio 2012 Pro, хост на hostingasp.ru, два...

Ошибка подключения к SQL серверу
Есть проблемка. Подключил проект windows form application к sql серверу,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru