IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Сетевое API для AZ*
SuperMax
сообщение 15.3.2024, 15:20
Сообщение #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
60 авторизация продукта по хешу
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
сообщение 31.3.2024, 11:21
Сообщение #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
сообщение 11.1.2025, 19:22
Сообщение #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 используется ф-я
Прикрепленный файл  crc.rar ( 856 байт ) Кол-во скачиваний: 147



Стратегия работы
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.




--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 20.4.2025, 22:18