Понимание необработанных данных bluetooth rfcoom
Я пытаюсь создать приложение, которое читает информацию, отправленную через службу Bluetooth, используя rfcomm. Устройство является тестером твердости (HT-6510A), к сожалению, не удается найти спецификации о формате данных устройства. Я столкнулся со странной проблемой, я должен понять, как читать эту информацию.
01-11 17:47:28.940 11862-13447/joinstore.it.testhardness V/result: ��S
01-11 17:47:29.581 11862-13447/joinstore.it.testhardness V/result: ��S
01-11 17:47:30.211 11862-13447/joinstore.it.testhardness V/result: ��S
01-11 17:47:30.872 11862-13447/joinstore.it.testhardness V/result: ��S
01-11 17:47:31.513 11862-13447/joinstore.it.testhardness V/result: ��S
01-11 17:47:32.143 11862-13447/joinstore.it.testhardness V/result: ��T
01-11 17:47:32.794 11862-13447/joinstore.it.testhardness V/result: ��T
Это данные, которые я получаю от устройства, я не думаю, что что-то не так с реализацией, которая просто использует этот поток после стабилизации соединения rfcomm.
//After connection, handle data transfer
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
// readAndPublishRaw();
readAndPublishString();
Log.v("result", "Reading data ended.");
setStatusText(-1);
}
void readAndPublishRaw(){
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
Log.v("result", "Start reading...");
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
Log.v("result", bytes + "");
} catch (IOException e) {
break;
}
}
}
void readAndPublishString(){
//String method, not useful in this case?
try {
BufferedReader r = new BufferedReader(new InputStreamReader(mmInStream));
StringBuilder total = new StringBuilder();
String line;
Log.v("result", "Start reading...");
while ((line = r.readLine()) != null) {
total.append(line);
Log.v("result", line);
}
Log.v("result", total.toString());
//TODO publish read string to the view
} catch (Exception e) {
//
try {
mmSocket.close();
}catch (Exception ex){}
Log.v(TAG, "exception reading data from service");
}
}
/* Call this from the main activity to send data to the remote device */
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) {
}
}
/* Call this from the main activity to shutdown the connection */
public void cancel() {
try {
mmSocket.close();
setStatusText(-1);
} catch (IOException e) {
}
}
}
Ребята, можете ли вы дать мне какую-либо информацию о том, как правильно анализировать эти необработанные данные? Я думаю, что у меня должен быть поток значений с плавающей точкой, но вместо этого у меня есть только эти случайные вещи.
1 ответ
Предложение о том, как сначала получить полезный вывод журнала:
void readAndPublishRaw(){
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
Log.v("result", "Start reading...");
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
final StringBuilder sb = new StringBuilder();
sb.append("Received ").append(bytes).append(" bytes: ");
for ( int i = 0; i < bytes; i++ ) {
sb.append( Integer.toHexString(((int)buffer[i]) & 0xff) ).append(", ");
}
Log.v("result", sb.toString());
} catch (IOException e) {
break;
}
}
}
Следующим шагом должна быть калибровка данных, т.е. запишите, какое значение ввода / отображения дает какие необработанные данные. Оттуда вы можете или не сможете вывести фактическую кодировку.
Ваше устройство может включать или не включать в данные другую информацию, помимо фактических измерений, например, для обозначения низкого уровня заряда батареи. Это должно быть учтено, чтобы получить необработанные значения измерений.
Если одно значение данных содержит более одного байта, необходимо определить порядок байтов (младший или старший порядок).
Часто данные с плавающей запятой небольших устройств представляются в виде с фиксированной запятой. Иногда, особенно если нужны и отрицательные числа с добавлением смещения, так что
realValue = rawValue * a + c
Если вы узнаете a
а также c
ты в порядке. Следовательно, однажды вы можете связать только два разных realValue
с и соответствующие rawValue
Исходя из приведенной выше калибровки, у вас достаточно данных, чтобы решить уравнение для a
а также c
,
Устройства с немного большим "ударом", например, встроенные устройства Linux, также могут использовать обычные данные IEEE с плавающей запятой. - Не то чтобы небольшие встроенные устройства не могли использовать IEEE, но с плавающей запятой часто бывает больше, чем требуется, и это обходится ценой более высокой сложности (память и ЦП) для кода эмуляции с плавающей запятой.