• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - BLE 外设和 BLE 中央

[复制链接]
菜鸟教程小白 发表于 2022-12-12 10:00:32 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在开发一个使用 BLE Android 到 iOS 的聊天应用程序, 现在我正在使用以下两个库作为引用

https://github.com/izumin5210/Bletia

https://github.com/captain-miao/bleYan

我面临的问题是当外围设备写入任何特征时,不会调用 ble 中央设备 (Android) 中的 BLECallback。

我的回调代码

private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        BleLog.i(TAG, "onConnectionStateChange: State = " + BleUtils.getBleConnectStatus(status)
                + " newState = " + BleUtils.getBleConnectStatus(newState));

        if (newState == BluetoothProfile.STATE_CONNECTED) {
            updateState(BleConnectState.CONNECTED);
            //开始发现服务
            BleLog.i(TAG, "gatt.discoverServices()");
            gatt.discoverServices();
        } else if (newState == BluetoothProfile.STATE_CONNECTING) {
            updateState(BleConnectState.CONNECTING);
        } else if (newState == BluetoothProfile.STATE_DISCONNECTING) {
            updateState(BleConnectState.DISCONNECTING);
        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            //断开了,需要做什么处理?
            sIsWriting = false;
            sWriteQueue.clear();
            updateState(BleConnectState.DISCONNECTED);
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {

        if (status == BluetoothGatt.GATT_SUCCESS) {
            onDiscoverServices(gatt);
            //需要返回 gatt
            updateState(BleConnectState.SERVICE_IS_DISCOVERED);
        } else {
            BleUtils.refreshDeviceCache(mGatt);
            //失败 需要做何处理 129
            if(mState != BleConnectState.SERVICE_IS_NOT_DISCOVERED) {
                updateState(mState);
            }
        }

        //MSG_BLE_ID_SERVICES_DISCOVERED
        Message msg = Message.obtain();
        msg.what = BleConstants.MSG_BLE_ID_SERVICES_DISCOVERED;
        msg.arg1 = status;
        msg.obj = gatt;
        notifyAllBleClients(msg);
        BleLog.i(TAG, "onServicesDiscovered: " + BleUtils.getGattStatus(status));
    }

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt,
            BluetoothGattCharacteristic characteristic, int status) {
        BleLog.i(TAG, "onCharacteristicWrite: " + BleUtils.getGattStatus(status));
        UUID uuid = characteristic.getUuid();
        sendBleMessage(BleConstants.MSG_BLE_ID_CHARACTERISTIC_WRITE, status, uuid);
        onNextWrite();
    }

    @Override
    public void onDescriptorWrite(BluetoothGatt gatt,
            BluetoothGattDescriptor descriptor, int status) {
        BleLog.i(TAG, "onDescriptorWrite: " + BleUtils.getGattStatus(status));
        UUID uuid = descriptor.getUuid();

        sendBleMessage(BleConstants.MSG_BLE_ID_DESCRIPTOR_WRITE, status, uuid);
        onNextWrite();
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
        final byte[] data = characteristic.getValue();
        BleLog.i(TAG, "onCharacteristicChanged: " + HexUtil.encodeHexStr(data));
        UUID uuid = characteristic.getUuid();

        sendBleMessage(BleConstants.MSG_BLE_ID_CHARACTERISTIC_NOTIFICATION, BluetoothGatt.GATT_SUCCESS, data, uuid);
        onNextWrite();
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        final byte[] data = characteristic.getValue();
        System.out.println(TAG +" onCharacteristicRead: " + data);

        if(data != null) {
            final StringBuilder stringBuilder = new StringBuilder(data.length);
            for (byte byteChar : data)
                stringBuilder.append(String.format("%02X ", byteChar));

            final String values = stringBuilder.toString();

            BleLog.i(TAG, "onCharacteristicRead: " + new String(data));
        }else{
            BleLog.i(TAG, " onCharacteristicRead: " + "NULL");
        }

        UUID uuid = characteristic.getUuid();

        sendBleMessage(BleConstants.MSG_BLE_ID_CHARACTERISTIC_READ, status, data, uuid);
        onNextWrite();
    }

    @Override
    public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
        final byte[] data = descriptor.getValue();

        if(data != null) {
            final StringBuilder stringBuilder = new StringBuilder(data.length);
            for (byte byteChar : data)
                stringBuilder.append(String.format("%02X ", byteChar));

            final String values = stringBuilder.toString();

            BleLog.i(TAG, "onDescriptorRead: " + new String(data, Charset.defaultCharset()));
        }else{
            BleLog.i(TAG, " onDescriptorRead: " + "NULL");
        }
        UUID uuid = descriptor.getUuid();

        sendBleMessage(BleConstants.MSG_BLE_ID_DESCRIPTOR_READ, status, data, uuid);
        onNextWrite();
    }

    @Override
    public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {
        BleLog.i(TAG, "onReliableWriteCompleted: " + BleUtils.getGattStatus(status));

        Message msg = Message.obtain();
        msg.what = BleConstants.MSG_BLE_ID_RELIABLE_WRITE_COMPLETED;
        msg.arg1 = status;
        notifyAllBleClients(msg);
        onNextWrite();
    }

    @Override
    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
        BleLog.i(TAG, "onReadRemoteRssi: " + rssi + " status:" + BleUtils.getGattStatus(status));

        Message msg = Message.obtain();
        msg.what = BleConstants.MSG_BLE_ID_READ_REMOTE_RSSI;
        msg.arg1 = status;
        msg.arg2 = rssi;
        notifyAllBleClients(msg);
        onNextWrite();
    }

    @Override
    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
        BleLog.i(TAG, "onMtuChanged: " + BleUtils.getGattStatus(status));

        Message msg = Message.obtain();
        msg.what = BleConstants.MSG_BLE_ID_MTU_CHANGED;
        msg.arg1 = status;
        msg.arg2 = mtu;
        notifyAllBleClients(msg);
        onNextWrite();
    }
};

iOS 通知代码

    if (myPeripheral.connectedToPeer)
    {
        CBCharacteristic *peerAvailable = [myPeripheral findCharacteristicFromUUID:myPeripheral.notifyPeerAvailableUUID];
        if (peerAvailable && !peerAvailable.isNotifying) {
            [myPeripheral.cbPeripheral setNotifyValue:YES forCharacteristic:peerAvailable];
        }

        CBCharacteristic *peerReceiveMessage = [myPeripheral findCharacteristicFromUUID:myPeripheral.peerSendToCentralFromPeripheralUUID];
        if (peerReceiveMessage && !peerReceiveMessage.isNotifying) {
            [myPeripheral.cbPeripheral setNotifyValue:YES forCharacteristic:peerReceiveMessage];
        }

    }



Best Answer-推荐答案


外围设备应通过bluetoothGattServer.notifyCharacteristicChanged

通知该特性已更改

Android 中央设备应订阅通知。

if (characteristic != null) {
                        //SetNotification
                        Log.i(TAG, "SetNotification");
                        gatt.setCharacteristicNotification(characteristic, true);
                        for (BluetoothGattDescriptor descriptor : characteristic.getDescriptors()) {
                            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
                            gatt.writeDescriptor(descriptor);
                        }

关于ios - BLE 外设和 BLE 中央,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34562806/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap