| Автор |
Съобщение |
|
MidNighT_SpiRiT
Ранг: Напреднал
Регистриран на: Нед Сеп 17, 2006 12:00 pm Мнения: 450 Местоположение: Plovdiv
|
 Комуникация през TCP сокети
Колеги, налага ми се да организирам комуникация между компютър (сървър) и едно устройство с линукс. До сега нещата ставаха с предаване на XML текст през сокета, но се оказа, че устройството не е достатъчно бързо да обработва всичките щуротий и сега трябва да ползвам нещо "просто" - да организирам някакви рамки (пакети) и полета в тях, за да предам командите с данните. Мастер-а е сървъра, а устройството - подчинения. Някой има ли опит с такъв обмен? Трябва ми нещо, което е проверено, че работи - в смисъл като организация и справяне с евентуални грешки.
_________________ for(;;) DoFire();
|
| Чет Окт 20, 2011 4:38 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Комуникация през TCP сокети
Хич не се разбира какво искаш. XML парсера ли ти се бави или нещо друго? Каква "рамка" очакваш? С един XML можеш да опишеш много неща и не вярвам да има някой дето да ти отговори твърдо и решително - "ей тъй става..". Справяне с грешки? TCP-то не ти ли стига? До сега като си карал на XML кой се е справял с грешките? Направи си един тест м/у XML и JSON парсер на лункското у-во и виж дали няма да е по - бързо и да те удволетвори. Все пак с JSON-а можеш да опишеш най различни структури от данни.
|
| Чет Окт 20, 2011 8:28 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Комуникация през TCP сокети
Какво е това устройство дето търкаля линукс, а на XML се бави?
Има нещо гнило тука... освен XML-а да е голям (мегабайти?), ама то ако данните са много обработката винаги ще е бавна. Ние работим с XML-и, но нямаме проблем със скоростта, въпреки че хардуерът е доста слаб. По-скоро проблем ни е паметта и заради това трябваше да си правим сами парсването и валидирането без да ползваме рекурсивни алгоритми...
|
| Чет Окт 20, 2011 9:20 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
 Re: Комуникация през TCP сокети
Пробвай с http://en.wikipedia.org/wiki/Binary_XML или някой друг двоичен йерархичен стандарт. Щото явно ти трябва йерархия. Ако не ти трябва - въпроса е излишен.
|
| Чет Окт 20, 2011 11:35 pm |
|
 |
|
MidNighT_SpiRiT
Ранг: Напреднал
Регистриран на: Нед Сеп 17, 2006 12:00 pm Мнения: 450 Местоположение: Plovdiv
|
 Re: Комуникация през TCP сокети
За кратки съобщения няма проблеми, но в случая се предават артикули с разни атрибути(име, цена и др.), които са много - примерно при 8000 артикула един по един и чакане на отговор дали е записан в базата данни на устройството. Всичкото отнема от порядъка на 20 минути и повече. Използвам Qt. За един артикул времето е около 100ms само обработката на XML-a.
_________________ for(;;) DoFire();
|
| Пет Окт 21, 2011 11:11 am |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Комуникация през TCP сокети
значи пращаш по един XML за всеки артикул? В такъв случай 100ms е страшно много време, нещо не е както трябва  При не много сложна дефиниция, валидирането и парсване до обекти (от типа на STL) трябва да е поне 1MB/s. Нямам представа как работят Qt библиотеките, но в общия случай най-тежкото в алгоритмите е заемането на памет. Средно на 5-10 байта се прави malloc(), тъй че един отделен пул може доста да ускори нещата. Другото е какво правиш с данните, евентуално записването може да се бави, но това пък няма нищо общо с XML-а. При всички случаи те съветвам да не бягаш от XML-a. Той си се налага като стандарт за тоя сорт приложения. Ако трябва си пренапиши парсера, или поне виж как да го оптимизираш вместо да измисляш нови формати...
|
| Пет Окт 21, 2011 12:48 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Комуникация през TCP сокети
Кой от всичките ХМЛ парсери на кют ползваш? Да не си се метнал на xpath?
|
| Пет Окт 21, 2011 1:24 pm |
|
 |
|
MidNighT_SpiRiT
Ранг: Напреднал
Регистриран на: Нед Сеп 17, 2006 12:00 pm Мнения: 450 Местоположение: Plovdiv
|
 Re: Комуникация през TCP сокети
Използвам QXmlStreamReader - чрез него съм си направил прост парсер. Като гледах днес вероятно повечето време се губи от копиране на данните от едно място на друго. Примерно QTcpSocket->readAll() връща QByteArray, който трябва да го преобразувам на QString, за да пратя към QXmlStreamReader. Данните, които не са числа са кодирани base64 и трябва да ги предам към функцията, която декодира и тн. Най-големият проблем е и картинката, която пращам (също кодирана base64) с размер 40-60kB.
_________________ for(;;) DoFire();
|
| Пет Окт 21, 2011 3:00 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Комуникация през TCP сокети
Не го преобразувай до QString. На QXmlStreamReader конструктура приема и QByteArray.
|
| Пет Окт 21, 2011 4:05 pm |
|
 |
|
MidNighT_SpiRiT
Ранг: Напреднал
Регистриран на: Нед Сеп 17, 2006 12:00 pm Мнения: 450 Местоположение: Plovdiv
|
 Re: Комуникация през TCP сокети
Конструктора да, но в случая QXmlStreamReader::addData(String&) си иска само QString
_________________ for(;;) DoFire();
|
| Пет Окт 21, 2011 5:02 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Комуникация през TCP сокети
Ми не викай addData. След като си създал класа и си му задал референция към QByteArray не е нужно да викаш addData.
|
| Пет Окт 21, 2011 5:29 pm |
|
 |
|
MidNighT_SpiRiT
Ранг: Напреднал
Регистриран на: Нед Сеп 17, 2006 12:00 pm Мнения: 450 Местоположение: Plovdiv
|
 Re: Комуникация през TCP сокети
Мерси michev, въпреки, че не тръгва както би трябвало да е, т.е. да му задам девайс и да си чете от там. Ползвам пак addData(), но видях, че можело да се подава const char* указател. Процесорът е ARMG45 на 400MHz. Като цяло пак е бавно, но малко по-бързо от преди.
_________________ for(;;) DoFire();
|
| Вто Окт 25, 2011 3:04 pm |
|
|