我在智能手机上收到的数据包还不够多

时间:2019-09-03 09:51:07

标签: java android-studio bluetooth-lowenergy

对于一个项目,我想通过BLE 4.2(带有DLE)发送加速度数据。加速包包含81个值(每个24位,共243个字节)。我的目标是发送18个数据包(1458个加速数据包或4374个字节)。我使用Samsung Galaxy A3 2017 Edition作为中央设备,并使用微控制器(nRF52832dk)作为外围设备。发送完所有数据包后,将终止与智能手机的连接,并记录新的1458加速数据包。之后,RTC会在nRF52832dk上激活睡眠模式1分钟。 1分钟后,nRF52832dk将进行广告宣传以与智能手机建立新连接。下图说明了该问题:

https://ibb.co/Syb4GDg

nRF52832dk上的软件运行正常。我能够记录数据,进入睡眠模式,在1分钟后唤醒,并宣传新的连接。我的问题是软件应用程序。我使用这些教程:

https://github.com/googlesamples/android-BluetoothLeGatt

https://developer.android.com/guide/topics/connectivity/bluetooth-le

在BluetoothLeGatt中,我已更改:

mBluetoothGatt = device.connectGatt(this,true,mGattCallback);

当第二个参数为true时,智能手机可能会自动连接。正常(对于与nRF的首次连接)

最初是: mBluetoothGatt = device.connectGatt(this,false,mGattCallback);

建立连接后,GATT处理程序将调用回调例程。

    // Implements callback methods for GATT events that the app cares about.  For example,
    // connection change and services discovered.
    private final BluetoothGattCallback mGattCallback =
            new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            String intentAction;
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                intentAction = ACTION_GATT_CONNECTED;
                mConnectionState = STATE_CONNECTED;
                broadcastUpdate(intentAction);
                Log.i(TAG, "Connected to GATT server.");
                // Attempts to discover services after successful connection.
                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);
            }
        }
        @Override
        // New services discovered
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
            } else {
                Log.w(TAG, "onServicesDiscovered received: " + status);
            }
        }

        @Override
        // 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);
            }
        }

        @Override
        // Change in the characteristic
        public void onCharacteristicChanged(BluetoothGatt gatt,
                                            BluetoothGattCharacteristic characteristic) {
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        }
    }; </i>

建立连接并接收到第一个数据包后,我进入broadcastUpdate

    <i>private void broadcastUpdate(final String action,
                                 final BluetoothGattCharacteristic characteristic) {
        final Intent intent = new Intent(action);

        // This is special handling for the nRF52 profile.  Data parsing is
        // carried out as per profile specifications:
        // http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml
        if (UUID_NRF.equals(characteristic.getUuid())) {

            byte[] data = characteristic.getValue();                                                    
            if (data != null && data.length > 0) {   
                final StringBuilder stringBuilder = new StringBuilder(data.length);
                for(byte byteChar : data)
                    stringBuilder.append(String.format("%02X ", byteChar));
                intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());
            }

        } else {
            // For all other profiles, writes the data formatted in HEX.
            final byte[] data = characteristic.getValue();
            if (data != null && data.length > 0) {
                final StringBuilder stringBuilder = new StringBuilder(data.length);
                for(byte byteChar : data)
                    stringBuilder.append(String.format("%02X ", byteChar));
                intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());
            }
        }
        sendBroadcast(intent);
    }

现在我遇到了两个问题(在更改代码之前,我有两个相同的问题)。

第一个问题: 我的第一个问题是,我只收到18个BLE软件包中的一个(第一个)。

第二个问题: 我的第一个问题也引起了我的第二个问题。应用程序无法识别该连接已从nRF52832dk终止。

还有另一个问题。到底是什么

endBroadcast(intent);

1 个答案:

答案 0 :(得分:0)

这篇文章非常复杂,我想你是说你不能接收nrf52数据。

  1. 您需要检查nrf52支持多少MTU,BLE保护最大值为'247',有效数据长度为'244'有效长度为(DEVICE_MTU-OPCODE_LENGTH(1)-HANDLE_LENGTH(2));

  2. 所以您说要接收2474个字节,至少是17次。

  3. android上的当前进程是onCharacteristicChanged-> onCharacteristicRead

  4. 如果要触发onCharacteristicChanged,则需要打开远程设备通知,如下所示:

    private void EnableNotification(BluetoothGattDescriptor d, BluetoothGatt gatt)
    {
        gatt.SetCharacteristicNotification(d.Characteristic, true);
        d.SetValue(new byte[] { 1, 1 });
        gatt.WriteDescriptor(d);
    }