我试图使用简单的循环发送超过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);
}
答案 0 :(得分:5)
通过将数据分成20字节数据包并在发送每个数据包之间实现短延迟(即使用sleep()
),可以轻松实现通过BLE发送超过20个字节。
这里是我正在处理的项目的一小段代码,它以byte[]
的形式获取数据并将其拆分为相同的数组,(byte[][]
),在20个字节的块中,然后将其发送到另一个方法,逐个传输每个数据包。
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);
以下是关于如何实现这一目标的另外两个非常好的解释:
答案 1 :(得分:2)
您可以发送超过20个字节的数据,而不会分成块并包含延迟。您尝试编写的每个特征都分配了MTU值。它是您可以一次写入的字节数。 在连接期间,MTU值被交换,您可以一次写入多个字节。您可以增加服务器端的mtu值(最大512字节)并一次性发送这么多字节。
对于Android,您可能希望在使用
连接服务器后手动请求mturequestMtu(int mtu)
根据您发送的mtu值返回true或false。它会给onMtuChanged回调,其中Android设备和服务器协商最大可能的MTU值。
onMtuChanged(BluetoothGatt gatt,int mtu,int status)
您可以在此功能中设置MTU值,并且可以一次发送超过20个字节。
答案 2 :(得分:1)
某些嵌入式蓝牙LE实现将特性的大小限制为20个字节。我知道Laird BL600系列就是这么做的。这是Laird模块的限制,即使BLE规范要求最大长度更长。其他嵌入式BLE解决方案也有类似限制。我怀疑这是你遇到的限制。
答案 3 :(得分:1)
我没有为每个chunk使用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++;
}
}