Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
doc:jroboplc:modules:jrbustcp-protocol [2020/12/22 21:34] denis [01 - INIT] |
doc:jroboplc:modules:jrbustcp-protocol [2022/01/27 13:35] (текущий) denis [07 - AUTH_INIT] |
||
---|---|---|---|
Строка 53: | Строка 53: | ||
''**flags**'' - битовые параметры:\\ | ''**flags**'' - битовые параметры:\\ | ||
- | * <del>b0 - не использовать описания тегов. Если 1, то описание тега в ответе команды LIST будет пустой строкой.</del> **Внимание! Это ошибка, допущеная в предыдущей версии описания. Правильный вариант описания ''b0'' см. ниже.** | ||
* ''b0'' - клиент поддерживает передачу описания тегов. Если b0 не установлен, то описания тегов в ответе команды ''LIST'' будут пустыми строками. | * ''b0'' - клиент поддерживает передачу описания тегов. Если b0 не установлен, то описания тегов в ответе команды ''LIST'' будут пустыми строками. | ||
* ''b1'' - клиент поддерживает передачу статусов тегов в ответе команды ''READ''. | * ''b1'' - клиент поддерживает передачу статусов тегов в ответе команды ''READ''. | ||
Строка 153: | Строка 152: | ||
| | ||
+ | ===== 06 - CRC ===== | ||
+ | Чтение CRC32 по всем текущим значениям тегов, зафиксированным командой UPDATE. | ||
+ | request: 0x06 | ||
+ | answer: 0x86 crc#4 | ||
+ | | ||
+ | ''**crc**'' - контрольная сумма CRC32 всех значений тегов | ||
+ | Подсчет CRC выполняется последовательно по списку тегов, сформированному командой INIT. Значение каждого тега представляется в виде байтового массива, длина которого зависит от типа тега: | ||
+ | * BOOL - 1 байт | ||
+ | * INT - 4 байт | ||
+ | * LONG - 8 байт | ||
+ | * DOUBLE - 8 байт | ||
+ | * STRING - 4 байт | ||
+ | |||
+ | Старший байт значения суммируется первым. | ||
+ | |||
+ | Для тегов типа STRING используется значение хэш-кода, расчитываемого следующим образом (java): | ||
+ | <code java> | ||
+ | public int hashCode() { | ||
+ | int h = hash; | ||
+ | if (h == 0 && value.length > 0) { | ||
+ | char val[] = value; | ||
+ | | ||
+ | for (int i = 0; i < value.length; i++) { | ||
+ | h = 31 * h + val[i]; | ||
+ | } | ||
+ | hash = h; | ||
+ | } | ||
+ | return h; | ||
+ | } | ||
+ | </code> | ||
+ | При расчете хэш-кода используются значения символов строки в кодировке [[https://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024|UNICODE]]. | ||
+ | |||
+ | |||
+ | ===== 07 - AUTH_INIT ===== | ||
+ | Инициализация процесса аутентификации. | ||
+ | |||
+ | request: 0x07 klen#2 keyname#klen | ||
+ | answer: 0x87 status#1 nlen#2 nonce#nlen | ||
+ | | ||
+ | **''klen''** - длина строки keyname в байтах. | ||
+ | |||
+ | **''nlen''** - длина строки nonce в байтах. | ||
+ | | ||
+ | ''**keyname**'' - имя файла приватного ключа, который будет использоваться на стороне клиента. | ||
+ | |||
+ | ''**status**'' - статус выполнения инициализации аутентификационного процесса на сервере: | ||
+ | 0 - OK - процесс начат нормально, сформировано и зашифровано nonce (random-строка) | ||
+ | 1 - FAILED - процесс не начат, в nonce находится описание проблемы | ||
+ | 2 - DISABLED - аутентификация на сервере отключена, вход свободный | ||
+ | |||
+ | ''**nonce**'' - зашифрованное публичным ключем сгенерированное значение (строка случайных символов) | ||
+ | |||
+ | Сервер должен иметь у себя соответствующий публичный ключ с именем файла ''keyname.pub''. После того, как клиент получил зашифрованный nonce, он должен расшифровать его своим приватным ключем ''keyname'' и отправить на сервер последующей командой AUTH_SUBMIT. | ||
+ | |||
+ | |||
+ | |||
+ | ===== 08 - AUTH_SUBMIT ===== | ||
+ | Завершение процесса аутентификации. | ||
+ | |||
+ | request: 0x08 nlen#2 nonce#nlen | ||
+ | answer: 0x88 status#1 | ||
+ | | ||
+ | **''nlen''** - длина строки nonce в байтах. | ||
+ | | ||
+ | ''**nonce**'' - расшифрованная приватным ключем значение nonce, полученное от сервера командой AUTH_INIT | ||
+ | |||
+ | ''**status**'' - результат аутентификации: | ||
+ | 0 - ACCEPTED - успешно | ||
+ | 0xFF - DENIED - отказано | ||
+ | |||
+ | |||
+ | ===== FE - UNAUTHENTICATED ===== | ||
+ | Ответ на любую команду, если сервер требует аутентификации, и она не выполнена. Не распространяется на команды AUTH_*. | ||
+ | |||
+ | answer: 0xFE | ||
+ | | ||
===== FF - UNKNOWN ===== | ===== FF - UNKNOWN ===== | ||
- | Ответ на неизвестную команду, код которой не соответствует вышеописанным командам. | + | Ответ на неизвестную серверу команду. |
answer: 0xFF | answer: 0xFF | ||
| | ||