bus

Материал из RO-fan
Перейти к: навигация, поиск
bus [<булиев_флаг>]
Эта системная переменная определяет, включить ли бус-шину (англ. bus), которая позволяет общаться нескольким экземплярам OpenKore между собой и обеспечивает взаимодействие внешних программ с OpenKore. Если системная переменная bus 0, то бус-шина выключена и никаких настроек делать не надо. Если же системная переменная bus 1, то бус-шина включена и для общения по ней следует сделать некоторые настройки в файле sys.txt.

Коротко о бус-шине

Цель бус-шины - позволить различным экземплярам OpenKore легко общаться между собой и позволить внешним программам также легко общаться с запущенной OpenKore.

Бус-шина - это канал связи, который может заниматься широковещательной рассылкой сообщений, также как и рассылкой личных, приватных сообщений своим абонентам. Кто-то сравнил это с улицей, на которой любой может громко прокричать что-либо (это типа широковещательная рассылка), а может подойти и шепнуть на ушко (а это типа приватное сообщение).

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

Описание протокола

Создатель этого протокола назвал формат сообщений "Simple Serializable Message" (SSM). Формат этих сообщений - двоичный.

Каждое сообщение SSM содержит следующую информацию:

  • Идентификатор сообщения - MID. Это строка, в которой может быть написано всё, что угодно.
  • Список аргументов. Это может быть либо список пар вида параметр-значение, либо список скалярных значений, то есть массив.

Сообщение сопоставимо с вызовом функции в языках программирования. Представьте себе следующую функцию в C++:

void copyFile(string from, string to);
copyFile("foo.txt", "bar.txt");

Проводя аналогию между функцией на C++ и сообщением SSM для бус-шины, можно отметить:

  • Идентификатор сообщения был бы строкой copyFile.
  • Список аргументов состоял бы из двух пар параметр-значение:
from = foo.txt
to = bar.txt

Структура сообщения

Возьмите на заметку, что все целые числа записываются в big-endian. Это означает, что в сообщении старший байт будет записан перед младшим.

Заголовок сообщения

Каждое SSM-сообщение начинается с заголовка struct Header, структура которого описана ниже:

struct {
	// Header
	uint32 length;           // Длина в байтах всего SSM-сообщения.
	uint8  options;          // Тип SSM-сообщения: 0 = список пар параметр-значение, 1 = список скаляров, массив.
	uint8  MID_length;       // Длина MID - идентификатора сообщения, который является строкой.
	char   MID[MID_length];  // MID - идентификатор сообщения, это строка в UTF-8 кодировке.
} Header;

Если в вышеописанном заголовке сообщения поле options = 0, тогда за заголовком следует список структур struct MapEntry, который идёт до самого конца SSM-сообщения. Это список пар параметр-значение.

Если же в заголовке сообщения поле options = 1, тогда за заголовком следует список структур struct ArrayEntry, который идёт до самого конца SSM-сообщения. Это список скаляров, массив.

Структура параметр-значение

struct {
	uint8  key_length;           // Длина имени параметра.
	char   key[key_length];      // Строка - имя параметра в UTF-8 кодировке.

	uint8  value_type;           // Тип значения: 0 = двоичный, 1 = строка в UTF-8 кодировке, 2 = unsigned integer
	uint24 value_length;         // Длина значения параметра.
	char   value[value_length];  // Само значение параметра, длиной value_length символов, байт.
} MapEntry;

Структура скаляра

struct {
	uint8  type;                 // Тип скаляра: 0 = двоичный, 1 = строка в UTF-8 кодировке, 2 = unsigned integer
	uint24 length;               // Длина значения скаляра.
	char   value[length];        // Само значение скаляра, длиной length символов, байт.
} ArrayEntry;