Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511

TCP и HTTP сервера на одном stm32

19.02.2021, 19:45. Показов 4657. Ответов 18

Студворк — интернет-сервис помощи студентам
Хочу сделать одновременно TCP и HTTP сервера на одном мк.
Использую LWIP RAW, stm32f746, PHY - LAN8742, без OS, код генерирую в CubeMX.
Сейчас настроен TCP сервер на LWIP RAW. HTTP делал на NETCONN. На RAW сделать HTTP, я так понимаю, особо ничем не отличается от TCP, только добавить связку входящий запрос-ответ отправкой страницы/данных.
Но интересует в целом возможность совместить TCP и HTTP на одном мк.
Насколько я знаю, HTTP просит создавать соединение на 80м порту. Для TCP номер порта не важен.
Пока не понятно как это можно организовать. Как-то пытаться делать несколько соединений на TCP, просто HTTP привязывать на 80й порт, или вообще параллельно создавать два соединения, параллельно их прослушивать и т.д. Тогда не понятно как настройки будут поделены между этими соединениями, как будет делиться память мк.
Буду благодарен любой помощи и подсказкам.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2021, 19:45
Ответы с готовыми решениями:

Нужна подсказка новичку разобраться с функциями работы HTTP (HTTPS) сервера, TCP сервера
Добрый день. Опыт программирования пару дней, прошу учесть при ответе. Задача стояла в организации "прокладки" между интернет...

Помогите с реализацией TCP/IP сервера для stm32
Кто работал с TCP/IP на stm32? Помогите разобраться. Задача такая, у меня есть микроконтроллер STM32F417VG и контроллер который...

Чем связать STM32 + STM32 в одном корпусе?
Есть 2 платы: (1) - STM32 (Вывод на LCD + запись SD) и (2) - STM32F4 (обработка сигналов + коммуникация с датчиками). Чем связать данные...

18
19.02.2021, 23:24

Не по теме:

Цитата Сообщение от DmitryDDDD Посмотреть сообщение
Но интересует в целом возможность совместить TCP и HTTP на одном мк.
Не просто можно... они могут только вместе работать, т.к. HTTP использует TCP.

