Android上的蓝牙LE

时间:2015-09-12 02:27:23

标签: android macos bluetooth-lowenergy

我试图连接到我为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自己的示例代码也只能在我测试过的设备中使用不到一半!

1 个答案:

答案 0 :(得分:0)

我从android设备连接到ios设备(Peripheral)作为中心,我能够读取和写入特性。请告诉我,您现在正在寻找什么!!!

Follow the sample code