Introducción a la especificación MDB/ICP

MDB/ICP son las siglas de Multi-Drop Bus/Internal Communication Protocol. Aquí voy a describir la versión 4.2 de la especificación.

MDB es un protocolo utilizado en las máquinas de vending para interconectar diferentes módulos, como pueden ser: Monederos (coin changers), billeteros (bill acceptors) y lectores RFID.

El protocolo MDB transmite las señales por un bus serie que trabaja a 9600 baudios en una configuración maestro-esclavo, donde todos los periféricos son esclavos de un controlador maestro. Cada periférico tiene una dirección única y un conjunto de comandos.

El maestro sondea continuamente el bus para conocer la actividad de los periféricos. Es decir, cada periférico recibe una encuesta y éste responde con un acuse de recibo, acuse de recibo negativo, o datos específicos dependiendo de la actividad que esté realizando. Si un periférico no responde dentro de un tiempo predefinido se supone que no está presente en el bus. Las colisiones dentro del bus se evitan debido a que cada periférico solo responde cuando es encuestado. Como solo hay un maestro, y toda comunicación es iniciada por éste, las colisiones en el bus se evitan fácilmente.

El protocolo MDB tiene tres niveles funcionales. El nivel 3 es el que más comandos soporta. Ningún dispositivo responderá a comandos de un nivel superior al suyo.

Comunicación

El protocolo MDB utiliza una transmisión serie asíncrona para el envío de los datos. La velocidad de transmisión es de 9600 baudios con una codificación NRZ.

Se transmiten 11 bits: 1 bit de arranque, 8 bits de datos (primero el LSB), 1 bit de modo y 1 bit de parada.

trama

Bit de modo en la transmisión de Maestro a periférico: El bit de modo a 1 indica un byte de dirección, si es un 0 indica un byte de datos. La dirección la leen todos los periféricos pero solo responde el que tiene esa dirección. El byte de datos solo lo lee el periférico direccionado.

Bit de modo en la transmisión de periférico a maestro: Se pone a 1 cuando el periférico envía el último byte del bloque de datos.

Formato del bloque

  • Maestro a periférico

La transmisión de un comando desde el maestro hasta un periférico consiste en:

  1. Un byte con la dirección del periférico (bits 3, 4, 5, 6 y 7) y un comando (bits 0,1 y 2). Modo = 1
  2. Opcionalmente un byte con un subcomando. Modo = 0
  3. Opcionalmente n bytes de datos. Modo = 0
  4. Un byte con el checksum. Modo = 0

El maestro puede responder a un periférico con ACK, NAK o RET. Modo = 0

maestroperiferico

  • Periférico a maestro

La respuesta de un periférico al comando enviado por el maestro consiste en:

  1. N bytes de datos. Modo = 0
  2. un byte con el checksum. Modo = 1

Si no tiene nada que enviar al maestro responderá con ACK. Modo = 1

Si no recibe lo que esperaba responderá con NAK. Modo = 1

  • Checksum

El byte de checksum se calcula sumando todos los bytes del bloque enviado. El bit de acarreo en el checksum se ignora ya que el checksum es de 8 bits.

En la siguiente imagen se muestra un ejemplo del cálculo del checksum en un bloque de datos enviado por el maestro. Observe como al resultado de sumar los seis bytes, es decir a 0x23E, se le aplica un AND 0xFF para quedarse solo con 8 bits e ignorar el acarreo.

checksum

Tiempo de respuesta

Si el maestro no recibe una respuesta del periférico en 5 ms volverá a enviar el mismo comando u otro distinto hasta que reciba una respuesta o pase un tiempo de espera configurado por el periférico. Este tiempo por defecto se puede aumentar en la configuración que envía el periférico al maestro en el comando Setup. Más adelante veremos este comando.

Una vez transcurrido este tiempo máximo de espera, el maestro enviará al periférico un comando RESET por lo menos cada 10 segundos.

Códigos de respuesta

  • ACK = 0x00
  • RET = 0xAA
  • NAK = 0xFF

Hardware

Como he comentado en el punto anterior, el protocolo MDB utiliza un bus para la transmisión y recepción de las señales entre el maestro (VMC) y los esclavos (dispositivos periféricos). En la siguiente figura se muestra un esquema de las conexiones entre los distintos dispositivos de una máquina de vending.

hardware

Los periféricos se aíslan eléctricamente del bus mediante unos optoacopladores, ver siguiente imagen.

aislamiento

Dispositivo cashless

Un dispositivo cashless es un dispositivo para realizar pagos sin dinero en efectivo, por ejemplo una tarjeta prepago o un teléfono móvil con tecnología NFC o mediante códigos QR.

El cashless es un esclavo en el bus MDB y las direcciones reservadas para este dispositivo son la 10H y la 60H, utilizare la dirección 10H en el resto de la explicación.

El VMC está continuamente sondeando a los periféricos con el comando POLL. El cashless deberá esperar a este comando si tiene algo que comunicar al VMC.

poll

En la imagen se observa que el primer byte del bloque es el comando 2H (RESET) enviado a la dirección 10H (Cashless). En binario sería 1 00010 010 = 112H (el primer bit es el 8). Es decir, bits 0, 1 y 2 son el comando 2H y los bits 3, 4, 5, 6 y 7 la dirección 10H. El bit 8 es el modo que como es 1 indica que el dato lleva una dirección.

El segundo byte del bloque es el checksum calculado como se ha explicado en uno de los puntos anteriores.

El cashless simplemente devuelve ACK con el bit de modo a 1 por ser el último byte, y único en este caso, del bloque de su respuesta.

Estados

Un dispositivo cashless se puede ver como una máquina de estados (ver siguiente Figura), estos son:

  1. Inactive
  2. Disabled
  3. Enabled
  4. Session Idle
  5. Vend

maquinaestados

Inactive

Es el estado inicial del cashless. Se llega a él tras alimentar al dispositivo o al hacer un RESET en cualquiera de los estados. En este estado el dispositivo no está disponible.

El VMC envía un comando de RESET al dispositivo.

inactive

Seguidamente el VMC se dedica a enviar comandos POLL. Cuando el cashless está listo responde con el comando JUST RESET.

justreset

A continuación el VMC envía el comando SETUP con su configuración y el cashless le responde con la suya. En este ejemplo el VMC le está indicando que trabaja en el nivel 2 y el display que tiene (nº de filas y columnas). El cashless le responde que trabaja en el nivel 1, el código del país, el factor de escala y los decimales que emplea en los valores del crédito, el tiempo máximo de espera sin respuesta y un último byte para configurar otros aspectos como es la recarga de saldo.

setup1

El VMC envía de nuevo el comando SETUP pero con otro subcomando, el que se refiere a la configuración Max/Min precios.

setup2

Entonces el cashless responde con ACK y pasa al estado Disabled.

Disabled

En este estado el cashless recibirá varios comandos POLL y si todo está bien el VMC enviará un comando READER ENABLE que pasará al cashless al estado Enabled.

disabled

Enabled

En este estado el dispositivo cashless está preparado para recibir una señal externa que le haga iniciar una sesión de venta, por ejemplo, un cliente acerca su terminal móvil al tag NFC. En este estado se responde a un comando POLL con BEGIN SESSION, esta respuesta consiste en un bloque de datos con el importe introducido para realizar una compra.

enabled

El dispositivo cashless cambiará al estado Session Idle.

Session Idle

En este estado el cliente selecciona un producto en el teclado de la máquina de vending. Entonces el VMC envía un comando VEND REQUEST con el precio y posición del producto seleccionado. Tras esto, El dispositivo cashless pasa al estado Vend.

 

sessionidle

Vend

En el estado Vend si el dispositivo cashless comprueba que es correcto entregar el producto elegido, responderá a un POLL con VEND APPROVE indicando el importe del producto que valida. Aquí el cashless también podría responder VEND DENIED si no validase la entrega del producto elegido, por ejemplo.

vend

A continuación el VMC confirmará si ha entregado el producto correctamente con el comando VEND SUCCESS, en caso contrario responderá con VEND FAILURE. Existe otro posible subcomando, VEND CANCEL que lo enviará el VMC si el cliente cancela la operación de compra en este momento. Esto sería que pulsa el botón de devolución de monedas.

vendsuccess

Después se vuelve al estado Session Idle y si no hay otra venta pendiente se regresa al estado Enabled tras recibir el comando SESSION COMPLETE.

sessioncomplete

Esto finalizaría un ciclo de venta quedándose el dispositivo cashless preparado para iniciar un nuevo ciclo.

 

Autor: Patxi Ballesteros @patxiba

Referencias:

 

 

Anuncios

9 respuestas a “Introducción a la especificación MDB/ICP

  1. Hola Patxi, me encanta tu forma de explicar el protocolo que para mas de uno sigue siendo tabú, me gustaria saber si con arduino desarrollaste algun metodo para espiar las comunicaciones entre dispositivos o empleaste algun otro aparato. En caso de que lo hicieras con arduino podrias compartir como hacerlo???, gracias de antemano

  2. Buen día estoy trabajando con una vending en mi proyecto de tesis, el proyecto se trata de incorporarle un punto de venta ya que la vending solo tiene como forma de pago una bill validator. Por favor si me puedes contactar para hablarte mas del proyecto te lo agradecería

  3. Buenas tardes Patxi:
    Querria comprar una maquina vending con protocolo MDB y acoplarle un desarrollo externo que directamente me saque un producto de la máquina. Tengo dudas de si realmente sabre hacerlo y no sé si puedo comunicarme con la máquina mediante puerto serie rs232.
    Únicamente querría darle la orden de que sacara un producto de las posiciones disponibles. Hay algún comando para hacerlo?¿Como lo tendría que hacer?

  4. HOLA.
    Tengo una inquietud..
    ¿ a través del protocolo MDB “dispositivo cashless” puedo ingresarle a la máquina la selección que quiero comprar? o necesariamente tengo que seleccionarla en el teclado de la máquina?, de que forma se hace?

    Saludos y muchas gracias

    • Hola, el dispositivo cashless pone el crédito, pero luego hay que seleccionar en el teclado multiplexado el código del producto. Esto lo hemos hecho también con Arduino, es decir, primero el cashless (que es el Arduino) pone el importe, después, también Arduino da la señal al teclado multiplexado para que expulse el producto solicitado.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s