Как работает Bluetooth в Android. Какие основные компоненты используются для реализации Bluetooth-функциональности. Как правильно управлять Bluetooth-соединением в приложении. Какие проблемы могут возникнуть при работе с Bluetooth и как их решить.
Основы работы с Bluetooth в Android
Bluetooth — это технология беспроводной связи малого радиуса действия, которая позволяет устройствам обмениваться данными на расстоянии до 10 метров. В Android встроена обширная поддержка Bluetooth, позволяющая приложениям подключаться к другим Bluetooth-устройствам для обмена данными.
Основные компоненты для работы с Bluetooth в Android:
- BluetoothAdapter — представляет Bluetooth-адаптер устройства
- BluetoothDevice — представляет удаленное Bluetooth-устройство
- BluetoothSocket — интерфейс для отправки и получения данных
- BluetoothServerSocket — для прослушивания входящих подключений
Реализация Bluetooth как сервиса в Android
Одним из эффективных подходов к реализации Bluetooth-функциональности в Android является использование сервиса. Это позволяет:

- Управлять Bluetooth-соединением независимо от жизненного цикла активности
- Поддерживать соединение активным при переходе между экранами
- Централизованно обрабатывать Bluetooth-события
Ключевые шаги для реализации Bluetooth-сервиса:
- Создать класс, наследующийся от Service
- Реализовать логику управления Bluetooth-подключением
- Использовать LocalBroadcastManager для отправки событий
- Связать сервис с активностью через ServiceConnection
Основные компоненты Bluetooth-сервиса
Типичный Bluetooth-сервис в Android включает следующие основные компоненты:
1. LocalBinder
Класс LocalBinder позволяет активностям получать ссылку на сервис и вызывать его методы:
inner class LocalBinder : Binder() {
fun getService(): BluetoothService = this@BluetoothService
}
2. Управление Bluetooth-адаптером
Инициализация и управление BluetoothAdapter:
private lateinit var bluetoothAdapter: BluetoothAdapter
override fun onCreate() {
super.onCreate()
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
}
3. Потоки для соединения
Отдельные потоки для установки соединения и обмена данными:

- ConnectThread — для установки исходящего соединения
- ConnectedThread — для обмена данными после установки соединения
- AcceptThread — для прослушивания входящих подключений
Обработка Bluetooth-событий
Для эффективной обработки Bluetooth-событий рекомендуется использовать следующий подход:
- Определить константы для типов событий
- Использовать LocalBroadcastManager для отправки событий из сервиса
- Создать BroadcastReceiver в активности для приема событий
Пример отправки события из сервиса:
private fun sendEvent(action: String, device: BluetoothDevice?, message: String?) {
val intent = Intent(action).apply {
putExtra(EXTRA_DEVICE, device)
putExtra(EXTRA_MESSAGE, message)
}
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
}
Оптимизация работы с Bluetooth
Для улучшения работы с Bluetooth в Android-приложениях следует учитывать следующие рекомендации:
- Использовать асинхронные операции для поиска устройств и установки соединения
- Корректно обрабатывать потерю соединения и переподключение
- Оптимизировать передачу данных, используя буферизацию
- Учитывать особенности энергопотребления при работе с Bluetooth
Обеспечение безопасности Bluetooth-соединений
При работе с Bluetooth важно обеспечить безопасность передаваемых данных. Основные меры безопасности включают:

- Использование шифрования для передачи конфиденциальных данных
- Проверка подлинности устройств перед установкой соединения
- Ограничение видимости устройства только на время необходимое для сопряжения
- Использование уникальных PIN-кодов для сопряжения устройств
Тестирование Bluetooth-функциональности
Тщательное тестирование Bluetooth-компонентов приложения критически важно для обеспечения стабильной работы. Основные аспекты тестирования включают:
- Проверку корректности установки соединения с различными устройствами
- Тестирование передачи данных различных объемов и типов
- Симуляцию потери соединения и проверку корректности переподключения
- Оценку энергопотребления при длительной работе Bluetooth
Решение проблем при разработке Bluetooth-приложений
При работе с Bluetooth в Android могут возникнуть различные проблемы. Рассмотрим некоторые распространенные проблемы и способы их решения:
Проблема: Устройство не обнаруживается при сканировании
Возможные решения:
- Убедиться, что на устройстве включен Bluetooth и оно находится в режиме обнаружения
- Проверить наличие необходимых разрешений в манифесте приложения
- Увеличить время сканирования
Проблема: Не удается установить соединение
Возможные решения:

- Проверить совместимость профилей Bluetooth устройств
- Убедиться в корректности UUID, используемого для соединения
- Попробовать переподключиться после короткой паузы
Проблема: Потеря соединения во время передачи данных
Возможные решения:
- Реализовать механизм переподключения при потере соединения
- Использовать буферизацию данных для минимизации потерь при разрыве
- Оптимизировать размер передаваемых пакетов данных
Будущее Bluetooth в Android
Технология Bluetooth продолжает развиваться, и Android постоянно расширяет поддержку новых возможностей. Некоторые перспективные направления развития Bluetooth в Android включают:
- Улучшенную поддержку Bluetooth Low Energy (BLE) для энергоэффективных приложений
- Расширение возможностей аудио через Bluetooth с поддержкой новых кодеков
- Интеграцию с другими беспроводными технологиями для создания гибридных решений
- Улучшение безопасности Bluetooth-соединений на уровне операционной системы
Разработчикам Android-приложений следует следить за новыми возможностями Bluetooth и внедрять их для улучшения пользовательского опыта и расширения функциональности своих приложений.

Bluetooth в качестве сервиса / Хабр
Реализация Bluetooth как сервиса в AndroidПочему? И как?
Вы когда-нибудь задавали себе вопрос, прочитав официальное руководство по bluetooth для Android, как управлять им внутри вашего приложения? Как сохранить соединение активным, даже когда вы переходите от одного действия к другому?
Что ж, в этом руководстве я постараюсь показать вам, как я реализовал связь bluetooth через Service, чтобы управлять bluetooth и соединением с различными действиями, используя Service Binding, а также установил слушатель обратного вызова для операций, получающих информацию о состоянии связи bluetooth.
В этом руководстве мы создадим четыре файла:
BluetoothSDKService
:который реализует функциональные возможности bluetooth и выдаетLocalBroadcast
сообщения во время операцийBluetoothSDKListenerHelper
: который выполняетBroadcastReceiver
и запускает функцииIBluetoothSDKListener
IBluetoothSDKListener
: наш Interface, который определяет функции обратного вызоваBluetoothUtils
: который содержит имена действий, определенных для фильтрации событий вBroadcastReceiver
1) Определите действия
Первым шагом является определение файла BluetoothUtils. kt , который содержит действия, о которых мы хотим получать уведомления в нашей активности:
class BluetoothUtils { companion object { val ACTION_DISCOVERY_STARTED = "ACTION_DISCOVERY_STARTED" val ACTION_DISCOVERY_STOPPED = "ACTION_DISCOVERY_STOPPED" val ACTION_DEVICE_FOUND = "ACTION_DEVICE_FOUND" val ACTION_DEVICE_CONNECTED = "ACTION_DEVICE_CONNECTED" val ACTION_DEVICE_DISCONNECTED = "ACTION_DEVICE_DISCONNECTED" val ACTION_MESSAGE_RECEIVED = "ACTION_MESSAGE_RECEIVED" val ACTION_MESSAGE_SENT = "ACTION_MESSAGE_SENT" val ACTION_CONNECTION_ERROR = "ACTION_CONNECTION_ERROR" val EXTRA_DEVICE = "EXTRA_DEVICE" val EXTRA_MESSAGE = "EXTRA_MESSAGE" } }
Я определил несколько, но вы можете добавлять их по своему усмотрению.
2) Определите события-функции обратного вызова
Второй шаг — это определение нашего интерфейса, который будет содержать события, соответствующие действиям, которые мы определили в первом шаге.
IBluetoothSDKListener
как:interface IBluetoothSDKListener { /** * from action BluetoothUtils.ACTION_DISCOVERY_STARTED */ fun onDiscoveryStarted() /** * from action BluetoothUtils.ACTION_DISCOVERY_STOPPED */ fun onDiscoveryStopped() /** * from action BluetoothUtils.ACTION_DEVICE_FOUND */ fun onDeviceDiscovered(device: BluetoothDevice?) /** * from action BluetoothUtils.ACTION_DEVICE_CONNECTED */ fun onDeviceConnected(device: BluetoothDevice?) /** * from action BluetoothUtils.ACTION_MESSAGE_RECEIVED */ fun onMessageReceived(device: BluetoothDevice?, message: String?) /** * from action BluetoothUtils.ACTION_MESSAGE_SENT */ fun onMessageSent(device: BluetoothDevice?) /** * from action BluetoothUtils.ACTION_CONNECTION_ERROR */ fun onError(message: String?) /** * from action BluetoothUtils.ACTION_DEVICE_DISCONNECTED */ fun onDeviceDisconnected() }
Этот интерфейс будет позже реализован в нашей активности, или фрагменте, который будет выполнять некоторые действия при появлении события. Например, когда устройство подключается, срабатывает функция
onDeviceDiscovered
, и затем вы можете перейти к выполнению определенных операций, например, как мы увидим в следующих шагах, отправить сообщение по bluetooth на только что подключенное устройство через наш BluetoothSDKService
.
3) Определение BroadcastReceiver
Следующим шагом будет определение нашего BroadcastReceiver
, задачей которого будет фильтрация намерений с нашими действиями, определенными до получения LocalBroadcastManager
, для запуска функций обратного вызова, определенных в предыдущем разделе. Поэтому мы используем BluetoothSDKListenerHelper
как:
class BluetoothSDKListenerHelper { companion object { private var mBluetoothSDKBroadcastReceiver: BluetoothSDKBroadcastReceiver? = null class BluetoothSDKBroadcastReceiver : BroadcastReceiver() { private var mGlobalListener: IBluetoothSDKListener? = null public fun setBluetoothSDKListener(listener: IBluetoothSDKListener) { mGlobalListener = listener } public fun removeBluetoothSDKListener(listener: IBluetoothSDKListener): Boolean { if (mGlobalListener == listener) { mGlobalListener = null } return mGlobalListener == null } override fun onReceive(context: Context?, intent: Intent?) { val device = intent!!.getParcelableExtra<BluetoothDevice>(BluetoothUtils.EXTRA_DEVICE) val message = intent.getStringExtra(BluetoothUtils.EXTRA_MESSAGE) when (intent.action) { BluetoothUtils.ACTION_DEVICE_FOUND -> { mGlobalListener!!.onDeviceDiscovered(device) } BluetoothUtils.ACTION_DISCOVERY_STARTED -> { mGlobalListener!!.onDiscoveryStarted() } BluetoothUtils.ACTION_DISCOVERY_STOPPED -> { mGlobalListener!!.onDiscoveryStopped() } BluetoothUtils.ACTION_DEVICE_CONNECTED -> { mGlobalListener!!.onDeviceConnected(device) } BluetoothUtils.ACTION_MESSAGE_RECEIVED -> { mGlobalListener!!.onMessageReceived(device, message) } BluetoothUtils.
ACTION_MESSAGE_SENT -> { mGlobalListener!!.onMessageSent(device) } BluetoothUtils.ACTION_CONNECTION_ERROR -> { mGlobalListener!!.onError(message) } BluetoothUtils.ACTION_DEVICE_DISCONNECTED -> { mGlobalListener!!.onDeviceDisconnected() } } } } public fun registerBluetoothSDKListener( context: Context?, listener: IBluetoothSDKListener ) { if (mBluetoothSDKBroadcastReceiver == null) { mBluetoothSDKBroadcastReceiver = BluetoothSDKBroadcastReceiver() val intentFilter = IntentFilter().also { it.addAction(BluetoothUtils.ACTION_DEVICE_FOUND) it.addAction(BluetoothUtils.ACTION_DISCOVERY_STARTED) it.addAction(BluetoothUtils.ACTION_DISCOVERY_STOPPED) it. addAction(BluetoothUtils.ACTION_DEVICE_CONNECTED) it.addAction(BluetoothUtils.ACTION_MESSAGE_RECEIVED) it.addAction(BluetoothUtils.ACTION_MESSAGE_SENT) it.addAction(BluetoothUtils.ACTION_CONNECTION_ERROR) it.addAction(BluetoothUtils.ACTION_DEVICE_DISCONNECTED) } LocalBroadcastManager.getInstance(context!!).registerReceiver( mBluetoothSDKBroadcastReceiver!!, intentFilter ) } mBluetoothSDKBroadcastReceiver!!.setBluetoothSDKListener(listener) } public fun unregisterBluetoothSDKListener( context: Context?, listener: IBluetoothSDKListener ) { if (mBluetoothSDKBroadcastReceiver != null) { val empty = mBluetoothSDKBroadcastReceiver!!.removeBluetoothSDKListener(listener) if (empty) { LocalBroadcastManager.getInstance(context!!) .
unregisterReceiver(mBluetoothSDKBroadcastReceiver!!) mBluetoothSDKBroadcastReceiver = null } } } } }
В действии или фрагменте мы реализуем наш IBluetoothSDKListener
, который мы зарегистрируем через две функции registerBluetoothSDKListner()
и unregisterBluetoothSDKListner()
. Например:
class CoolFragment() : BottomSheetDialogFragment() { private lateinit var mService: BluetoothSDKService private lateinit var binding: FragmentPopupDiscoveredLabelerDeviceBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_popup_discovered_labeler_device, container,false) binding = FragmentPopupDiscoveredLabelerDeviceBinding.bind(view) bindBluetoothService() // Register Listener BluetoothSDKListenerHelper.registerBluetoothSDKListener(requireContext(), mBluetoothListener) return view } /** * Bind Bluetooth Service */ private fun bindBluetoothService() { // Bind to LocalService Intent( requireActivity().applicationContext, BluetoothSDKService::class.java ).also { intent -> requireActivity().applicationContext.bindService( intent, connection, Context.BIND_AUTO_CREATE ) } } /** * Handle service connection */ private val connection = object : ServiceConnection { override fun onServiceConnected(className: ComponentName, service: IBinder) { val binder = service as BluetoothSDKService.LocalBinder mService = binder.getService() } override fun onServiceDisconnected(arg0: ComponentName) { } } private val mBluetoothListener: IBluetoothSDKListener = object : IBluetoothSDKListener { override fun onDiscoveryStarted() { } override fun onDiscoveryStopped() { } override fun onDeviceDiscovered(device: BluetoothDevice?) { } override fun onDeviceConnected(device: BluetoothDevice?) { // Do stuff when is connected } override fun onMessageReceived(device: BluetoothDevice?, message: String?) { } override fun onMessageSent(device: BluetoothDevice?) { } override fun onError(message: String?) { } } override fun onDestroy() { super.
onDestroy() // Unregister Listener BluetoothSDKListenerHelper.unregisterBluetoothSDKListener(requireContext(), mBluetoothListener) } }
Теперь наш фрагмент может быть запущен для событий, полученных BroadcastListener
, который передает их через обратные вызовы в интерфейс нашего фрагмента. Чего теперь не хватает? Ну, важная часть: сервис Bluetooth!
4) Определите сервис Bluetooth
А теперь самая сложная часть — Bluetooth Service. Мы собираемся определить класс, расширяющий Service
, в котором мы определим функции, позволяющие привязывать Service и управлять потоками Bluetooth-соединения:
class BluetoothSDKService : Service() { // Service Binder private val binder = LocalBinder() // Bluetooth stuff private lateinit var bluetoothAdapter: BluetoothAdapter private lateinit var pairedDevices: MutableSet<BluetoothDevice> private var connectedDevice: BluetoothDevice? = null private val MY_UUID = "..." private val RESULT_INTENT = 15 // Bluetooth connections private var connectThread: ConnectThread? = null private var connectedThread: ConnectedThread? = null private var mAcceptThread: AcceptThread? = null // Invoked only first time override fun onCreate() { super.onCreate() bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() } // Invoked every service star override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { return START_STICKY } /** * Class used for the client Binder. */ inner class LocalBinder : Binder() { /* Function that can be called from Activity or Fragment */ } /** * Broadcast Receiver for catching ACTION_FOUND aka new device discovered */ private val discoveryBroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { /* Our broadcast receiver for manage Bluetooth actions */ } } private inner class AcceptThread : Thread() { // Body } private inner class ConnectThread(device: BluetoothDevice) : Thread() { // Body } @Synchronized private fun startConnectedThread( bluetoothSocket: BluetoothSocket?, ) { connectedThread = ConnectedThread(bluetoothSocket!!) connectedThread!!.
start() } private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() { // Body } override fun onDestroy() { super.onDestroy() try { unregisterReceiver(discoveryBroadcastReceiver) } catch (e: Exception) { // already unregistered } } override fun onBind(intent: Intent?): IBinder? { return binder } private fun pushBroadcastMessage(action: String, device: BluetoothDevice?, message: String?) { val intent = Intent(action) if (device != null) { intent.putExtra(BluetoothUtils.EXTRA_DEVICE, device) } if (message != null) { intent.putExtra(BluetoothUtils.EXTRA_MESSAGE, message) } LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent) } }
Чтобы сделать суть более читабельной, я закомментировал части о потоках, которые вы можете получить из официальной документации.
Как вы видите, в LocalBinder
можно определить функции, которые будут видны действиям после привязки к ним. Например, мы можем определить функции для операций обнаружения, отправки сообщения или соединения, которые затем будут выполняться операции внутри сервиса.
/** * Class used for the client Binder. */ inner class LocalBinder : Binder() { /** * Enable the discovery, registering a broadcastreceiver {@link discoveryBroadcastReceiver} * The discovery filter by LABELER_SERVER_TOKEN_NAME */ public fun startDiscovery(context: Context) { val filter = IntentFilter(BluetoothDevice.ACTION_FOUND) filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED) registerReceiver(discoveryBroadcastReceiver, filter) bluetoothAdapter.startDiscovery() pushBroadcastMessage(BluetoothUtils.ACTION_DISCOVERY_STARTED, null, null) } /** * stop discovery */ public fun stopDiscovery() { bluetoothAdapter.cancelDiscovery() pushBroadcastMessage(BluetoothUtils.ACTION_DISCOVERY_STOPPED, null, null) } // other stuff }
Затем в потоках, управляющих сокетами, вы можете использовать функцию pushBroadcastMessage()
для генерации событий и добавления информационного наполнения, такого как удаленное устройство и сообщение. Например:
private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() { private val mmInStream: InputStream = mmSocket.inputStream private val mmOutStream: OutputStream = mmSocket.outputStream private val mmBuffer: ByteArray = ByteArray(1024) // mmBuffer store for the stream override fun run() { var numBytes: Int // bytes returned from read() // Keep listening to the InputStream until an exception occurs. while (true) { // Read from the InputStream. numBytes = try { mmInStream.read(mmBuffer) } catch (e: IOException) { pushBroadcastMessage( BluetoothUtils.ACTION_CONNECTION_ERROR, null, "Input stream was disconnected" ) break } val message = String(mmBuffer, 0, numBytes) // Send to broadcast the message pushBroadcastMessage( BluetoothUtils.ACTION_MESSAGE_RECEIVED, mmSocket.remoteDevice, message ) } } // Call this from the main activity to send data to the remote device. fun write(bytes: ByteArray) { try { mmOutStream.write(bytes) // Send to broadcast the message pushBroadcastMessage( BluetoothUtils.ACTION_MESSAGE_SENT, mmSocket.remoteDevice, null ) } catch (e: IOException) { pushBroadcastMessage( BluetoothUtils.
ACTION_CONNECTION_ERROR, null, "Error occurred when sending data" ) return } } // Call this method from the main activity to shut down the connection. fun cancel() { try { mmSocket.close() } catch (e: IOException) { pushBroadcastMessage( BluetoothUtils.ACTION_CONNECTION_ERROR, null, "Could not close the connect socket" ) } } }
Мы закончили!
Заключение
Мы видели, как из нашей активности можем связать сервис Bluetooth (1), который выполняет и управляет операциями Bluetooth. В нем мы можем запускать многоадресное событие (broadcast event) (2), которые получает Bluetooth-приемник. Получив их, Bluetooth-приемник, в свою очередь, вызывает функцию интерфейса, реализованную (4) в нашей активности, зарегистрированной на bluetooth-приемник(3)
Мой совет — всегда следовать официальному руководству и рекомендациям по написанию чистого кода.
Материал подготовлен в рамках специализации «Android Developer».
Всех желающих приглашаем на двухдневный онлайн-интенсив «Делаем мобильную мини-игру за 2 дня». За 2 дня вы сделаете мобильную версию PopIt на языке Kotlin. В приложении будет простая анимация, звук хлопка, вибрация, таймер как соревновательный элемент. Интенсив подойдет для тех, кто хочет попробовать себя в роли Android-разработчика. >> РЕГИСТРАЦИЯ
Настольный телефон Yealink SIP-T58A, цветной сенсорный экран, Android, WiFi, Bluetooth, GigE, без CAM50, без БП
Характеристики
Производитель | Yealink |
Артикул производителя | SIP-T58A |
Функции телефона: 1 | |
Функции телефона: | |
16 SIP-аккаунтов | ✔ |
Удержание, отключение микрофона, DND («Не беспокоить») | ✔ |
Быстрый набор, горячая линия | ✔ |
Переадресация, режим ожидания, трансфер | ✔ |
Групповое прослушивание, SIP SMS, экстренные вызовы | ✔ |
5-сторонняя аудиоконференция или смешанная конференция (10-сторонняя доступна в версии ПО v85 и выше) | ✔ |
3-сторонняя видеоконференция | ✔ |
Выбор мелодии/загрузка/удаление | ✔ |
Настройка времени: автоматически или вручную | ✔ |
Правила набора, XML-браузер, Action URL/URI | ✔ |
RTCP-XR, VQ-RTCPXR | ✔ |
USB-порт сверху для подключения камеры CAM50 | ✔ |
USB-порт сзади для | |
Встроенный Bluetooth 4.![]() | |
Получение изображения из URL-адреса, содержащегося в сообщении INVITE (доступно в версии ПО v85 и выше) | ✔ |
Звуковое оповещение о потере сети (доступно в версии ПО v85 и выше) | ✔ |
Работа в качестве базовой станции через DECT USB Dongle DD10K с трубками Yealink W56H, W53H (также CP930W и W41P, доступно в версии ПО v85 и выше) | ✔ |
Проводное подключение к сети Wi-Fi для компьютера подключенного в PC порт телефона (доступно в версии ПО v85 и выше) | ✔ |
Функция беспроводной точки доступа (доступно в версии ПО v85 и выше) | ✔ |
Загрузка записей разговора на удаленное хранилище (доступно в версии ПО v85 и выше) | ✔ |
Отключение звука видеозвонка при интеркоме и автоответе (доступно в версии ПО v85 и выше) | ✔ |
Экран и индикаторы: | |
Цветной 7″ сенсорный экран с разрешением 1024х600 | ✔ |
Регулируемый угол наклона экрана | ✔ |
LED-индикатор питания и MWI | ✔ |
Индикаторы состояния линий с красно-зеленой подсветкой | ✔ |
Обои рабочего стола | ✔ |
Поддержка нескольких языков | ✔ |
Caller ID с именем и номером | ✔ |
Энергосбережение | ✔ |
Скринсейвер | ✔ |
Индикация непрочитанных голосовых сообщений, и их количества на BLF клавишах (доступно в версии ПО v85 и выше) | ✔ |
Функциональные кнопки: | |
Клавиатура с английскими буквами | ✔ |
27 экранных кнопок с возможностью программирования | ✔ |
Клавиши регулировки громкости | ✔ |
7 функциональных клавиш: удержание, гарнитура, повторный набор номера, громкая связь, голосовая почта, вкл/откл микрофона | ✔ |
Кодеки и настройки голоса: | |
HD voice, HAC | ✔ |
Технология подавления фонового шума Acoustic Shield | ✔ |
Широкополосные кодеки: G.![]() | ✔ |
Кодеки: G.711 (A/u), G.723, G.729AB, G.726, iLBC | ✔ |
DTMF: In-band, Out-of-band (RFC2833), SIP INFO | ✔ |
Full-duplex (полнодуплексная) громкая связь с AEC (подавление эха) | ✔ |
VAD (обнаружение активности голоса), CNG (генератор комфортного шума), AEC (подавление эха), PLC (маркирование потери пакета с медиа-данными), AJB (адаптивный буфер для голосовых пакетов), AGC (автоматическая регулировка чувствительности микрофона) | ✔ |
Smart Noise Filter (Умная фильтрация шума) (доступно в версии ПО v85 и выше) | ✔ |
Видео (при установке камеры CAM50): | |
720p30fps Full-HD Видеовызов | ✔ |
Кодеки: H.264 High Profile, H.264, VP8 | ✔ |
Камера 2 МП со шторкой и световым индикатором | ✔ |
Поле обзора по горизонтали: 70.2° | ✔ |
Поле обзора по вертикали: 50° | ✔ |
Кнопка быстрого включения изображения с камеры | ✔ |
Записные книги: | |
Локальная записная книга до 1000 контактов | ✔ |
Черный список | ✔ |
Удаленная записная книга XML, LDAP | ✔ |
Интеллектуальный поиск | ✔ |
Поиск по записным книгам, импорт/экспорт локальной записной книги | ✔ |
История вызовов: набранные/принятые/пропущенные/переадресованные | ✔ |
Интеграция с IP-АТС | |
Анонимный вызов, отклонение анонимных вызовов | ✔ |
BLF | ✔ |
BLA | ✔ |
Hot-desking, экстренный вызов, интерком, paging, music on hold, напоминание | ✔ |
MWI, напоминание, запись разговора | ✔ |
Голосовая почта, парковка вызова, захват вызова | ✔ |
Управление: | |
Android 5.![]() | ✔ |
Настройка телефона: веб-интерфейс/экран телефона/Autoprovision | ✔ |
FTP/TFTP/HTTP/HTTPS/PnP Autoprovision | ✔ |
Zero-sp-touch, TR069 | ✔ |
Блокировка клавиатуры | ✔ |
Сброс к настройкам по умолчанию, перезагрузка | ✔ |
Логи: PCAP Trace, system log | ✔ |
Администратор может устанавливать/удалять приложения | ✔ |
AutoProvision по PIN-коду (доступно в версии ПО v85 и выше) | ✔ |
Сетевые характеристики и безопасность: | |
SIPv1 (RFC2543), SIPv2 (RFC3261) | ✔ |
NAT, STUN | ✔ |
Способы вызова: Proxy и peer-to-peer (по IP-адресу) | ✔ |
Получение IP: Статический/DHCP | ✔ |
HTTP/HTTPS-сервер | ✔ |
Синхронизация времени и даты через SNTP | ✔ |
UDP/TCP/DNS-SRV (RFC3263) | ✔ |
QoS: 802.![]() | ✔ |
Поддержка TLS | ✔ |
Управление HTTPS-сертификатами | ✔ |
AES шифрование конфигурационных файлов | ✔ |
Поддержка стандартов шифрования и идентификации (MD5 и MD5-sess) | ✔ |
SRTP (Внимание! В продуктах, предназначенных для стран-участников Таможенного Союза, данный функционал отсутствует) | ✔ |
Поддержка IEEE802.1X | ✔ |
Поддержка IPv6 | ✔ |
LLDP/CDP/DHCP VLAN | ✔ |
Физические характеристики: | |
Крепление к стене | ✔ |
2хRJ45 Ethernet-порта 10/100/1000Мбит/с | ✔ |
POE (IEEE 802.3af), class 3 | ✔ |
Встроенный Wi-Fi (2.4GHz, 802.11b/g/n) | ✔ |
Разъем для замка | ✔ |
1xUSB-порт сверху для CAM50 | ✔ |
1xUSB-порт сзади | ✔ |
1хRJ9 для подключения трубки | ✔ |
1хRJ9 для подключения гарнитуры | ✔ |
1 x RJ12 EXT-порт | ✔ |
Блок питания | Вход 100-240V AC, Выход 5V, 2А |
Потребление через блок питания | 1.![]() |
Потребление через POE | 2.3 — 6.0W |
Размеры (Ш*Г*В*Т) | 259.4мм*220мм*215мм*42.6мм |
Рабочая влажность | 10~95% |
Рабочая температура | -10~40°C |
Гарантия | 18 месяцев |
Комплектация
Yealink SIP-T58A – 1 шт. | ✔ |
Сетевой кабель Ethernet – 1 шт. | ✔ |
Телефонная трубка – 1 шт. | ✔ |
Шнур для подключения трубки RJ9 – 1 шт. | ✔ |
Подставка – 1 шт. | ✔ |
Краткое руководство – 1 шт. | ✔ |
Гарантийный талон – 1 шт. | ✔ |
Упаковка
Размеры индивидуальной упаковки, мм | 324*293*128 |
Вес индивидуальной упаковки, кг | 1.![]() |
Размеры коробки, мм | 680*303*332 |
Количество штук в коробке | 5 |
Вес брутто коробки, кг | 10.4 |
Объём коробки, куб.м | 0.07 |
BluetoothAdapter.LeScanCallback | Интерфейс обратного вызова, используемый для доставки результатов сканирования LE. |
Профиль Bluetooth | Общедоступные API для профилей Bluetooth. |
BluetoothProfile.ServiceListener | Интерфейс для уведомления IPC-клиентов BluetoothProfile, когда они
был подключен или отключен от услуги.![]() |
BluetoothA2dp | Этот класс предоставляет общедоступные API для управления Bluetooth A2DP. профиль. |
Адаптер Bluetooth | Представляет адаптер Bluetooth локального устройства. |
BluetoothAssignedNumbers | Назначенные номера Bluetooth. |
Класс Bluetooth | Представляет класс Bluetooth, описывающий общие характеристики и возможности устройства. |
Класс Bluetooth.Устройство | Определяет все константы класса устройств. |
BluetoothClass.![]() | Определяет все основные константы класса устройств. |
BluetoothClass.Service | Определяет все константы класса обслуживания. |
BluetoothCodecConfig | Представляет конфигурацию кодека для исходного устройства Bluetooth A2DP. |
BluetoothCodecConfig.Builder | Построитель для BluetoothCodecConfig . |
BluetoothCodecStatus | Представляет состояние кодека (конфигурация и возможности) для Bluetooth. Исходное устройство A2DP. |
BluetoothCodecStatus.![]() | Построитель для BluetoothCodecStatus . |
BluetoothCsipSetCoordinator | Этот класс предоставляет общедоступные API для управления координатором набора Bluetooth CSIP. |
Устройство Bluetooth | Представляет удаленное устройство Bluetooth. |
BluetoothGatt | Общедоступный API для профиля Bluetooth GATT. |
BluetoothGattCallback | Этот абстрактный класс используется для реализации обратных вызовов BluetoothGatt . |
BluetoothGattХарактеристика | Представляет характеристику Bluetooth GATT Характеристика ГАТТ — это базовый элемент данных, используемый для создания услуги ГАТТ, |
Дескриптор BluetoothGatt | Представляет дескриптор Bluetooth GATT Дескрипторы GATT содержат дополнительную информацию и атрибуты GATT
характеристика, |
BluetoothGattServer | Общедоступный API для роли сервера профиля Bluetooth GATT. |
BluetoothGattServerCallback | Этот абстрактный класс используется для реализации обратных вызовов BluetoothGattServer . |
BluetoothGattService | Представляет службу Bluetooth GATT. Gatt Service содержит набор |
Гарнитура Bluetooth | Общедоступный API для управления службой Bluetooth Headset. |
BluetoothHealth | Этот класс устарел
на уровне API 29.
Профиль устройства работоспособности (HDP) и протокол MCAP больше не используются. Новые приложения
следует использовать решения на основе Bluetooth с низким энергопотреблением, такие как BluetoothGatt , BluetoothAdapter#listenUsingL2capChannel() , или BluetoothDevice#createL2capChannel(int) |
BluetoothHealthAppConfiguration | Этот класс устарел
на уровне API 29.
Профиль устройства работоспособности (HDP) и протокол MCAP больше не используются.![]() BluetoothGatt , BluetoothAdapter#listenUsingL2capChannel() , или BluetoothDevice#createL2capChannel(int) |
BluetoothHealthCallback | Этот класс устарел
на уровне API 29.
Профиль устройства работоспособности (HDP) и протокол MCAP больше не используются. Новый
приложения должны использовать решения на основе Bluetooth с низким энергопотреблением, такие как BluetoothGatt , BluetoothAdapter#listenUsingL2capChannel() или BluetoothDevice#createL2capChannel(int) |
Слуховой аппарат Bluetooth | Этот класс предоставляет общедоступные API для управления профилем слухового аппарата.![]() |
BluetoothHidDevice | Предоставляет общедоступные API для управления профилем устройства Bluetooth HID. |
BluetoothHidDevice.Callback | Класс шаблона, который приложения используют для вызова функций обратного вызова для событий из HID. хозяин. |
BluetoothHidDeviceAppQosSettings | Представляет параметры качества обслуживания (QoS) для приложения Bluetooth HID Device. |
BluetoothHidDeviceAppSdpSettings | Представляет параметры протокола обнаружения служб (SDP) для приложения Bluetooth HID Device. |
BluetoothLeAudio | Этот класс предоставляет общедоступные API для управления профилем LeAudio.![]() |
BluetoothLeAudioCodecConfig | Представляет конфигурацию кодека для устройства-источника Bluetooth LE Audio. |
BluetoothLeAudioCodecConfig.Builder | Построитель для BluetoothLeAudioCodecConfig . |
BluetoothLeAudioCodecStatus | Представляет состояние кодека (конфигурация и возможности) для Bluetooth. Источник Le Audio. |
Диспетчер Bluetooth | Менеджер высокого уровня, используемый для получения экземпляра BluetoothAdapter и осуществлять общее управление Bluetooth. |
BluetoothServerSocket | Bluetooth-разъем для прослушивания.![]() |
BluetoothSocket | Подключенный или подключаемый разъем Bluetooth. |
Коды состояния Bluetooth | Класс с константами, представляющими возможные возвращаемые значения для API Bluetooth. |
Bluetooth с низким энергопотреблением | Разработчики Android
Android обеспечивает встроенную поддержку платформы Bluetooth с низким энергопотреблением (BLE) в центральную роль и предоставляет API-интерфейсы, которые приложения могут использовать для обнаружения устройств, запроса услуги и передавать информацию.
Общие варианты использования включают следующее:
- Передача небольших объемов данных между соседними устройствами.
- Взаимодействие с датчиками приближения для предоставления пользователям индивидуального опыта на основе
на их текущем местоположении.
903:00
В отличие от классического Bluetooth, BLE предназначен для значительно более низкого энергопотребления. Это позволяет приложениям обмениваться данными с устройствами BLE, которые имеют более строгие требования к питанию, например датчики приближения, пульсометры и фитнес-устройства.
Внимание: Когда пользователь подключает свое устройство к другому устройству с помощью BLE данные, которые передаются между двумя устройствами, доступны для все приложений на устройстве пользователя.
По этой причине, если ваше приложение собирает конфиденциальные данные, вам следует реализовать безопасность на уровне приложения для защиты конфиденциальности этих данных.
Основы
Чтобы устройства с поддержкой BLE могли передавать данные между собой, они должны сначала
образуют канал связи. Использование API Bluetooth LE требует от вас
объявить несколько разрешений
в вашем файле манифеста. Как только ваше приложение получит разрешение на использование Bluetooth, ваше приложение
необходимо получить доступ к
BluetoothAdapter
и определить, доступен ли Bluetooth
на устройстве. Если Bluetooth
доступен, устройство будет сканировать близлежащие BLE
устройства. Как только устройство
обнаружены, возможности устройства BLE обнаруживаются путем подключения к
GATT-сервер на BLE
устройство. Когда
установлено соединение, данные могут быть переданы с помощью подключенного
устройство на основе имеющихся
услуги и характеристики.
Ключевые термины и понятия
Ниже приводится сводка основных терминов и понятий BLE:
- Общий профиль атрибутов (GATT)
- Профиль GATT — это общая спецификация для отправки и получения коротких
фрагменты данных, известные как «атрибуты» по ссылке BLE. Все текущие BLE
профили приложений основаны на GATT. Обзор Android BluetoothLeGatt
образец
на GitHub, чтобы узнать больше.
- Профили
- Bluetooth SIG определяет многие профили для BLE-устройств. Профиль — это спецификация того, как устройство работает в конкретное приложение. Обратите внимание, что устройство может реализовывать более одного профиль. Например, устройство может содержать пульсометр и детектор уровня заряда батареи.
- Протокол атрибутов (ATT)
- GATT построен на основе протокола атрибутов (ATT). Это также упоминается как ГАТТ/АТТ. ATT оптимизирован для работы на устройствах BLE. Для этого он использует как как можно меньше байт. Каждый атрибут однозначно идентифицируется универсальным Уникальный идентификатор (UUID), который представляет собой стандартизированный 128-битный формат строки. ID, используемый для уникальной идентификации информации. атрибуты перевезены АТТ форматируются как характеристики и услуги .
- Характеристика
- Характеристика содержит одно значение и 0-n дескрипторов, описывающих
значение характеристики.
Характеристика может рассматриваться как тип, по аналогии с классом.
- Дескриптор
- Дескрипторы — это определенные атрибуты, описывающие значение характеристики. Для например, дескриптор может указывать удобочитаемое описание, допустимый диапазон для значения характеристики или единица измерения, зависит от значения характеристики.
- Служба
- Служба представляет собой набор характеристик. Например, у вас может быть служба под названием «Монитор сердечного ритма», которая включает в себя такие характеристики, как «измерение пульса». Вы можете найти список существующих профилей на основе GATT и услуги на bluetooth.org.
Роли и обязанности
При взаимодействии устройства с BLE-устройство:
Центральный или периферийный. Это относится к самому соединению BLE. устройство в центральной роли сканирует в поисках рекламы, а устройство в второстепенную роль играет реклама.
Сервер GATT по сравнению с клиентом GATT. Это определяет, как два устройства разговаривают друг с другом. другой, как только они установили соединение. Чтобы понять различие, представьте, что у вас есть телефон Android и трекер активности, который является BLE устройство. Телефон поддерживает центральную роль; Трекер активности поддерживает периферийная роль. Чтобы установить соединение BLE, вам понадобится по одному из каждого — два вещи, поддерживающие только периферийные устройства, не могли разговаривать друг с другом, равно как и два вещи, которые поддерживают только центральные.
После того, как телефон и трекер активности установили соединение, они
начать передачу метаданных ГАТТ друг другу. В зависимости от вида данных
они передаются, один или другой может действовать как сервер. Например, если
трекер активности хочет передать данные датчиков на телефон, это может иметь смысл
чтобы трекер активности выступал в роли сервера. Если трекер активности хочет
получать обновления с телефона, то телефон может иметь смысл
выступать в роли сервера.