Android bluetooth. Bluetooth в Android: обзор, реализация и лучшие практики

Как работает 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-сервиса:

  1. Создать класс, наследующийся от Service
  2. Реализовать логику управления Bluetooth-подключением
  3. Использовать LocalBroadcastManager для отправки событий
  4. Связать сервис с активностью через 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-событий рекомендуется использовать следующий подход:

  1. Определить константы для типов событий
  2. Использовать LocalBroadcastManager для отправки событий из сервиса
  3. Создать 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-порт сзади для
  • подключения проводных и беспроводных гарнитур
  • записи разговоров на flash
  • подключения до 3 модулей расширения
  • подключение Yealink CP900/CP700 и проводной гарнитуры Yealink Uh46 (доступно в версии ПО v85 и выше)
  • использование телефона с аналоговыми линиями связи через Yealink CPN10 (доступно в версии ПО v85 и выше)
  • Встроенный Bluetooth 4. 0 для
  • подключения Bluetooth-гарнитур
  • сопряжения с мобильными устройствами
  • сопряжения и подключения двух Bluetooth устройств одновременно (доступно в версии ПО v85 и выше)
  • Получение изображения из 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. 722, G.722.1, G.722.1C, Opus
    Кодеки: 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. 1.1
    Настройка телефона: веб-интерфейс/экран телефона/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. 1p/Q tagging (VLAN), Layer 3 ToS DSCP
    Поддержка 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. 5 – 4.5W
    Потребление через POE2.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. 9
    Размеры коробки, мм 680*303*332
    Количество штук в коробке 5
    Вес брутто коробки, кг 10.4
    Объём коробки, куб.м 0.07

    андроид.блютуз | Разработчики Android

    BluetoothAdapter.LeScanCallback Интерфейс обратного вызова, используемый для доставки результатов сканирования LE.
    Профиль Bluetooth Общедоступные API для профилей Bluetooth.
    BluetoothProfile.ServiceListener Интерфейс для уведомления IPC-клиентов BluetoothProfile, когда они был подключен или отключен от услуги.
    BluetoothA2dp Этот класс предоставляет общедоступные API для управления Bluetooth A2DP. профиль.
    Адаптер Bluetooth Представляет адаптер Bluetooth локального устройства.
    BluetoothAssignedNumbers Назначенные номера Bluetooth.
    Класс Bluetooth Представляет класс Bluetooth, описывающий общие характеристики и возможности устройства.
    Класс Bluetooth.Устройство Определяет все константы класса устройств.
    BluetoothClass. Device.Major Определяет все основные константы класса устройств.
    BluetoothClass.Service Определяет все константы класса обслуживания.
    BluetoothCodecConfig Представляет конфигурацию кодека для исходного устройства Bluetooth A2DP.
    BluetoothCodecConfig.Builder Построитель для BluetoothCodecConfig .
    BluetoothCodecStatus Представляет состояние кодека (конфигурация и возможности) для Bluetooth. Исходное устройство A2DP.
    BluetoothCodecStatus. Builder Построитель для BluetoothCodecStatus .
    BluetoothCsipSetCoordinator Этот класс предоставляет общедоступные API для управления координатором набора Bluetooth CSIP.
    Устройство Bluetooth Представляет удаленное устройство Bluetooth.
    BluetoothGatt Общедоступный API для профиля Bluetooth GATT.
    BluetoothGattCallback Этот абстрактный класс используется для реализации обратных вызовов BluetoothGatt .
    BluetoothGattХарактеристика Представляет характеристику Bluetooth GATT

    Характеристика ГАТТ — это базовый элемент данных, используемый для создания услуги ГАТТ, BluetoothGattService .

    Дескриптор BluetoothGatt Представляет дескриптор Bluetooth GATT

    Дескрипторы GATT содержат дополнительную информацию и атрибуты GATT характеристика, BluetoothGattХарактеристика .

    BluetoothGattServer Общедоступный API для роли сервера профиля Bluetooth GATT.
    BluetoothGattServerCallback Этот абстрактный класс используется для реализации обратных вызовов BluetoothGattServer .
    BluetoothGattService Представляет службу Bluetooth GATT.

    Gatt Service содержит набор BluetoothGattCharacteristic , а также упомянутые услуги.

    Гарнитура Bluetooth Общедоступный API для управления службой Bluetooth Headset.
    BluetoothHealth Этот класс устарел на уровне API 29. Профиль устройства работоспособности (HDP) и протокол MCAP больше не используются. Новые приложения следует использовать решения на основе Bluetooth с низким энергопотреблением, такие как BluetoothGatt , BluetoothAdapter#listenUsingL2capChannel() , или BluetoothDevice#createL2capChannel(int)
    BluetoothHealthAppConfiguration Этот класс устарел на уровне API 29. Профиль устройства работоспособности (HDP) и протокол MCAP больше не используются. Новый приложения должны использовать решения на основе Bluetooth с низким энергопотреблением, такие как 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, вам понадобится по одному из каждого — два вещи, поддерживающие только периферийные устройства, не могли разговаривать друг с другом, равно как и два вещи, которые поддерживают только центральные.

    После того, как телефон и трекер активности установили соединение, они начать передачу метаданных ГАТТ друг другу. В зависимости от вида данных они передаются, один или другой может действовать как сервер. Например, если трекер активности хочет передать данные датчиков на телефон, это может иметь смысл чтобы трекер активности выступал в роли сервера. Если трекер активности хочет получать обновления с телефона, то телефон может иметь смысл выступать в роли сервера.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *