Взаимодействовать с Bluetooth-устройствами в Интернете

  1. Прежде чем мы начнем
  2. Доступно для ознакомительных испытаний
  3. Требования безопасности
  4. Только HTTPS
  5. Требуется жест пользователя
  6. Попасть в код
  7. Запрос устройств Bluetooth
  8. Подключиться к устройству Bluetooth
  9. Читать характеристики Bluetooth
  10. Написать на Bluetooth характеристику
  11. Отключиться от устройства Bluetooth
  12. Читать и писать в дескрипторы Bluetooth
  13. Образцы, демонстрации и кодовые метки
  14. начинающий
  15. Библиотеки
  16. Советы разработчиков
  17. Что дальше

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

До сих пор возможность взаимодействия с устройствами Bluetooth была возможна только для нативных приложений. API-интерфейс Web Bluetooth направлен на то, чтобы изменить это и распространить на веб-браузеры. Наряду с такими усилиями, как Физическая Сеть люди могут ходить и взаимодействовать с устройствами прямо из Интернета. Проверьте это Дрон управляется из веб-приложения видео, чтобы понять, как это будет работать.

Прежде чем мы начнем

В этой статье предполагается, что у вас есть базовые знания о том, как Bluetooth Low Energy (BLE) и Профиль общих атрибутов (GATT) Работа.

Хотя Спецификация веб-Bluetooth API еще не завершена, команда Chrome активно ищет энтузиастов-разработчиков (я имею в виду вас), чтобы опробовать этот незавершенный API и дать Отзыв о спецификации а также отзывы о реализации ,

Подмножество веб-API Bluetooth доступно в Chrome OS, Chrome для Android M, Mac (Chrome 56) и Windows 10 (Chrome 70). Это означает, что вы должны быть в состоянии запрос а также присоединиться близлежащие устройства Bluetooth, читать / записывать Характеристики Bluetooth, получать уведомления ГАТТ знать когда Bluetooth-устройство отключается , и даже читать и писать в дескрипторы Bluetooth ,

Для более ранних версий Windows и Linux вам по-прежнему нужно перейти в chrome: // flags / # enable-эксперимент-web-platform-functions, включить выделенный флаг и перезапустить Chrome.

Доступно для ознакомительных испытаний

Чтобы получить как можно больше отзывов от разработчиков, использующих API Web Bluetooth в полевых условиях, мы ранее добавили эту функцию в Chrome 53 как исходное испытание для Chrome OS, Android M и Mac.

Судебный процесс успешно завершился в январе 2017 года.

Требования безопасности

Чтобы понять компромиссы безопасности, я рекомендую Модель безопасности Web Bluetooth сообщение от Джеффри Яскина, инженера-программиста из команды Chrome, работающего над спецификацией Web Bluetooth API.

Только HTTPS

Поскольку этот экспериментальный API является мощной новой функцией, добавленной в Интернет, Google Chrome стремится сделать его доступным только для безопасные контексты , Это означает, что вам нужно строить с учетом TLS.

Во время разработки вы сможете взаимодействовать с веб-Bluetooth через http: // localhost, используя такие инструменты, как Редактор Chrome Dev или удобный python -m SimpleHTTPServer, но для его развертывания на сайте вам необходимо настроить HTTPS на вашем сервере. Лично мне нравится GitHub Pages для демонстрационных целей.

Чтобы добавить HTTPS на ваш сервер, вам нужно получить сертификат TLS и настроить его. Не забудьте проверить Статья о безопасности с HTTPS для лучших практик там. Для информации, теперь вы можете получить бесплатные сертификаты TLS с новым центром сертификации Давайте зашифруем ,

Требуется жест пользователя

В качестве функции безопасности обнаружение устройств Bluetooth с помощью navigator.bluetooth.requestDevice должно быть инициировано пользовательский жест такие как прикосновение или щелчок мыши. Мы говорим о прослушивании pointerup , нажмите и коснитесь события.

button.addEventListener ('pointerup', function (event) {// Вызвать navigator.bluetooth.requestDevice});

Попасть в код

API веб Bluetooth в значительной степени опирается на JavaScript обещания , Если вы не знакомы с ними, проверьте этот великий Обещание учебник , Еще одна вещь, () => {} это просто ECMAScript 2015 Функции стрелок - они имеют более короткий синтаксис по сравнению с выражениями функций и лексически связывают значение this.

Запрос устройств Bluetooth

Эта версия спецификации Web Bluetooth API позволяет веб-сайтам, работающим в центральной роли, подключаться к удаленным серверам GATT через соединение BLE. Он поддерживает связь между устройствами, которые реализуют Bluetooth 4.0 или новее.

Когда веб-сайт запрашивает доступ к ближайшим устройствам с помощью navigator.bluetooth.requestDevice, Google Chrome предложит пользователю выбрать устройство, где он может выбрать одно устройство или просто отменить запрос.

Функция navigator.bluetooth.requestDevice принимает обязательный объект, который определяет фильтры. Эти фильтры используются для возврата только тех устройств, которые соответствуют объявленным службам Bluetooth GATT и / или имени устройства.

Например, запрос устройств Bluetooth, рекламирующих Обслуживание батареи Bluetooth GATT это просто:

navigator.bluetooth.requestDevice ({filters: [{services: ['battery_service']}]}) .then (device => {/ * ... * /}) .catch (ошибка => {console.log (ошибка) );});

Если вашей службы Bluetooth GATT нет в списке стандартизированные сервисы Bluetooth GATT тем не менее, вы можете предоставить либо полный UUID Bluetooth, либо короткую 16- или 32-битную форму.

navigator.bluetooth.requestDevice ({filters: [{services: [0x1234, 0x12345678, '99999999-0000-1000-8000-00805f9b34fb']}]}) .then (device => {/ * ... * /}) .catch (error => {console.log (error);});

Вы также можете запросить устройства Bluetooth на основе объявления имени устройства с помощью ключа фильтров имени или даже префикса этого имени с помощью ключа фильтров namePrefix. Обратите внимание, что в этом случае вам также потребуется определить ключ AdditionalServices, чтобы иметь возможность доступа к некоторым службам. Если вы этого не сделаете, вы получите ошибку позже при попытке доступа к ним.

navigator.bluetooth.requestDevice ({filters: [{name: 'Francois robot'}], необязательные услуги: ['battery_service']}) .then (device => {/ * ... * /}) .catch (error = > {console.log (error);});

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

navigator.bluetooth.requestDevice ({acceptAllDevices: true, optionServices: ['battery_service']}) .then (device => {/ * ... * /}) .catch (error => {console.log (error); });

Подключиться к устройству Bluetooth

Итак, что вы делаете сейчас, когда у вас есть BluetoothDevice, возвращенный из Promise navigator.bluetooth.requestDevice? Давайте подключимся к удаленному Bluetooth-серверу GATT, который содержит определения сервиса и характеристик.

navigator.bluetooth.requestDevice ({filters: [{services: ['battery_service']}]}) .then (device => {// Удобное для восприятия имя устройства. console.log (device.name); // Пытается подключиться к удаленному серверу GATT. Return device.gatt.connect ();}) .then (server => {/ * ... * /}) .catch (error => {console.log (error);} );

Читать характеристики Bluetooth

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

В приведенном ниже примере battery_level является стандартизированная характеристика уровня заряда батареи ,

navigator.bluetooth.requestDevice ({filters: [{services: ['battery_service']}]}) .then (device => device.gatt.connect ()) .then (server => {// Получение обслуживания батареи .. . return server.getPrimaryService ('battery_service');}) .then (service => {// Получение характеристики уровня заряда батареи ... return service.getCharacteristic ('battery_level');}) .then (характеристика => {// Считывание уровня заряда батареи ... возвращаемая характеристика.readValue ();}) .then (значение => {console.log («Процент заряда батареи» + value.getUint8 (0));}) .catch (error => {console .log (ошибка);});

Если вы используете пользовательскую характеристику Bluetooth GATT, вы можете предоставить либо полный UUID Bluetooth, либо короткую 16- или 32-битную форму для service.getCharacteristic.

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

... .then (характеристика => {// Настройка прослушивателя событий для случая, когда значение характеристики изменяется. характеристика. addEventListener ('Characteristicueueoted', handleBatteryLevelChanged); // // Чтение уровня заряда батареи ... return attribute.readValue ();}) .catch (error => {console.log (error);}); function handleBatteryLevelChanged (event) {let batteryLevel = event.target.value.getUint8 (0); console.log («Процент заряда батареи» + уровень батареи); }

Написать на Bluetooth характеристику

Запись в Bluetooth GATT Характеристика так же просто, как и чтение. На этот раз давайте воспользуемся точкой контроля сердечного ритма, чтобы сбросить значение поля «Расход энергии» на 0 на устройстве контроля сердечного ритма.

Я обещаю, что здесь нет магии. Это все объясняется в Страница характеристик контрольной точки сердечного ритма ,

navigator.bluetooth.requestDevice ({filters: [{services: ['heart_rate']}]}) .then (device => device.gatt.connect ()) .then (server => server.getPrimaryService ('heart_rate') ) .then (service => service.getCharacteristic ('heart_rate_control_point')) .then (характеристика => {// Запись 1 - это сигнал для сброса затраченной энергии. var resetEnergyExpended = Uint8Array.of (1); вернуть характеристику.writeValue ( resetEnergyExpended);}) .then (_ => {console.log ('Израсходовано энергии.');}) .catch (error => {console.log (error);});

Теперь давайте посмотрим, как получить уведомление, когда Измерение пульса Характерные изменения на устройстве:

navigator.bluetooth.requestDevice ({filters: [{services: ['heart_rate']}]}) .then (device => device.gatt.connect ()) .then (server => server.getPrimaryService ('heart_rate') ) .then (service => service.getCharacteristic ('heart_rate_measurement')) .then (характеристика => характеристика.startNotifications ()) .then (характеристика => {характеристика.addEventListener ('характеристика_значения_объекта) 'Уведомления запущены.');}) .Catch (error => {console.log (error);}); function handleCharacteristicValueChanged (event) {var value = event.target.value; console.log («Получено» + значение); // TODO: анализировать значение измерения пульса. // См. Https://github.com/WebBluetoothCG/demos/blob/gh-pages/heart-rate-sensor/heartRateSensor.js}

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

Отключиться от устройства Bluetooth

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

navigator.bluetooth.requestDevice ({filters: [{name: 'Francois robot'}]}) .then (device => {// Настройка прослушивателя событий, когда устройство отключается. device.addEventListener ('gattserverdisconnected', onDisconnected) ; // Пытается подключиться к удаленному серверу GATT. Return device.gatt.connect ();}) .then (server => {/ * ... * /}) .catch (error => {console.log (error) );}); function onDisconnected (event) {let device = event.target; console.log ('Device' + device.name + 'отключен.'); }

Вы также можете вызвать device.gatt.disconnect (), чтобы отключить ваше веб-приложение от устройства Bluetooth. Это вызовет существующие прослушиватели событий gattserverdisconnected. Обратите внимание, что он НЕ прекратит связь с устройством Bluetooth, если другое приложение уже обменивается данными с устройством Bluetooth. Проверьте Пример отключения устройства и Образец автоматического переподключения нырнуть глубже.

Читать и писать в дескрипторы Bluetooth

Дескрипторы Bluetooth GATT - это атрибуты, которые описывают характерное значение. Вы можете читать и записывать их аналогично характеристикам Bluetooth GATT.

Посмотрим, например, как прочитать пользовательское описание интервала измерения термометра состояния устройства.

В приведенном ниже примере health_thermometer является Сервис термометров здоровья , измерение_интервал Характеристика интервала измерения и gatt.characteristic_user_description the Характеристика Дескриптор описания пользователя ,

navigator.bluetooth.requestDevice ({filters: [{services: ['health_thermometer']}]}) .then (device => device.gatt.connect ()) .then (server => server.getPrimaryService ('health_thermometer') ) .then (service => service.getCharacteristic (' measure_interval')) .then (характеристика => характеристика.getDescriptor ('gatt.characteristic_user_description')) .then (дескриптор => descriptor.readValue ()) .then (значение = > {let decoder = new TextDecoder ('utf-8'); console.log ('Описание пользователя:' + decoder.decode (value));}) .catch (error => {console.log (error);} );

Теперь, когда мы прочитали пользовательское описание интервала измерения термометра состояния устройства, давайте посмотрим, как его обновить и записать пользовательское значение.

navigator.bluetooth.requestDevice ({filters: [{services: ['health_thermometer']}]}) .then (device => device.gatt.connect ()) .then (server => server.getPrimaryService ('health_thermometer') ) .then (service => service.getCharacteristic ('measure_interval')) .hen '); let userDescription = encoder.encode (' Определяет время между измерениями. '); return descriptor.writeValue (userDescription);}) .catch (error => {console.log (error);});

Образцы, демонстрации и кодовые метки

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

начинающий

  • Информация об устройстве - получить основную информацию об устройстве с устройства BLE.
  • Уровень заряда батареи - получить информацию о батарее из устройства BLE, рекламируя информацию о батарее.
  • Сбросить энергию - сбросить энергию, затраченную на устройство BLE, рекламирующее сердечный ритм.
  • Характеристические свойства - отобразить все свойства определенной характеристики с устройства BLE.
  • Уведомления - запускать и останавливать характерные уведомления от устройства BLE.
  • Отключение устройства - отключиться и получить уведомление об отключении устройства BLE после подключения к нему.
  • Получить характеристики - получить все характеристики рекламируемой услуги с устройства BLE.
  • Получить дескрипторы - получить дескрипторы всех характеристик рекламируемой услуги с устройства BLE.

Объединение нескольких операций

Проверьте наш куратор веб-демонстрации Bluetooth а также официальные веб-коды Bluetooth также.

Библиотеки

  • веб-Bluetooth-Utils это модуль npm, который добавляет некоторые удобные функции в API.
  • Оболочка Web Bluetooth API доступна в благородный , самый популярный центральный модуль Node.js BLE. Это позволяет вам упаковать / просмотреть благородный веб без необходимости использования сервера WebSocket или других плагинов.
  • угловой веб-Bluetooth это модуль для угловатый это отвлекает весь шаблон, необходимый для настройки Web Bluetooth API.
  • <Платино-Bluetooth> это набор полимер элементы для обнаружения и связи с близлежащими устройствами Bluetooth на основе веб-API Bluetooth. Например, вот как можно прочитать уровень заряда батареи с устройства Bluetooth, находящегося поблизости, рекламируя обслуживание батареи:

<platinum-bluetooth-device services-filter = '["battery_service"]'> <platinum-bluetooth-service service = 'battery_service'> <характеристика платиновой Bluetooth-характеристики = 'уровень-батареи'> </ характеристика платиновой bluetooth> </ platinum-bluetooth-service> </ platinum-bluetooth-device> var bluetoothDevice = document.querySelector («платиновое-bluetooth-устройство»); var batteryLevel = document.querySelector («характеристика платины-bluetooth»); bluetoothDevice.request () .then (_ => batteryLevel.read ()) .then (value => {console.log ('Процент заряда батареи равен + + value.getUint8 (0));}) .catch (error => {console.log (error);});

  • Начните с веб-Bluetooth это простое веб-приложение, которое генерирует весь стандартный код JavaScript для начала взаимодействия с устройством Bluetooth. Введите имя устройства, услугу, характеристику, определите ее свойства, и все готово.
  • Если вы уже являетесь разработчиком Bluetooth, Плагин Web Bluetooth Developer Studio также сгенерирует код JavaScript Web Bluetooth для вашего устройства Bluetooth.

Советы разработчиков

Страница «Внутренние устройства Bluetooth» доступна в Chrome по адресу chrome: // bluetooth-internals, так что вы можете проверить все, что касается соседних устройств Bluetooth: состояние, услуги, характеристики и дескрипторы.

Страница «Внутренние устройства Bluetooth» доступна в Chrome по адресу chrome: // bluetooth-internals, так что вы можете проверить все, что касается соседних устройств Bluetooth: состояние, услуги, характеристики и дескрипторы

Я также рекомендовал бы вам проверить официальный «Как подать веб-сообщения об ошибках Bluetooth» Страница как отладка Bluetooth иногда бывает сложной.

Что дальше

Проверить состояние реализации браузера и платформы сначала узнать, какие части Web Bluetooth API в настоящее время внедряются.

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

  • Сканирование на наличие рекламы BLE поблизости произойдет с помощью navigator.bluetooth.requestLEScan ().
  • Указание обновления Eddystone позволит веб-сайту, открытому из уведомления Physical Web, обмениваться данными с устройством, которое объявило свой URL-адрес.
  • Новое событие с добавленной службой будет отслеживать недавно обнаруженные службы Bluetooth GATT, а событие с удаленной службой будет отслеживать удаленные. Новое событие с измененным сервисом сработает, когда какой-либо признак и / или дескриптор будет добавлен или удален из службы Bluetooth GATT.

Ресурсы

Похожие

Neo24 код скидки
Скидочный код Neo24 гарантирует привлекательную цену покупки бытовой техники и электроники. Если вы ищете идеальное оборудование для вашего дома, воспользуйтесь широким ассортиментом бытовой техники и электроники. Интернет-магазин Neo24 - это идеальное место, где вы можете найти и купить подходящее оборудование для вашей кухни или ванной комнаты. В интернет-магазине Neo24 можно найти широкий спектр устройств,
Что такое тест IQ? Что такое высокий показатель IQ?
Что такое тест IQ? Что такое точный тест IQ? В то время как у людей разные когнитивные сильные и слабые стороны (например, язык, музыка, математика, визуальные эффекты), постоянные корреляции между ними показывают нам, что у всех них
Игры для ПК на планшетах с Windows 8.1?
... ируются как игровое оборудование. В некотором смысле, правильно, потому что, если бы я искал планшет только для игр, я бы предпочел наклониться в сторону Nvidia Shield Tablet , Он предлагает более широкий ассортимент игр, предназначенных для сенсорных экранов, а также более эффективную, чем бюджетные планшеты с Windows. Ситуация на планшетах, работающих под управлением системы Microsoft,
Для новых кукол Барби возникает вопрос: что надеть?
На этой неделе Барби значительно преобразилась, когда Mattel выпустила любимую куклу в трех новых, более реалистичных типах телосложения, с 30 оттенками волос, 22 оттенками глаз и семью оттенками кожи. Одна вещь, которую Барби не получила? Новый гардероб. Изменения в форме тела Барби были долгими в работах для Mattel, Журнал Time В своей обложке рассказывалось о кукле, и каждое решение принималось предельно тщательно.
Оригинальные оранжевые свитера не только на осень - 5 идей
... вый свитер - довольно сложный предмет одежды - его сложно подобрать в таком интенсивном цвете к повседневной стилизации, не говоря уже о официальной вечеринке"> Оранжевый свитер - довольно сложный предмет одежды - его сложно подобрать в таком интенсивном цвете к повседневной стилизации, не говоря уже о официальной вечеринке. Звезды не боятся испытаний и хвастаются своими идеями для все более интересных модных экспериментов. У нас есть 5 вдохновений для вас с этим
Lineage предоставляет обновление для Android 8.1, расширяет поддержку устройств
Это был настоящий удар, когда было объявлено, что Cyanogen Inc. закроет свои двери , Хотя это означало смерть CyanogenMod, к счастью, сообщество снова собралось, чтобы поддержать
Huawei Mate 9
Huawei Mate 9 является продолжением хорошего пропуска производителя среди высококлассных смартфонов, предназначенных в первую очередь для бизнес-пользователей, но также и для продвинутых энтузиастов новых технологий. Новый Huawei сочетает в себе возможности и скорость вычислений новейшего процессора Kirin 960 и новой, интеллектуальной и самообучающейся системы. Благодаря этим революционным решениям пользователь может наслаждаться интуитивно понятным управлением программным обеспечением.
Мы покупаем колонны - что искать?
... ив купить новые колонны, мы сталкиваемся с трудным выбором - на рынке есть множество моделей, и чаще всего акции и возможности трудно иногда выбирать оборудование, которое действительно хорошо и недорого . Поэтому, прежде чем мы перейдем к портфелю, стоит тщательно проанализировать технические характеристики интересующих нас продуктов, уделив особое внимание наиболее важным параметрам и функциям.
SWIFT код для всех банков в Болгарии - страница 1
SWIFT код для всех банков в Болгарии Swift Code - это стандартный формат идентификационных кодов банков (BIC) и уникальный идентификационный код для конкретного банка. Эти коды используются при переводе денег между банками, особенно для международных банковских переводов. Банки также использовали коды для обмена другими сообщениями между ними. Код Swift состоит из 8 или 11 символов. Когда указан 8-значный код, он относится к основному офису. Код отформатирован,
Пистолет Walther PPK - краткая история и обзор
... вид Тонг Автор пистолета Дэвид Тонг знакомит нас с историей пистолета Walther PPK. Пистолет Walther PPK был укороченной версией модели PP 1929 года и впервые был выпущен в 1931 году.
Обзор Fitbit Charge 2
... Bluetooth вы можете синхронизировать свои действия с приложением и получать элементарные уведомления от подключенного смартфона. Они включают только идентификатор звонящего, сообщения и напоминания календаря. Первоначально Fitbit Charge 2 мог отображать только SMS-сообщения. Я не могу вспомнить, когда в последний раз я получал стандартное SMS-сообщение от кого-то, кто не был маркетологом, поэтому насколько полезным вы найдете это, сомнительно. К счастью, недавнее обновление

Комментарии

Что на самом деле должен делать багги?
Что на самом деле должен делать багги? Чтобы выяснить это, мы запустили два опроса: в Facebook и Instagram мы хотели узнать от мам и пап: что важного в багги в повседневной жизни? Что мы должны проверить на багги? В то же время мы начали с наших матерей и отцов в команде небольшой флэш-опрос по тем же вопросам. Из наиболее распространенных ответов мы разработали наши тестовые категории. * Наши критерии Все багги были проверены в одинаковых условиях на их управляемость,
Что такое нейтральная реальная процентная ставка и как мы можем ее использовать?
Что такое нейтральная реальная процентная ставка и как мы можем ее использовать? Бюллетень Резервного Банка Новой Зеландии, 64 (3), 15-28. Армстронг, J. (2015). Набор индикаторов разрыва выпуска в Резервном банке Новой Зеландии и его свойства в реальном времени. Резервный банк Новой Зеландии Аналитическая записка AN2015 / 08. Резервный банк Новой Зеландии. Армстронг Дж. & Карагедикли О. (2017). Роль неучастников в динамике рынка труда. Резервный банк Новой Зеландии
Но что это?
Но что это? !! На все эти сомнения ответит наш гид. Здесь вы найдете не сложные детали и подробные технические описания, а самую простую, четко определенную информацию, позволяющую выбрать объектив для только что купленной цифровой зеркальной фотокамеры. Поэтому, если вы являетесь опытным пользователем SLR, этот цикл не для вас. В каждом эпизоде ​​мы обсудим, какие объективы подходят для камер определенных марок, как выбрать фокусное расстояние для их нужд и какие маркировки используются
Что мы тестировали?
Что мы тестировали? Тестируемые мной навигационные тесты оснащены 5-дюймовыми дисплеями с разрешением 480х272 пикселей. Это стандарт навигации, и этого разрешения достаточно. TomTom Start 52 Установлена карта Европы , и производитель объявляет о неограниченных и бесплатных обновлениях карты, а также о трехмесячной подписке на услугу Speed ​​Cameras
Что мы получаем за эту цену?
Что мы получаем за эту цену? Контроллер Silicon Motion SM2256 (такой же, как у модели ADATA SP550) и 16-нм память TLC Micron. Заявленная скорость чтения составляет в этом случае 540 МБ / с, в свою очередь запись - 490 МБ / с. Тот факт, что мы имеем дело с дешевым диском, уже виден после оборудования - включены только шайба и крепежные винты. Crucial MX200 500 ГБ
Что отличает эти устройства?
Что отличает эти устройства? Возможность нагрева и активного охлаждения одним устройством. Широкий температурный диапазон: от 7 ° C (в режиме охлаждения) до 55 ° C (в режиме нагрева). Splydro - это идеальный тепловой насос для отопления дома на одну семью с низким потреблением тепла, который можно комбинировать с другими источниками тепла, как обычными, так и возобновляемыми. Система состоит из компактного наружного блока сплит-типа, который занимает мало места и может быть размещен непосредственно
У вас есть слух к сплетням, и вы узнали, что один из ваших учителей настоящий мастер кухни?
У вас есть слух к сплетням, и вы узнали, что один из ваших учителей настоящий мастер кухни? Однажды в комнате учителя вы съели кусок лучшего торта в мире, а потом оказалось, что она его испекла? В этом случае вас интересуют не только подарки для учителей, но и оригинальные аксессуары для кухни. Здесь нет ни малейшей проблемы. Лучшая леди - разделочная доска Это отличное сочетание, и мы уверены, что каждый учитель с кулинарной
Что вы хотели купить своему ребенку?
Что вы хотели купить своему ребенку? рейтинг грузовых автомобилей 2019 он зовет ребенка
Что в этом происходит?
Что в этом происходит? Для установки 2-часового интервала времени, в течение которого груз должен быть доставлен. Этому способствует система SMS-уведомлений и бесплатная электронная почта, с помощью которой вы можете изменить дату и время доставки посылки клиенту. Однако, чтобы эффективно использовать интегрированные курьерские системы, прежде всего необходимо правильно настроить инструменты, обеспечивающие беспрепятственное взаимодействие между магазином -> поставщиком услуг. В случае
Что нам нужно?
Что нам нужно? Контроллерами игр на настольных компьютерах являются, конечно же, клавиатура и мышь. К сожалению, мы не будем перепрыгивать через него, к счастью, это оборудование, которое уже есть у всех дома. Здесь в гораздо лучшем положении находятся, например, владельцы планшетов с док-станциями в виде клавиатуры. Acer Aspire Switch или
У рюкзака есть поясной ремень, чехол от дождя и дополнительные карманы, расширяющие его функциональность - что еще можно пожелать?
У рюкзака есть поясной ремень, чехол от дождя и дополнительные карманы, расширяющие его функциональность - что еще можно пожелать? Не говоря уже о том, что эта модель действительно пользуется большой популярностью. 2. Hi-Tec Katanga V-lite 65

RequestDevice?
Что такое высокий показатель IQ?
Что такое тест IQ?
Что такое точный тест IQ?
Одна вещь, которую Барби не получила?
Мы покупаем колонны - что искать?
Что на самом деле должен делать багги?
Чтобы выяснить это, мы запустили два опроса: в Facebook и Instagram мы хотели узнать от мам и пап: что важного в багги в повседневной жизни?
Что мы должны проверить на багги?
Что такое нейтральная реальная процентная ставка и как мы можем ее использовать?