Отправить параметры в ACLMessage

Я отправляю сообщение от одного агента другому

msg.setContent("price: 30, count: 1");

После этого мне нужно вручную разобрать его. Есть ли более удобный способ передачи параметров без преобразования в строку? Например, отправьте какой-нибудь контейнер.

2 ответа

Решение

Тебе лучше использовать онтологию. Это более удобный способ. Например.

Создайте свой контейнер:

public class ParameterConcept implements Predicate{
    private Long price;
    private Long count;
    ... getters and setters
}

Создайте свою онтологию:

public class YourOntology extends Ontology {
    public static final String NAME = "YourOntology";
    private static Ontology instance = new YourOntology();
    public static Ontology getInstance() {
        return instance;
    }

    private YourOntology() {
        super(NAME, BasicOntology.getInstance());

        add(new PredicateSchema("ParameterConcept"), ParameterConcept.class);
        PredicateSchema parameterConcept = (PredicateSchema) getSchema("ParameterConcept");
        parameterConcept.add("price",         (PrimitiveSchema) getSchema(BasicOntology.INTEGER), ObjectSchema.MANDATORY);
        parameterConcept.add("count",         (PrimitiveSchema) getSchema(BasicOntology.INTEGER), ObjectSchema.MANDATORY);
    }
}

Зарегистрируйте свою онтологию следующим образом (YourAgent.java):

private static final Codec codec = new SLCodec();
private static final Ontology ontology = YourOntology.getInstance();

protected void setup() {
    getContentManager().registerLanguage(codec, FIPANames.ContentLanguage.FIPA_SL0);
    getContentManager().registerOntology(ontology);
}

Создайте сообщение как это:

ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
...
msg.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
msg.setOntology(YourOntology.NAME);
...
try {
    agent.getContentManager().fillContent(msg, parameterConcept);
} catch (Exception e) {
     throw new RuntimeException("cannot fill message.", e);
}

Теперь вы можете проанализировать сообщение (код другого агента) следующим образом:

ContentManager cm = myAgent.getContentManager();
ContentElement contentElement = cm.extractContent(aclMessage);
ParameterConcept pc = (ParameterConcept) contentElement;

Или вы можете просто использовать json с третьим json libs.

Вы могли бы просто использовать msg.setContentObject() Метод и передать объект с классом, который реализует интерфейс Serializable.

Другие вопросы по тегам