Russian Qt Forum
Сентябрь 25, 2018, 11:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QT и LWIP  (Прочитано 1441 раз)
Harlon
Новичок

Offline Offline

Сообщений: 39


Просмотр профиля
« : Май 16, 2018, 21:18 »

Суть вопроса вот в чем:

Есть у меня TCP сервер поднятый на микроконтроллере(bare metal) с использованием стэка LWIP, на callback (без сокетов, там всяких).

Этому серверу надо слать запросы и получать ответы, от него.

Вопрос в следующем, возможно ли средствами QT написать такой клиент, что бы общаться со столь специфическим сервером? (Примерно как PuTTY или Hercules) Помогите пожалуйста.

P.S. Возможно подскажете куда копать, если это в обще реально...
« Последнее редактирование: Май 16, 2018, 21:56 от Harlon » Записан
vic57
Чайник
*
Offline Offline

Сообщений: 77


Просмотр профиля
« Ответ #1 : Май 17, 2018, 01:28 »

если tcp стек поддерживается, почему нет?
начни с простого
http://qt-doc.ru/realizacia-klienta-s-pomoschu-klassa-qtcpsocket.html

Записан
Harlon
Новичок

Offline Offline

Сообщений: 39


Просмотр профиля
« Ответ #2 : Май 17, 2018, 10:17 »

Спасибо, за ответ, просто по моему не опытному мнению, если я упаковываю сокет, то и на сервер должен принимать сокет, а там его нету. Но это по моему неопытному мнению.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2628


Просмотр профиля
« Ответ #3 : Май 17, 2018, 12:07 »

Сокет это просто программная абстракция для "высокоуровневых" ОС.
Записан

ArchLinux x86_64 / Win10 64 bit
vic57
Чайник
*
Offline Offline

Сообщений: 77


Просмотр профиля
« Ответ #4 : Май 18, 2018, 03:42 »

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

Offline Offline

Сообщений: 39


Просмотр профиля
« Ответ #5 : Май 18, 2018, 14:55 »

Туплю страшно,

Код
C
#include <stdio.h>
#include <string.h>
 
#include "lwip/err.h"
#include "lwip/tcp.h"
#if defined (__arm__) || defined (__aarch64__)
#include "xil_printf.h"
#endif
 
int transfer_data() {
return 0;
}
 
void print_app_header()
{
xil_printf("\n\r\n\r-----lwIP TCP echo server ------\n\r");
xil_printf("TCP packets sent to port 6001 will be echoed back\n\r");
}
 
err_t recv_callback(void *arg, struct tcp_pcb *tpcb,
                              struct pbuf *p, err_t err)
{
/* do not read the packet if we are not in ESTABLISHED state */
if (!p) {
tcp_close(tpcb);
tcp_recv(tpcb, NULL);
return ERR_OK;
}
 
/* indicate that the packet has been received */
tcp_recved(tpcb, p->len);
 
/* echo back the payload */
/* in this case, we assume that the payload is < TCP_SND_BUF */
if (tcp_sndbuf(tpcb) > p->len) {
err = tcp_write(tpcb, p->payload, p->len, 1);
} else
xil_printf("no space in tcp_sndbuf\n\r");
 
/* free the received pbuf */
pbuf_free(p);
 
return ERR_OK;
}
 
err_t accept_callback(void *arg, struct tcp_pcb *newpcb, err_t err)
{
static int connection = 1;
 
/* set the receive callback for this connection */
tcp_recv(newpcb, recv_callback);
 
/* just use an integer number indicating the connection id as the
  callback argument */

tcp_arg(newpcb, (void*)(UINTPTR)connection);
 
/* increment for subsequent accepted connections */
connection++;
 
return ERR_OK;
}
 
 
int start_application()
{
struct tcp_pcb *pcb;
err_t err;
unsigned port = 7;
 
/* create new TCP PCB structure */
pcb = tcp_new();
if (!pcb) {
xil_printf("Error creating PCB. Out of Memory\n\r");
return -1;
}
 
/* bind to specified @port */
err = tcp_bind(pcb, IP_ADDR_ANY, port);
if (err != ERR_OK) {
xil_printf("Unable to bind to port %d: err = %d\n\r", port, err);
return -2;
}
 
/* we do not need any arguments to callback functions */
tcp_arg(pcb, NULL);
 
/* listen for connections */
pcb = tcp_listen(pcb);
if (!pcb) {
xil_printf("Out of memory while tcp_listen\n\r");
return -3;
}
 
/* specify callback to use for incoming connections */
tcp_accept(pcb, accept_callback);
 
xil_printf("TCP echo server started @ port %d\n\r", port);
 
return 0;
}

Это эхо-сервер написанный на Си, для начала надо послать сюда сообщение и сервер пошлет его обратно.

Вопрос вот в чем, в какую сторону мне смотреть?

