Как правильно работать с BLE-устройствами и читать характеристики и сервисы? Android котлинAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно работать с BLE-устройствами и читать характеристики и сервисы? Android котлин

Сообщение Anonymous »


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

Это мой код на Kotlin.
класс MainActivity : AppCompatActivity() { частный lateinit var bluetoothAdapter: BluetoothAdapter частный lateinit var deviceListView: ListView частный lateinit var scanButton: Кнопка частный lateinit var sendRequestButton: Кнопка частный val deviceList = mutableListOf() частный lateinit var deviceAdapter: ArrayAdapter частная переменная selectedDevice: BluetoothDevice? = ноль частный вар bluetoothSocket: BluetoothSocket? = ноль частная переменная bluetoothGatt: BluetoothGatt? = ноль частный var inputStream: InputStream? = ноль частный var outputStream: OutputStream? = ноль переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView (R.layout.activity_main) deviceListView = findViewById(R.id.deviceListView) scanButton = findViewById(R.id.scanButton) sendRequestButton = findViewById(R.id.sendRequestButton) val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) как BluetoothManager bluetoothAdapter = bluetoothManager.adapter deviceAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, deviceList) deviceListView.adapter = адаптер устройства запрос разрешений () scanButton.setOnClickListener { сканированиеДляУстройств() } deviceListView.setOnItemClickListener { _, _, позиция, _ -> val deviceInfo = список устройств[позиция] showPairDialog (deviceInfo) } sendRequestButton.setOnClickListener { sendUUIDRequest() } val readMeasureTypeButton = findViewById(R.id.readMeasureTypeButton) readMeasureTypeButton.setOnClickListener { readMeasureTypeCharacteristic() } } частное развлечение requestPermissions() { val PermissionToCheck = Manifest.permission.ACCESS_FINE_LOCATION если (ContextCompat.checkSelfPermission(this, PermissionToCheck) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(this, arrayOf(permissionToCheck), PERMISSION_REQUEST) } } личное развлечение scanForDevices() { если (!bluetoothAdapter.isEnabled) { val EnableBtIntent = Намерение (BluetoothAdapter.ACTION_REQUEST_ENABLE) startActivity (включитьBtIntent) возвращаться } список устройств.очистить() deviceAdapter.notifyDataSetChanged() bluetoothAdapter.startDiscovery() val deviceReceiver = объект: BroadcastReceiver() { переопределить fun onReceive(context: Context, Intent: Intent) { val действие: String = намерение.действие!! if (BluetoothDevice.ACTION_FOUND == действие) { вал устройство: BluetoothDevice = Intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)!! val deviceInfo = "${device.name ?: "Неизвестное устройство"} - ${device.address}" deviceList.add(deviceInfo) deviceAdapter.notifyDataSetChanged() } } } val filter = IntentFilter(BluetoothDevice.ACTION_FOUND) RegisterReceiver (deviceReceiver, фильтр) deviceListView.postDelayed({ bluetoothAdapter.cancelDiscovery() отменить регистрациюReceiver (deviceReceiver) Toast.makeText(this, «Обнаружение остановлено», Toast.LENGTH_SHORT).show() }, SCAN_PERIOD) } частное развлечение showPairDialog (deviceInfo: String) { val builder = AlertDialog.Builder(это) builder.setTitle("Сопряжение с устройством") builder.setMessage("Вы хотите выполнить сопряжение с $deviceInfo?") builder.setPositiveButton("Пара") { _, _ -> val deviceAddress = deviceInfo.substringAfterLast(" - ") val устройство = bluetoothAdapter.getRemoteDevice(deviceAddress) параУстройство (устройство) } builder.setNegativeButton("Отмена") { диалог, _ -> диалог.отклонить() } val диалог = builder.create() диалог.шоу() } частная забавная параDevice (устройство: BluetoothDevice) { устройство.createBond() showToast("Сопряжение с ${device.name ?: "Неизвестное устройство"}...") sendRequestButton.visibility = Просмотр.VISIBLE selectedDevice = устройство } личное развлечение sendUUIDRequest() { selectedDevice?.let { устройство -> val uuid = UUID.fromString("33810000-f565-43f3-ab47-b8777fec168a") ConnectToDevice (устройство, uuid) } ?: бегать { showToast("Устройство не выбрано.") } } частное развлечение showToast (сообщение: String) { Обработчик(Looper.getMainLooper()).post { Toast.makeText(this, message, Toast.LENGTH_SHORT).show() } } личное развлечение ConnectToDevice (устройство: BluetoothDevice, uuid: UUID) { пытаться { bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid) bluetoothSocket?.connect() showToast("Подключено к ${device.name ?: "Неизвестное устройство"}") // Используем BluetoothGatt для дальнейшей связи bluetoothGatt = bluetoothSocket?.let { сокет -> val устройство = Socket.remoteDevice устройство.connectGatt(this, false, gattCallback) } } catch (e: IOException) { showToast("Ошибка соединения: ${e.message}") Log.e("Bluetooth", "Не удалось подключиться к UUID: ${e.message}") closeBluetoothConnection() // Закрываем соединение Bluetooth при ошибке } } личное развлечение closeBluetoothConnection() { пытаться { bluetoothGatt?.disconnect() bluetoothGatt?.close() BluetoothGatt = ноль bluetoothSocket?.close() bluetoothSocket = ноль } catch (e: IOException) { Log.e("Bluetooth", "Ошибка при закрытии соединения Bluetooth: ${e.message}") } } частный val gattCallback = объект: BluetoothGattCallback() { переопределить fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) { если (newState == BluetoothProfile.STATE_CONNECTED) { showToast("Подключено к серверу GATT.") Гатт?.discoverServices() } Еще если (newState == BluetoothProfile.STATE_DISCONNECTED) { showToast("Отключение от сервера GATT.") } } переопределить fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) { если (статус == BluetoothGatt.GATT_SUCCESS) { readMeasureTypeCharacteristic() } еще { showToast("Ошибка обнаружения службы со статусом: $status") } } } личное развлечение readMeasureTypeCharacteristic() { val характеристика = bluetoothGatt?.getService(BluetoothConstants.STEREOSCANNER_SERVICE_UUID) ?.getCharacteristic(BluetoothConstants.MEASURE_TYPE_CHARACTERISTIC_UUID) Log.d("Bluetooth", "Тип меры: $characteristic") если (характеристика != ноль) { bluetoothGatt?.readCharacteristic(характеристика) } } сопутствующий объект { частная константа значение PERMISSION_REQUEST = 42 частная константа val SCAN_PERIOD: Long = 10000 } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»