Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Cетевые протоколы и технологии

Cетевые протоколы и технологии TCP/IP стек

Ответ
 
Опции темы Опции просмотра
Старый 21.11.2012, 13:02   #1
skdon
Junior Member
 
Регистрация: 24.09.2009
Возраст: 39
Сообщений: 14
Вес репутации: 100/40
skdon will become famous soon enoughskdon will become famous soon enough
По умолчанию Нужна помощь с TCP/IP

Пытаемся разобраться с TCP/IP.
В общем задача в следующем: Необходимо устройство, которое с помощью HTTP будет запрашивать данные с сервера и соответственно отображать на устройстве индикации.
С созданием и закачкой страничек для настройки в принципе более менее понятно.
А вот как контроллером сделать запрос по HTTP к серверу???
Дальше, как я понимаю, можно получать страничку и парсить ее или делать POST/GET запросы и выдирать переменные.
В общем прошу помощи, или ткните, плиз, носом. Перерыл форум, подобного не нашел.
skdon вне форума   Ответить с цитированием
Старый 21.11.2012, 14:01   #2
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,183
Вес репутации: 4655/132
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: Нужна помощь с TCP/IP

Цитата:
Сообщение от skdon Посмотреть сообщение
Пытаемся разобраться с TCP/IP.
В общем задача в следующем: Необходимо устройство, которое с помощью HTTP будет запрашивать данные с сервера и соответственно отображать на устройстве индикации.
С созданием и закачкой страничек для настройки в принципе более менее понятно.
А вот как контроллером сделать запрос по HTTP к серверу???
Дальше, как я понимаю, можно получать страничку и парсить ее или делать POST/GET запросы и выдирать переменные.
В общем прошу помощи, или ткните, плиз, носом. Перерыл форум, подобного не нашел.
ну так стыкуешься к серверу, посылаешь запрос стандартный, как все браузеры, принимаешь данные, а потом парсишь
__________________

Vanizma вне форума   Ответить с цитированием
Старый 21.11.2012, 14:12   #3
skdon
Junior Member
 
Регистрация: 24.09.2009
Возраст: 39
Сообщений: 14
Вес репутации: 100/40
skdon will become famous soon enoughskdon will become famous soon enough
По умолчанию Re: Нужна помощь с TCP/IP

Эт я понимаю. Как именно это сделать. В смысле, как состыковаться с сервером?
Как контроллером послать запрос???
Если зайти на страничку и жмакнуть кнопку, понятно. А средствами контроллера как???
Просто пока слабо понимаю как именно работает сервер.
Прошу сильно не пинать, в TCP/IP новичок.
skdon вне форума   Ответить с цитированием
Старый 21.11.2012, 14:50   #4
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,183
Вес репутации: 4655/132
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: Нужна помощь с TCP/IP

Цитата:
Сообщение от skdon Посмотреть сообщение
Эт я понимаю. Как именно это сделать. В смысле, как состыковаться с сервером?
Как контроллером послать запрос???
Если зайти на страничку и жмакнуть кнопку, понятно. А средствами контроллера как???
Просто пока слабо понимаю как именно работает сервер.
Прошу сильно не пинать, в TCP/IP новичок.
Код:
MySocket = TCPOpen(currentIP.Val, TCP_OPEN_IP_ADDRESS, currentPort, TCP_PURPOSE_RELAY_CLIENT_TCP);
а дальше проверяешь что подключился и ... TCPPut...
потом ждешь ответ
получаешь ответ
парсишь

Есть же в стеке клиент SMTP. Там все есть что нужно для обращения к серверу
__________________

Vanizma вне форума   Ответить с цитированием
Старый 21.11.2012, 15:25   #5
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,449
Вес репутации: 725/49
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: Нужна помощь с TCP/IP

http://www.pickit2.ru/doku.php/all_articles:tcpipconfig
SergP01 вне форума   Ответить с цитированием
Старый 21.11.2012, 15:45   #6
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 41
Сообщений: 4,860
Вес репутации: 4724/137
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Нужна помощь с TCP/IP

Цитата:
Сообщение от SergP01 Посмотреть сообщение
При чем тут эта статья, которая в общих чертах поясняет как сконфигурировать TCP-IP стек. ТС хочет послать вполне конкретный запрос от МК к серверу. Я бы заказал работу знающим людям.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 21.11.2012, 18:35   #7
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,536
Вес репутации: 4887/118
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Нужна помощь с TCP/IP

Цитата:
Сообщение от skdon Посмотреть сообщение
Пытаемся разобраться с TCP/IP.
В общем задача в следующем: Необходимо устройство, которое с помощью HTTP будет запрашивать данные с сервера и соответственно отображать на устройстве индикации.
С созданием и закачкой страничек для настройки в принципе более менее понятно.
А вот как контроллером сделать запрос по HTTP к серверу???
Дальше, как я понимаю, можно получать страничку и парсить ее или делать POST/GET запросы и выдирать переменные.
В общем прошу помощи, или ткните, плиз, носом. Перерыл форум, подобного не нашел.
Код:
#define __GENERICTCPCLIENT_C

#include "TCPIP.h"


#if defined(STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE)

BOOL RQtransmit; // флаг требования передать данные через Generik


// Defines the server to be accessed for this application
//static const DWORD  ServerName = 0x0300A8C0ul;

// Defines the port to be accessed for this application
//static WORD ServerPort = 9760ul;

// Defines the URL to be requested by this HTTP client

/*****************************************************************************
  Function:
    void GenericTCPClient(void)

  Summary:
    Implements a simple HTTP client (over TCP).

  Description:
    This function implements a simple HTTP client, which operates over TCP.  
    The function is called periodically by the stack, and waits for BUTTON1 
    to be pressed.  When the button is pressed, the application opens a TCP
    connection to an Internet search engine, performs a search for the word
    "Microchip" on "microchip.com", and prints the resulting HTML page to
    the UART.
    
    This example can be used as a model for many TCP and HTTP client
    applications.

  Precondition:
    TCP is initialized.

  Parameters:
    None

  Returns:
      None
  ***************************************************************************/



static enum _GenericTCPExampleState
    {
        SM_HOME = 0,
        SM_SOCKET_OBTAINED,
        SM_PROCESS_RESPONSE,
        SM_PROCESS_RESPONSE2,
        SM_DISCONNECT_GOOD,
        SM_DISCONNECT,
        SM_DONE
    } ;

static BYTE GenericTCPExampleState ;
static TICK            Timer;
static TCP_SOCKET    MySocket;
static WORD len;
static IP_ADDR ServerName; // адрес сервера сбора данных

static  BYTE GTCP_client[40];
static  BYTE IndexServ=0; // прогон всех серверов по порядку
static  TICK TICKwait[4]; // храним время первого провала


void initGenericTCPClient(void)
{
    MySocket = INVALID_SOCKET;
    GenericTCPExampleState = SM_DONE;
    RQtransmit=0;
    ServerName=AppConfig.MyIPAddr;      //  поправить последний октет моего адреса
  ServerName.v[3]=1ul; //  пока запрашивается IP адрес только 10.96.32.1 чтобы не спрашивать себя же
// предустановка серверов
   

}


void GenericTCPClient(void)
{

char search, temp;
signed char ix; // подготовка номера светодиода 
char * pclient;
static char errs[4]; //счетчики ошибок чтения состояния

    const WORD ServerPort = 80ul;
     switch(GenericTCPExampleState)
    {
        case SM_HOME:
            // Connect a socket to the remote TCP server
    

            ServerName.v[3] = distrib_led[IndexServ].numIP; 

            ix = searchIP2MAC(ServerName); // ищем запись в КЭШ
            if(ix<0) 
            {
                if( (TickGet() - TICKwait[IndexServ]) > TICK_SECOND*10)
                {                
                    // нет такой записи в КЭШ
                    MySocket = TCPOpen( ServerName.Val, TCP_OPEN_IP_ADDRESS, ServerPort, TCP_PURPOSE_GENERIC_TCP_CLIENT);
                    TICKwait[IndexServ] = TickGet(); // установить начало времени отсутствия устройства
                }
                else
                {   
                    GenericTCPExampleState = SM_DONE; // переходим к следующему пациенту
                }

            }
            else
            {
                // есть такая запись - берем её из КЭШ
                MySocket = TCPOpen((DWORD) &arp_cache[ix].info, TCP_OPEN_NODE_INFO, ServerPort, TCP_PURPOSE_GENERIC_TCP_CLIENT);

            }


            // Abort operation if no TCP socket of type TCP_PURPOSE_GENERIC_TCP_CLIENT is available
            // If this ever happens, you need to go add one to TCPIPConfig.h
            if(MySocket == INVALID_SOCKET) // при наличии свободного сокета этого типа сразу выдаст хендл
            {   // если нет свободного сокета, то он занят прямо тут же этим же алгоритмом -вообщем то бред
                if(TickGet()-Timer > TICK_SECOND/8) GenericTCPExampleState = SM_DISCONNECT;
                break;
            }
            

            GenericTCPExampleState = SM_SOCKET_OBTAINED;
            Timer = TickGet();
            break;

        case SM_SOCKET_OBTAINED:
            // Wait for the remote server to accept our connection request
            if(!TCPIsConnected(MySocket))
            {
                // Time out if too much time is spent in this state
                if(TickGet()-Timer > TICK_SECOND)
                {
                    // Close the socket so it can be used by other modules
                    TCPDisconnect(MySocket);
                    MySocket = INVALID_SOCKET;
                    GenericTCPExampleState = SM_DISCONNECT;
                }
                break;
            }

            Timer = TickGet();

            // Make certain the socket can be written to
            if(TCPIsPutReady(MySocket) < 50u)
                break;
            
            
            
            TCPPutROMString(MySocket, (ROM BYTE*)"GET /sensor.xml \r\n\r\n"); // запрашиваю данные
           
            // Send the packet
            TCPFlush(MySocket);
            GenericTCPExampleState++;
            break;

        case SM_PROCESS_RESPONSE:
            if(!TCPIsConnected(MySocket))
            {
                GenericTCPExampleState = SM_DISCONNECT;
                // Do not break;  We might still have data in the TCP RX FIFO waiting for us
                
            }
            if(TCPIsGetReady(MySocket) < 5u) break; // не с чем сравнивать

            len = TCPFindROMArray(MySocket, (ROM BYTE*)"<led>", 5, 0, FALSE); // ищем начало данных
            if(len==0xFFFF)
            {
                // не найдено в этом месте
                TCPGetArray(MySocket, NULL, TCPIsGetReady(MySocket)-5);// промотать сколько есть

            }
            else 
            {
                // обнаружено необходимое слово
                TCPGetArray(MySocket, NULL, len + 5); // промотать до конца этого слова 
                GenericTCPExampleState = SM_PROCESS_RESPONSE2;
            }

            break;
        case SM_PROCESS_RESPONSE2:// получены некоторые данные мы их пропустили
            if(!TCPIsConnected(MySocket))
            {
                GenericTCPExampleState = SM_DISCONNECT;
                // Do not break;  We might still have data in the TCP RX FIFO waiting for us
                
            }
            if(TCPIsGetReady(MySocket) < 16u) break; // мало данных
            len=TCPGetArray(MySocket, GTCP_client, 16);    
            if(len<16) 
            {    // тут не правильно совсем возможно стоит вообще убрать
                GenericTCPExampleState = SM_DISCONNECT;
                break;
            }
                pclient= &GTCP_client[0];// начальная позиция 
                for(search = 0; search < 8; search++)
                {
                    temp=0;
                
                    switch(*pclient)
                    {
                    case 'R': temp |= L_BLINK;
                    case 'r': temp |= L_RED;
                    break;    
                    case 'G': temp |= L_BLINK;
                    case 'g': temp |= L_GREEN;
                    break;    
                    case 'Y': temp |= L_BLINK;
                    case 'y': temp |= L_YELLOW;
                    break;    
                    
                    }
                    ix = distrib_led[IndexServ].numLed[search];
                    if(ix<0 || ix > 19) continue; // пропустить его
                    set_led(temp | ix );
                    pclient+=2;
                }
                
                 errs[IndexServ]=0; // сброс числа ошибок
                GenericTCPExampleState = SM_DISCONNECT_GOOD;
                break;
            
        case SM_DISCONNECT:// плохое окончание - нужно стереть то что горит уже если число ошибок велико
            if(errs[IndexServ]>1)
            {
                for(search = 0; search < 8; search++)
                {
                    ix = distrib_led[IndexServ].numLed[search];
                    if(ix<0 || ix > 19) continue; // пропустить его
                    set_led( ix );
                }    
            }
            else errs[IndexServ]++;        

            TCPDisconnect(MySocket);
            MySocket = INVALID_SOCKET;
            GenericTCPExampleState = SM_DONE;
            RQtransmit=0;// будем ждать N-ю секунду
            break;

        case SM_DISCONNECT_GOOD:
            // Close the socket so it can be used by other modules
            // For this application, we wish to stay connected, but this state will still get entered if the remote server decides to disconnect

            ix = searchIP2MAC(ServerName); // раз хорошо отработало - 
            if(ix>=0 && ix<4) good_arp(ix); // значит пролонгировать жизнь пары в КЭШ


            TCPDisconnect(MySocket);
            MySocket = INVALID_SOCKET;
            GenericTCPExampleState = SM_DONE;
            RQtransmit=0;// будем ждать N-ю секунду
            break;
    
        case SM_DONE:
            // Do nothing unless the user pushes BUTTON1 and wants to restart the whole connection/download process
            if(RQtransmit) // надо передать данные    
            {
                RQtransmit=0;
                GenericTCPExampleState = SM_HOME;
                for(ix=0;ix<4;ix++)
                {
                      IndexServ++;
                    if(IndexServ>3  ) IndexServ=0;
                    if( !(distrib_led[IndexServ].numIP == 0)) break; // найдена активная запись
                    // не найдена запись
                }
                if( (distrib_led[IndexServ].numIP == 0) ) GenericTCPExampleState = SM_DONE; // не найден активный

                Timer = TickGet();// начало тайм аута поиска сервера без учета потери времени на цикл РТОС
            }
            break;
    }
}

#endif    //#if defined(STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE)
местами есть где похихикать...
ampersant вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь по asm для dsPIC hubble Продукция MICROCHIP 17 09.02.2012 23:17
Нужна помощь с BUGGY piter Продукция MICROCHIP 2 25.07.2011 12:55
Нужна помощь!!! MDD File System FSIO simnov Вопросы начинающих 1 29.05.2011 01:01
Нужна помощь в Proteus`е italic Общетехнические вопросы 2 25.03.2008 14:49
Нужна помощь в решении вопросса! (в тему и не в тему) Noname1024 Общетехнические вопросы 31 19.12.2007 15:30


Часовой пояс GMT +3, время: 02:58.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot