Bluetooth не может найти пользовательский UUID службы в запросе SDP - PullRequest
0 голосов
/ 30 июня 2018

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

private val scanReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == BluetoothDevice.ACTION_FOUND) {
            val dev = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
            Log.d(TAG, "Got device ${dev.name} with address ${dev.address}")
            if (dev.name != null) {
                Log.d(TAG, "Found nonnull device name, adding")
                if (!viewAdapter.dataset.any { it.name == dev.name }) {
                    viewAdapter.dataset.add(dev)
                    viewAdapter.notifyDataSetChanged()
                }
            }
        }
    }
}

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

private val scanReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        when (intent.action) {
            BluetoothDevice.ACTION_FOUND -> {
                val dev = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
                Log.d(TAG, "Got device ${dev.name} with address ${dev.address}")
                if (dev.name != null) {
                    dev.fetchUuidsWithSdp()
                }
            }

            //TODO: Untested code
            BluetoothDevice.ACTION_UUID -> {
                val id = intent.getParcelableExtra<ParcelUuid>(BluetoothDevice.EXTRA_UUID)
                if (id.uuid == ShareServerSocket.SERVICE_UUID) {
                    val dev = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
                    if (!viewAdapter.dataset.any { it.name == dev.name }) {
                        viewAdapter.dataset.add(dev)
                        viewAdapter.notifyDataSetChanged()
                    }
                }
            }
        }
    }
}

(С необходимыми изменениями IntentFilter я регистрирую его).

Код в новой ветви вызывается, я подтвердил это с некоторыми результатами отладки. Однако ParcelUuid[], который мне дают, никогда не содержит UUID моего сервиса, и поэтому устройство никогда не добавляется. Если я сохраню все настройки на устройстве, действующем в качестве сервера, и пропущу новую проверку на клиенте, я смогу нормально подключаться и взаимодействовать. Я не уверен, почему моя служба не будет показана в этот момент.

P.S. Я также проверил кэш SDP, моего UUID службы тоже нет.

1 Ответ

0 голосов
/ 17 июля 2018

Оказывается, я столкнулся с той же проблемой, что и описанная в Странное обращение UUID из fetchUuidsWithSdp . Кража этого обходного пути заставила его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...