[英]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);
以下是另外兩個關於如何實現這一目標的非常好的解釋:
您可以發送超過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.