Предыстория
Итак, хотелось бы начать свой рассказ с опыта, полученного во время обучения в дистанционном формате. Мы практически не получали знаний, многие уроки не проводились(хотя мы были этому рады). Мне было обидно за то, что дистанционное обучение внедрили как-то слишком быстро, а не постепенно. И именно поэтому не всем учителям эта идея понравилась, но куда им деваться.
Cамо обучение проходило в дискорде. Конечно, почти все дети имели представление что это такое. Но учителя нет. Большой объем труда лег на плечи нашего учителя информатики, в целях приобщения учительского состава к новой для них программе. Но он справился не со всем, и поэтому некоторые учителя просто сбрасывали нам дз(домашки было много, но зато мы в некоторые дни могли хорошо выспаться). Не все учителя не проводили занятия. Были те, кто освоился в программе и проводил занятия.
Именно в то время я стал задумываться над тем, почему еще не было создано приложение, где будет сочетаться все: и видеочат, и расписание уроков, и чат с преподавателем, короче все те максимально удобные вещи, которые бы упростили бы работу на дистанте.
Зарождение и развитие идеи
Загоревшись этой идеей я начал сканировать весь интернет. Моей главной задачей была реализация видеочата, а оболочку приложения создать будет нетрудно. В результате сканирования я понял, что люди используют несколько технологий: webRTC и уже готовые видеосервера, где надо будет только к ним подключаться и настраивать connect. Так как последнее мне показалось более скучным, то я решил прочитать про технологию webRTC.
О стандарте webRTC
Для реализации видеочата я использовал стандарт webRTC (web real time communications). WebRTC - проект с открытым исходным кодом, предназначенный для организации передачи потоковых данных между браузерами или другими поддерживающими его приложениями по технологии точка-точка. Его также называют P2P (peer too peer) соединением. В стандарте WebRTC описано, что мы можем реализовать его сами на удобных нам технологиях: rest api, websocket и другое. Для своего видеочата я использовал технологию websocket.
Для того чтобы установить прямое соединение между клиентами необходимо знать их IP-адреса. Но у нас они есть не всегда, так как не все клиенты обладают публичным статическим IP-адресом.
Большинство устройств, которые выходят в интернет, находятся за NAT (Network Address Translation – транслирует внутренние локальные IP-адреса во внешние глобальные IP-адреса). То есть устройства подключаются к роутерам, который обладает статическим публичным адресом, и он транслирует наш локальный внутренний адрес устройства во внешний публичный адрес. Нам необходимо узнать с нашего клиента наш публичный адрес. Для этого есть специальная технология STUN (Simple Traversal of UDP through NAT) – сетевой протокол, который позволяет клиенту узнать свой публичный адрес. STUN серверы есть у кампании Google, а также есть другие бесплатные серверы.
После того как мы узнаем IP-адрес, порт и другие метаданные о клиенте, мы захватываем медиаконтент, то есть видео и аудио, и отправляем эти данные через сервер сигнализации на другой клиент. Отправляем мы “Offer”, который захватывает с собой тот самый медиаконтент, и ICE candidate, который в себе несет метаданные о клиенте. После получения этих данных второй клиент проделывает те же самые операции, только вместо “Offer”, отправляет “Answer”, где также хранятся данные медиаконтента. Бывают случаи, когда WebRTC соединение установить невозможно, к примеру при использовании мобильного интернета. Тогда в дело вступает еще одна технология – TURN-сервер (Traversal Using Relay NAT – позволяет получать данные через TCP или UDP соединения). Он используется в крайнем случае как посредник, превращая P2P соединение в клиент-серверную связь. При использовании такого сервера качество картинки хуже, и в целом все медленнее работает.
Заключение
В данной статье была лишь теория. Я понимаю что это скучно, но надо знать с чем ты работаешь. В следующей статье я уже буду описывать создание самого видеочата. Пишите в комментарии ваши пожелания, мои недочеты, пишите критику, буду очень рад. Встретимся в следующей статье!