Просто через socket->write() посылать строку или использовать QDataStream или ещё как-то? Просто если на эхо сервер написанный на QT, что-то отсылать оно нормально уходит, а на этот я как только не извращался, не шлет и всё. А вот Hercules нормально шлет и получает.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3945



Просмотр профиля
« Ответ #6 : Май 18, 2018, 15:03 »

Это же эхо-сервер. Ему все равно, что вы ему пришлете, он вам вернет что пришло. Улыбающийся
А вы на какой порт к нему подключаетесь?
Записан
Harlon
Новичок

Offline Offline

Сообщений: 39


Просмотр профиля
« Ответ #7 : Май 18, 2018, 15:47 »

Порт в мк можно передать любой, у меня 7. Т.е. я могу передать ему просто QString. Но вопрос через какой механизм, просто socket->write("asd") передать туда?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3945



Просмотр профиля
« Ответ #8 : Май 18, 2018, 15:58 »

Порт в мк можно передать любой, у меня 7. Т.е. я могу передать ему просто QString. Но вопрос через какой механизм, просто socket->write("asd") передать туда?
Лучше сразу делать правильно и работать с QByteArray, а в него уже можно укладывать что угодно. Лучше сразу через QDataStream. Улыбающийся
А его уже в socket->send( data );
Записан
Harlon
Новичок

Offline Offline

Сообщений: 39


Просмотр профиля
« Ответ #9 : Май 18, 2018, 16:02 »

Ок, попробую и отпишусь. Спасибо за подсказку. Ещё вопрос, что за send?
« Последнее редактирование: Май 18, 2018, 16:08 от Harlon » Записан
vic57
Чайник
*
Offline Offline

Сообщений: 77


Просмотр профиля
« Ответ #10 : Май 20, 2018, 07:00 »

так сделай самый простой клиент и проверь
http://masandilov.ru/network/guide_to_network_programming6
только порт лучше сделать > 1024, меньше вроде резервируются системой
типа 0.0.0.0:8000
Записан
vic57
Чайник
*
Offline Offline

Сообщений: 77


Просмотр профиля
« Ответ #11 : Май 20, 2018, 07:34 »

проверить ты можешь telnet
Код
Bash
telnet [host [port]]
 
Записан
Harlon
Новичок

Offline Offline

Сообщений: 39


Просмотр профиля
« Ответ #12 : Май 22, 2018, 22:35 »

Разобрался с отправкой и приемом, теперь новая проблема вылезла, посылаю я int из LWIP получаю его своей программой.
Теперь 2 варианта ответов разберу.
1) На LWIP поднят эхо-сервер, на него посылаю допусти int 5 через QBytearray, далее принимаю его так:
Код
C++ (Qt)
int q = qFromLittleEndian<int>((const uchar*)Data.constData());
qDebug() << q;
 
и в debug выводит 5, то есть всё нормально и хорошо;

2) Я на сервере LWIP инициализирую int 5, отправляю её своему клиенту на QT и вместо пяти в debug я получаю 1239765247.
Это работает не так как надо бы.

Ещё в дебаг я выводил содержимое QBytearray. И вот тут тоже интересно, когда я шлю на эхо ответ в массиве байтов выглядит как-то так "\r\x00\x00\x00" это цифра "13", а вот так выглядит int отправленный сервером во втором варианте "\x00""E\x00\x01" та же цифра "13", а вывод в программе получается такой 16794880.

Может есть идеи, каким-то другим способом разобрать строку байтов в int?
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 449


Просмотр профиля
« Ответ #13 : Май 23, 2018, 00:42 »

а инт на сервере это сколько байт и как лежат?
Записан
Harlon
Новичок

Offline Offline

Сообщений: 39


Просмотр профиля
« Ответ #14 : Май 23, 2018, 11:15 »

Вывод моего сервера:

little-endian //Это вывод функции из Википедии
Код
C
printf("%s\n", *((unsigned char *) &x) == 0 ? "big-endian" : "little-endian");
A1560 v.1 Test

-----lwIP TCP echo server ------
TCP packets sent to port 6001 will be echoed back
WARNING: Not a Marvell or TI Ethernet PHY. Please verify the initialization sequence
link speed for phy address 3: 100
Board IP: 192.168.0.103
Netmask : 255.255.255.0
Gateway : 192.168.0.1
TCP echo server started @ port 7

Из этого я так понимаю можно сделать вывод, что байты располагаются от меньшего к большему, использовал для отправки тип данных обычный short, и вот мне, что интересно стало, мой QBytearray в дебаг выводит:

Во вложении скриншот,
Пояснение:
это данные "\x00\x00\xEA%" - это пришла единица.
а это число "0", но должно быть "1".

НО меня ещё смущает "\x00\x00\xEA%", то что в конце строки "%" стоит, возможно, это связано с тем, что QBytearray переводит десятичные знаки в таблицу ASCII?
« Последнее редактирование: Май 23, 2018, 11:19 от Harlon » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.12 секунд. Запросов: 22.