Как я могу отправить сообщение ACLMessage с платформы JADE, работающей на windows, на другую платформу JADE, работающую на Raspberry pi (Raspbian)? - PullRequest
2 голосов
/ 06 марта 2020

Я пытаюсь установить мультиагентную систему в распределенной сети (компьютер Windows и Raspberry pi с установленной ОС Raspbian). Я запускаю свою нефритовую платформу на windows с помощью этой команды:

java mylibrary jade.Boot -gui -platfrom-id Platform1 -agents starter:Starter

Я также запускаю свою нефритовую платформу на Raspbian с помощью этой команды:

java mylibrary jade.Boot -gui -platform-id Raspy1 -agents starter:Starter

Это Starter. java на обоих компьютерах:

import jade.core.Agent;
import jade.core.behaviours.CyclicBehaviour;
import jade.lang.acl.ACLMessage;

import java.util.Arrays;

public class Starter extends Agent {

    @Override
    protected void setup() {
        System.out.println("Setup of starter agent");

        addBehaviour(new ReceiveBehaviour());

    }

    private class ReceiveBehaviour extends CyclicBehaviour {

        @Override
        public void action() {
            ACLMessage msg = myAgent.receive();
            if (msg != null) {
                System.out.println(msg.getContent());
                System.out.println(Arrays.toString(msg.getSender().getAddressesArray()));
                ACLMessage reply = msg.createReply();
                reply.setContent("I got it. Thank you " + msg.getSender().getName());
                myAgent.send(reply);
            } else {
                block();
            }
        }
    }
}

Кроме того, это mtpaddress в моем windows: <a href="http://192.168.1.6:7778/acc" rel="nofollow noreferrer">http://192.168.1.6:7778/acc</a>, и это mtpaddress на моем raspbian: <a href="http://raspy1:7778/acc" rel="nofollow noreferrer">http://raspy1:7778/acc</a>

Оба моих компьютера подключены к локальной сети (беспроводному модему) с помощью Wi-Fi.

Теперь происходит следующее: я запускаю свою платформу на обоих компьютерах, запускаю DummyAgent на windows и попробуйте отправить сообщение на распбианскую платформу. Поэтому я добавляю получателя и помещаю имя и адрес, как на изображении

ниже: DymmyAgent в моем windows, чтобы отправить сообщение моей малине

, и это вывод консоли:

Mar 06, 2020 7:45:33 PM jade.core.messaging.MessagingService deliverNow
WARNING: Cannot deliver message to address: http://raspy1:7778/acc [jade.mtp.MTPException: raspy1 - Caused by:  raspy1]. Trying the next one...
Mar 06, 2020 7:45:33 PM jade.core.messaging.MessageManager$Deliverer run
WARNING: Deliverer Thread Deliverer-4 - Delivery-time over threshold (9322). Receiver = da0, message size = 301
( (action ( agent-identifier :name starter@Platform1  :addresses (sequence http://192.168.1.6:7778/acc )) (ACLMessage) ) (MTS-error ( agent-identifier :name da0@Raspy1  :addresses (sequence http://raspy1:7778/acc )) (internal-error "Foreign agent unreachable: No valid address contained within the AID da0@Raspy1")) )
[http://192.168.1.6:7778/acc]

Я могу отправить сообщение от DummyAgent на Raspberry на мою windows платформу, но обратного пути не произойдет. Что я могу сделать?

1 Ответ

0 голосов
/ 11 марта 2020

Мы широко используем связь JADE между различными машинами (Win, Linux, Ma c) в распределенной среде Smart Grid.

Чтобы разрешить связь между нашими агентами, мы настроили Центральный агент, называемый CEA (сокращение от Central Exectuion Agent), который служит посредником связи между агентами. Например, он владеет и поддерживает центральную телефонную книгу. Все агенты регистрируются в этом агенте CEA. В свою очередь, агент CEA может предоставить точные адреса известных агентов приложений.

Чтобы зарегистрироваться в CEA, агентам необходимо знать его адрес. Адрес содержит имя агента, имя платформы, MTP-URL CEA и MTP-порт. В приведенном ниже примере вы узнаете, как мы настраиваем AID, если мы находимся на разных машинах.

 public AID getAID(){

    String ceaName = this.getAgentName();
    String platformName = this.getPlatformName();
    String mtpProtocol = this.getMtpType();
    String mtpUrl = this.getUrlOrIp();
    int mtpPort = this.getMtpPort();

    String ceaGUID = ceaName + "@" + platformName;
    String ceaMTPAddress = mtpProtocol.toLowerCase() + "://" + mtpUrl + ":" + mtpPort + "/acc";

    AID aid = new AID(ceaGUID, true);
    aid.addAddresses(ceaMTPAddress);
    return aid;
}

Таким образом, наиболее важным является то, что в отличие от локальных ACLMessages (отправка между агентами на одной платформе ), вам нужно добавить информацию MTP для удаленной платформы JADE в AID. Я не уверен, если JADE визуализация / пользовательский интерфейс способен это сделать.

Что касается показанного MTP-адреса вашего R'Pi, я сомневаюсь, что URL http://raspy1: 7778 / a cc может быть разрешен в вашей локальной сети (если у вас не запущен DNS, который переводит «raspy1»). Лучше запускать обе платформы с указанными c настройками MTP, чтобы вместо имен использовались IP-адреса (см. Руководство администратора JADE).

...