我正在尝试创建一个应用程序,该应用程序可以连接并接收来自多个蓝牙低能耗设备的通知。我想知道如何实现这一目标。每个连接是否需要一个单独的线程?考虑到API的异步特性,如何确保能够按发现的顺序发现服务并设置通知。我目前使用的是此处提供的相同结构:https : //developer.android.com/guide/topics/connectivity/bluetooth-
le.html
。此设置仅用于单个连接。我将能够保持这种结构,即在BluetoothLeService类中扩展Service类并绑定到该服务。我最近发现Service类是一个单例,因此我将如何创建BluetootLeService类的不同实例并接收广播,并注册广播接收器/接收器以处理来自适当设备的更改。
我想知道如何实现
要实现多个BLE连接,您必须存储多个BluetoothGatt
对象并将这些对象用于不同的设备。要存储多个连接对象,BluetoothGatt
可以使用Map<>
private Map<String, BluetoothGatt> connectedDeviceMap;
在服务上onCreate
初始化Map
connectedDeviceMap = new HashMap<String, BluetoothGatt>();
然后,在呼叫device.connectGatt(this, false, mGattCallbacks);
连接到 GATT Server
之前,请检查该设备是否已经连接。
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(deviceAddress);
int connectionState = mBluetoothManager.getConnectionState(device, BluetoothProfile.GATT);
if(connectionState == BluetoothProfile.STATE_DISCONNECTED ){
// connect your device
device.connectGatt(this, false, mGattCallbacks);
}else if( connectionState == BluetoothProfile.STATE_CONNECTED ){
// already connected . send Broadcast if needed
}
上BluetoothGattCallback
,如果连接状态 CONNECTED
然后存储BluetoothGatt
于对象Map
,并且如果连接状态 DISCONNECTED 然后将其删除形成Map
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status,
int newState) {
BluetoothDevice device = gatt.getDevice();
String address = device.getAddress();
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "Connected to GATT server.");
if (!connectedDeviceMap.containsKey(address)) {
connectedDeviceMap.put(address, gatt);
}
// Broadcast if needed
Log.i(TAG, "Attempting to start service discovery:" +
gatt.discoverServices());
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.i(TAG, "Disconnected from GATT server.");
if (connectedDeviceMap.containsKey(address)){
BluetoothGatt bluetoothGatt = connectedDeviceMap.get(address);
if( bluetoothGatt != null ){
bluetoothGatt.close();
bluetoothGatt = null;
}
connectedDeviceMap.remove(address);
}
// Broadcast if needed
}
}
类似地,onServicesDiscovered(BluetoothGatt gatt, int status)
您BluetoothGatt
在参数上具有连接对象的方法也可以从中获取设备BluetoothGatt
。像public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)
您这样的其他回调方法将获得设备表单gatt
。
当您需要 writeCharacteristic 或 writeDescriptor时
,BluetoothGatt
从获取对象Map
并使用该BluetoothGatt
对象调用gatt.writeCharacteristic(characteristic)
gatt.writeDescriptor(descriptor)
不同的连接。
每个连接是否需要一个单独的线程?
我认为您不需要为每个连接使用单独的 线程 。只需Service
在后台线程上运行。
希望这对您有所帮助。
我想在我的Android应用程序中被动地扫描BLE广告商, 但我找不到如何做到这一点。 > < li> 根据蓝牙4.0核心规范,存在被动扫描模式。< br >第6卷:核心系统包[低能耗控制器卷],< br > D部分:4.1被动扫描< br > https://www.bluetooth.org/DocMan/handlers/DownloadDoc.ashx?doc_id=282159 “设备可
问题内容: 目前,我的连接 mongoose.js 具有以下代码: 需要连接的文件是 test.js : 如何更新mongoose.js以使用mongoose.createConnection(…)函数使用多个连接? 当我进行如下更改时,我仅从一个连接的更改开始: 我得到“未定义不是函数”。如果我使用此代码: 我收到“错误:尝试打开未关闭的连接” 有什么建议吗? 问题答案: mongoose通过
我有一些元素,我想通过JSPlumb社区版将它们连接起来。我在javascript中有以下代码行: 我想做的是在运行时制作两个和一个,并将两个源endpoint连接到目标endpoint,但当我将一个源endpoint连接到目标endpoint时,目标不会接受第二个源endpoint。我该怎么做?
问题内容: 我正在使用标准的join命令来连接基于column1的两个排序文件。命令是简单的连接文件1文件2>输出文件。 但是,如何使用相同的技术加入3个或更多文件?join file1 file2 file3> output_file上面的命令给了我一个空文件。我认为sed可以帮助我,但我不太确定该怎么做? 问题答案: : 它仅适用于 两个 文件。 如果您需要加入三个,也许您可以先加入前两个
问题内容: 我从来没有做过这样的PHP / MYSQL技巧来加入多表。请具有该领域经验的人员帮助: TICKETS 表中的字段: 表 RECEPTS中的 字段: 表 PAYMENTS中的 字段: 表 CUSTOMERS中的 字段: 表之间的关系很容易理解: 我希望达到的最终结果: 我试图做这样的事情,但在某个地方出错: 问题答案: 您应该可以使用以下方法获得结果: 参见带有演示的SQL Fiddl
问题内容: 我正在尝试使用hibernate条件生成器连接4个表。 下面分别是这些表。 在这4个表中,我想为MySQL执行以下sql脚本: 那么,如何使用Hibernate CriteriaBuilder实现这一目标?请帮助… 预先感谢....... 问题答案: CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQue