- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题总结和背景
作为大学项目的一部分,我们需要使用自定义应用程序连接到蓝牙 LE 模块 (BL654) 以更新特性。
问题是,如果不先做一个变通办法,我就无法连接到我们的模块。我能够毫无问题地搜索设备,并且我们的模块显示在搜索中。我希望该应用不必依赖其他应用即可正常运行。
在手机(Pixel 3XL/Pixel 3/LG G5)的干净启动和干净操作系统安装中,我无法连接到我们的模块。但是,我能够连接到其他 BLE 设备,例如 Raspberry Pi 和 HTV Vive 基站。
我在 Android Studio Logcat 中收到的错误是:
D/BluetoothGatt: onClientConnectionState() - status=133 clientIf=7 device=C2:A1:E0:B3:69:54
然后使用 nRF Connect 连接到不同设备后,我就可以连接到我们在 nRF Connect 中的模块,然后连接到我应用程序中的模块。 Nordic 制作在电路板上运行的固件和 nRF Connect。这让我相信两者之间正在发生一些特别的事情?
我正在使用标准的 Android 库建立连接,也尝试过使用 RxAndroidBle。
我已经研究了将近一个月关于这个错误和可能的解决方案,但无法解决它。任何指导将不胜感激。
这是一个Logcat失败的连接尝试。这是一个 Logcat使用变通方法后成功连接尝试。
下面我将展示相关代码的 fragment 。如果需要更多代码,我很乐意分享。
代码 fragment
我在 Kotlin 类文件和 MainActivity.kt 之间进行了代码拆分,据我所知,我在这两个文件之间传递了所有正确的参数。我是 Kotlin 的初学者,所以尽量放轻松 ;)
查找蓝牙设备(在 mBluetoothLEAdapter.kt 中):
fun findBluetoothDevices(mBluetoothAdapter: BluetoothAdapter?){
// Get and instance of the Bluetooth Low Energy Scanner
scanner = mBluetoothAdapter?.bluetoothLeScanner
// Create search settings object
val mSettings = ScanSettings.Builder().
setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).
setReportDelay(reportDelay).
build()
// Create a scanning filter
val mFilter = ScanFilter.Builder().setDeviceName("AEsir ADC Test").build()
val scannerFilter = arrayListOf<ScanFilter>()
scannerFilter.add(mFilter)
// Stop previous scan if there was one
stopScanningBluetoothDevices()
//Start new scanner
tools.showToast("Scanning...")
scanner?.startScan(null, mSettings, mCallback)
}
扫描回调(在 mBluetoothLEAdapter.kt 内部):
inner class MCallBack: ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult?) {
super.onScanResult(callbackType, result)
stopScanningBluetoothDevices()
tools.showToast("Single Result Found!")
}
override fun onScanFailed(errorCode: Int) {
super.onScanFailed(errorCode)
stopScanningBluetoothDevices()
tools.showToast("Error on Scan!")
tools.showToast(errorCode.toString())
}
override fun onBatchScanResults(results: MutableList<ScanResult>?) {
super.onBatchScanResults(results)
stopScanningBluetoothDevices()
tools.showToast("Batch Results Found!")
scanResults = results
val mAdapter = DeviceListAdapter(activity, scanResults)
val deviceList = activity.findViewById<ListView>(R.id.device_list)
deviceList.adapter = mAdapter
}
}
连接到设备(在 MainActivity.kt 中):
// Runs when an item in the Device List is pressed.
// This initiates a GATT connection to the selected device.
override fun onListPressed(): AdapterView.OnItemClickListener? {
return AdapterView.OnItemClickListener { parent, _, position, _ ->
if (bluetoothGatt != null) {
bluetoothGatt?.disconnect()
bluetoothGatt?.close()
}
val clickedItem = parent.getItemAtPosition(position) as ScanResult
//val device = clickedItem.device
val address = clickedItem.device.address
tools.showToast("Connecting to: $address")
// CONNECTION NOT WORKING. HAVE TO USE nRF Connect to make it work
bluetoothGatt = clickedItem.device.connectGatt(applicationContext, false, mGattCallback, BluetoothDevice.TRANSPORT_LE)
}
}
GattCallback(在 MainActivity.kt 中):
inner class GattCallback : BluetoothGattCallback() {
override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
super.onConnectionStateChange(gatt, status, newState)
//If we connected to the GATT server find services on device
if (status == BluetoothGatt.GATT_SUCCESS) {
gatt.discoverServices()
}
else if (status == BluetoothGatt.STATE_CONNECTING) {
tools.showToast("Connecting I am")
}
else if (status == BluetoothGatt.STATE_DISCONNECTED) {
bluetoothGatt?.close()
bluetoothGatt = null
tools.showToast("I got here and closed the connection")
}
}
override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
super.onServicesDiscovered(gatt, status)
bluetoothServices = gatt?.services
}
override fun onCharacteristicChanged(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
//"Notification"
}
override fun onCharacteristicWrite(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?, status: Int) {
super.onCharacteristicWrite(gatt, characteristic, status)
//Confirm that the characteristic was actually changed
tools.showToast("Characteristic was written!")
}
override fun onCharacteristicRead(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, status: Int) {
}
override fun onDescriptorRead(gatt: BluetoothGatt, descriptor: BluetoothGattDescriptor, status: Int) {
}
}
Thank you for any help you can offer :)
最佳答案
尝试将报告延迟设置为 0。
你的设置现在应该是这样的
val mSettings = ScanSettings.Builder().
setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).
setReportDelay(0).
build()
您还需要开始使用单个结果回调而不是 onBatchScanResults
,这将需要将结果列表存储在其他地方。
override fun onScanResult(callbackType: Int, result: ScanResult?) {
//add to the list
//adapter.notifyDataSetChanged() if needed
}
我在我的一个应用程序中遇到了这个问题,它似乎是解决方法。
如果向用户显示一个列表,这似乎会使列表更新得太快以至于无法点击,因此您可能希望添加自己的延迟更新而不使用 setReportDelay
如果这成为一个问题
关于android - 在没有使用 nRF Connect 的解决方法的情况下,无法使用自定义应用程序连接到 BLE 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58843327/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!