我是Kotlin和Android的新手。 我需要编写一个应用程序来查找特定的外围设备,连接到它并写入特征。
我可以找到它,我正在连接它并寻找服务。
然而,我似乎无法发现一个特征。
代码:
override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
super.onServicesDiscovered(gatt, status)
mClientActionListener.log("** Made it to onServicesDiscovered")
if (status != BluetoothGatt.GATT_SUCCESS) {
mClientActionListener.log("Device service discovery unsuccessful, status $status")
return
}
mClientActionListener.log("BLE Service status: $status. What we are looking for: $gatt")
val matchingCharacteristics = bluetoothUtils.findCharacteristics(gatt)
...
fun findCharacteristics(bluetoothGatt: BluetoothGatt): List<BluetoothGattCharacteristic> {
Log.i(TAG_BLEUTIL, "** Made it to findCharacteristics")
val matchingCharacteristics = ArrayList<BluetoothGattCharacteristic>()
val serviceList = bluetoothGatt.services
Log.i(TAG_BLEUTIL, "** serviceList: $serviceList")
val characteristics = bluetoothGatt.readCharacteristic(serviceList[1].characteristics[0])
Log.i(TAG_GATT_CALLBACK, "** Characteristics: $characteristics")
val service = findService(serviceList) ?: return matchingCharacteristics
val characteristicList = service.characteristics
Log.i(TAG_BLEUTIL, "characterList: $characteristicList")
for (characteristic in characteristicList) {
matchingCharacteristics.add(characteristic)
}
Log.i(TAG_BLEUTIL, "Characteristics: $matchingCharacteristics")
return matchingCharacteristics
}
来自典型运行的日志:
... D/PairState: Device004
... I/PairState: 00:23:A7:FD:2B:B1
... D/BluetoothAdapter: isLeEnabled(): ON
... I/PairState: ** Connecting to VQpa004
... I/BleService: Connecting to 00:23:A7:FD:2B:B1D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=7 device=00:23:A7:FD:2B:B1
... I/BleService: onConnectionStateChange newState: 2
... D/BleGattServerCallback: onConnectionStateChange newState: 2
... I/BleService: Connected to device 00:23:A7:FD:2B:B1
... D/BleGattServerCallback: BluetoothProfile.STATE_CONNECTED: 0
... D/BluetoothGatt: discoverServices() - device: 00:23:A7:FD:2B:B1
... D/BluetoothGatt: onConnectionUpdated() - Device=00:23:A7:FD:2B:B1 interval=6 latency=0 timeout=500 status=0
... D/BluetoothGatt: onSearchComplete() = Device=00:23:A7:FD:2B:B1 Status=0
... I/BleService: ** Made it to onServicesDiscovered
... I/BleService: BLE Service status: 0. What we are looking for: android.bluetooth.BluetoothGatt@9917c65
... I/BluetoothUtils: ** Made it to findCharacteristics
... I/BluetoothUtils: ** serviceList: [android.bluetooth.BluetoothGattService@1f6ed3a, android.bluetooth.BluetoothGattService@746ddeb, android.bluetooth.BluetoothGattService@f8c4748]
... I/BleGattServerCallback: ** Characteristics: false
... I/BluetoothUtils: ** Made it to findService
... D/BluetoothGatt: onConnectionUpdated() - Device=00:23:A7:FD:2B:B1 interval=36 latency=0 timeout=500 status=0
根据我在文档中的理解以及其他一些(面向Java的)帖子,这些代码应该正常工作。但我没有想法。
感谢您的帮助。如果有帮助,我很乐意提供更多代码。
由于
答案 0 :(得分:0)
确定。主要问题是我期待Android BLE libs / flow与iOS类似。
在Android上执行BLE时要记住的一些事情要解决我的问题:
e.g。
for (characteristic in matchingCharacteristics) {
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT)
enableCharacteristicNotification(gatt, characteristic)
}
这是一种非典型用途,但基本原则是:一旦获得服务,您就会传递GATT配置文件,其中包含所有服务,特征和描述符。从那里你可以直接操作所有这些,而无需进一步发现。有关找到服务后BluetoothGattCharacteristic可用的功能,请参阅Android文档。
我上面用来获取服务的行: mClientActionListener.log(&#34; BLE服务状态:$ status。我们在寻找什么:$ gatt&#34;) 实际上是回送了特征而不是服务。这让我很困惑,因为我再次测试的BLE外设只有一个服务和三个与之相关的特性。但事实上我们在提取信息的时候在onServicesDiscovered中,而且事实上我没有发现gatt对象实际上是GATT配置文件,其中包含的内容比服务更多,而且语法让我觉得我应该只期待那时的服务 **请记住:当您在onServicesDiscovered时,您会将GATT对象中的所有内容传回给您。
有些功能可以让您从中发现特征和其他信息。但是,它们用于提供信息。他们不再让你接触这些特征或描述符。
我让你决定这是不是一个很好的方法来做一些异步和一点点的枪支和威士忌&#34;首先。但它与Android的方式相同。
代码清洁。代码聪明。