Тема Т3-N7 - "Передача данных с уведомлением о доставке".

 

Выполнил: студент группы № 1110 Соколов Н.А.

 

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

2. Экспериментальная часть. Разработка и экспериментальное исследование программной модели канала передачи данных.

2.1. Разработка и описание блок-схемы алгоритма модели.

2.2. Разработка программных модулей передачи и приема сообщений канального уровня

 

1.4. Построение итоговой иерархической модели узлов сети (в соответствии с концепцией OSI).


Рис.8. Итоговая иерархическая модель узлов сети (в соответствии с концепцией OSI)

 

Модель OSI описывает схему взаимодействия сетевых объектов, определяет перечень задач и правила передачи данных. В эталонной модели OSI отдельные уровни взаимодействуют друг с другом посредством четко определенных интерфейсов. На каждом уровне реализуется определенное количество базовых функций при помощи набора функций, определенных в эталонной модели OSI нижележащего уровня. Каждый уровень предоставляет набор услуг находящемуся над ним уровню, причем на вышележащем уровне неизвестны детали реализации услуг, предоставляемых нижележащим уровнем.

Рассмотрим данную модель применимо к разрабатываемой радиосистеме и решаемым ею задач (Рис.8). 

В силу относительной несложности разрабатываемой радиосистемы, три верхних уровня классической модели OSI – прикладной, представительский и сеансовый – объединим в один уровень, являющийся интеллектуальным центром системы. На данном уровне на основе данных информационной системы и данных, полученных с нижнего уровня, будут приниматься все решения в системе. Поэтому данный уровень назовем уровнем «управления». Задача этого уровня – это анализ полученных с нижних уровней, данных,  на его основании принимается решение о дальнейших действиях системы. Решения о функционировании сети принимаются исходя из служебных сообщений, а также на основе сценариев взаимодействия терминалов, прописанных в программном обеспечении  терминалов.

Следующий уровень в иерархии  - транспортный. Он обеспечивает надежный механизм обмена данными, контролирует отсутствие ошибок в принимаемых данных, расположение пакетов в соответствующем порядке, их полноту. В разрабатываемой системе канальный уровень выполняет все перечисленные функции транспортного уровня. Поэтому в наличие отдельного транспортного уровня нет необходимости.

        Далее в структуре OSI следует сетевой уровень. Но в разрабатываемой модели он отсутствует, поскольку нет соединения с другими сетями.

Моя модель узлов сети будет состоять из трёх уровней: физического, канального и уровня управления.

Физический уровень:

- организация физических каналов;

- радиоизмерения;

- безошибочный приём/передача сообщений;

- синхронизация терминалов.

 

Канальный уровень:

- адресная доставка сообщений;

- контроль за наличием ошибок (ARQ, CRC-16);

- доступ к физическим каналам (CSMA/CA);

- формирование/расформирование сообщений.

 

Уровень управления:

- управление мощностью передачи;

- формирование временной структуры работы терминалов.


2. Экспериментальная часть. Разработка и экспериментальное исследование программной модели канала передачи данных.

2.1. Разработка и описание блок-схемы алгоритма модели.




            Рис.9. Блок-схема алгоритма передачи данных с уведомлением.

 

Программа начинает работу с того, что передается трафик сообщения.

Т1- передатчик (Master), Т2 – приемник (Slave).

На 1-ой части блок-схемы (Рис.9) до пунктирной линии описана работа Т1 – как передатчика, а после пунктирной линии Т2 – как приемника.

На 2-ой части блок-схемы (Рис.9) до пунктирной линии описана работа Т1 – как приемника, а после пунктирной линии Т2 – как передатчика.

 

1)      Т1 формирует сообщение УУ (здесь содержится поле для управления мощностью);

2)      Т1 формирует сообщение  КУ (определяются адреса мастера и слейва, определяется количество передаваемых сообщений);

3)      Т1 формирует сообщение ФУ (здесь содержится частотная и тактовая синхронизация)

4)      Затем Т1 отправляет сообщение по КС.

5)      Т2, получив сообщение от Т1, проводит радиоизмерение и передает Т2 корректировку мощности (на блок-схеме ссылка (1)).

После радиоизмерений Т2 осуществляет синхронизацию.

Если синхронизация прошла не успешно, происходит прекращение передачи информации.

Если синхронизация прошла успешно, Т2 производит демодуляцию/декодирование сообщения.

6)      Затем при помощи ARQ – запроса происходит обнаружение ошибок  Т2 (слейвом).

Если есть ошибки, то осуществляется запрос на повторную передачу (на блок-схеме ссылка (2)).

Если нет ошибок, то терминалом Т2 извлекается информация об адресе получателя,

производится извлечение мультимедиа и формируется сообщение об успешном приеме (на блок-схеме ссылка (3)).

 

 


2.2. Разработка программных модулей передачи и приема сообщений канального уровня.

 

В начале программы происходит инициализация параметров, которая осуществляется функцией: finction set = init(). Здесь описывается файлы для чтения и записи, частота дискретизации, длина сообщения УУ трафика и управления мощностью, длина сообщения КУ трафика и управления мощностью без учета поля CRC, задаются параметры CRC.

%инициализация параметров

st = init();

 

Далее считывается мультимедийный файл, выделяется моноканал и присваиваются адреса мастеру и слейву.

% чтение wav файла

media=wavread(st.FileNameRead,'native');

% выделение моноканала

media=media(:,1)';

 

% адреса мастера и слейва

Add_rec_m = [1 0 0 0 1];

Add_rec_s = [0 1 1 1 0];

 

Затем мультимедийный фрагмент (или его часть) переводится из шестнадцатиричного - int16 в десятичный - double (function data_double=int16_2_double(data_int16)).

А затем из десятичного - double в  двоичный – binary (function b= my_de2bi(d, msbflag, n)).

 

% перевод типа данных int16 в двоичный

data_double=int16_2_double(media(1:100000)); %участок медиа

%data_double=int16_2_double(media);% весь медиа

% задается массив, куда будет записываться сообщение на выходе

media_rx=[];

 

Далее определяется количество передаваемых кадров сообщения и начинает работать цикл, до тех пор, пока все кадры не будут успешно переданы.

% количество передаваемых кадров

N=floor(length(data_double)/st.Len_traf);

 

for i=1:N

ARQ_cont_rx=1;

 

Для формирования сообщения УУ мастером заполняем поле управления мощностью передачи слейва.

% последовательность управления мощностью передачи слейва   

Contr_pow = ones (1,16);  

 

Для формирования сообщения УУ мастером выделяем сообщение трафика (пакет)

% выделение сообщения трафика из мультимедиа потока

L3_traf=data_double((i-1)*st.Len_traf+1:i*st.Len_traf);

 

И формируем сообщение УУ мастера

% формирование сообщения уровня управления мастера

mes_L3=[Contr_pow L3_traf];

 

Далее начинается работа ARQ-запроса и начинает формироваться пакет трафика.

while  (ARQ_cont_rx==1)

 

disp('шаг:')

disp(i)

disp('из')

disp(N)

 

Для формирования мастером сообщения канального уровня определяем номер пакета трафика

 % определения номера пакета (перевод из десятичной в двоичную (function b= my_de2bi(d, msbflag, n)

Number_packet=my_de2bi( mod(i-1,16),'left_msb',4);

 

Далее мастер формирует сообщение КУ (function  msg_Lev2 = My_transmiter_master (Add_rec, Number_packet, mes_L3), которое включает в себя: адрес получателя, номер пакета и сообщение УУ, также добавляется циклический избыточный код CRC-16.

% формирование мастером сообщения КУ   

msg_Lev2 = My_transmiter_master(Add_rec_m, Number_packet, mes_L3);

 

Теперь производим наложение случайной ошибки (помехи) для проверки работы ARQ.

% наложение случайной ошибки для проверки работы ARQ

pom=rand>0.5;%pom = 0 нет ошибок,

 

rx_mes_L2=msg_Lev2+[zeros(1,972) pom];

 

Далее слейв производит расформирование сообщения КУ (function [Add_rec_rx, Number_packet_rx, rx_mes_L3,  detect] = My_receiver_slave (rx_mes_L2))

% расформирование слейвом сообщения КУ

[Add_rec_m_rx, Number_packet_rx, rx_mes_L3, error_slave] = My_receiver_slave (rx_mes_L2);

% формирование подтверждения/запроса на повторную передачу

disp('получено сообщение номер')

disp(Number_packet_rx)

 

if (error_slave == 0)

    ARQ_cont = 0;

      disp('в нем нет ошибок')

    % извлечение сообщения управления мощностью передачи слейва

    Contr_pow_rx = rx_mes_L3(1:16);

    % выделение собщения трафика

    rx_L3_traf=rx_mes_L3(17:st.Len_traf+16);

else

    ARQ_cont = 1;

    disp('в нем есть ошибки: запрос на повторную передачу')

 

end

 

Теперь слейв формирует сообщение УУ управления мощностью передачи мастера

% последовательность управления мощностью передачи мастера   

Contr_pow_s = ones (1,16);

% формирование сообщения уровня управления

 

mes_L3_s= [Contr_pow_s zeros(1,50)];%%%%

 

Далее слейв формирует сообщение КУ управления мощностью передачи мастера

% формирование слейвом сообщения КУ (function  msg_Lev2 = My_transmiter_slave (Add_rec, Number_packet, ARQ_m, mes_L3)). Сюда входит: адрес слейва, номер пакета, признак ARQ (1-естьошибки, 0-нет ошибок), сообщение УУ, также добавляется циклический избыточный код CRC-16.    

 

msg_Lev2_s = My_transmiter_slave (Add_rec_s, Number_packet_rx, ARQ_cont, mes_L3_s);

 

Далее производится наложение случайной ошибки для проверки работы ARQ. Возьмем случай, когда ошибок нет.

% наложение случайной ошибки для проверки работы ARQ

pom=0;%rand>0.5;

 

rx_mes_L2_s=msg_Lev2_s+[zeros(1,91) 0];

 

Далее мастер производит расформирование сообщения канального уровня

 (function [Add_rec_rx, Number_packet_rx, ARQ_m, rx_mes_L3, detect] = My_receiver_master (rx_mes_L2))

 

% расформирование мастером сообщения КУ

[Add_rec_rx_s, Number_packet_rx_s, ARQ_cont_rx, rx_mes_L3_s, error_master] = My_receiver_master (rx_mes_L2_s);

 

% формирование подтверждения/запроса на повторную передачу

if (error_master == 0)

    disp('в сообщении управления нет ошибок')

    % извлечение сообщения управления мощностью передачи слейва

    Contr_pow_rx = rx_mes_L3_s(1:16);

else

    disp('в сообщении управления есть ошибки')

    error('прекращение сеанса передачи данных')

end

 

 

end

 

Далее формируется поток трафика

% формирование потока трафика

media_rx=[media_rx rx_L3_traf];

 

end

 

Потом происходит перевод сообщения трафика из двоичного в int16(function data_int16=double_2_int16(data_double)

 

%перевод из двоичного в int16

media_int16=double_2_int16(media_rx);

 

И трафик записывается в выходной файл: fraza1_add_noise.wav

% запись wav файла   

wavwrite(media_int16,st.Fs,st.FileNameWrite)

 


function set = init()

 

% название файла для чтения

set.FileNameRead='fraza1111.wav';

% частота дискретизации

set.Fs=44100;

% название файла для записи

set.FileNameWrite='fraza1_add_noise.wav';

% параметры модели

 

% длина сообщения УУ

set.Len_traf=932;

set.Len_cont=50;

 

% длина сообщения КУ без учета поля CRC

set.length_msg_Lev2_traf = 973-16;%

set.length_msg_Lev2_cont = 92-16;%

 

% Параметры CRC

set.poly=[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0];

[set.x, set.y]=size(set.poly);

 

end

 

**************************

function data_double=int16_2_double(data_int16)

% Функция, отвечающая за преобразование данных типа int16 в double, а также

% за преобразование десятичного формата данных в двоичный

out_bin=[];

 

for ii=1:length(data_int16)

    sample=data_int16(ii);

if sample>0

        znak=0;

    else

         znak=1;

end

   sample_bin=de2bi(abs(sample),15,'left-msb');

   sample_bin_znak=[znak sample_bin];

  

   out_bin=[out_bin sample_bin_znak];   

end

 

data_double=double(out_bin);

end

 

data_int16=out_sample_int16;

 

end

**************************

function b= my_de2bi(d, msbflag, n)

 

% Эта функция отвечает за преобразование десятичного формата данных в двоичный.

%This is the function to convert decimal to binary. here b is the binary

%output where non-negative decimal vector d is the input data. Each row of

%the binary matrix b is corresponds to the one element of d. The first

%element in the row of b signifies LSB. If d is the matrix rather than row

%and coulmn vector then, convert to coulmn vector.

 

% here two optional parameter i am using msbflag and n. msbflag determines

% the output orientation, it has two possible values right_msb and

% left_msb. if the left_msb id given then the orientation of the bits are

% just flip i.e. display the msb to the left and right_msb is for the default.

% n defines how many digits(coulmn) are output.

 

%santosh shah, The LNM IIT Jaipur (India)(santosh.jnt@gmail.com) 23/04/07

 

%process for decibel to binary conversion

 

if nargin < 2

    msbflag = 'right_msb';

end % by default msb bit is at the right side

 

% Convert d to column if necessary

d = d(:);

 

% Find minimum number of digits needed to represent the input. If n is

% specified, use it but only if its >= the required minimum; otherwise

% raise an error.

nmax = ceil(log2(max(d)));

if (nargin < 3)

    n = nmax;

elseif n < nmax

    error('Specified number of columns in output matrix is too small.');

end

 

%checking wheter d is integer or not.

if ~all(d == floor(d))

    error('messege data should be a +ve integer.');

end

 

%allocating space for output data

b = zeros(length(d),n) ;

 

% Convert to binary. Loop over the entries of d, and for each entry, first

% get the lsb, and then keep right shifting by dividing by 2 until the

% number is zero.

for k = 1:length(d)

    x = d(k);

    l = 1;      % Indicates the bit we are currently looking at

   

    while x > 0

       

        % Extract lsb, shift x to the right and update index

        b(k, l) = bitand(x, 1);

        x = floor(x / 2);

        l = l + 1;

    end

end

 

%checking the condition of msbflags

switch(msbflag)

    case 'left_msb'

        b = fliplr(b);

    case 'right_msb'

        %leave as same

    otherwise

        error('Invalid value of MSBFLAG');

end

 

*************************************

 

function data_int16=double_2_int16(data_double)

% Функция, отвечающая за преобразование данных типа double в int16, а также

% за преобразование двоичного формата данных в десятичный

out_sample_int16=[];

out_bin=int16(data_double);

 

for ii=1:floor(length(out_bin)/16)

    sample_bin_r=out_bin(16*(ii-1)+1:16*(ii-1)+16);

       if sample_bin_r(1)==0

        znak=1;

    else

        znak=-1;

    end

   

   sample_in16_r=bi2de(sample_bin_r(2:16),'left-msb');

  

   sample_in16_r_znak=znak*sample_in16_r;

  

   out_sample_int16=[out_sample_int16 sample_in16_r_znak];

  

end

 

***************************

 

 

function d = my_bi2de(b, msbflag)

 

%now i need to convert bit vector into decimal numbers. so my_bi2de is the

%function for that, d is the output decimal number, b is the binary vector,

%and msbflag is unlike my_de2bi function to check the msb position.

 

%santosh shah, The LNM IIT Jaipur (India)(santosh.jnt@gmail.com) 23/04/07

 

if nargin < 2 % by default msb bit is at the right side

    msbflag = 'right_msb';

end

 

%checking the matrix containt wheter it has 1's or 0's or not.

if ~all(all(b==1 | b==0))

    error('matrix containt can not be other than 1 and 0');

end

 

%now i am going to check the matrix dimention

 

[nrow ncol] = size(b);

%computing decimal number

[nrows ncols] = size(b);

d = zeros(nrows, 1);

power_two = 2 .^ [0:ncols-1]; % computing in the form [1 2 4 8]

 

%checking the condition of msbflags

switch(msbflag)

    case 'left_msb'

        b = fliplr(b);

    case 'right_msb'

        %leave as same

    otherwise

        error('Invalid value of MSBFLAG');

end

d = b * power_two';   

 

**********************

 

function [Add_rec_rx, Number_packet_rx, ARQ_m, rx_mes_L3, detect] = My_receiver_master (rx_mes_L2)

st = init();

% расформирование сообщения КУ слейва

[q r]=deconv(rx_mes_L2,st.poly);

%проверка остатка

   r=mod(abs(r),2);

   if r == zeros(1,length(rx_mes_L2))

        detect=0;% ошибок нет

   else

        detect=1;% обнаружены ошибки

   end

  

Add_rec_rx=rx_mes_L2(1:5);

Number_packet_rx=rx_mes_L2(6:9);

ARQ_m=rx_mes_L2(10);

rx_mes_L3=rx_mes_L2(11:st.length_msg_Lev2_cont);

 

end

**********************

function [Add_rec_rx, Number_packet_rx, rx_mes_L3,  detect] = My_receiver_slave (rx_mes_L2)

% расформирование сообщения КУ мастера

st = init();

 

[q r]=deconv(rx_mes_L2,st.poly);

%проверка остатка

   r=mod(abs(r),2);

   if r == zeros(1,length(rx_mes_L2))

        detect=0;% ошибок нет

   else

        detect=1;% обнаружены ошибки

   end

  

Add_rec_rx=rx_mes_L2(1:5);

Number_packet_rx=rx_mes_L2(6:9);

rx_mes_L3=rx_mes_L2(10:st.length_msg_Lev2_traf);

end

*************************

function  msg_Lev2 = My_transmiter_master (Add_rec, Number_packet, mes_L3)

% формирование сообщения КУ Мастера

st = init();

 

% ================== Канальный уровень ================================

msg_Lev2 = [Add_rec Number_packet mes_L3];

 

% получение CRC кода

m = [msg_Lev2 zeros(1,st.y-1)]; %вставка нулей в поле CRC

[q r] = deconv(m,st.poly); % поиск частного и остатка от деления

%информационной части на порождающий полином CRC кода

r = mod(abs(r),2);

CRC = r(st.length_msg_Lev2_traf + 1:end);%расчет CRC

% сборка сообщения

msg_Lev2 = [msg_Lev2 CRC];

 

end

***************

function  msg_Lev2 = My_transmiter_slave (Add_rec, Number_packet, ARQ_m, mes_L3)

% формирование сообщения КУ слейва

st = init();

 

% ================== Канальный уровень ================================

msg_Lev2 = [Add_rec Number_packet ARQ_m mes_L3];

 

% получение CRC кода

m = [msg_Lev2 zeros(1,st.y-1)]; %вставка нулей в поле CRC

[q r] = deconv(m,st.poly); % поиск частного и остатка от деления

%информационной части на порождающий полином CRC кода

r = mod(abs(r),2);

CRC = r(st.length_msg_Lev2_cont + 1:end);%расчет CRC

% сборка сообщения

msg_Lev2 = [msg_Lev2 CRC];

 

end

**********************

 

 Используемая литература:

 

1. Скляр Б. Цифровая связь. Теоретические основы и практическое применение. М.: Вильямс, 2003г.

2. Бакке А.В.   «Лекции по курсу ССПО»

3. Основы построения беспроводных сетей стандарта 802.11: методические указания к лабораторной работе / Рязан. гос. радиотехн. ун-т; сост.: А.В. Бакке. -Рязань, 2008. -52 с.

4. http://omoled.ru/publications/view/406