菜鸟教程小白 发表于 2022-12-12 10:00:32

ios - BLE 外设和 BLE 中央


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

<p> <a href="https://github.com/izumin5210/Bletia" rel="noreferrer noopener nofollow">https://github.com/izumin5210/Bletia</a> </p>

<p> <a href="https://github.com/captain-miao/bleYan" rel="noreferrer noopener nofollow">https://github.com/captain-miao/bleYan</a> </p>

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

<p><strong>我的回调代码</strong></p>

<pre><code>private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
      BleLog.i(TAG, &#34;onConnectionStateChange: State = &#34; + BleUtils.getBleConnectStatus(status)
                + &#34; newState = &#34; + BleUtils.getBleConnectStatus(newState));

      if (newState == BluetoothProfile.STATE_CONNECTED) {
            updateState(BleConnectState.CONNECTED);
            //开始发现服务
            BleLog.i(TAG, &#34;gatt.discoverServices()&#34;);
            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, &#34;onServicesDiscovered: &#34; + BleUtils.getGattStatus(status));
    }

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt,
            BluetoothGattCharacteristic characteristic, int status) {
      BleLog.i(TAG, &#34;onCharacteristicWrite: &#34; + 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, &#34;onDescriptorWrite: &#34; + 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, &#34;onCharacteristicChanged: &#34; + 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 +&#34; onCharacteristicRead: &#34; + data);

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

            final String values = stringBuilder.toString();

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

      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(&#34;%02X &#34;, byteChar));

            final String values = stringBuilder.toString();

            BleLog.i(TAG, &#34;onDescriptorRead: &#34; + new String(data, Charset.defaultCharset()));
      }else{
            BleLog.i(TAG, &#34; onDescriptorRead: &#34; + &#34;NULL&#34;);
      }
      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, &#34;onReliableWriteCompleted: &#34; + 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, &#34;onReadRemoteRssi: &#34; + rssi + &#34; status:&#34; + 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, &#34;onMtuChanged: &#34; + BleUtils.getGattStatus(status));

      Message msg = Message.obtain();
      msg.what = BleConstants.MSG_BLE_ID_MTU_CHANGED;
      msg.arg1 = status;
      msg.arg2 = mtu;
      notifyAllBleClients(msg);
      onNextWrite();
    }
};
</code></pre>

<p><strong>iOS 通知代码</strong></p>

<pre><code>    if (myPeripheral.connectedToPeer)
    {
      CBCharacteristic *peerAvailable = ;
      if (peerAvailable &amp;&amp; !peerAvailable.isNotifying) {
            ;
      }

      CBCharacteristic *peerReceiveMessage = ;
      if (peerReceiveMessage &amp;&amp; !peerReceiveMessage.isNotifying) {
            ;
      }

    }
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>外围设备应通过<code>bluetoothGattServer.notifyCharacteristicChanged</code></p>通知该特性已更改

<p>Android 中央设备应订阅通知。</p>

<pre><code>if (characteristic != null) {
                        //SetNotification
                        Log.i(TAG, &#34;SetNotification&#34;);
                        gatt.setCharacteristicNotification(characteristic, true);
                        for (BluetoothGattDescriptor descriptor : characteristic.getDescriptors()) {
                            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
                            gatt.writeDescriptor(descriptor);
                        }
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - BLE 外设和 BLE 中央,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/34562806/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/34562806/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - BLE 外设和 BLE 中央