【发布时间】:2015-11-09 13:28:02
【问题描述】:
我正在尝试收听 BT Stream:
{
InputStream is = socket.getInputStream();
//ПОПЫТАЕМСЯ СОЗДАТЬ НОЫЙ ПОТОК
LIS_STATE=1;
byte[] buffer = new byte[1];
int bytes;
String readMess2="";
while (true) {
try {
// нужное начало пакета
bytes = is.read(buffer);
//Если мы поймали C0 - || buffer[0] == (byte) 0x0D
if(buffer[0] == (byte) 0x0A || buffer[0] == (byte) 0x0D)
{
//testMessage= readMess2;
//Тут начитанная информация парситься
startWordGet = readMess2.charAt(0);
//если стартовый символ нормальный начинаем разбирать пакет
if(startWordGet==':')
{
//стркоа без стартвого символа
String message2=readMess2.substring(1);
//длинна ожидаемой полезной информации без Str1.length()
String mesLength="";
mesLength=message2.substring(0,2);
//перводим в инт длинну
int messLength=0;
messLength=hexToDec(mesLength);
//Длина всей даты без : ODOA
int fullMessLenght=0;
fullMessLenght=message2.length();
//Длинна даты без длинны и CRC
int messLengthReal=0;
messLengthReal=fullMessLenght-4;
// int messStopDataInt=0;
//Совпадает ли длинна декларируемая с реальной (передаваемая дата без транспорта)
if(messLength==messLengthReal)
{
//проверяем CRC
//переводим нашу HEX строку в массив байтов
// byte[] mesByteArr=null;
// mesByteArr = hexStringToByteArray(message2);
// byte reslutCrc2=0;
// reslutCrc2 =cheakCrcHexByteArr(mesByteArr);
// String resultcrc2string= Integer.toHexString(reslutCrc2);
boolean resultCrc=cheakCrcHexString(message2);
if(resultCrc)
{
//CRC совпалао
int messStopDataInt=0;
int crclength=2;
messStopDataInt=fullMessLenght-crclength;
String dataReal=message2.substring(2,messStopDataInt);
int valueResive=hexToDec(dataReal);
//Normal ways would be Integer.toString(i) or String.valueOf(i).
//testMessage="M:"+resultCrc+" V: "+Integer.toString(valueResive);
testMessage="OK:"+dataReal+" "+Integer.toString(valueResive);
}
else
{
//CRC не совпало
//только для тестов
//может для детекта стабильности конекта
//но скорее всего все это уже есть на уровне блютуса
int messStopDataInt=0;
int crclength=2;
messStopDataInt=fullMessLenght-crclength;
String dataReal=message2.substring(2,messStopDataInt);
int valueResive=hexToDec(dataReal);
testMessage="CR:"+dataReal+" "+Integer.toString(valueResive);
}
}
else
{
//длина сообщения не соответсвует
//данный else только для теста нужен
int messStopDataInt=0;
int crclength=2;
messStopDataInt=fullMessLenght-crclength;
String dataReal=message2.substring(2,messStopDataInt);
int valueResive=hexToDec(dataReal);
testMessage="LE:"+dataReal+" "+Integer.toString(valueResive);
}
}
else
{
//testMessage="ERROR : "; ошибка с аротовго слова
// char startWordB = readMess2.charAt(0);
//стркоа без стартвого символа
String message2=readMess2.substring(1);
//длинна ожидаемой полезной информации без Str1.length()
String mesLength="";
mesLength=message2.substring(0,2);
//перводим в инт длинну
int messLength=0;
messLength=hexToDec(mesLength);
//Длина всей даты без : ODOA
int fullMessLenght=0;
fullMessLenght=message2.length();
//Длинна даты без длинны и CRC
int messLengthReal=0;
messLengthReal=fullMessLenght-4;
int messStopDataInt=0;
int crclength=2;
messStopDataInt=fullMessLenght-crclength;
String dataReal=message2.substring(2,messStopDataInt);
int valueResive=hexToDec(dataReal);
testMessage="ST:"+dataReal+" "+Integer.toString(valueResive);
}
readMess2="";
// serviceNotifer("ADPTTO Service", "0A / 0D ("+co+") № " + byte_num + ": " +buffer[0],9);
// serviceNotifer("ADPTTO Service", "C0 № " + co + ": " +buffer[0],3);
// маркер конца команды - вернуть ответ в главный поток
// intent.putExtra(DashboardActivity.PARAM_STATUS, DashboardActivity.STATUS_FINISH);
// intent.putExtra(DashboardActivity.PARAM_RESULT, "BYTE №(" + byte_num + "): ");
// sendBroadcast(intent);
// byte_flag=0;
// FLAG_C0=1;
// serviceNotifer("ADPTTO Service ", " ("+co+") № " + byte_num + ": " +readMess2,8);
}
else
{
/*bytes = is.read(buffer);
//readMess2 = readMess2+new String(buffer, 0, 1);
readMess2 = readMess2+ new String (buffer, 0, bytes);
// serviceNotifer("ADPTTO Service", "BYTE ELSE ("+co+") № " + byte_num + ": " +buffer[0],10);
testMessage=readMess2;
// testMessage=readMess2;*/
readMess2 += "" + new String (buffer, 0, bytes);
// serviceNotifer("ADPTTO Service ", " ("+co+") № " + byte_num + ": " +readMess2,9);
}
一切正常,但 90% 的时间 startWordGet = 空字符! 我无法理解方式..这是逻辑错误...
BT设备发送:OCXX9CB4x
XX - 这部分每一步都会改变。 x - 这是 0xA0
使用此代码,我会收到完整的消息,但是 ..stra sumbol ':' 缺少 80-90% 的时间。我是 Java 的菜鸟。
【问题讨论】:
-
什么叫空字符?是
0值吗? -
空字符 = null。现在我(在“/* */”的帮助下)明白了......如果我评论这个: testMessage="ST:"+dataReal+" "+Integer.toString(valueResive);我会得到所有的数据(没有丢失的数据)。当 InputStream 为空时 - 我什么也没读。所以最后一个字节 = 0xA0 -> 但我的 String readMess2 是空的 - 没有字符。所以我得到这个错误;但我忘了清理字符串消息2!这让我觉得我丢失了一些数据......并且长度和CRC控制就像魔术一样工作))因为没有第一个字符长度变化。我noooob))
-
字符可以为空但不能为字符
标签: java android bluetooth stream