Тема
Т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 (
%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 (
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 с.