0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
20.02.2021, 00:39
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
Тогда не понятно как настройки будут поделены между этими соединениями, как будет делиться память мк.
а какие настройки Вас тревожат? Различия и коллбеки, в итоге, будут привязаны к порту, к которому будет выполняться соединение. Просто на одном порту вы открываете raw tcp handler, на другом - привязываете http-сервер. И все. Все остальное за Вас сделает lwIP
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
20.02.2021, 13:16  [ТС]
Humanoid, Voland_, Проблемы возникли вот в чем:
Вот, например, типичное создание нового TCP соединения:
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
void TcpServer_Init(void)
{
    pcb = tcp_new();                                                                  // Create a new TCP PCB
    if(pcb != NULL)
    {
        err_t err;
        err = tcp_bind(pcb, NULL, 80);                                                // Bind PCB to local IP address and port
        if (err == ERR_OK)
        {
            pcb = tcp_listen(pcb);                                                    // Make PCB listen for incoming connections
            if (pcb != NULL)
            {
                tcp_accept(pcb, TcpServer_accept);                                    // Set callback used for new incoming connections
            }
            else
            {
                           //
            }
        }
        else
        {
            memp_free(MEMP_TCP_PCB, pcb);                                             // Deallocate the pcb
        }
    }
    else
    {
                   //
    }
}
Т.е. я делаю привязку к 80му порту, что для HTTP обязательно (если нет, то поправьте меня)
tcp_bind(pcb, NULL, 80);
Дальше я хочу получить следующее (в случае одновременного подключения TCP клиента и HTTP клиента, либо кого-то одного из них):
- если поступает GET запрос, то отправляем ему ответ HTTP (т.е. страницу/данные)
- если поступает какой-то TCP пакет, то принимаем его как обычный TCP, т.е. буфер данных и обрабатываем
Вот очень большая функция приема TCP пакета:
Кликните здесь для просмотра всего текста
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
static err_t TcpServer_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
    struct TcpServer_struct *es;
    err_t ret_err;
 
    struct fs_file file;
 
    LWIP_ASSERT("arg != NULL", arg != NULL);
    es = (struct TcpServer_struct *)arg;
 
    // Close connection if received tcp frame form client is empty
    if (p == NULL)
    {
        // Remote host closed connection
        es->state = ES_CLOSING;
        if(es->p == NULL)
        {
            tcp_recved(tpcb, p->tot_len);
        }
        else
        {
            tcp_sent(tpcb, TcpServer_sent);                     // Not done yet, acknowledge received packet
            TcpServer_send(tpcb, es);                           // Send remaining data
        }
 
        ret_err = ERR_OK;
    }
 
    // If received frame is not empty, but err != ERR_OK
    else if(err != ERR_OK)
    {
        // Free received pbuf
        if (p != NULL)
        {
            es->p = NULL;
            pbuf_free(p);
        }
        ret_err = err;
    }
 
    else if(es->state == ES_ACCEPTED)
    {
        tcp_recved(tpcb, p->tot_len);                           // Added bymc
 
        strncpy(TcpStrRecv, p->payload, p->len);
        TcpStrRecv[p->len] = '\0';
        HAL_UART_Transmit(&huart3, (uint8_t*)TcpStrRecv, strlen(TcpStrRecv), 100);
        pbuf_free(p);
        es->p = NULL;
 
        if ((p->len >=5) && (strncmp(p, "GET /", 5) == 0))
        {
            if ((strncmp((char const *)p,"GET /",6) == 0)||(strncmp((char const *)p,"GET /index.html", 15) == 0))
            {
                fs_open(&file, "/index.html");
                tcp_write(tpcb, (const unsigned char*)(file.data), (size_t)file.len, 1);
                fs_close(&file);
 
                snprintf(send_str, 50, "GET\r\n");
                HAL_UART_Transmit(&huart3, (uint8_t*)send_str, strlen(send_str), 100);
            }
            else if (strncmp((char const *)p,"GET /IMG/Test.png", 18) == 0)
            {
                fs_open(&file, "/IMG/Test.png");
                tcp_write(tpcb, (const unsigned char*)(file.data), (size_t)file.len, 1);
                fs_close(&file);
 
                snprintf(send_str, 50, "GET Test\r\n");
                HAL_UART_Transmit(&huart3, (uint8_t*)send_str, strlen(send_str), 100);
            }
            else
            {
                fs_open(&file, "/404.html");
                tcp_write(tpcb, (const unsigned char*)(file.data), (size_t)file.len, 1);
                fs_close(&file);
 
                snprintf(send_str, 50, "404\r\n");
                HAL_UART_Transmit(&huart3, (uint8_t*)send_str, strlen(send_str), 100);
            }
        }
        else
        {
            __NOP();
        }
 
        ret_err = ERR_OK;
    }
 
    else if (es->state == ES_RECEIVED)
    {
        // More data received from client and previous data has been already sent
        if(es->p == NULL)
        {
            es->p = p;
            ret_err = ERR_OK;
        }
        else
        {
            struct pbuf *ptr;
            // Chain pbufs to the end of what we recv'ed previously
            ptr = es->p;
            pbuf_chain(ptr, p);
        }
        ret_err = ERR_OK;
    }
 
    else if(es->state == ES_CLOSING)
    {
        // Odd case, remote side closing twice, trash data
        tcp_recved(tpcb, p->tot_len);
        es->p = NULL;
        pbuf_free(p);
 
        ret_err = ERR_OK;
    }
 
    else
    {
        // Unkown es->state, trash data
        tcp_recved(tpcb, p->tot_len);
        es->p = NULL;
        pbuf_free(p);
        ret_err = ERR_OK;
    }
 
    return ret_err;
}

Здесь я расчитывал, что просто принятый пакет будет проходить ряд условий, при которых он определится либо как GET запрос и будет сформирован ответ, а если нет, то просто примется как TCP пакет и пойдет по дальнейшему пути принятия TCP пакета
Начиная с этого условия в этой части кода else if(es->state == ES_ACCEPTED)
C
1
if ((p->len >=5) && (strncmp(p, "GET /", 5) == 0))
Но пока HTTP сервер что-то пытается выдать, но страница не приходит. TCP сервер вроде работает нормально

Добавлено через 12 минут
Но я еще так подозреваю, что данный TCP сервер при той реализации, что сделана сейчас, не поддерживает два и более одновременных подключения, возможно проблема в этом, т.к. HTTP же пытается тянуть страницу через несколько подключений сразу. Я, если честно, забыл уже как задать больше одного возможного подключения
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
20.02.2021, 13:38
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
я делаю привязку к 80му порту, что для HTTP обязательно (если нет, то поправьте меня)
нет, не обязательно. Сервер HTTP, как и любого другого протокола, может работать на любом свободном порту. Просто есть назначенные порты, есть порты "прижившиеся", но это Вам, решать, что и где будет находиться.
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
Здесь я расчитывал, что просто принятый пакет будет проходить ряд условий, при которых он определится либо как GET запрос и будет сформирован ответ, а если нет, то просто примется как TCP пакет и пойдет по дальнейшему пути принятия TCP пакета
А зачем Вам это? Нет, это возможно, но просто это интересно тогда, когда памяти нет совсем, а TCP-сервер настолько немощный, что не может поддерживать одновременно несколько сокетов на нескольких портах...

Вот, есть раздумья некоего автора, который сам нашел ответ на свою проблему.
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
20.02.2021, 13:46  [ТС]
Voland_, Да не, это не сервер не мощный, это моя реализация сервера не поддверживает нормального подключения двух клиентов, я что-то упустил. Там stm32f746 пока особо ничем не нагруженный.
На netconn делал и TCP и HTTP, там все нормально было, все поддерживалось. Тут на RAW что-то упустил. А по поводу "зачем": ну тут скорее придать некой универсальности для программы, захотел подключился по TCP через какую-нибудь самодельную програмку, а захотел и подключился через браузер. Такая вот дополнительная хотелка).
Ну, я так понимаю, что сейчас надо ликвидировать невозможность подключения нескольких клиентов одновременно, дальше пробовать HTTP подключать.
Ну а сама моя идея реализации хоть правильная?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
20.02.2021, 14:03
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
идея реализации хоть правильная?
Время покажет - правильная или нет ). На мой взгляд, лучше не совмещать два разные протокола обмена на одном порту. В конце-концов, для разделения их - порты и существуют ).
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
захотел подключился по TCP через какую-нибудь самодельную програмку
самодельная программка может поддерживать и http Для универсальности нужно просто поддержать http тогда и сделать это полноценно - в несколько потоков.
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
20.02.2021, 17:20  [ТС]
Voland_, HTPP это же по сути надстройка над TCP, т.е. соединение устанавливается, зактывается да и работает как TCP. А HTTP должен только обрабатывать полученные GET запросы. На имеющийся TCP сервер я добавил обработку GET запросов в функции принятия пакетов, а чем еще отличается релизация HTTP сервера от TCP я пока не знаю даже. Надо найти какой-нибудь рабочий пример и посмореть различия
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
20.02.2021, 20:58
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
На имеющийся TCP сервер я добавил обработку GET запросов в функции принятия пакетов, а чем еще отличается релизация HTTP сервера от TCP я пока не знаю даже
GET-запросами, да и их форматом, HTTP не заканчивается. Да, я тоже делал приблизительно такой вариант - надстройку для ответов на AJAX-запросы. Но это вариант весьма ограниченный, и подходит не для всех вариантов запросов. То есть не факт что это будет работать, допустим, со всеми браузерами и во всех сетях.

