Краткое описание:

JWSN - инструмент разработчика протоколов. Ориентирован на работу в беспроводной сети, однако может быть расширен разработчиком для моделирования, к примеру, проводных и любых других сетей, в которых осуществляется обмен сообщениями.

Разработчику предоставляется механизм создания многоуровневой структуры поведения элементов сети и их взаимодействия, графический интерфейс визуализатора, подробный логгер событий системы. Реализована возможность запускать симулятор без графического интерфейса для моделирования крупных систем, анализа логов.

Чтобы создать новую модель, необходимо выполнить следующую последовательность действий:

1. Объявить необходимое количество мотов или любых других объектов с суперклассом NetObject.

   Mot m1 = new Mot(100, 100, power, threshold);
   Mot m2 = new Mot(300, 100, power, threshold);
   Mot m3 = new Mot(200, 100, 100 * power, threshold);

   m1.addModule("mac", new CommonMac(m1));
   m1.addModule("net", new Net(m1));
   m1.addModule("app", new SenderApp(m1));

   m2.addModule...
   m3.addModule...

2. При линейной топологии модулей внутри мота можно напрямую её задать, первые 3 уровня зарезервированы под mac, net и app. Иначе либо соединять вручную (как показано в Tutorial_Protocol), либо перегружать createTopology.

   m1.createTopology();
   m2.createTopology();
   m3.createTopology();

3. Возможно считать описания из файла.

  List mots = new LinkedList();
  mots.add(m1); mots.add(m2); mots.add(m3);
  try {
  	FieldParser.ReadStyles(new FileInputStream("Descriptions.xml"), mots);
  } catch (FileNotFoundException nf) { ... }

4. Задать топологию сети для hard-coded протоколов.

  IDispatcher disp = Dispatcher.getInstance();
  IGraph g = new Graph();

  for (int i = 0; i < 3; i++) {
  	g.newVertex(new Integer(i));
  }
		
  g.addNeighbour(0, 1);
  ...		
  g.solvePaths(2);
  disp.setTopology(g);

5. Создать UI.

  BasicUI.createUI();

6. Добавить слушателей, чтобы их отобразил визуализатор.

  disp.addActiveObjectListener(m1);
  disp.addActiveObjectListener(m2);
  disp.addActiveObjectListener(m3);

Чтобы создать новый протокол, необходимо выполнить следующую последовательность действий:

Каждый NetObject собирается из таких модулей, которые пересылают друг другу объекты класса IPacket. Для этого у каждого модуля есть методы интерфейса IModule, такие, как:

- IGate declareGate(String name)
- IGate getGate(String name)

Они позволяют задать "порты", через которые пресылаются сообщения. Параметр name - уникальное в рамках модуля имя порта. Чтобы обозначить связь, пару таких портов нужно соединить между собой либо односторонне, либо дуплексно, например, так:

   // IGate gate <-> IGate dest
   gate.setTo(dest);
   dest.setFrom(gate);
   gate.setFrom(dest);
   dest.setTo(gate);

Очевидно, одностороннее соединение выглядит так:

   // IGate gate -> IGate dest
   gate.setTo(dest);
   dest.setFrom(gate);

Чтобы обрабатывать пакет, необходимо перегрузить метод recieveMessage модуля: - boolean recieveMessage(IPacket m); Внутри этого метода можно обращаться к полю модуля "String arrivedOn", чтобы определить, на какой из портов пришло сообщение (IPacket), это поле содержит имя соответствующего порта. Теперь необходимо заняться созданием элемента сети (ЭС - NetObject или Mot), который содержит этот протокол. Для обмена сообщениями с другими элементами сети служит метод sendMessage(IMessage m) диспетчера. Соответственно, получают сообщения от диспетчера эС тоже в виде IMessage: recieveMessage(IMessage m). Они содержат наследников IPacket в качестве данных. Соответственно, чтобы определить, какому из модулей пересылать пришедшее сообщение, ЭС содержит по порту на каждый класс, методы:

- IGate declareInputGate(Class msgClass);
- IGate getInputGate(Class msgClass);
- boolean hasInputGate(Class msgClass);

И именно с ними необходимо соединить модуль, который получит исходное сообщение.