安卓蓝牙开发-接收分包数据
最近在开发一个安卓和蓝牙光谱仪设备通讯的程序,用的是传统蓝牙,下位机蓝牙发送的光谱数据比较大,分成了15个包发送。
其中14个包大小290个byte
,最后1个包大于100个byte
,而且一整个数据包由数据头、数据长度、数据、数据尾
这几个部分组成,所以接受的时候做了一个判断,定义了一个大容量数组,用笨方法循环拼接。
/**
* 用于接收蓝牙传入的byte[]并拼接包
* 同时发送广播
*/
public void run() {
// buffer store for the stream
int bytes; // bytes returned from read()
int times=1;
// Keep listening to the InputStream until an exception occurs
//开辟一个5000大小的byte数组,用于存储光谱数据流
byte[] longBuffer = new byte[5000];
while (true) {
try {
//先获取接收到的信息流有多少字节,获取到之后就开辟一个对应大小的空间
int count=0;
while(count==0){
count=mmInStream.available();
}
//较短的数据直接输出,不用拼包
//大的数据分为三种情况拼包,开头的、中间的、末尾的
byte[] tmp=new byte[count];
bytes = mmInStream.read(tmp);
if(tmp[0]==(byte)0xbd&&tmp[count-1]==(byte)0xbe){
if( bytes >0) {
Message message = mHandler.obtainMessage(Constant.MSG_GOT_DATA, tmp);
mHandler.sendMessage(message);
}
Log.e("GOTMSG", "message size 读取到字节" + bytes);
}
else if(tmp[0]==(byte)0xbd&&tmp[count-1]!=(byte)0xbe){
for(int i=0;i<count;i++){
longBuffer[i]=tmp[i];
}
continue;
}
else if(tmp[0]!=(byte)0xbd&&tmp[count-1]==(byte)0xbe){
for(int i=1;i<count;i++){
longBuffer[4060+i]=tmp[i];
}
bytes=5000;
Message message = mHandler.obtainMessage(Constant.MSG_GOT_DATA, longBuffer);
mHandler.sendMessage(message);
Log.e("GOTMSG", "message size 读取到字节应该是" + bytes);
longBuffer=new byte[5000];
times=1;
}
else if(tmp[0]!=(byte)0xbd&&tmp[count-1]!=(byte)0xbe){
for(int i=0;i<count;i++){
longBuffer[290*times+i]=tmp[i];
}
times++;
continue;
}
} catch (IOException e) {
mHandler.sendMessage(mHandler.obtainMessage(Constant.MSG_ERROR, e));
break;
}
}
}