hardware – Códigos de barras T-Disk de ingeniería inversa para cafeteras Tassimo

Pregunta:

Con la esperanza de que esto sea apropiado

Tengo una cafetera Tassimo TAS2002EE de Bosch que utiliza T-Disks. Estos contienen café / leche / algo más, y un código de barras que se supone que le dice a la máquina cómo manejar el disco.

Lo que quiero hacer es entender el código de barras y crear algunos códigos de barras diferentes que se acepten como válidos y me permitan ajustar, por ejemplo, el volumen de la bebida.

Al principio no pude encontrar ninguna información decente sobre estos códigos de barras, entre los principales éxitos de Google se encontraban cosas como esta perorata bastante inútil. Sorprendentemente, cuando buscaba imágenes de T-Disks (para estudiar más códigos de barras), me encontré con esta útil publicación: Hackear el Tassimo – Parte 2: Rompiendo el código ( archivo ) , que también enlaza con este T-Disk relacionado patente , en la que hay una tabla que explica los bits de control. Si bien esto fue bastante prometedor, no resultó en nada, como también descubrió el autor del blog. ( Archivo de la Parte 3 )


Además de la información de los enlaces anteriores, esto es lo que descubrí yo mismo.

El código de barras utiliza la simbología Interleaved 2 de 5 y 6 dígitos. El último dígito es el dígito de control calculado de acuerdo con las reglas de dígitos de control de la UPC .
Códigos de barras reales con la suma de comprobación eliminada:

Código de barras Producto Salida, ml Binario de código de barras
06409 coffe créma 150 00011001 00001001
06178 Café exprés 80 00011000 00100010
63735 leche para café con leche (disco grande) ? 11111000 11110111
06182 leche para capuchino (disco pequeño) ? 00011000 00100110
06665 chocolate caliente ? 00011010 00001001
07879 disco de servicio 200 00011110 11000111

El disco de servicio se utiliza para la limpieza, hace que el agua caliente a 60 ° C fluya directamente sin tiempo de preparación.

Utilizando una impresora de códigos de barras, intenté modificar el código de barras de Coffe Créma para dar 300 ml (la cantidad máxima de la patente). Hice algunas pruebas realmente extensas, imprimiendo y alimentando la máquina con un puñado de códigos de barras, y parece que hay seis bits en el código de barras, no cuatro, que controlan la cantidad. Los datos están disponibles aquí en Google Docs. El rango de 6 bits en cuestión está en el medio: los últimos 3 bits del primer byte y los primeros 3 bits del segundo byte (big-endian). Debido a que Google Docs no admite colores dentro de la celda, también hay un archivo de Excel de colores más agradables subido aquí en Google Drive.

Entonces identifiqué dos secuencias de 6 bits que dieron como resultado 300 ml para Crema.
En aras del interés, tomé una de las secuencias y la puse en el lugar correspondiente del código de barras original de Espresso. Y ahí está, tengo 300 ml de Espresso.

Si bien esto fue una especie de éxito (ahora puedo producir códigos de barras con los volúmenes correctos para las bebidas que me interesan), todavía estoy completamente perdido en cuanto a cómo funciona exactamente. Como puede ver en la tabla de experimentos, el patrón es bastante difuso y hay entradas que dan el mismo volumen a partir de diferentes combinaciones de bits. Tampoco estoy seguro de obtener los mismos parámetros de elaboración con los códigos de barras que hice.

Comparta sus ideas sobre cómo entender esto más a fondo.

Respuesta:

Considere el código que pudo modificar. La representación decimal de su código modificado es 065375.

The checksum of 064095 =  3*0 + 6 + 3*4 + 0 + 3*9 + 5 = 50 (≡ 0 mod 10).
The checksum of 065375 =  3*0 + 6 + 3*5 + 3 + 3*7 + 5 = 50 (≡ 0 mod 10).

Entonces, parece que este disco fue aceptado porque la suma de verificación coincidió, mientras que los otros discos no se tomaron debido a la suma de verificación incorrecta.

Ahora, si elimino el dígito de la suma de verificación de los números decimales y los convierto a binarios:

06409 = 0001 1001 0000 1001
06537 = 0001 1001 1000 1001

Desafortunadamente, eso no coincide con nada de la tabla de volumen de patentes, incluso si comparo los volúmenes más grandes (170/230 para tener en cuenta el agua que permanece en el disco) o los volúmenes más pequeños (130/190). – Mis dos números tienen solo un bit que es diferente, y cada combinación de la tabla necesita más de un bit diferente. Pero no hay garantía de que la tabla de volumen de la máquina sea idéntica a la de la patente.

Intentaría tomar los códigos anteriores, voltear un bit tras otro en cada uno de ellos, calcular el número decimal, marcar el dígito de la suma de verificación e imprimirlo en el código de barras, luego verificar lo que sucede:

$ ./bitflip 0001100100001001
1001100100001001 391771
0101100100001001 227933
0011100100001001 146012
0000100100001001 023139
0001000100001001 043618
0001110100001001 074339
0001101100001001 069212
0001100000001001 061537
0001100110001001 065375
0001100101001001 064736
0001100100101001 064415
0001100100011001 064255
0001100100000001 064019
0001100100001101 064132
0001100100001011 064118
0001100100001000 064088

Si se aceptan todos estos códigos de barras, deberían producir resultados diferentes que deberían dar una pista sobre qué bit tiene qué significado.

Si quieres jugar con otras combinaciones de bits, aquí está la fuente de mi programa bitflip (no es el código más limpio y producirá resultados extraños si le arrojas algo que no sean dígitos binarios, pero funcionará):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    int pos, pos2, binval, checksum;
    char oldbit;
    char buf[10];

    if (argc!=2 || strlen(argv[1]) != 16) {
            fprintf(stderr, "Need a 16 bit binary value\n");
            exit(1);
    }
    for (pos=0; pos<16; pos++) {
            oldbit=argv[1][pos];
            argv[1][pos]=(oldbit == '1' ? '0' : '1');
            binval=0;
            for (pos2=0; pos2<16; pos2++) {
                    binval=(binval<<1) | (argv[1][pos2]=='1');
            }
            sprintf(buf, "%05d", binval);
            checksum=
                     3*(buf[0]-'0')
                    +  (buf[1]-'0')
                    +3*(buf[2]-'0')
                    +  (buf[3]-'0')
                    +3*(buf[4]-'0');
            checksum=10-(checksum%10);
            if (checksum==10)
                    checksum=0;
            printf("%16s %5s%d\n", argv[1], buf, checksum);
            argv[1][pos]=oldbit;
    }
}

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım