![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
SuperMax |
![]()
Сообщение
#1
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 339 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Идея:
разработать различное API для работы с сетью Интернет Задача 1. Таблица рекордов в общих штрихах серверная часть: сервер БД WEB интерфейс - регистрация пользователя логин-пароль (дабы таблицы рекордов были персонализированными) - регистрация игры и получение уникального ID игры - просмотр рекордов/статистики игр итд итп API для AZБК - авторизация игры - авторизация пользователя - добавление рекорда клиентская часть на AZ* - авторизация игры - авторизация пользователя - добавление рекорда Задача 2. Сетевые диски возможность подключения в режиме R/O или R/W образа дисков на сервере UPD 2024-03-17 разрисовываю детально и начинаю делать UPD 2024-03-24 планируется такой пакет команд AZ 61 авторизация пользователя по хешу 62 регистрация пользователя 63 передача параметров из буфера на сервер 64 считывание таблицы рекордов с сервера в файл на карточке начал делать команды UPD 2024-03-25 долго не хотел этим заниматься, но видимо пришло время сделаю сетевой сервер дисков иначе говоря будет возможность цеплять любые сетевые диски как устройства AZ или будет отдельный драйвер - еще не решил но суть именно такая - блочное сетевое устройство начал писать сервер - демон на сях UPD 2024-12-02 итого API HOF реализовано в полной мере в "тетрис" имплементировано API HOF успешно работает - аутентификация игры - аутентификация пользователя - регистрация пользователя - регистрация игры осталось прикрутить ачивки и вывод таблицы рекордов видео выложено тут https://t.me/pdp11_az/15708/21177 UPD 2025-01-04 проект сетевых дисков "получил время" на разработку - хоть я и начал думать на демоном, но реально начал писать только в конце декабря а сейчас, соответственно я хорошо продвинулся в этом направлении прямо сейчас уже работает демон обслуживающий монтирование R/O любых образов дисков из архива https://mirrors.pdp-11.ru/ максимальное количество одновременно открытых файлов для работы - 20тысяч демон способен обслужить до 5k запросов в секунду полный набор команд демона, я еще не реализовал и не прикрутил средства борьбы с DDOS [у меня есть опыт и готовые модули для этого тоже есть] теперь можно очертить проект сетевых дисков более четко: 1. диски из архива можно монтировать прямо при помощи API 2. максимальная длина пути - 384 символа (самый длинный путь в архиве сейчас 366, соответственно точно хватит ) 3. все диски из архива монтируются только R/O режиме 4. пользователи смогут заводить свои персональные зоны с дисками которые можно будет монтировать в монопольном RW режиме (он будет по-умолчанию) иначе говоря это будут "персональные облака типа one drive" [TODO] 5. для авторизации будет использовать функционал HOF - иначе говоря это будет единая учетка и для рекордов и для своих облачных дисков 6. ограничений на количество ваших AZ контроллеров работающих под одной учеткой не будет. 7. будет реализована полностью сетевая загрузка с сетевых дисков - иначе говоря можно будет вообще не хранить свои образа на карточке [TODO] UPD 2025-01-06 1. будет 4 пространства сетевых дисков N:/ - это архив в текущем виде - те все что угодно можно монтировать R:/ репозиторий - буду формировать внятный набор дисков - прошу коллег подключаться к этому процессу P:/ - персональное облако, будет доступно и на запись но доступ только для себя S:/ - shared - облако для возможности делится с кем-то дисками и доступом к ним досутп будет управляемый ————- по времени реализации N: и R: - будут сейчас P: и S: - позднее тк это надо дописать авторизацию и прочее в демоне ибо сейчас он просто сетевой сервер -------------------- Живы будем - Не помрем !
|
SuperMax |
![]()
Сообщение
#2
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 339 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
проект API по рекордам и ачивкам - https://hof.maxiol.com/ Hall of Fame
проект API по рекордам и ачивкам обмен будет в виде запросов с ответами отправляемых со стороны STM32 формат - JSON организация обмена - типовая последовательность 1. #023 принять с шины в буфер данные - те загоняем данные (кроме инициализации - тут содержимое буфера не имеет значения) 2. #025 инициализация (или #026 - обмен) 3. #022 отдать на шину считанный блок из буфера последовательность 1. инициализация включает в себя - резолвинг домена с back-end-ом - dns имя back.hof.maxiol.com - установка первоначального соединения с сервером, прокачка шифра, получение номера(хеша) сессии результатом является такой JSON Код {"SID":"хеш сессии","RESULT":"OK"} или ошибка Код {"RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} {"RESULT":"ERROR","DESCRIPTION":"CONNECTION_ERROR"} технически сессия будет с солью дабы не раскрутить 2. авторизация игры технически это отправка JSON Код {"SID":"хеш сессии","CMD":"AUTH_GAME","GID":"хеш игры","SERNUM":"1234567890","UTC":"420"} где SERNUM - серийный номер игры (для игр ретейл поставки) UTC - часовой пояс игрока, число в минутах, брать из AZ.INI ответ тоже JSON Код {"SID":"хеш сессии","RESULT":"OK"} или Код {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"GAME_NOT_FOUND"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SESSION_NOT_EXISTS_OR_EXPIRED"} 3. регистрация пользователя технически это отправка JSON {"SID":"хеш сессии","CMD":"REG_USER","NICKNAME":"никнейм пользователя","PASSWORD":"пароль пользователя","EMAIL":"email пользователя"} все поля обязательные! ответ тоже JSON {"SID":"хеш сессии","RESULT":"OK"} или Код {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"NO_ALL_DATA"} - какое-то поле NULL {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"EMAIL_ALREADY_USED"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"NICKNAME_TAKEN"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"NOT_VALID_EMAIL"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"NOT_VALID_NICKNAME"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"NOT_VALID_PASSWORD"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SESSION_NOT_EXISTS_OR_EXPIRED"} 4. авторизация пользователя технически это отправка JSON {"SID":"хеш сессии","CMD":"AUTH_USER","NICKNAME":"никнейм пользователя","PASSWORD":"пароль пользователя"} ответ тоже JSON Код {"SID":"хеш сессии","RESULT":"OK"} или Код {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"USER_NOT_FOUND_OR_WRONG_PASSWORD"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SESSION_NOT_EXISTS_OR_EXPIRED"} 5. регистрация ачивмента технически это отправка JSON Код {"SID":"хеш сессии","CMD":"REG_ACHIEVEMENT","ACHIEVEMENT":"id aчивмента"} ответ тоже JSON Код {"SID":"хеш сессии","RESULT":"OK"} или Код {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"ACHIEVEMENT_NOT_EXISTS"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"ACHIEVEMENT_ALREADY_TAKEN"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"USER_AUTHORIZATION_REQUIRED"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"GAME_AUTHORIZATION_REQUIRED"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SESSION_NOT_EXISTS_OR_EXPIRED"} 6. регистрация рекорда игры технически это отправка JSON Код {"SID":"хеш сессии","CMD":"REG_SCORE","SCORE":"число"} ответ тоже JSON Код {"SID":"хеш сессии","RESULT":"OK"} или {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"USER_AUTHORIZATION_REQUIRED"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"GAME_AUTHORIZATION_REQUIRED"} {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SESSION_NOT_EXISTS_OR_EXPIRED"} 7. продление сессии технически это отправка JSON Код {"SID":"хеш сессии","CMD":"NOP"} ответ тоже JSON Код {"SID":"хеш сессии","RESULT":"OK"} или Код {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} 8. трекинг кастомной информации технически это отправка JSON Код {"SID":"хеш сессии","CMD":"TRACKING","PARAMETER":"имя параметра","VALUE":"значение параметра"} ответ тоже JSON Код {"SID":"хеш сессии","RESULT":"OK"} или Код {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} команда предназначена для трекинга какой-то своей информации в игре для трекинга нескольких параметров сразу доступен такой синтаксис Код {"SID":"хеш сессии","CMD":"TRACKING","PARAMETER":"имя параметра1|имя параметра2|имя параметра3","VALUE":"значение параметра1|значение параметра2|значение параметра3"} те имена и значения разделаются через пайп - | 9. завершение сессии технически это отправка JSON Код {"SID":"хеш сессии","CMD":"CLOSE_SESSION"} ответ тоже JSON Код {"SID":"хеш сессии","RESULT":"OK"} или Цитата {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} 10. Получение таблицы рекордов технически это отправка JSON Код {"SID":"хеш сессии","CMD":"GET_SCORE","COUNT":"количество строк","DETAILS":"уровень детализации"} уровень детализации определяет набор возвращаемых полей и формать ответ тоже JSON - отличается форматами, возможно добавление новых форматов по заказу DETAILS=1 Код {"SID":"хеш сессии","RESULT":"OK","COUNT":9,"SCORES":[["1","TEST","1328"],["2","TEST5","1321"],["3","TEST","1195"],["4","TEST","704"],["5","TEST","672"],["6","TEST","541"],["7","TEST4","519"],["8","TEST","432"],["9","TEST","400"]]}<p><p>{"SID":"BKBHKLBBKBKJBBK","RESULT":"OK","COUNT":9,"SCORES":{"Peter":5,"Ben":37,"Joe":43}} DETAILS=2 Код {"SID":"хеш сессии","RESULT":"OK","COUNT":9,"SCORES":[[" 1","TEST "," 1328"],[" 2","TEST5 "," 1321"],[" 3","TEST "," 1195"],[" 4","TEST "," 704"],[" 5","TEST "," 672"],[" 6","TEST "," 541"],[" 7","TEST4 "," 519"],[" 8","TEST "," 432"],[" 9","TEST "," 400"]]} DETAILS=3 Код {"SID":"хеш сессии","RESULT":"OK","COUNT":9,"SCORES":[[" 1|TEST | 1328"],[" 2|TEST5 | 1321"],[" 3|TEST | 1195"],[" 4|TEST | 704"],[" 5|TEST | 672"],[" 6|TEST | 541"],[" 7|TEST4 | 519"],[" 8|TEST | 432"],[" 9|TEST | 400"]]} DETAILS=4 тут добавлена короткая дата Код {"SID":"хеш сессии","RESULT":"OK","COUNT":9,"SCORES":[["1","TEST","1328","2024-12-02"],["2","TEST5","1321","2024-12-03"],["3","TEST","1195","2024-12-02"],["4","TEST","704","2024-12-02"],["5","TEST","672","2024-12-02"],["6","TEST","541","2024-12-02"],["7","TEST4","519","2024-12-02"],["8","TEST","432","2024-12-03"],["9","TEST","400","2024-12-02"]]} DETAILS=5 тут добавлена дата + время Код {"SID":"хеш сессии","RESULT":"OK","COUNT":9,"SCORES":[["1","TEST","1328","2024-12-02 17:02"],["2","TEST5","1321","2024-12-03 14:51"],["3","TEST","1195","2024-12-02 17:01"],["4","TEST","704","2024-12-02 16:52"],["5","TEST","672","2024-12-02 16:59"],["6","TEST","541","2024-12-02 17:04"],["7","TEST4","519","2024-12-02 17:10"],["8","TEST","432","2024-12-03 14:50"],["9","TEST","400","2024-12-02 16:52"]]} DETAILS=6 на тему 3й формы добавлена дата Код {"SID":"BKBHKLBBKBKJBBK","RESULT":"OK","COUNT":9,"SCORES":[[" 1|TEST |2024-12-02| 1328"],[" 2|TEST5 |2024-12-03| 1321"],[" 3|TEST |2024-12-02| 1195"],[" 4|TEST |2024-12-02| 704"],[" 5|TEST |2024-12-02| 672"],[" 6|TEST |2024-12-02| 541"],[" 7|TEST4 |2024-12-02| 519"],[" 8|TEST |2024-12-03| 432"],[" 9|TEST |2024-12-02| 400"]]} DETAILS=7 на тему 3й формы добавлена дата + время Код {"SID":"BKBHKLBBKBKJBBK","RESULT":"OK","COUNT":9,"SCORES":[[" 1|TEST |2024-12-02 17:02| 1328"],[" 2|TEST5 |2024-12-03 14:51| 1321"],[" 3|TEST |2024-12-02 17:01| 1195"],[" 4|TEST |2024-12-02 16:52| 704"],[" 5|TEST |2024-12-02 16:59| 672"],[" 6|TEST |2024-12-02 17:04| 541"],[" 7|TEST4 |2024-12-02 17:10| 519"],[" 8|TEST |2024-12-03 14:50| 432"],[" 9|TEST |2024-12-02 16:52| 400"]]} или Код {"SID":"хеш сессии","RESULT":"ERROR","DESCRIPTION":"SERVER_ERROR"} ограничения 1. применяется кодировка ASCII - те только латиница, для полной унификации 2. длина NICKNAME - от 3х до 16 символов, 3. длина EMAIL - до 32 символов 4. длина PASSWORD - от 8 до 16 символов 5. ACHIVMENT - это его числовой идентификатор в системе (смотрим на сайте) 6. длина SCORE - от 1х до 16 цифр 7. количество получаемых записей рекордов от 1 до 10 8. время жизни сессии игры - 4 часа 9. имя параметра - от 1ого до 32 символов 10. значение параметра - от 1ого до 32 символов -------------------- Живы будем - Не помрем !
|
SuperMax |
![]() ![]()
Сообщение
#3
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 339 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Сетевое API - AZSERVER
редакция от 2025-01-11 Концепция сетевых дисков: 1. Технически это блочный интерфейс к любому файлу расположенному в пространстве имен. 2. На данный момент поддержаны 2 пространства имен N:\ и R:\ 3. Пространство N: - сетевой диск из архива - те любой образ c https://mirrors.pdp-11.ru/ данный путь считается корнем соответственно для монтирования диска OVERKIL.IMG расположенного по пути https://mirrors.pdp-11.ru/_bk0010-11-11m/so...collection/IMG/ надо указать следующее имя файла N:/_bk0010-11-11m/soft/SuperMax_collection/IMG/OVERKIL.IMG 4. Форматы запросов и ответов (упакованные структуры) указаны ниже. Лицензирование В связи с тем, что сетевое API создается в расчете на все ретроплатформы, API является открытым решением, единственным условием использования которого в своих решениях является обязательное указание MAXIOL Landisk technology ® это должно быть указано и в документации на Ваше решение и при использовании данной функции на стороне ретроплатформы. Данные для подключения: DNS name - landisk.maxiol.com TCP Port - 34162 Структуры Код // структура пакета запроса typedef __packed struct landisk_reqest { unsigned int num_block; // номер блока (32 бита) unsigned short int command; // команда unsigned char reserved[32]; // зарезервировано unsigned char data[512]; // данные - если они отправляются char path[386]; // путь до диска unsigned short int crc; // CRC команды } landisk_reqest_t; при открытии файла блок данных (data) рассматривается как пакет информации Код // структура пакета открытия файла, информационные параметры typedef __packed struct landisk_reqest_status { unsigned long timestamp; // локальное время контроллера (unix-time) unsigned long uptime; // аптайм в секундах unsigned long ip_addr; // локальный ip адрес контроллера unsigned long dns_srv1; // ip адреса DNS-серверов unsigned long dns_srv2; unsigned short int tzone; // таймзона в минутах unsigned short int platform; // номер платформы unsigned short int controller; // тип контроллера unsigned short int version; // версия прошивки контроллера char build[32]; // дата билда прошивки контроллера char url[64]; // URL производителя контроллера } landisk_reqest_status_t; пакет информации настоятельно рекомендуется заполнять полностью // номер платформы 1 - PDP-11 - БК 10/11M 2 - PDP-11 - остальные - те ДВК Э60 УКНЦ оригинальные машины итд 3 - MSX если вашей платформы нет в списке - пишите мне // тип контроллера 1 - AZБК 2 - AZ - для всех остальных PDP-11 машин 3 - Carnivore2+ для добавления в список Вашего контроллера - пишите мне. Код // команды #define LANDISK_CMD_OPEN 1 // в ответ успешность/ошибка, и если успешно - размер диска #define LANDISK_CMD_READ 2 // чтение блока #define LANDISK_CMD_WRITE 3 // запись блока #define LANDISK_CMD_CLOSE 4 // закрытие файла #define LANDISK_CMD_OPENDIR 5 // открыть оглавление по указанному пути #define LANDISK_CMD_READDIR 6 // прочитать одну запись оглавления в буфер #define LANDISK_CMD_SEARCH_REQ 7 // послать запрос поиска #define LANDISK_CMD_READ_SREQ 8 // прочитать одну запись результата поиска в буфер Код // структура пакета ответа с данными typedef __packed struct landisk_answer { unsigned short int result; // результат unsigned char data[512]; // принятые данные unsigned short int crc; // CRC ответа } landisk_answer_t; Код // структура пакета ответа статуса файла typedef __packed struct landisk_answer_status { unsigned char fattr; // File attribute unsigned short int fdate; // Fat date unsigned short int ftime; // Fat time unsigned int fsize; // File size } landisk_answer_status_t; это стандартный набор информации о файле-образе в FATформате. Код // ответы #define LANDISK_ANS_OK 0x0000 // команда выполнена успешно #define LANDISK_ANS_ERROR 0x0001 // флаг ошибки, устанавливается при любой ошибке #define LANDISK_ANS_ACCESS_DENIED 0x0002 // нет доступа, устанавливается при любой ошибке доступа #define LANDISK_ANS_NEED_REG 0x0004 // нет доступа - нужна регистрация #define LANDISK_ANS_RO_ONLY 0x0008 // нет доступа на запись- данный диск только для чтения #define LANDISK_ANS_NOT_EXISTS 0x0010 // нет данного образа - неверный путь до файла образа или директории Для расчета CRC используется ф-я ![]() Стратегия работы 1. первая команда должна быть открытие файла (LANDISK_CMD_OPEN) при запросе на открытие надо указать блок параметров (landisk_reqest_status_t) в ответ будет прислан блок landisk_answer_t но data[512] надо рассматривать как landisk_answer_status_t 2. далее можно посылать команды чтения 3. на данный момент поддержаны команды LANDISK_CMD_OPEN, LANDISK_CMD_READ, LANDISK_CMD_WRITE, LANDISK_CMD_CLOSE 4. В конце работы желательно (но не обязательно) послать команды закрытия дисков. Ограничения: 1. не более 100 запросов в секунду с одного IP (иначе сработает блок анти-DDOS и забанит данный IP на некоторое время) 2. не более 10ти "висящих" соединений на IP. -------------------- Живы будем - Не помрем !
|
![]() ![]() |
Текстовая версия | Сейчас: 20.4.2025, 22:18 |