我正在尝试使用4.3中的新BTLE API在Nexus 7上实现BTLE SERVER。我遇到了几个问题。首先,SDK没有示例。唯一的例子是客户。其次,文档实际上告诉你做错了。它声明必须使用BluetoothAdapter.getProfileProxy() with a BluetoothProfile.GATT_SERVER
参数来获取BluetoothGattServer
对象。这种方法可行,但是人们无法将BluetoothGattServerCallback
的一个实现链接到BLE堆栈。 (这个回调就是人们如何响应客户端读写请求等。)然而,在问题58582上遇到绊脚石后,开发人员指出了新的BluetoothManager.openGattServer()
方法,该方法将您的回调作为参数并返回{{1对象。好吧,一个问题解决了。
下一个问题更成问题。 BluetoothGattServer
文档声明可以使用此类创建和通告蓝牙LE服务和特性。创建服务等不是问题,但他们忽略了如何开始做广告。类本身或我可以找到的任何其他类都没有方法。
有谁知道怎么做?目前我所能看到的是使用客户端使用的相同方法,但这种方法涉及扫描(不是广告)。所有文档都进一步表明BluetoothGattServer
确实只是用于扫描。
那么,一旦我的所有服务,特征和描述符到位,我该如何调用广告?
答案 0 :(得分:17)
据我了解,Android实现只能作为中央设备,而不能作为外围设备。在蓝牙低功耗中,只有外围设备可以做广告。中央设备可以扫描来自外围设备的广告,并将连接请求作为对(某些类型)广告的回复发送,以创建与外围设备的连接。
在BLE中,概念 Central / Peripheral 和 Server / Client 之间存在区别:
中心/外围设备与网络架构有关,其中中心是星形中心,其中有一个或多个外围设备连接到它。它通常是手机,平板电脑或计算机。外围设备一次只能连接到一个中心。
服务器/客户端(GATT服务器/客户端)是一种更高级别的概念,与保存在设备中并可能通过连接进行通信的数据相关。中央设备和外围设备都可以实现GATT服务器和GATT客户端,但不需要同时使用两者。
所以回答你的问题:你不能调用广告。您必须开始扫描外围设备才能与其中一个或多个设备建立连接。
希望这有帮助。
答案 1 :(得分:12)
您需要API级别21.
import android.bluetooth.le;
...
...
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter myBluetoothAdapter = bluetoothManager.getAdapter();
BluetoothLeAdvertiser myBluetoothLeAdvertiser = myBluetoothAdapter.getBluetoothLeAdvertiser ();
myBluetoothLeAdvertiser.startAdvertising (AdvertiseSettings settings, AdvertiseData advertiseData, AdvertiseCallback callback);
有用的链接是:https://developer.android.com/about/versions/android-5.0.html
答案 2 :(得分:2)
似乎getProfileProxy
没有回复GATT
或GATT_SERVER
请求。 API建议广告支持,but there is no code implemented behind yet.(Android问题跟踪器)
在推出NFC时,最初发布了相同的中途实现API,Google迭代通过后续版本添加了更全面的功能。
答案 3 :(得分:1)
正如我所看到的,BLE广告能力(又称外围模式)将添加到Android,即将推出的Kitkat版本4.4.3。 它本应在下周发布,但更改日志已经意外泄露,请参阅第2554行的Google缓存或here:外设模式(3/4):添加外设模式API < / strong>即可。
我想我们会很快知道的。