Цитата Сообщение от DmitryDDDD Посмотреть сообщение
На имеющийся TCP сервер я добавил обработку GET запросов в функции принятия пакетов, а чем еще отличается релизация HTTP сервера от TCP я пока не знаю даже.
PS: я не утверждаю обратное, HTTP - надстройка, в случае с Ethernet - над TCP/IP. Но сама идея "портов" и "сокетов" - это чисто программное решение на базе TCP/IP, чтобы разделять пакеты по протоколам и соединениям. Это тоже самое, как и в других соединениях на базе протоколов 802.1x.ххх... очень широкий перечень. Если вы по-изучаете модель OSI - станет многое понятнее, почему и как разделяют протоколы ). Они просто на разных уровнях [модели] находятся, а вы смешиваете все в одну кучу.
1
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
25.02.2021, 07:38  [ТС]
Voland_, Да, согласен, переведу код под HTTP, так думаю проще будетв дальнейшем реализовывать. Да и вообще лучше отойду к общению с мк через браузер. Но пока есть одна пролема, я так понимаю тут в основном на вопросы по LWIP только Вы отвечаете), поэтому спрошу: сейчас TCP сервер создает только одно соединение, точне он и второе создает, при попытке соединиться со вторым клиентом (тройное рукопожатие проходит нормально), но как только второй клиент начинает слать данные, первый же пакет не доходит до мк, происходит множественные retransmission. При этом и первое соединение тоже перестает работать. Все настройки проверил, там вроде все нормально, колличество соединений TCP 10. В какую сторону копать?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
25.02.2021, 09:14
DmitryDDDD, надо смотреть код. Просто инициализация всех соединений не происходит непосредственно в Init(). И, соответственно, при открытии 1го соединения, никто не открывает следующее. Это надо делать в бесконечном цикле (стейт-машины или idle-loop'а), который и будет
C
1
2
3
4
5
pcb = tcp_listen(pcb);                                                    // Make PCB listen for incoming connections
            if (pcb != NULL)
            {
                tcp_accept(pcb, TcpServer_accept);                                    // Set callback used for new incoming connections
            }
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
лучше отойду к общению с мк через браузер.
почему? Грамотно составленная страничка позволяет не перегружать все данные, но собирает их из разных источников GET запросами. Копайте в сторону AJAX, JQuery (тут JS-спецы вам больше подскажут). Другое дело, что lwIP "из коробки" не поддерживает обработку таких запросов, но в примерах и работа с файлами показана весьма приблизительно, так что тут фантазия как раз может бурлить до бесконечности - реализовуйте, что хотите, в том числе, и AJAX ).

Добавлено через 4 минуты
Цитата Сообщение от Voland_ Посмотреть сообщение
надстройку для ответов на AJAX-запросы.
...вот, исходя из этого материала. Пришлось, естесно, подсматривать wireshark'ом на "живых" сайтах (можно, допустим, поставить какой-нибудь apache для опытов, или просто LAMP установить в наборе. Мало ли что еще понравится или понадобится). Но это таки заработало )
1
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
25.02.2021, 09:23  [ТС]
Voland_, Вот основные части кода, все приводить не буду, чтобы не перегружать лишней информацией, если что-то надо будет привести дополнительно, напишите, скину)
1) Используемые функции
C
1
2
3
4
5
6
7
8
9
10
11
void TcpServer_Init(void);                                                                  // Create a new TCP connection
void TcpServer_Close(void);                                                                 // Close the current TCP connection
int16_t TcpServerTransmission(uint8_t *pData, uint16_t Len);
 
static err_t TcpServer_accept(void *arg, struct tcp_pcb *newpcb, err_t err);                // LwIP callback of accept, recognizing link establishment
static err_t TcpServer_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);    // TCP callback of receiving
static void TcpServer_error(void *arg, err_t err);
static err_t TcpServer_poll(void *arg, struct tcp_pcb *tpcb);
static err_t TcpServer_sent(void *arg, struct tcp_pcb *tpcb, u16_t len);
static void TcpServer_send(struct tcp_pcb *tpcb, struct TcpServer_struct *es);
static void TcpServer_connection_close(struct tcp_pcb *tpcb, struct TcpServer_struct *es);
2) Инициализацию приводил выше
Ну да, получается инициализацию выполняю в main один раз
C
1
2
3
4
5
6
7
int main(void)
{
HAL_Init();
MX_LWIP_Init();
//
TcpServer_Init();  
}
3) TcpServer_recv тоже привел выше в теме
4)
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
static err_t TcpServer_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
{
    err_t ret_err;
    struct TcpServer_struct *es;
 
    LWIP_UNUSED_ARG(arg);
    LWIP_UNUSED_ARG(err);
 
    tcp_setprio(newpcb, TCP_PRIO_MIN);                                          // Set a new pcb priority
 
    // Allocation struct mem for pcb information  control
    es = (struct TcpServer_struct *)mem_malloc(sizeof(struct TcpServer_struct));
    TcpServer_es = es;
    if (es != NULL)
    {
        es->state = ES_ACCEPTED;                                                // Rcv established
        es->tcppcb = newpcb;                                                    // This is the established pcb (pcb->state == ESTABLISHED)
        es->retries = 0;
        es->p = NULL;
 
        tcp_nagle_disable(pcb);
 
        tcp_arg(newpcb, es);                                                    // Now es is the new pcb parameters
        tcp_recv(newpcb, TcpServer_recv);                                       // Init tcp_recv() callback
        tcp_err(newpcb, TcpServer_error);                                       // Init tcp_err() callback
        tcp_poll(newpcb, TcpServer_poll, 1);                                    // Init tcp_poll callback
 
        ret_err = ERR_OK;
    }
    else
    {
        TcpServer_connection_close(newpcb, es);                                 // Close TCP link
        ret_err = ERR_MEM;                                                      // Return the error code
    }
    return ret_err;
}
Ну вот основные функции вроде привел.
Цитата Сообщение от Voland_ Посмотреть сообщение
Просто инициализация всех соединений не происходит непосредственно в Init(). И, соответственно, при открытии 1го соединения, никто не открывает следующее. Это надо делать в бесконечном цикле (стейт-машины или idle-loop'а), который и будет
Получается пробоема в том, что функция инициализации выполняется только один раз в main? Т.е. получается надо постоянно крутить функцию pcb = tcp_listen(pcb); в цикле while?
Цитата Сообщение от Voland_ Посмотреть сообщение
Копайте в сторону AJAX
С AJAX сталкивался делал HTTP на netconn, там использовал, вроде неплохо работало)

