Últimamente he estado haciendo bastante domótica (RF; 433MHz) en muchos dispositivos diferentes, lo que funcionó bien para todos excepto uno. Básicamente es un robot de piscina con un control remoto realmente horrible.
Recopilé algunos datos usando un BladeRF SDR y GNU Radio. La columna "otros 3" es básicamente la acción, mientras que "otro 1" parece ser una serie y "otro 2" define el robot si tiene varios en uso, supongo (algún amigo mío que tiene el mismo tiene un valor diferente allí). No estoy seguro de para qué sirve el conteo, pero supongo que es para que el robot sepa cuándo el rango se amplía demasiado (¿falta información?). He reducido los bytes y sus significados, sin embargo, no puedo calcular el CRC (suma de verificación) correcto para los datos.
ANTIGUO - ¡POR FAVOR VEA LA ACTUALIZACIÓN A CONTINUACIÓN!
Aquí hay algunos datos de muestra:
<other1 > <other2> <other3> <count > <crc >
10110100 00111110 10001111 11001000 00000001 11110111 01011110
10110100 00111110 10001111 11001000 00000001 11111000 01010011
10110100 00111110 10001111 11001000 00000001 11111001 01010100
10110100 00111110 10001111 11001000 00000001 11111010 01010001
10110100 00111110 10001111 11001000 00000001 11111011 01010010
10110100 00111110 10001111 11001000 00000001 11111100 01010111
10110100 00111110 10001111 11001000 00000001 11111101 01011000
10110100 00111110 10001111 11001000 00000001 11111110 01010101
10110100 00111110 10001111 11001000 00000001 11111111 01010110
10110100 00111110 10001111 11001000 00000001 00000000 01100111
10110100 00111110 10001111 11001000 00000001 00000001 01101000
10110100 00111110 10001111 11001000 00000001 00000010 01100101
10110100 00111110 10001111 11001000 00000001 00000011 01100110
10110100 00111110 10001111 11001000 00000001 00000101 01100100
10110100 00111110 10001111 11001000 00000001 00000111 01100010
added data:
10110100 00111110 10001111 11001000 00000010 00000110 01100100
10110100 00111110 10001111 11101010 00000010 01100101 10011010
10110100 00111110 10001111 11101010 00000001 01100100 10011100
10110100 00111110 10001111 11101010 00000001 01100011 10011101
10110100 00111110 10001111 11101010 00000001 01100110 10011010
Hay un recuento para cada solicitud que se debe cambiar y algunos comandos para enviar, por ejemplo, la columna "otros 3" podría leer 00000010 en lugar de 00000001.
Sería muy útil si alguien pudiera darme algunas pistas sobre dónde mirar. He probado diferentes técnicas como XOR a través de los bytes o el módulo de cálculo, etc. Incluso probé diferentes herramientas de fuerza bruta del algoritmo CRC, desafortunadamente aún no he tenido éxito.
EDITAR: Puse los datos en Excel y agregué algunas funciones (básicamente compara cada 4 bits con los de arriba, la última transmisión). Lo hice cuando reconocí que el CRC permaneció igual una vez. Este fue el caso cuando tanto la acción como el recuento aumentaron en 1. Por favor, eche un vistazo:
ACTUALIZAR:
He encontrado alguna otra especificación más detallada. del mismo proveedor en la red después de buscar durante horas y salió el CRC tan pensado, de hecho, es una paridad. También ajusté mi diagrama de flujo de captura de radio gnu y recopilé algunos datos nuevos. Haga caso omiso de los datos anteriores y eche un vistazo aquí:
other 1> other 2 > other 3> other 4 > parity
10110100 001111101000111111101010 00000001 011110101001 0101
10110100 001111101000111111101010 00000001 011110111001 0110
10110100 001111101000111111101010 00000001 011111001001 0011
10110100 001111101000111111101010 00000001 011111011001 0100
10110100 001111101000111111101010 00000010 011111101001 0100
10110100 001111101000111111101010 00000010 011111111001 0011
10110100 001111101000111111101010 00000010 100000001001 0011
10110100 001111101000111111101010 00000010 100000011001 0100
10110100 001111101000111111101010 00000001 100000101001 0100
10110100 001111101000111111101010 00000001 100000111001 0011
10110100 001111101000111111101010 00000001 100001001001 0110
10110100 001111101000111111101010 00000001 100001011001 0101
10110100 001111101000111111101010 00000010 100001101001 0101
10110100 001111101000111111101010 00000010 100001111001 0110
10110100 001111101000111111101010 00000010 100010001001 1011
10110100 001111101000111111101010 00000010 100010011001 1100
10110100 001111101000111111101010 00000001 100010101001 1100
10110100 001111101000111111101010 00000001 100010111001 1011
10110100 001111101000111111101010 00000001 100011001001 1110
10110100 001111101000111111101010 00000001 100011011001 1101
Y aquí está de nuevo como un lujo excelente:
¿Alguien sabe cómo calcular esa paridad? Intenté dividir los datos, etc. y usar los cálculos de paridad habituales, pero desafortunadamente aún no he tenido éxito.
fuente
Respuestas:
Oh hombre, no me preguntes cómo, pero creo que lo descubrí.
Echemos un vistazo:
Básicamente, divide los datos en paquetes de 4 bits cada uno. Luego concatena cada primera, segunda, tercera y cuarta letra juntas por separado. Esto se puede ver en las columnas 1, 2, 3 y 4. Luego, cuenta los 1 en cada uno de ellos (el número de unos se escribe al lado de cada uno de ellos). Si son pares es un 0 para el bit de paridad, si son impares es uno. Entonces, antes de terminar, ahora tiene que agregar binario 1 al resultado anterior (!). Eso coincidía cada vez y pude generar con éxito mis propios marcos de esa manera. Problema resuelto parece. Perfecto. Muchas gracias a todos por contribuir.
fuente