Преподаватели сетевых технологий МЦК-КТИТС Владимир Андреев и Виталий Казаров помогли студенту Егору Журавлеву решить задачу по моделированию работы продавца мороженого по дисциплине «Основы алгоритмизации и программирования». Обьединившись, вместе они решили создать мобильное приложение для учебного процесса. В статье поэтапно рассказывается, как удалось создать инструмент цифровизации образовательного процесса
![](https://habrastorage.org/getpro/habr/upload_files/8c4/7a3/1b7/8c47a31b7916a794a3866f6cff579f4c.jpg)
Шаг первый – инцидент.
Задача была следующая: «Смоделировать работу продавца мороженого, предусмотрев обработку исключений, где предлагается не менее трех видов мороженого с указанием названия и цены. Покупатель выбирает, указывает количество, оплачивает и получает сдачу». Решив задачу, я поделился впечатлениями со своими наставниками – тренерами Национальной сборной (НС) Ворлдскиллс Россия по компетенции «Структурированные кабельные системы». В ходе обсуждения и появилось желание сделать что-то полезное для учебного процесса.
Шаг второй – анализ проблематики
Разделение сетей на подсети преследует несколько целей.
Первая цель – обеспечение безопасности. В организации может быть множество устройств, с которыми работают сотрудники с разным уровнем доступа. Если все устройства будут расположены в единой подсети, есть вероятность получения случайно или, что хуже, умышленно, несанкционированного доступа к критически важной информации. В этой ситуации логично будет разделить устройства на группы по их уровню допуска, либо по принадлежности к подразделениям компании.
Вторая цель – это сохранение максимальной пропускной способности ЛВС. Дело в том, что чем больше устройств включено в единую сеть, тем большую долю от общей пропускной способности сети занимает служебный трафик: ARP-запросы, поиск DHCP-серверов, и другие широковещательные запросы. Разделение сети на менее крупные подсети позволяет контролировать широковещательный трафик. Что касается протокола IPv4, то при его использовании также целью разделения на подсети является повышение эффективности использования сравнительно небольшого адресного пространства.
![](https://habrastorage.org/getpro/habr/upload_files/9b1/005/b9e/9b1005b9e4dc4c80c263bb9351ac0055.jpeg)
На тренировках НС довольно часто мне приходилось решать задачи по основам эксплуатации компьютерных сетей, в частности, решение задач по сабнеттингу по схемам организации связи с учетом сервисов и размеров подсетей. Тренерами НС было разработано электронное пособие «Эксплуатация компьютерных сетей. Сборник задач по сабнеттингу», в котором содержатся сведения из теории с примерами, а также задачи с различными уровнями сложности.
Выдача заданий осуществлялась в «ручном» режиме путём жеребьёвки, а решение выполнялось письменно в рабочей тетради путем заполнения определенных таблиц с последующей проверкой тренером, а это и есть повод для автоматизации всего процесса и увеличения производительности в целом за счет сокращения времени на «ручные» операции.
Шаг третий – постановка задачи.
Разработать генератор задач по сабнеттингу с возможностью выбора уровня сложности, ввода решения и автоматической самопроверки в режиме «Тренировка». В режиме «Экзамен» также должен быть генератор задач по сабнеттингу с возможностью выбора уровня сложности, ввода решения, без возможности автоматической самопроверки, но с возможностью ввода ФИО, группы/номера рабочего места и отправки решения преподавателю. В меню «Теория» должны содержаться сведения из электронного пособия «Эксплуатация компьютерных сетей. Сборник задач по сабнеттингу».
Шаг четвертый – реализация.
Владея базовыми навыками программирования на C#, мы решили разработать мобильное приложение в среде Xamarin. Мобильный телефон всегда под рукой, что на наш взгляд, и позволяет применять современные подходы по автоматизации образовательных процессов в современных условиях цифровизации.
Далее мы разработали следующую структуру мобильного приложения «IP-задачник»:
![](https://habrastorage.org/getpro/habr/upload_files/3d6/317/527/3d6317527ca36d68cf7c553f40688e7e.png)
Уровень сложности определяется размером генерируемых подсетей: «Базовый» – до 256 адресов (префикс 24), «Средний» – до 65536 адресов (префикс 16), «Сложный» – до 16777216 адресов (префикс 8).
По нажатию кнопки «Сгенерировать задачу» приложение случайным образом генерирует IP-адрес сети:
for (int i = 0; i < 4; i++)
{
ip = ip << 8;
ip += (uint)rnd_ip.Next(0b00000001, 0b11111111);
IP_uint ^= ip;
}
А также случайным образом генерирует маску подсети в зависимости от уровня сложности:
if((string)spisok.SelectedItem == "Базовый") host_count = (uint)rnd.Next(3, 257);
else if ((string)spisok.SelectedItem == "Средний") host_count = (uint)rnd.Next(257, 65537);
else host_count = (uint)rnd.Next(65538, 16777217);
mask = mask << (byte)Math.Ceiling(Math.Log(host_count, 2));
Случайно сгенерированный адрес не обязательно является адресом подсети, поэтому полученный адрес побитово умножается на маску подсети:
correct_start_ip = mask & IP_uint;
После чего происходит генерация текста задания, и пользователь может ввести свое решение в соответствующие поля:
![](https://habrastorage.org/getpro/habr/upload_files/ec6/af6/573/ec6af657313e1c4acc080a18eb68541b.png)
Для того, чтобы проверить ответ, выполняется решение предложенной пользователю задачи, и полученные значения сравниваются с введёнными.
Широковещательный адрес вычисляется при помощи дизъюнкции адреса сети и инвертированной маски подсети, что переводит все биты, относящиеся к хостовой части IP-адреса, в состояние «1». Остаётся только разбить результат на октеты и сравнить с введёнными значениями. Разбитие на октеты позволяет также вывести правильный ответ в случае, если пользователь ошибся:
uint bcast = 0;
bcast = correct_start_ip | (~mask);
tmpip = bcast;
for (int i = 3; i >= 0; i--)
{
output10[i] = Convert.ToByte(tmpip & 0b11111111);
tmpip = tmpip >> 8;
}
user_array = bcast_entry.Text.Split('.');
for (int i = 0; i < 4; i++)
{
if (Convert.ToInt32(user_array[i]) != output10[i])
{
bcast_entry.TextColor = Color.Red;
correct_bcast.Text = $"Правильный ответ: {output10[0]}.{output10[1]}.{output10[2]}.{output10[3]}";
correct_bcast.IsVisible = true;
break;
}
else bcast_entry.TextColor = Color.Green;
}
Первый адрес для хоста будет первым адресом после адреса подсети, а последним адресом для хоста будет адрес перед широковещательным адресом.:
// Первый адрес хоста
tmpip = correct_start_ip + 1;
for (int i = 3; i >= 0; i--)
{
output10[i] = Convert.ToByte(tmpip & 0b11111111);
tmpip = tmpip >> 8;
}
user_array = first_ip_entry.Text.Split('.');
for (int i = 0; i < 4; i++)
{
if (Convert.ToInt32(user_array[i]) == output10[i]) first_ip_entry.TextColor = Color.Green;
else
{
first_ip_entry.TextColor = Color.Red;
correct_first.Text = $"Правильный ответ: {output10[0]}.{output10[1]}.{output10[2]}.{output10[3]}";
correct_first.IsVisible = true;
break;
}
}
// Последний адрес хоста
tmpip = bcast - 1;
for (int i = 3; i >= 0; i--)
{
output10[i] = Convert.ToByte(tmpip & 0b11111111);
tmpip = tmpip >> 8;
}
user_array = last_adr_entry.Text.Split('.');
for (int i = 0; i < 4; i++)
{
if (Convert.ToInt32(user_array[i]) != output10[i])
{
last_adr_entry.TextColor = Color.Red;
correct_last.Text = $"Правильный ответ: {output10[0]}.{output10[1]}.{output10[2]}.{output10[3]}";
correct_last.IsVisible = true;
break;
}
else last_adr_entry.TextColor = Color.Green;
}
Маска подсети уже рассчитана при генерации задачи, поэтому её остаётся только так же разбить на октеты и сравнить с вводом пользователя.
// Маска подсети
tmpip = mask;
for (int i = 3; i >= 0; i--)
{
output10[i] = Convert.ToByte(tmpip & 0b11111111);
tmpip = tmpip >> 8;
}
user_array = mask_entry.Text.Split('.');
for (int i = 0; i < 4; i++)
{
if (Convert.ToInt32(user_array[i]) != output10[i])
{
mask_entry.TextColor = Color.Red;
correct_mask.Text = $"Правильный ответ: {output10[0]}.{output10[1]}.{output10[2]}.{output10[3]}";
correct_mask.IsVisible = true;
break;
}
else mask_entry.TextColor = Color.Green;
}
В режиме «Тренировка» пользователь генерирует для себя задачи, решает их, и тут же проверяет. В режиме «Экзамен» – пользователь может только отправить сгенерированную задачу и свой ответ преподавателю при помощи стандартной функции «Поделиться».
Шаг пятый – апробация и тестирование.
Первичная апробация сборника задач была проведена в период тренировок Национальной сборной Ворлдскиллс Россия по компетенции «Информационные кабельные сети». Последующие апробации были проведены во время проведения финала Х Национального чемпионата «Молодые профессионалы» 9-11 сентября 2022 г., по компетенции «Информационные кабельные сети», а также на Четвертом отраслевом чемпионате в сфере информационных технологий DigitalSkills 2022 21-24 сентября 2022 г., по компетенции «Структурированные кабельные системы».
По результатам успешных апробаций получены положительные отзывы и рекомендации от экспертов профессионального сообщества по компетенции «Структурированные кабельные системы» для внедрения в образовательный процесс в СПО и ВПО, а также для подготовки участников и экспертов к чемпионатам Worldskills в сфере информационных и коммуникационных технологий.
![](https://habrastorage.org/getpro/habr/upload_files/91c/e22/d0f/91ce22d0fd7e6fd1b46a4038b237b8f1.png)
Шаг шестой – цифровизация для всех.
При составлении электронного методического пособия авторы стремились:
Дать достаточное количество упражнений для получения навыков решения типовых задач.
Дать задачи, способствующие уяснению основных понятий и их взаимной связи.
Дать задачи, дополняющие лекционные курсы и содействующие расширению кругозора обучающихся в сфере сетевых технологий.
Разработанное нами мобильное приложение стало лучшим дополнением к электронному учебно-методическому пособию и дополнительным современным инструментом цифровизации образовательного процесса.
Кстати, если интересно, приложение доступно по ссылке.