我试图连接到我为Android Mac OS X编写的蓝牙外设。我在下面有以下代码:
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
String intentAction;
mBluetoothGatt = gatt;
if (newState == BluetoothProfile.STATE_CONNECTED) {
intentAction = ACTION_GATT_CONNECTED;
mConnectionState = STATE_CONNECTED;
broadcastUpdate(intentAction);
Log.i(TAG, "Connected to GATT server.");
Log.i(TAG, "Attempting to start service discovery: " + mBluetoothGatt.discoverServices());
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
intentAction = ACTION_GATT_DISCONNECTED;
mConnectionState = STATE_DISCONNECTED;
Log.i(TAG, "Disconnected from GATT server.");
broadcastUpdate(intentAction);
mBluetoothGatt.setCharacteristicNotification(characteristic, false);
}
}
// New services discovered
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
Log.i(TAG, "onServicesDiscovered received: " + status);
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
} else {
Log.w(TAG, "onServicesDiscovered received: " + status);
}
}
// Result of a characteristic read operation
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
}
};
以上大部分文档都在Google的网站上:
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html#read
但是,我一直在onServicesDiscovered
上获取状态129,并且我无法向外围设备发送任何数据。上面有什么我做错了吗?我似乎遵循了文档,但我无法做到。
修改
似乎在API 21中,Google对BLE API进行了一些更改,但他们没有更新文档(对我们的开发人员来说显然非常方便)。我发现以下教程很有帮助:
http://www.truiton.com/2015/04/android-bluetooth-low-energy-ble-example/
基本上使用API 21+,您必须使用BluetoothLeScanner mLEScanner
扫描附近的LE设备。扫描完成后,我们会收到如下回调:
private ScanCallback mScanCallback = new ScanCallback() {
public void onScanResult(int callbackType, ScanResult result) {
Log.i("callbackType", String.valueOf(callbackType));
Log.i("result", result.toString());
onScan(result.getDevice(), 0, null);
}
public void onBatchScanResults(List<ScanResult> results) {
for (ScanResult sr : results) {
onScan(sr.getDevice(), 0, null);
}
}
public void onScanFailed(int errorCode) {
Log.e("Scan Failed", "Error Code: " + errorCode);
}
};
我们可以从ScanResult
获取设备并将其用于连接,它可以在某些设备上运行,但不是全部。我让它在我的Nexus 7上工作,但不是我的三星Galaxy S6。 Android BLE是一个MESS。
编辑2
目前我们只使用蓝牙经典而不是蓝牙LE。希望谷歌正确地弄清楚他们的LE堆栈。我无法在市场上的大部分设备上使用BLE代码。
即使是Google自己的示例代码也只能在我测试过的设备中使用不到一半!
答案 0 :(得分:0)
我从android设备连接到ios设备(Peripheral)作为中心,我能够读取和写入特性。请告诉我,您现在正在寻找什么!!!