Стенд за тестване на безжична мрежа на Linux

Пиша тестова платформа за Linux за безжични сензорни мрежи. Основната цел е да се тества трансферът на данни между всеки два възела. Мрежата работи с помощта на дървовидна топология. Един възел в мрежата е "Драйвер". Този възел е свързан чрез сериен порт към компютър с Linux. Това, което се опитвам да напиша, е софтуерът на този компютър с Linux, който ще управлява трансфера на данни в мрежата.

Възелът "Драйвер", приемайки команди от софтуера, работещ на компютър с Linux, ще изпрати съобщение за искане на данни до възел на подател. Изпращащият възел ще анализира съобщението за заявка на данни и ще започне прехвърлянето на данни към „Драйвера“. Могат да съществуват множество такива податели. Всички трансфери на данни са от подателите към възела „Драйвер“. Възелът "Драйвер" предава всички данни, които получава, към приложението на linux. Приложението за Linux следи колко пакета са получени от различните податели.

Следват изискванията.

  1. Всеки възел в мрежата може да бъде драйвер (дестинация) и всеки възел може да бъде подател.
  2. Във всеки един момент може да има множество податели, които изпращат данни към възела „Драйвер“.
  3. Данните, получени от сериен порт и изпратени чрез сериен порт от приложението на linux, се записват във файл.
  4. Приложението за Linux трябва да може да чете съобщения за искане на данни от файл и да ги изпраща в определени моменти.
  5. GUI за това Linux приложение. Целият код с е на C, така че изборът на GUI ще трябва да се постави добре с C.

Един последен обрат: данните от изпращача до „водача“ са фрагментирани данни. От страна на изпращача фрагментацията се обработва в самото устройство. От страна на "Драйвер" фрагментирането ще се обработва в приложението за Linux. Така че приложението на linux ще трябва да следи прозореца за фрагментиране и да изпраща потвърждение на фрагмента за всяко прехвърляне на данни, което се извършва с множество податели, и да следи броя на пакетите, получени досега от всеки подател.

И така, в приложението за linux, начинът да има няколко нишки - една нишка за всеки изпращач? Ще работят ли добре няколко нишки с един сериен порт за изпращане и получаване едновременно?

Ще бъдат оценени съвети относно всяко изискване. Основната идея е да се тества прехвърлянето на данни, особено събирането на данни (няколко възела, изпращащи данни към един възел). Ако се предложи подход, различен от описания по-горе, аз съм повече от добре дошъл да ги чуя.

Благодаря много

Джеймс


person Community    schedule 08.06.2009    source източник
comment
Може да помогне, ако опишете интерфейса за четене/запис във вашата сензорна мрежа. Базиран ли е на сокет или има някакъв драйвер на устройство с dev файлове и ioctl извиквания?   -  person bmdhacks    schedule 09.06.2009


Отговори (2)


И така, в приложението за linux, начинът да имате множество нишки - една нишка за всеки подател?
Ще работят ли много нишки добре с един сериен порт за изпращане и получаване едновременно?

Искате само един четец/подател да чете/записва на серийния порт. Когато вашето приложение блокира при извеждане, вие ще искате неблокиращ I/O на порта, за да можете да отговаряте на получените символи и да обработвате заявки за UI. Също така, при четене ще искате да съберете пълен набор от данни в пълен пакет. Това може да отнеме няколко четения, докато получите пълен „пакет“.

Ако вашият GUI избор е X, можете да добавите манипулатор на събития за четене и запис на серийния порт с XtAppAddInput().

person codeDr    schedule 09.06.2009
comment
Благодаря. За неблокиращ I/O, за обработка на четене и запис select() би бил добър избор? - person ; 11.06.2009
comment
Мисля за малко по-различно изискване. Искам да стартирам всички възли на един компютър. Софтуерът трябва да управлява цялата мрежа. Мрежата ще има множество драйвери и изпращачи. Един възел обаче не може да бъде едновременно драйвер и подател. Подателят ще разговаря само с един водач наведнъж. Мисля да имам един процес, който чете данни от всички серийни портове. Мисля, че мога да използвам select() за неблокиране на I/O и четене/запис от/на няколко серийни порта. Сега как да стартирам всеки драйвер? По-добре ли е всеки драйвер да е процес или нишка? Имате ли предвид друга различна архитектура? - person ; 11.06.2009
comment
За всеки процес, управляващ повече от един файлов дескриптор, който искате да използвате select() или poll(), за да разберете кой файлов дескриптор е готов за обработка. Не съм сигурен как изглежда системата, но може да е по-лесно да управлявате драйверите като процеси, които стартирате/спирате, ако е необходимо. - person codeDr; 13.06.2009

Това е по-малко въпрос и по-скоро непълна спецификация за пълен софтуерен пакет. Въпреки това ще направя всичко възможно да ви помогна тук.

Относно единични срещу многопоточни: със сигурност можете да напишете това в една нишка. При този подход вероятно просто ще запазите състоянието на фрагмента в структура от данни и ще използвате poll() за четене от всички сензори и сериен порт. Ако сте избрали многонишковия подход, вероятно искате да обвиете достъпа си до сериен порт (и всички други споделени ресурси) в mutex, използвайки pthreads.

Да, така че не виждам други въпроси, които задавате тук. Какво точно търсите допълнително?

person bmdhacks    schedule 08.06.2009
comment
Благодаря. Мисля, че многонишковостта е ненужна. Би било добра идея да запазите целия софтуер като един процес или серийното четене и запис да е един процес, който комуникира със серийния порт за четене и запис и поддържа буфер/опашка за същия и различен процес за обработка на фрагментация и данни получени. Също така имам структура от данни за съхраняване на състоянието на фрагмента. Предполагам, че за множество податели мога да използвам масив от тази структура от данни. - person ; 11.06.2009
comment
Мисля за малко по-различно изискване. Искам да стартирам всички възли на един компютър. Софтуерът трябва да управлява цялата мрежа. Мрежата ще има множество драйвери и изпращачи. Един възел обаче не може да бъде едновременно драйвер и подател. Подателят ще разговаря само с един водач наведнъж. Мисля да имам един процес, който чете данни от всички серийни портове. Мисля, че мога да използвам select() за неблокиране на I/O и четене/запис от/на няколко серийни порта. Сега как да стартирам всеки драйвер? По-добре ли е всеки драйвер да е процес или нишка? Имате ли предвид друга различна архитектура? - person ; 11.06.2009