簡體   English   中英

如何在android中發送超過20個字節的數據?

[英]How to send more than 20 bytes data over ble in android?

我試圖使用簡單的循環發送超過33個字節,是否有人知道如何通過android ble發送超過20個字節的數據。

if(!mConnected) return;
        for (int i = 0; i<str.length;i++) {
            if(str[i] == str[str.length -1]){
                 val = str[i]+"\n";
            }else {
                val = str[i] + "_";
            }
            System.out.println(val);
            mBluetoothLeService.WriteValue(val);
        }

通過將數據拆分為20字節數據包並在發送每個數據包之間實現短延遲(即使用sleep() ),可以輕松實現通過BLE發送超過20個字節。

這是我正在處理的項目的一小段代碼,它以byte[]的形式獲取數據,並以20字節的塊的形式將其拆分為相同的數組( byte[][] ),然后發送它是另一種逐個傳輸每個數據包的方法。

    int chunksize = 20;
    byte[][] packets = new byte[packetsToSend][chunksize]; 
    int packetsToSend = (int) Math.ceil( byteCount / chunksize);

    for(int i = 0; i < packets.length; i++) {
        packets[i] = Arrays.copyOfRange(source,start, start + chunksize);
        start += chunksize;
    }

    sendSplitPackets(packets);

以下是另外兩個關於如何實現這一目標的非常好的解釋:

(Stackoverflow)Android:通過BLE發送> 20個字節的數據

(Nordic Semi)通過BLE處理大型數據包

您可以發送超過20個字節的數據,而不會分成塊並包括延遲。 您嘗試編寫的每個特征都分配了MTU值。 它是您可以一次寫入的字節數。 在連接期間,MTU值被交換,您可以一次寫入多個字節。 您可以增加服務器端的mtu值(最大512字節)並一次性發送那么多字節。

對於Android,您可能希望在使用服務器連接后手動請求mtu

requestMtu(int mtu)

根據您發送的mtu值返回true或false。 它會給onMtuChanged回調,其中Android設備和服務器協商最大可能的MTU值。

onMtuChanged(BluetoothGatt gatt,int mtu,int status)

並且您可以在此功能中設置MTU值,並且可以一次發送超過20個字節。

一些嵌入式藍牙LE實現將特征的大小限制為20個字節。 我知道Laird BL600系列就是這么做的。 這是Laird模塊的限制,即使BLE規范要求最大長度更長。 其他嵌入式BLE解決方案也有類似限制。 我懷疑這是你遇到的限制。

我沒有為每個塊使用sleep,而是為我的應用程序發送了一個更好,更有效的方法來發送超過20位的數據。

數據包將在觸發onCharacteristicWrite()后發送。 我剛剛發現外圍設備(BluetoothGattServer)發送sendResponse()方法后會自動觸發此方法。

首先,我們必須使用此功能將數據包數據轉換為塊:

public void sendData(byte [] data){
    int chunksize = 20; //20 byte chunk
    packetSize = (int) Math.ceil( data.length / (double)chunksize); //make this variable public so we can access it on the other function

    //this is use as header, so peripheral device know ho much packet will be received.
    characteristicData.setValue(packetSize.toString().getBytes());
    mGatt.writeCharacteristic(characteristicData);
    mGatt.executeReliableWrite();

    packets = new byte[packetSize][chunksize];
    packetInteration =0;
    Integer start = 0;
    for(int i = 0; i < packets.length; i++) {
        int end = start+chunksize;
        if(end>data.length){end = data.length;}
        packets[i] = Arrays.copyOfRange(data,start, end);
        start += chunksize;
    }

在我們准備好數據之后,我將迭代放在這個函數上:

@Override
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        if(packetInteration<packetSize){
        characteristicData.setValue(packets[packetInteration]);
        mGatt.writeCharacteristic(characteristicData);
            packetInteration++;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM