我正在尝试收听BT流:
{
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
有了这个代码,我得到了完整的信息,但是。。strat sumbol":"有80-90%的时间是失踪的。我不懂Java。
所以这是我的逻辑错误!
我想当我读取空的InputStream表单时,我会得到"什么都没有",读取缓冲区中也不会有任何内容。但在我的密码里,我有最后一个字节!它是一个停止字节(0xA0),所以我一次又一次地尝试读取一个空字符串!