Добавлено через 2 минуты
Периодически пользуюсь этим сайтом, много информации полезной, но порой как-то не так подается информация, там и по HTT RAW есть уроки, но что-то выжать с них пока не получилось
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
25.02.2021, 09:35
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
Получается пробоема в том, что функция инициализации выполняется только один раз в main?
я считаю, да. Может это и не так - тут надо понимать, что откуда берется, и что надо сохранять (в связанный список, скорее всего) о соединении, чтобы работать конкретно с ним. В AJAX'е вы просто открываете соединение в отдельном созданном потоке, и шлете туда все что ни попадя и закрываете. То есть сделано что-то типа:
C
1
2
3
4
if (pcb = tcp_listen(pcb) {
    tcp_accept(pcb, TcpServer_accept);
    osCreateThread(... pcb, ...);
}
(написал вкратце, но смысл понятен, думаю). И в потоке вы уже общаетесь с клиентом, как и когда хотите и закрываете соединение, когда надо. В случае с noOS, вы должны сами сформировать где-то этот "массив соединений", и поллить их на предмет новых данных, и необходимости общения. Это не сложно, но требует создания своих внутренних массивов (или связанного списка, я говорил) структур, чтобы хендлить каждое соединение последовательно. В случае с RTOS это немного проще в реализации, но и требует больше внимания к архитектуре проекта вцелом.
1
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
25.02.2021, 09:47  [ТС]
Voland_,
Цитата Сообщение от Voland_ Посмотреть сообщение
Может это и не так
Да нет, это было прям в точку), добавил в while
C
1
2
3
4
5
6
7
8
9
10
      pcb = tcp_listen(pcb);                                                    // Make PCB listen for incoming connections
      if (pcb != NULL)
      {
          tcp_accept(pcb, TcpServer_accept);                                      // Set callback used for new incoming connections
      }
      else
      {
          snprintf(send_str, 50, "Can not listen pcb\r\n");
          HAL_UART_Transmit(&huart3, (uint8_t*)send_str, strlen(send_str), 100);
      }
И все заработало, спасибо), а то я думал может где какая память не выделяется, или настройки куба не правильно сделал, даже и не думал в этом направлении.
Сейчас попробую еще это все на HTTP перевести.
Я вот сначала делал на FreeRTOS и netconn, в целом проблем не возникало. Потом хотел перейти на noOS, т.е. RAW, но уже стал задумываться, а стоит ли оно того, может проще поставить OS да и крутить просто весь рабочий код мк в одной задаче, а LWIP пусть создается в другой, и крутится себе в потоках сам. Там просто другая проблема возникнет, где и сколко памяти выделить под ОС, еще кучу параметров перебирать и настраивать)
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
25.02.2021, 09:59
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
И все заработало, спасибо)
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
26.02.2021, 08:00  [ТС]
Voland_, Можете дать такой более организационный совет: есть утройство на мк, которое по большей части выпоняет свои определенные функции и процессы, но для управления его работой (передачи управляющих сигналов на мк, данных настройки и т.д.), а так же для передачи ряда параметров с датчиков и сигналов от мк к пк я приделаю туда обмен данными по TCP, ну или с большей вероятнростью HTTP. Так вот стоит выбор: RAW, NETCONN или SOCKET. С Raw все поняно, тут зависит от реализации с FreeRTOS или без ОС. Вот быбор между NETCONN и SOCKET не совсем очевиден, что предпочтительнее использовать? Ну и по FreeRTOS так же, разные мнения относительно ОС, кто-то старается избегать использование ОС, а кто-то считает, что ОС гораздо упрощает и улучшает работу программы
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
26.02.2021, 10:09
DmitryDDDD, тут я не советчик. У каждого свой подход ). Для устройств с полным циклом разработки и поддержки (то есть разработка, тестирование, тех.документация и пр.) имеет смысл использовать модульный подход и готовые open-source решения. В случае отсутствия чего-то удобного под проект, либо когда проект просто обязан быть уникальным - придется городить свой огород, протокол, и все к нему.
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
RAW, NETCONN или SOCKET
вообще не в курсе, если честно ). Для меня это практически одна суть. Хотя, скорее всего я просто не прав, посоветовать не могу. Но... имея низкий уровень понимания TCP/IP, я бы использовал API наиболее подходящий под задачу. Нет смысла лезть "ниже" (по уровням), чем вам надо.
То же самое касается и RTOS. Если Вы комфортно себя ощущаете без ОСи, и другие компоненты могут его не использовать - так и стройте алгоритм. На мой взгляд программы без ОСи заранее предсказуемы, потому что в них хоть и есть прерывания, но это все, о чем надо думать. С другой стороны - наличие ОСи позволяет думать "шире", и не строить стейт-машины абсолютно везде. Тут уж, как вам удобнее ).
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
01.03.2021, 09:49  [ТС]
Voland_, А Вы не использовали RAW HTTP? Сколько примеров нашел, там везде по-сути все делается одной строчкой
C
1
httpd_init();
И все, fsdata.c подгружаешь и сервер работает, а хотелось бы какую-то более осмысленную реализацию, чтобы можно было контролируемо подружать страницы, по типу
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ((p->len >=5) && (strncmp(p, "GET /", 5) == 0))
        {
            if ((strncmp((char const *)p,"GET /",6) == 0)||(strncmp((char const *)p,"GET /index.html", 15) == 0))
            {
                fs_open(&file, "/index.html");
                tcp_write(tpcb, (const unsigned char*)(file.data), (size_t)file.len, 1);
                fs_close(&file);
 
                snprintf(send_str, 50, "GET\r\n");
                HAL_UART_Transmit(&huart3, (uint8_t*)send_str, strlen(send_str), 100);
            }
            else if (strncmp((char const *)p,"GET /IMG/Test.png", 18) == 0)
// ...
}
Чуть покапал HAL, там забуриться можно с их кодом надолго
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
01.03.2021, 10:24
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
не использовали RAW HTTP?
Точно не помню. Скорее всего нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.03.2021, 10:24
Помогаю со студенческими работами здесь

Подскажите самый простой пример TCP клиента и TCP сервера
Подскажите пример самого простого TCP клиента и TCP сервера.

Не приходит ответ на TCP клиент андроид с TCP сервера Qt
У меня есть TCP клиент андроид и TCP сервер Qt с клиента на сервер сообщения доходят нормально. Ну а с сервера на клиент сообщения(ответы)...

Modbus TCP STM32
Здравствуйте, возникла задача реализовать Modbus TCP на STM32. Я разобрал стандартный пример TCP эхо-сервер. Можно ли на его основе...

TCP сервер stm32
Здравствуйте, пытаюсь организовать TCP сервер на stm32, уже перечитал кучу информации, поискал примеры, но ничего подходящего пока не...

аудио сигнал через TCP-IP на STM32
Всем привет ! У кого есть решения передачи аудио сигнала через TCP-IP стек на STM32. Стоит задача удаленной передачи аудио сигналов...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru