1. Построение итоговой иерархической модели узлов сети (в соответствии с концепцией OSI). В модели должны быть обязательно учтены задачи доставки как служебных, так и информационных сообщений.
Рассматриваемая система радиоуправления освещением довольно простая и для ее реализации необходимо всего 2 уровня: физический уровень и канальный уровень.
Рис.1 модель OSI.
Помимо канального и физического уровня, как показано на рисунке, в системе присутствует уровень L3 - мозг системы. На этом уровне закладываются сценарии взаимодействия терминалов с точкой доступа, анализируются принятые сообщения, выполняются команды, принимаются решения такие как: повышение уровня мощности и решение довести до пользователя информацию о неисправности светильника(часть 2).
Физический и канальный уровни выполняют транспортные функции, доводя до терминалов команды уровня L3 точки доступа и передавая в обратном порядке радиоизмерения с уровня L3 терминалов. Важен тот факт, что уровни L3, как и канальные не могут общаться непосредственно друг с другом и сообщению необходимо пройти долгий путь, постоянно преобразуясь, чтобы достичь адресата.
Канальный уровень делится на 2 подуровня:
RLC – подуровень, отвечающий за взаимодействие с уровнем L3.
MAC – службы, отвечающие за организацию сообщений канального уровня. На этом уровне, пакет поступивший с L3 уровня и поток битов с физического уровня преобразуются в кадры.
Следует отметить, что RLC подуровень способен передать сообщение на физический уровень, обойдя подуровень MAC. Это будет использоваться в радиоизмерениях, для повышения уровня мощности, если сообщение до терминала при исходных данных не доходит.
1. Разработка и описание блок-схемы алгоритма модели.
Рассмотрим передачу команды от ТД к терминалу с точки зрения программной части. Разрабатываемая модель будет содержать в себе только канальный и физический уровни, уровень L3 задействован в программе не будет. С L3 уровня точки доступа команда передается на L3 уровень терминала, проходя через канальный и физический уровни. Рассмотрим, какие операции необходимо выполнить для успешной передачи:
Поступая на канальный уровень сообщение перегруппировывается ,создавая пакет канального уровня, здесь также происходит вычисление и добавление CRC(1). Затем оно переходит на физический уровень, где кодируется с помощью БЧХ кода(127), который, вводя избыточность, расширяет его до 127 бит(2), происходит добавление дополнительного бита(3), для приведения сообщения к величине, кратной log2 позиционности модуляции BFSK, происходит модуляция cообщения(4) и переход его в канал связи, где появляется шум(5).
Рис.2. Блок-схема канала передатчика.
На приемной стороне, последовательность действий противоположная:
Поступая из канала связи(1), происходит выделение сообщения, демодуляция(2), избавление от дополнительного бита(3), декодирование БЧХ кода(4), переход сообщения на канальный уровень(5), где оно снова разбивается на блоки и поступает на уровень L3.

;
Рис. 3. Блок-схема приемника .
1. Разработка программных модулей передачи и приема сообщений канального уровня.
Реализуем
разработанную выше блок схему.
Начнем с задания
входных параметров, необходимых для построения приемо-передающего тракта:
function set =
initSettings()
%% Инициализация
основных параметров модели
% Выбор файлов для
сохранения действительной и мнимой частей сигнала
set.SignalFileName = 'signal.bin';
set.SignalFileName2 = 'signal2.bin';
% Кодировка
передаваемых символов: 2 бита на символ
set.sym_size = 2;
% Данные, входящие в
состав сообщения канального уровня:
set.adres = 2; %
адресная доставка сообщения
set.number_of_lighter = 5; %номер
светильника
% Информационная часть,
передаваемой команды:
set.yar = 50; %
яркость, которую необходимо установить;
set.red = 100; %
значение мощности для красного светодиода;
set.green = 59; %
значение мощности для зеленого светодиода;
set.blue = 43; %
значение мощности для синего светодиода;
set.dop = 6; %
номер слота для ответа и запрос телеметрии.
% Позиционность
модуляции - BFSK
set.mPos = 2;
% Параметры БЧХ кода
set.n = 127; %
размер после кодирования
set.k = 57; %
размер до кодирования
% Определение матрицы
оптимальных параметров
params = bchpoly(set.n);
% Определение
параметров кодирования
set.errocorr = params(3,3);
% Параметры CRC-12
set.poly=[1 1 0 0 0 0 0 0 0 1 1 1 1];
[set.x set.y]=size(set.poly); %размерность полинома
% переменная, равная
длине передаваемого сообщения канального уровня без
% поля контрольной
суммы
set.length_msg_Lev2 = 45;
Настроим передатчик в модуле Transmitter:
Соберем
пакет канального уровня системы.
Во-первых,
переведем входные данные в двоичную систему в соответствии с заданным в П2
размером полей:
% Перевод параметров,
передаваемых в сообщении в двоичную систему счисления
adres = my_de2bi(st.adres,'left_msb',2);
number_of_lighter = my_de2bi(st.number_of_lighter,'left_msb',8);
yar = my_de2bi(st.yar,'left_msb',8);
red = my_de2bi(st.red,'left_msb',7);
green = my_de2bi(st.green,'left_msb',7);
blue = my_de2bi(st.blue,'left_msb',7);
dop = my_de2bi(st.dop,'left_msb',6);
Во-вторых вычислим CRC:
% получение CRC кода
m=[msg zeros(1,st.y-1)]; %
вставка нулей в поле CRC
% Поиск частного и
остатка от деления информационной части
% на порождающий
полином CRC кода
[q r] = deconv(m,st.poly);
r = mod(abs(r),2);
CRC = r(st.length_msg_Lev2 + 1:end);%расчет CRC
И наконец, соберем пакет канального уровня:
% сборка сообщения канального уровня
msg = [adres number_of_lighter yar red green blue
dop];
% окончательная сборка
сообщения канального уровня
msg = [msg CRC];
Далее сообщение поступает на физический
уровень, где кодируется, передается по каналу связи и поступает на физический
уровень приемника. Подробное описание будет приведено в 4 Части.
Перейдем к канальному уровню приемника в
модуле Receiver:
Сообщение поступает с
физического уровня на канальный, где происходят следующие действия:
Сначала осуществляется
вычисление контрольной суммы и проверка целостности сообщения с помощью ее:
% Подготовка к
проверке CRC
[q r]=deconv(msg,st.poly);
% Проверка остатка
r = mod(abs(r),2);
if r == zeros(1,length(msg))
detect=0;%
ошибок нет
else
detect=1;% обнаружены ошибки
end;
После этой операции
сообщение канального уровня уже без СRC выглядит следующим
образом:
% Принятое сообщение
msg =
msg(1:st.length_msg_Lev2);
Далее сообщение
канального уровня разбивается на исходные блоки при этом переходя из двоичной
системы счисления в десятичную:
% Преобразование
принятых параметров в десятичную систему счисления
adres = my_bi2de(msg(1:2),'left_msb');
number_of_lighter = my_bi2de(msg(3:10),'left_msb');
yar = my_bi2de(msg(10:18),'left_msb');
red = my_bi2de(msg(19:25),'left_msb');
green = my_bi2de(msg(25:32),'left_msb');
blue = my_bi2de(msg(33:39),'left_msb');
dop = my_bi2de(msg(40:45),'left_msb');
И наконец происходит вывод полученного сообщения на монитор:
% Вывод информации на экран
R_message = [adres number_of_lighter yar red green
blue dop];
ans =
2 5 50 100 59 43 6
Как можно увидеть из этого ответа: сообщение было передано и раскодировано верно.
Используемая литература:
1. "Лекции по курсу ССПО" Бакке А.В.
2. Методическое пособие к лабораторной работе "Исследование принципов организации
канала передачи данных "
3. http://omoled.ru/publications/view/473
4. http://omoled.ru/publications/view/467
5. http://omoled.ru/publications/view/623
6.http://omoled.ru/publications/view/581