`

СПЕЦІАЛЬНІ
ПАРТНЕРИ
ПРОЕКТУ

Чи використовує ваша компанія ChatGPT в роботі?

BEST CIO

Определение наиболее профессиональных ИТ-управленцев, лидеров и экспертов в своих отраслях

Человек года

Кто внес наибольший вклад в развитие украинского ИТ-рынка.

Продукт года

Награды «Продукт года» еженедельника «Компьютерное обозрение» за наиболее выдающиеся ИТ-товары

 

Беспроводные сети Bluetooth

0 
 
Давайте вспомним то "страшное" время, когда трубка вашего телефона была намертво присоединена к базе проводом. Сколько раз у вас убегало молоко или выкипал кофе? А сколько раз вы стремительно неслись из кухни (или другого места) к надрывающемуся телефону, сбивая коленки и локти о дверные косяки? А как часто ваш аппарат падал в самый неподходящий момент на пол, увлекаемый вместе с трубкой неосторожным движением? А какой длины был ваш телефонный провод, для того чтобы аппарат можно было перенести в удобное место, которое всякий раз оказывалось другим? Ну и последний вопрос -- какой восторг вы испытывали первую неделю после появления беспроводного телефона? Да-а, говорят, что нет ничего более пьянящего, чем чувство свободы. Но ведь это всего лишь прелюдия мобильных коммуникаций. Сотовые телефоны в синергетическом альянсе с беспроводными сетевыми технологиями обещают преобразить не только способ коммуникаций, но и стиль жизни. Вы сможете обмениваться корреспонденцией и файлами из любой точки, покрываемой беспроводной сетевой инфраструктурой, будучи в деловой поездке или на отдыхе, в кабине автомобиля или салоне самолета. И технология Bluetooth, получающая все большее признание и распространение, является одним из кирпичиков того фундамента, на котором будет построено будущее сетевых технологий, которое сегодня кажется фантастическим.

Читатель будет совершенно прав, если после всего вышесказанного придет к выводу, что данной технологии посвящена тема этого номера. Мы постарались осветить ее со всех сторон. В опубликованных статьях вы найдете описание основ технологии Bluetooth, непосредственные впечатления пользователя, а также результаты в некотором смысле лабораторных работ.

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

Понять, что представляет собой технология Bluetooth, в чем ее предназначение и каковы области применения, будет проще, если для начала ознакомиться с физическим уровнем ее стека протоколов. Итак, Bluetooth основывается на радиосвязи в диапазоне частот от 2,4 до 2,4835 GHz, который является нелицензируемым в большинстве развитых стран. Чтобы удовлетворить порой жестким требованиям, выдвигаемым рядом государств, используются широкие боковые защитные полосы, предотвращающие взаимовлияние радиопередатчиков, работающих в соседних диапазонах: нижняя граница равняется 2, а верхняя -- 3,5 GHz.

По мощности передатчики разделены на три категории: 100 мВт (дальность связи 100 м), 2,5 мВт (10 м) и 1 мВт (10 см). Для первой категории, или, используя официальную терминологию, класса, предусмотрена функция регулирования мощности сигнала. Оценивая количество ошибок, обнаруженных в ходе передачи данных, взаимодействующие адаптеры "договариваются" о необходимых изменениях с помощью протокола LMP (Link Management Protocol). Далее мы остановимся на нем подробнее. Здесь же добавим, что поскольку регулирование мощности есть хотя и желательный, но необязательный элемент спецификации, то любое устройство первого класса должно быть готово вести передачу согласно нормам двух других, менее энергоемких категорий (на случай, если сигнал 100 мВт окажется чересчур сильным для близкорасположенного адаптера-приемника).

Кодирование сигнала выполняется по двухуровневой схеме GFSK (Gaussian Frequency Shift Keying), где значения 1 и 0 представлены двумя разными частотами. В общей частотной полосе выделено 79 радиоканалов шириной 1 MHz каждый. Они предназначены для скачущего переключения частот, которое является средством ухода от помех и интерференции с другими устройствами.


Стек протоколов

Беспроводные сети Bluetooth
Рис. 1
Bluetooth имеет достаточно простую структуру стека протоколов (рис. 1). Фактически спецификация определяет только 5 уровней: физический (RF), базовый (baseband, комбинация аппаратных и программных функций), протоколы управления каналом LMP и L2CAP (Logical Link Control and Adaptation Protocol), сетевой уровень и уровень приложений. Базовый уровень включает в себя функции формирования пакетов, передачи и кодирования данных, коррекции ошибок, управления каналами и частотными скачками. Протокол управления каналом LMP обеспечивает аутентификацию, инициализацию соединений и шифрование. Управляющая информация LMP упаковывается в однослотовые фреймы.

Напарник LMP -- L2CAP отвечает за процедуры формирования и сборки пакетов, которые здесь достигают внушительных размеров -- только поле полезной нагрузки для L2CAP-пакета составляет 64 KB. Логично, что L2CAP не используется в случае синхронных коммуникаций -- там нет необходимости в столь изощренном управлении. Как и LMP, L2CAP имеет свой формат пакетов для пересылки управляющей информации. Благодаря этому протоколу в Bluetooth существуют привычные для сетевых специалистов понятия пересылки данных с установлением соединения (данные направляются конкретному адресату, доставка гарантируется) и без него (широковещательная рассылка без контроля прохождения пакетов). Реализовано и туннелирование различных протоколов, для каждого из них резервируется отдельный логический канал. Венчает семейство протоколов SDP (Service Description Protocol) -- единственное средство определения сервисов, предоставляемых удаленным устройством. С помощью команд протокола можно считать информацию из локальной базы данных сервисов узла и определить способ взаимодействия с ними. Каждый сервис является производной общего класса, который определяет структуру его описания и способ ее интерпретации. Например, описание мобильного телефона будет включать в себя тип его дисплея, набор навигационных клавиш и частотный диапазон приемопередатчика.

Один из членов семейства остался в стороне -- HCI (Host Controller Interface), он отвечает за интеграцию низкоуровневых baseband-интерфейсов и клиентского программного обеспечения. HCI состоит из HCI Firmware и HCI Driver, взаимодействующих посредством Host Controller Transport Layer. HCI Firmware осуществляет вызов функций управления каналами и передачи данных, специфических для конкретного типа устройства. HCI Driver предоставляет унифицированный интерфейс для драйверов вышележащих сетевых уровней. Поскольку чип Bluetooth доступен по одному из стандартных аппаратных коммуникационных интерфейсов, Host Controller Transport Layer, согласно спецификации, поддерживает USB, UART и RS232.


Каналы и слоты

Bluetooth -- гибрид. И это не оскорбление, а точное определение физического уровня технологии, объединяющей в себе канальную и пакетную коммутацию. Обмен данными осуществляется с помощью техники Time-Division Duplex Multiple Access. Все 79 каналов функционируют на основе временных слотов длительностью 625 мкс, которые могут быть заняты каким-либо пакетом данных. Каждый пакет передается на ином канале, чем предыдущий -- это и есть пресловутые частотные "скачки" (1600 в секунду). Пакеты уровня baseband, как правило, занимают один слот, хотя потенциально разрешается формировать фреймы в пять раз больше. Помимо "демократической" формы распределения слотов (асинхронные каналы, ACL Link -- Asynchronous Connection-Less Link), существует и система квотирования, когда определенное их количество заранее отводится под трансляцию в реальном времени потоковых данных (синхронные каналы, SCO Link -- Synchronous Connection-Oriented Link). В действительности физические ресурсы ограничены и возможна поддержка или одного асинхронного канала с пропускной способностью ~781 Kbps, или трех синхронных голосовых каналов емкостью по 128 Kbps.

Здесь приведены суммарные максимальные значения пропускной способности при дуплексном обмене. Однако на деле все немного сложнее: для несимметричного асинхронного канала максимальная скорость передачи составляет всего 723,2 Kbps, при том, что для обратного направления все еще остается резерв в 57,6 Kbps. Для симметричного варианта соединения пропускная способность в обоих направлениях равна 433,9 Kbps. Синхронные каналы отличаются от асинхронных еще и тем, что первые не поддерживают механизма обнаружения и повторной передачи неверно принятых пакетов.

Соединения бывают как типа "один к одному", так и "один ко многим", при этом один из узлов должен выполнять функции мастера (master), а прочим отводится подчиненная функция (slave). Обязанности мастера сводятся к формированию канала (случайная последовательность частотных скачков, генерируемая на основе адреса устройства-мастера) и поддержке синхронной слотовой структуры. Несколько узлов, работающих на одной частоте и разделяющих общий канал, образуют пиконет (piconet). В принципе, существуют варианты сетей Bluetooth, когда некоторые узлы одной пиконет в то же время являются подчиненными или мастерами другой пиконет. Зоны действия перекрываются, общий эфирный ресурс распределяется по принципу разделения во времени -- TDM (Time-Division Multiplexing). Такая структура носит название "скаттернет" (scatternet).

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

Беспроводные сети Bluetooth
Рис. 2
Чуть выше пакеты упоминались, теперь пришло время их рассмотреть -- формат фрейма Bluetooth приведен на рис. 2а. Стандартное поле Access Code имеет длину 72 бита и в наиболее общем виде представлено на рис. 2б: оно содержит преамбулу, синхрослово и трейлер. Преамбула и синхрослово используются для синхронизации передатчика с приемником, а в целом поле Access Code может иметь различное значение в зависимости от ситуации, в которой оно было использовано. Во-первых, в варианте CAC (Channel Access Code) поле служит для идентификации и опроса узлов, принадлежащих пиконет. Код доступа формата CAC есть в составе каждого пакета, генерируемого в пиконет. С другой стороны, тип Inquire появляется в "лексиконе" узла, который пытается обнаружить все другие устройства в пределах досягаемости (General Inquire -- GIAC) или же какой-либо определенный тип устройств (Dedicated Inquire -- DIAC).

Синхрослово образуется из 24-битового адреса узла -- мастера или иного инициатора соединения (paging). Алгоритм его вычисления гарантирует достаточно большое расстояние Хемминга (Hamming distance) между сгенерированными синхропоследовательностями (это означает, что даже при декодировании принятого с ошибками слова спутать "позывные" двух устройств сложно).

Трейлер -- это своеобразная "буфер-прослойка" между Access Code и телом пакета. Он необходим для восстановления баланса постоянного тока (DC balance), поскольку на стыке разных полей часто возникают идущие подряд единицы или нули, что "сбивает с толку" приемник (теряется синхронизация).

Формат заголовка пакета представлен на рис. 2в. AM_ADDR -- это 3-битовый адрес устройства, внутренний для пиконет. В поле TYPE длиной 4 бита записывается тип пакета -- интерпретация его содержимого зависит от характера соединения (ACL или SCO). Флажок FLOW (управление потоком) сбрасывается в 0, когда буфер устройства-приемника переполнен. В ARQN текущего фрейма записывается подтверждение (1) или неподтверждение (0) успешного приема предыдущего пакета. Стробирующий бит SEQN позволяет отсеивать ошибочно повторно переданные пакеты: для каждого нового пакета данных (имеющего поле контрольной суммы) данный бит инвертируется. Поле HEC подытоживает заголовок контрольной суммой его содержимого.

Все разнообразные типы пакетов Bluetooth разбиты на четыре категории. В первую попали общие для всех разновидностей соединений типы (NULL, POLL, FHS, DM1), три другие описывают пакеты различной длины: во второй определяются однослотовые пакеты, а в четвертой -- занимающие пять временных слотов. Большинство типов пока не определены, но некоторые уже можно назвать. ID-пакеты имеют длину 68 бит и применяются для пейджинга и запросов. NULL-пакеты состоят только из полей Access Code и Header, играя роль подтверждений установления соединения или получения данных. Тип POLL аналогичен предыдущему за исключением того, что POLL-пакеты обязывают получателя ответить. Фактически так организуется обратная связь подчиненного узла с мастером.

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

Для синхронных и асинхронных соединений определены практически не пересекающиеся наборы специальных пакетов. Например, для синхронных соединений введено несколько форматов, различающихся в основном длиной поля данных и называющихся HV1, HV2 и HV3. Тип HV (High quality Voice) предназначен для ретрансляции голосовых потоков. Поле данных первого из них имеет длину 10, второго -- 20, а третьего -- 30 байт. Комбинированный вариант DV -- это пакет, предназначенный для передачи как голоса, так и данных, содержит 80 бит аудио и 150 бит данных. На самом деле обе его части обрабатываются полностью независимо, вплоть до того, что данные защищаются кодом CRC и посылаются повторно в случае повреждения в отличие от блока аудио.

Набор форматов для асинхронных соединений более разнообразен за счет введения высокоскоростного режима High rate. Пакеты DM1, DM2 и DM3 имеют общую структуру, различаясь, как и в случае асинхронных форматов, объемом полезной нагрузки. DH1, DH2 и DH3 могли бы стать их братьями-близнецами, если б не иной способ кодирования, а точнее, исключение стадии дополнения данных битами четности по алгоритму FEC 2/3 (5 бит контроля на 10 бит информации). Так что если DM1 занимает один временной слот и несет в себе 18 бит данных, то его скоростной аналог за то же время успевает "вытащить" 28, правда, с некоторым риском для их целостности.

Для большинства пакетов асинхронного формата действует механизм повторной передачи в случае ошибок. Исключением является AUX1, который, будучи аналогом пакета DH1, предназначен для аудиоданных и никогда не передается дважды.

Если углубиться еще дальше в структуру пакета Bluetooth, то мы обнаружим, что даже поле данных имеет свой заголовок, тело и поле контрольной суммы CRC. Заголовок несет в себе сведения о логических каналах и сегментации пакетов.

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

Чтобы как-то упорядочить разнообразные способы доставки управляющей и полезной информации, разработчики ввели 5 логических каналов. Канал Link Control (LC), который является высокоуровневым представлением заголовков пересланных пакетов, позволяет устанавливать низкоуровневые параметры соединения. Link Manager (LM) предназначен для обмена управляющей информацией между узлами сети пиконет. Данные канала LM кодируются пакетами DM. Каналы UA (User Asynchronous), UI (User Isochronous) и US (User Synchronous) обеспечивают пересылку асинхронных, изохронных и синхронных потоков данных посредством соответствующих типов пакетов.

Перед передачей и FEC-кодированием данные обрабатываются с помощью специального фильтра (whitening, выравнивание спектра), изменяющего образуемую нулями и единицами структуру таким образом, чтобы исключить длинные единообразные последовательности. Цель, как уже упоминалось выше, -- минимизация фактора постоянного тока (DC balance). Соответственно, на стороне приемника выполняется обратная фильтрации процедура.

Вообще, вопросы синхронизации целиком на совести ведущего устройства (master) в пиконет. Подчиненные узлы ориентируются на время появления пакетов от ведущего и уже от него отсчитывают интервалы начала передачи (625 мкс). Поскольку ведущий узел никогда не корректирует свои часы, а неустойчивая синхронизация и прочие сбои являются реальным фактором, введено окно, в течение которого ожидается приход очередного пакета. Обычно его размер составляет 20 мкс (±10 мкс), однако существуют несколько особых режимов: hold, sniff и park. Первый из них означает, что узел полностью отключается от сети, в то время как в состояниях sniff и park устройство периодически "просыпается" и прослушивает эфир, сохраняя синхронизацию с пиконет. Чтобы возобновить нормальную работу, узел должен определить фреймовую структуру соединения, поэтому на момент подключения размер поискового окна увеличивается до тех пор, пока соседние окна не начнут перекрываться (вплоть до 2500 мкс или 3750 мкс). Трюк заключается в том, что как только окна превышают длину стандартного цикла приема/передачи (2 x 625 мкс = 1250 мкс), они начинают центрироваться по середине каждого второго цикла. Если и этот барьер преодолен, то к интервалу центрирования окон добавляется еще один период приема/передачи.

Помощь узлам в сохранении синхронизации оказывает канал-"маяк" (beacon channel), или, говоря иными словами, сигнальный канал мастера: через определенные промежутки времени ведущий узел генерирует широковещательные пакеты, содержащие информацию для временно неактивных узлов (например, извещение об изменении параметров самого beacon channel). Если нет необходимости отсылать данные, то используются пакеты формата NULL.

Состояния hold, sniff и park отличаются также и правилами адресации устройства. Узел в режиме hold сохраняет за собой нормальный адрес в пиконет, а в режиме park он получает два адреса: один позволяет мастеру различать узлы, находящиеся в этом состоянии, и обращаться к ним, второй же необходим, чтобы "запаркованный" узел мог самостоятельно отослать запрос мастеру. Следовательно, пакеты, отправляемые устройству в режиме park, должны быть широковещательными, так как эти узлы лишены собственного активного адреса.

Один из режимов установления или возобновления соединения называется paging state. В таком состоянии мастер буквально забрасывает эфир на всех частотах (hop frequencies) короткими ID-пакетами, содержащими только код доступа устройства (device access code). Поскольку пакеты невелики, в рамках одного временного фрейма удается передавать два пакета на двух разных частотах. Подчиненный узел в режиме paging также успевает прослушивать за один интервал 625 мкс две частоты, ожидая появления своего кода.

Установление соединения осуществляется и с помощью запросов. Запрашивающее устройство не сообщает никакой информации о себе за исключением типа устройств, которые отвечают: все или только, например, факсы. Соответственно узел, желающий быть обнаруженным, должен периодически (каждые 2,56 с) входить в состояние прослушивания запросов (inquiry state). Чтобы высвободить ресурсы своего передатчика, устройство может даже перевести в режим hold или park свои асинхронные соединения. Синхронные коммуникации продолжают осуществляться, и пакеты могут прерывать процесс прослушивания.

После того как ведомое устройство было обнаружено опрашивающим мастером и ответило пакетом FHS, информирующим о состоянии его внутренних часов, адресе и прочих характеристиках, ведущий узел генерирует пакет POLL, чтобы удостовериться в том, что подчиненный узел правильно настроил параметры приема и в состоянии получать данные. Подключаемое устройство может ответить любым пакетом, но если ответ не пришел, мастер снова переходит в состояние paging или inquiry.

Подчиненные узлы в пиконет работают в одном из двух режимов: активном и "подслушивания" (sniff). Суть первого из них очевидна, а другой представляет собой некое подобие состояния сна в энергосберегающих технологиях. Устройство в режиме sniff прослушивает эфир только в заранее определенные периоды времени.

Режимы sniff, park и hold также необходимы для подключения узлов сразу к нескольким пиконет. Чтобы подсоединиться к другой сети, устройство может запросить для себя в текущей пиконет режим park или hold. В случае состояния sniff узел имеет несколько свободных временных слотов между прослушиваниями своей основной пиконет, чтобы участвовать в обмене данными с другими сетями.


"Секьюрити"

Система безопасности Bluetooth-устройств основывается на двух разновидностях секретных ключей и 48-битовом идентификаторе BD_ADDR, присваиваемом каждому устройству его производителем. Правила и порядок использования BD_ADDR регулируются комитетом IEEE. Шифрование данных осуществляется с помощью ключа, который в свою очередь генерируется на основе 128-битового ключа авторизации (authentication key). Длина ключа шифрования варьируется от 8 до 128 бит. С одной стороны, такое решение позволяет гибко управлять степенью защиты подсистемы безопасности, а с другой -- удовлетворить требованиям различных стран относительно допустимой сложности ключа.

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

Ключи классифицируются также по своему происхождению. Самый простой вариант генерации у ключа устройства (unit key) -- он создается каждым узлом. Чуть сложнее выглядит процесс создания комбинированного ключа (combination key), вычисляемого на основе информации, полученной от двух участвующих в соединении узлов. Очевидно, что для каждой пары взаимодействующих устройств требуется свой комбинационный ключ. Это более надежная, но и более ресурсоемкая схема: если объем памяти устройства ограничен или в ходе эксплуатации системы (например, сетевой принтер) предполагается подсоединение большого количества различных узлов, то оптимальным будет вариант с ключом устройства.

Еще один ключ называется инициализационным и служит временной заменой нормального ключа до тех пор, пока он не будет сгенерирован после завершения процесса установления соединения. Отдельно введено понятие мастер-ключа (master key): когда необходимо разослать информацию сразу нескольким узлам, этот ключ используется вместо текущего ключа соединения (current link key).

Чтобы пройти аутентификацию, устройству нужно получить от проверяющего узла случайное число, сгенерировать на основании этого числа, ключа и своего BD_ADDR некоторое значение и отослать его обратно. Проверяющий узел контролирует корректность результата. Если общий ключ еще не создан, генерируется инициализационный ключ. Устройство-инициатор отсылает узлу-напарнику случайное число, которое в комбинации с фиксированным идентификатором BD_ADDR последнего образует требуемый инициализационный ключ.


Bluetooth для "чайников"

Беспроводные сети Bluetooth
Рис. 3
Прочитать спецификацию -- это еще ничего не значит. Понять, как применить полученные знания на практике, гораздо сложнее. Чтобы облегчить вхождение в "мир Bluetooth", для инженеров и программистов были подготовлены так называемые "профили", описывающие конкретные наиболее распространенные варианты использования технологии. Так сказать, готовые рецепты в количестве 13 штук. Их логическая структура приведена на рис. 3. Обо всех мы говорить здесь не будем, но некоторые разберем для примера. Полный список с пояснениями вы найдете в таблице.

В качестве типичного примера рассмотрим Cordless Telephonе Profile (CTP). Главная идея здесь заключается в организации беспроводной радиотелефонной системы, состоящей из терминала и шлюза, подключенного к какой-либо телефонной сети -- PSTN (публичной телефонной сети) или IP-сети. В качестве терминала может использоваться как специализированное переговорное Bluetooth-устройство (радиотелефон), так и мобильный телефон или даже обычный ПК, оснащенный телефонной гарнитурой и Bluetooth-контроллером.

"Профили", описывающие конкретные наиболее распространенные варианты использования Bluetooth
Терминал (трубка) в такой конфигурации выступает в качестве подчиненного узла, а шлюз -- ведущего. Находящийся вне зоны связи терминал должен постоянно находиться в page mode, пытаясь установить контакт с базой. В свою очередь шлюзу надлежит выделять как можно большее количество ресурсов для прослушивания эфира на предмет пейджинговых запросов (page scanning). После установления соединения при таком положении дел шлюз окажется подчиненным узлом, поэтому для начала работы необходимо выполнить процедуру смены ролей. Для передачи управляющей информации задействуется асинхронное соединение L2CAP, а для аудиопотока -- синхронное SCO.

Подключенный к пиконет, но не участвующий в активных операциях (обслуживание звонка) терминал устанавливает L2CAP-соединение и переходит в состояние park. Это позволяет уменьшить время инициализации при поступлении вызова. Терминалы могут общаться напрямую между собой, при реализации данного режима используются спецификации Intercom Profile.

Далее CTP содержит конкретные инструкции по выполнению стандартных процедур телефонии средствами стека протоколов Bluetooth. Отдельно оговариваются моменты, касающиеся протоколов L2CAP, SDP и LMP. В итоге мы имеем полное руководство по использованию технологии Bluetooth в области радиотелефонии.

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

Ready, set, buy! Посібник для початківців - як придбати Copilot для Microsoft 365

0 
 

Напечатать Отправить другу

Читайте также

 

Ukraine

 

  •  Home  •  Ринок  •  IТ-директор  •  CloudComputing  •  Hard  •  Soft  •  Мережі  •  Безпека  •  Наука  •  IoT