[[:start|На главную]], [[protocols:start|Протоколы]]
----
====== Протокол Wake. Спецификация. ======
{{tag>Протоколы Wake}}
===== Описание =====
Протокол WAKE является логическим уровнем интерфейса управления оборудованием с помощью асинхронного последовательного канала. Физический уровень интерфейса протоколом не определяется, может использоваться, например, RS-232, RS-485 или USB. Протокол позволяет производить обмен пакетами данных (data frames) длиной до 255 байт с адресуемыми устройствами, которых может быть до 127.
Последовательный канал должен быть сконфигурирован следующим образом:
* число бит в посылке - 8
* количество стоп-бит - 1
* бит четности - нет
* скорость обмена - 300...115200 бод
* использование линий управления модемом - произвольное
===== Управляющие коды и стаффинг =====
Основой протокола WAKE является протокол SLIP (UNIXTM Serial Link Interface Protocol). Передача данных осуществляется в двоичном виде, т.е. используются все возможные значения байта (00h...FFh). Для передачи служебной информации зарезервированы два кода: FEND = C0h (Frame End) и FESC = DBh (Frame Escape). Управляющий код FEND служит для обозначения начала посылки, а код FESC служит для передачи ESC-последовательностей. Если в потоке данных встречаются байты, значения которых совпадают с управляющими кодами, производится подмена этих байт ESC-последовательностями. Такой механизм называют байт-стаффингом (byte stuffing). Код FEND заменяется последовательностью , , а код FESC - последовательностью , , где TFEND = DCh (Transposed FEND), TFESC = DDh (Transposed FESC). Коды TFEND и TFESC являются управляющими только в ESC-последовательностях, поэтому при передаче данных они в подмене не нуждаются.
**Таблица 1. Управляющие коды протокола WAKE.**
^ Обозначение ^ Пояснение ^ HEX-значение ^
| FEND |Frame End | C0h |
| FESC |Frame Escape | DBh |
| TFEND |Transposed Frame End | DCh |
| TFESC |Transposed Frame Escape | DDh |
**Таблица 2. Подмена байт данных ESC-последовательностями.**
^ Байт данных ^ Передаваемая последовательность ^
| FEND (C0h) | FESC, TFEND (DBh, DCh) |
| FESC (DBh) | FESC, TFESC (DBh, DDh) |
===== Структура пакета =====
Структура пакета WAKE следующая: пакет всегда начинается управляющим кодом FEND (C0h). Затем следует необязательный байт адреса, после которого идет байт команды. За ним следует байт количества данных и собственно байты данных. Завершает пакет необязательный байт контрольной суммы CRC-8.
**Таблица 3. Структура пакета WAKE.**
| FEND | ADDR | CMD | N | Data1 | ... | DataN | CRC |
**FEND:** Управляющий код FEND (C0h) является признаком начала пакета. Благодаря стаффингу, этот код больше нигде в потоке данных не встречается, что позволяет в любой ситуации однозначно определять начало пакета.
**ADDR:** Байт адреса используется для адресации отдельных устройств. На практике распространена ситуация, когда управление осуществляется только одним устройством. В таком случае байт адреса не требуется, и его можно не передавать. Вместо него сразу за кодом FEND передается байт команды CMD. Для того, чтобы можно было однозначно установить, адресом или командой является второй байт пакета, введены некоторые ограничения. Для адресации используется 7 бит, а старший бит, передаваемый вместе с адресом, должен всегда быть установлен:
| | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| ADDR=^ 1 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
Иногда возникает необходимость передать какую-то команду или данные сразу всем устройствам. Для этого предусмотрен коллективный вызов (broadcast), который осуществляется путем передачи нулевого адреса (учитывая единичный старший бит, в этом случае передаваемый байт равен 80h). Нужно отметить, что передача в пакете нулевого адреса полностью аналогична передаче пакета без адреса. Поэтому при реализации протокола можно автоматически исключать нулевой адрес из пакета. Учитывая разрядность адреса и один зарезервированный адрес для коллективного вызова, максимальное количество адресуемых устройств составляет 127.
Если возникает необходимость передать значение адреса 40h или 5Bh (передаваемый байт в этом случае будет равен C0h или DBh), то производится стаффинг, т.е. передача ESC-последовательности (см. таблицу 2). Поэтому следует учитывать, что устройства с такими адресами требуют большей на один байт длины пакета. Это может быть заметно в тех случаях, когда используются короткие пакеты. В таких случаях следует избегать назначения устройствам названных адресов.
**CMD:** Байт команды всегда должен иметь нулевой старший бит:
| | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| CMD=| 0 | C6 | C5 | C4 | C3 | C2 | C1 | C0 |
Таким образом, код команды занимает 7 бит, что позволяет передавать до 128 различных команд. Коды команд выбираются произвольно в зависимости от нужд приложения. Рекомендуется использовать несколько стандартных кодов команд:
**Таблица 4. Стандартные коды команд протокола WAKE.**
^ Код ^ Название ^ Описание команды ^
| 00h | C_Nop |Нет операции |
| 01h | C_Err |Передача кода ошибки |
| 02h | C_Echo |Запрос возврата переданного пакета |
| 03h | C_Info |Запрос информации об устройстве |
Коды остальных команд выбираются в зависимости от нужд приложения. Команды обычно имеют несколько параметров, которые передаются далее в виде пакета данных.
Поскольку код команды всегда имеет нулевой старший бит, этот код никогда не совпадает с управляющими кодами. Поэтому при передаче команды стаффинг никогда не производится.
**N:** Байт количества данных имеет значение, равное количеству передаваемых байт данных:
| | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| N=| N7 | N6 | N5 | N4 | N3 | N2 | N1 | N0 |
Таким образом, код количества данных занимает 8 бит, в результате один пакет может содержать до 255 байт данных. Значение N не учитывает служебные байты пакета FEND, ADDR, CMD, N и CRC. В результате стаффинга фактическая длина пакета может возрасти. Значение N не учитывает этот факт и отражает количество полезных байт данных (т.е. значение N всегда таково, как будто стаффинг не осуществляется). Если передаваемая команда не имеет параметров, то передается N = 00h и байты данных опускаются.
Если возникает необходимость передать значение N, равное C0h или DBh, то производится стаффинг, т.е. передача ESC-последовательности (см. таблицу 2). Однако при таких больших значениях N длина пакета столь велика, что его удлинение еще на один байт практически незаметно.
Data1...DataN: Байты данных, количество которых определяется значением N. При N = 00h байты данных отсутствуют. Байты данных могут иметь любое значение, кроме FEND (C0h) и FESC (DBh). Если возникает необходимость передать одно из этих значений, то производится стаффинг, т.е. передача ESC-последовательности (см. таблицу 2), состоящей из управляющего кода FESC и кода TFEND (TFESC).
**СRC:** Байт контрольной суммы CRC-8. Может отсутствовать в некоторых реализациях протокола. Контрольная сумма CRC-8 рассчитывается перед операцией стаффинга для всего пакета, начиная с байта FEND и заканчивая последним байтом данных. Если в пакете передается адрес, то при вычислении контрольной суммы используется его истинное значение, т.е. единичный старший бит не учитывается. Для расчета контрольной суммы используется полином CRC = X8 + X5 + X4 + 1. Значение CRC перед вычислением инициализируется числом DEh. При передаче значения байта контрольной суммы C0h и DBh заменяются ESC-последовательностями (см. таблицу 2).
**Таблица 5. Величина избыточности протокола WAKE.**
^ Вид пакета ^ Избыточность, % ^
|FEND, CMD, 00h, CRC | 75,0 |
|FEND, CMD, 00h | 66,7 |
|FEND, ADDR, CMD, 00h, CRC | 60,0 |
|FEND, ADDR, CMD, 00h | 50,0 |
|FEND, ADDR, CMD, 0Ah, <10 bytes of data>, CRC | 20,0 |
|FEND, ADDR, CMD, 32h, <50 bytes of data>, CRC | 5,5 |
|FEND, ADDR, CMD, 7Fh, <127 bytes of data>, CRC | 2,3 |
|FEND, CMD, 7Fh, <127 bytes of data>, CRC | 2,3 |
|FEND, ADDR, CMD, 7Fh, <127 bytes of data> | 1,5 |
|FEND, CMD, 7Fh, <127 bytes of data> | 1,5 |
----
===== Источники =====
[[http://caxapa.ru/lib/wake/|caxapa.ru Спецификация протокола WAKE]] \\
[[http://digit-el.com/files/open/wake/wake.html|digit-el.com Спецификация протокола WAKE]]
----
[[:start|На главную]], [[protocols:start|Протоколы]]
~~DISCUSSION~~