Async Channels

Mat|r permite comunicar tu Mat|r Device a través de canales (channels). Utilizando una configuración visual, accesible desde el editor Model se podrán crear canales a nivel de aplicación que permitirán la comunicación de Mat|r Devices corriendo la app. Además, los mismos canales podrán ser utilizados con los IoT Devices, es decir aquellos dispositivos que no corren una app Mat|r.

Creación y configuración de un nuevo Channel

Para crear un nuevo channel por medio del menu de configuración de Async > Channels lo hacemos a través del botón “create new channel”:

  1. Name: nombre con el cual se referencia el channel.
  2. Description: descripción del channel.
  3. Message Type: el mensaje que se envía a través de un channel es la representación en formato JSON de un modelo, el cual debe estar previamente definido en tu app utilizando matr script.
  4. Mappings: autocompleta todos los modelos y atributos que intervienen en el mapeo. En el campo de la derecha, se puede cambiar el nombre de propiedad a la cual se desea mapear dicho atributo, o resetear el mismo al valor por defecto.

Operaciones con canales

  • Edición: Se puede editar la información del canal haciendo click en el nombre del mismo.
  • Borrado: Se puede borrar un canal haciendo click en el ícono de tachito de basura, del canal correspondiente.
  • Ver info de conexión: Al hacer click en el ícono de información, podemos acceder a información de conexión, como lo son la URL y puerto del servidor, nombre interno del canal, etc.
  • Actualización automática de mapeos: Si modificamos un modelo que está siendo utilizado por un canal, dicho canal mostrará un ícono de alerta. Al hacer click en dicho ícono, se actualizará el mapeo incluyendo los cambios realizados al modelo.
Ejemplo:

Experience Main {
    // Add your attributes here
    String userName label("Username")
    String msg label("Mensage")
    Decision r2 action("MainContext.ruleSubscribe") label("subscribe")
    Decision r3 action("MainContext.ruleUnsubscribe") label("unsubscribe")
    Decision r4 action("MainContext.rulePublish") label("publish")
    Decision r5 action("MainContext.ruleDisconnect") label("disconnect")
    Array<String> messages value([]) as List
}
Application{
    String topicName
    OnInit{
        topicName = "mensajeria"// nombre del canal creado anteriormente 
        broker.async.initialize()
        broker.async.connect()
        broker.async.subscribe(topicName, @function(Subscriptors.handler))
    }
}

RuleContext MainContext {
    Rule ruleSubscribe{
        Main m = broker.ui.getDataSource()
        broker.async.subscribe(topicName, @function(Subscriptors.handler))
    }
    Rule rulePublish{
        Main main = broker.ui.getDataSource()
        User u = User(name:main.userName)
        Message m = Message(user:u, msg:main.msg)
        broker.async.publish(topicName, m)
    }
    
    Rule ruleUnsubscribe{
        Main m = broker.ui.getDataSource()
        broker.async.unsubscribe(topicName)
    }
    
    Rule ruleDisconnect{
        broker.async.disconnect()
    }
}

Model Message{
    String msg
    User user
}

Model User{
    String name
}

Module Subscriptors{
    void handler(Message message){
        Main m = broker.ui.getDataSource()
        m.messages.add("De " + message.user.name + ": " + message.msg)
    }
}