7

我正在使用两个 Android 5.0 设备通过低功耗蓝牙进行通信,但我不想:

  • 设备 1充当Central 和 Server

  • 设备 2充当Peripheral 和 Client


这是我想要实现的行为:

1)设备2开始做广告(外围角色)。

2)设备1开始扫描(中心角色),通过ScanCallback的onScanResult方法获取广告设备(BluetoothDevice对象)。

3)我现在希望通知广告设备(设备 2)它已被扫描,并且能够获取与设备 1 关联的蓝牙设备。

4) 设备 1 有一个 BluetoothGattServer 实例。设备 2 现在将在设备 1 上调用 connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback) 以获取 BluetoothGatt 的实例。

5)最后,Device 1是Server,Device 2是Client。


到目前为止,我发现在第 2 步中,一旦设备 1 拥有设备 2 的蓝牙设备,它就只能像第 4 步中那样使用 connectGatt 作为客户端连接。

我可能能够使用设备 1 中定义的BluetoothGattServer,并调用:gattServer.connect(BluetoothDevice device, boolean autoConnect)设备为设备 2。

但是如何通知设备 2 已连接?

如果我无法在 BluetoothDevice 上调用 connectGatt(Context, boolean, BluetoothGattCallback) ,我将如何在设备 2 获取BluetoothGatt实例

预先感谢您的帮助 !

一些文档:

蓝牙GattServer

蓝牙设备

4

2 回答 2

1

1)设备2开始做广告(外围角色)。

外设角色会做广告,一定要加上CONNECTABLE

     AdvertiseSettings.Builder settingBuilder = new AdvertiseSettings.Builder();
     settingBuilder.setConnectable(true);

并相应地开始广告。

2)设备1开始扫描(中心角色),通过ScanCallback的onScanResult方法获取广告设备(BluetoothDevice对象)。

完美,现在在此设备(外设)上调用connectGatt,确保在获得所需设备后停止广告,否则您最终将发送多个连接命令。

3)我现在希望通知广告设备(设备 2)它已被扫描,并且能够获取与设备 1 关联的蓝牙设备。

当您从 Central/client 角色调用 connectGatt 时,您的外围设备将在BluetoothGattServerCallback'onConnectionStateChange.

在那里你会知道已经建立了连接。尽管您必须在外围设备端注册具有特征的 gatt 服务。

4) 设备 1 有一个 BluetoothGattServer 实例。设备 2 现在将在设备 1 上调用 connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback) 以获取 BluetoothGatt 的实例。

错了,设备 1 将启动连接,正如我在第 3 点中所述。两个设备的 onConnectionStateChange 都将被调用以知道已建立连接。

5)最后,Device 1是Server,Device 2是Client。

错误,设备 2 是外围设备(服务器),设备 1 是监视器(客户端)

于 2015-05-27T04:31:10.923 回答
0

你必须把它转一下。扫描仪是连接到广告商的扫描仪。Dev1 扫描 dev2 adv 并扫描响应。然后 dev1 应该连接。Dev2 将在连接时获得回调。当有人在 android 上听到您的广告或请求扫描响应时,没有回调。如果您想宣传具有特定服务的服务器连接到您的请求,请检查 btsig 的 0x14 «List of 16-bit Service Solicitation UUIDs»。看到这个有点不寻常。

于 2015-05-25T06:58:58.670 回答