├── LICENSE ├── NeuralInterface ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-311.pyc │ ├── settings.cpython-311.pyc │ ├── urls.cpython-311.pyc │ └── wsgi.cpython-311.pyc ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── README.md ├── db.sqlite3 ├── interface ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-311.pyc │ ├── __init__.cpython-39.pyc │ ├── admin.cpython-311.pyc │ ├── admin.cpython-39.pyc │ ├── apps.cpython-311.pyc │ ├── apps.cpython-39.pyc │ ├── models.cpython-311.pyc │ ├── models.cpython-39.pyc │ ├── serializers.cpython-311.pyc │ ├── serializers.cpython-39.pyc │ ├── views.cpython-311.pyc │ └── views.cpython-39.pyc ├── admin.py ├── apps.py ├── models.py ├── serializers.py ├── static │ ├── css │ │ ├── base.css │ │ ├── index.css │ │ ├── info.css │ │ └── monitor.css │ ├── echarts │ │ └── dist │ │ │ ├── echarts.js │ │ │ ├── echarts.js.map │ │ │ └── echarts.min.js │ ├── images │ │ ├── Info │ │ │ ├── AddAgent.png │ │ │ └── EditAgent.png │ │ ├── admin_purple.png │ │ ├── darkmode.png │ │ ├── edit.gif │ │ ├── edit.png │ │ ├── edit.svg │ │ ├── edit_purple.png │ │ ├── favicon.ico │ │ ├── graph.gif │ │ ├── graph_dark.gif │ │ ├── graph_purple.png │ │ ├── info.gif │ │ ├── info_dark.gif │ │ ├── machine_learning.svg │ │ ├── neural_brain.png │ │ ├── neural_brain_purple.png │ │ ├── neural_map.png │ │ ├── neural_network.svg │ │ ├── neural_network_weight.png │ │ ├── settings.gif │ │ ├── settings_dark.gif │ │ └── settings_purple.png │ ├── js │ │ ├── index.js │ │ ├── info.js │ │ └── monitor.js │ └── video │ │ ├── InstallGit.mp4 │ │ ├── InstallProject.mp4 │ │ ├── InstallPython.mp4 │ │ └── info │ │ ├── AgentUse.mp4 │ │ ├── GraphUse.mp4 │ │ └── GroupUse.mp4 ├── templates │ └── interface │ │ ├── base.html │ │ ├── index.html │ │ ├── info.html │ │ └── monitor.html ├── tests.py └── views.py ├── manage.py ├── requirements.txt └── testing ├── FastStart └── run_server.bat ├── cpr.dll ├── libcurl-d.dll ├── libcurl.dll └── requests.exe /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Cognitive-systems-and-technologies 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /NeuralInterface/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/NeuralInterface/__init__.py -------------------------------------------------------------------------------- /NeuralInterface/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/NeuralInterface/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /NeuralInterface/__pycache__/settings.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/NeuralInterface/__pycache__/settings.cpython-311.pyc -------------------------------------------------------------------------------- /NeuralInterface/__pycache__/urls.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/NeuralInterface/__pycache__/urls.cpython-311.pyc -------------------------------------------------------------------------------- /NeuralInterface/__pycache__/wsgi.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/NeuralInterface/__pycache__/wsgi.cpython-311.pyc -------------------------------------------------------------------------------- /NeuralInterface/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for pythonProject project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NeuralInterface.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /NeuralInterface/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for NeuralInterface project. 3 | 4 | Generated by 'django-admin startproject' using Django 4.1.1. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/4.1/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | 15 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 16 | BASE_DIR = Path(__file__).resolve().parent.parent 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'django-insecure-1!n)d^c)#4g)kfs^)!w@#)6jvhzpn7j*h&=j02i6+h7s*qtwks' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = ['*'] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 'interface.apps.InterfaceConfig', 41 | 'rest_framework', 42 | 'bootstrap5', 43 | ] 44 | 45 | MIDDLEWARE = [ 46 | 'django.middleware.security.SecurityMiddleware', 47 | 'django.contrib.sessions.middleware.SessionMiddleware', 48 | 'django.middleware.common.CommonMiddleware', 49 | 'django.middleware.csrf.CsrfViewMiddleware', 50 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 51 | 'django.contrib.messages.middleware.MessageMiddleware', 52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 53 | ] 54 | 55 | ROOT_URLCONF = 'NeuralInterface.urls' 56 | 57 | TEMPLATES = [ 58 | { 59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 60 | 'DIRS': [], 61 | 'APP_DIRS': True, 62 | 'OPTIONS': { 63 | 'context_processors': [ 64 | 'django.template.context_processors.debug', 65 | 'django.template.context_processors.request', 66 | 'django.contrib.auth.context_processors.auth', 67 | 'django.contrib.messages.context_processors.messages', 68 | ], 69 | }, 70 | }, 71 | ] 72 | 73 | WSGI_APPLICATION = 'NeuralInterface.wsgi.application' 74 | 75 | 76 | # Database 77 | # https://docs.djangoproject.com/en/4.1/ref/settings/#databases 78 | 79 | DATABASES = { 80 | 'default': { 81 | 'ENGINE': 'django.db.backends.sqlite3', 82 | 'NAME': BASE_DIR / 'db.sqlite3', 83 | } 84 | } 85 | 86 | 87 | # Password validation 88 | # https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators 89 | 90 | AUTH_PASSWORD_VALIDATORS = [ 91 | { 92 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 93 | }, 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 102 | }, 103 | ] 104 | 105 | 106 | # Internationalization 107 | # https://docs.djangoproject.com/en/4.1/topics/i18n/ 108 | 109 | LANGUAGE_CODE = 'ru' 110 | 111 | TIME_ZONE = 'Europe/Moscow' 112 | 113 | USE_I18N = True 114 | 115 | USE_TZ = True 116 | 117 | 118 | # Static files (CSS, JavaScript, Images) 119 | # https://docs.djangoproject.com/en/4.1/howto/static-files/ 120 | 121 | STATIC_URL = 'static/' 122 | 123 | # Default primary key field type 124 | # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field 125 | 126 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 127 | -------------------------------------------------------------------------------- /NeuralInterface/urls.py: -------------------------------------------------------------------------------- 1 | """NeuralInterface URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/4.1/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path 18 | 19 | # from interface.views import interfaceAPIView 20 | from interface.views import index, monitor, info, \ 21 | AgentAddData, AgentDeleteData, AgentEditData, \ 22 | GroupAddData, GroupDeleteData, GroupEditData, \ 23 | SendRequestToAgent, GraphApiData, SyncAgentData, \ 24 | GraphAgentDataAdd, AgentErrorsDeleteData, DownloadNeuralNetworkStateData 25 | 26 | urlpatterns = [ 27 | # Главная страница 28 | path('', index), 29 | # Страница мониторинга 30 | path('monitor/', monitor), 31 | # Страница информации 32 | path('info/', info), 33 | # Страница администратора 34 | path('admin/', admin.site.urls), 35 | # API для добавления данных агента 36 | path('api/addAgentData', AgentAddData.as_view(), name='agent-add'), 37 | # API для редактирования данных агента с использованием его идентификатора (pk) 38 | path('api/editAgentData//', AgentEditData.as_view(), name='agent-edit'), 39 | # API для удаления данных агента с использованием его идентификатора (pk) 40 | path('api/deleteAgentData//', AgentDeleteData.as_view(), name='agent-delete'), 41 | # API для добавления данных группы 42 | path('api/addGroupData', GroupAddData.as_view(), name='group-add'), 43 | # API для редактирования данных группы с использованием ее идентификатора (pk) 44 | path('api/editGroupData//', GroupEditData.as_view(), name='group-edit'), 45 | # API для удаления данных группы с использованием ее идентификатора (pk) 46 | path('api/deleteGroupData//', GroupDeleteData.as_view(), name='group-delete'), 47 | # API для удаления данных об ошибках агента с использованием его идентификатора (agent_id) 48 | path('monitor/api/deleteAgentErrorsData//', AgentErrorsDeleteData.as_view(), 49 | name='agents-errors-delete'), 50 | # API для получения данных для графика 51 | path('api/graphData/', GraphApiData.as_view(), name='graph-data'), 52 | # API для отправки запроса агенту 53 | path('api/SendRequestToAgent', SendRequestToAgent.as_view(), name='graph-data'), 54 | # API для синхронизации данных агента 55 | path('api/syncAgentData', SyncAgentData.as_view(), name='agent-sync'), 56 | # API для добавления данных агента для графика 57 | path('api/graphAgentDataAdd', GraphAgentDataAdd.as_view(), name='graph-add-data'), 58 | # API для добавления данных состояний агента 59 | path('api/downloadNeuralNetworkStateData', DownloadNeuralNetworkStateData.as_view(), name='download-state-data'), 60 | ] 61 | -------------------------------------------------------------------------------- /NeuralInterface/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for pythonProject project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NeuralInterface.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # General description 2 | NeuralInterface is a monitoring and visualization module used to display the work of agents (mobile robots). 3 | 4 | This module is a web application with several pages displaying the current status of agents, their belonging to certain groups. 5 | 6 | The functionality of direct control of agents is also implemented. You can set the direction of their movement, download and unload their status data, start or stop their training. 7 | 8 | Practical application. 9 | 10 | The library can be used in areas where it is necessary to develop systems using neural networks, deep machine learning models, and reinforcement learning of intelligent agents. 11 | 12 | The developers consider the following areas to be the main areas of applied use of the library: 13 | - warehouse logistics (programming industrial robots in warehouses); 14 | - educational robotics (training in programming mobile robots using deep machine learning algorithms); 15 | - smart home devices (robot vacuum cleaners and other devices that require autonomous operation without operator intervention). 16 | 17 | This module is linked to the module: 18 | 19 | https://github.com/Cognitive-systems-and-technologies/RoboAICore. 20 | 21 | An example of the NeuralInterface module installed on a PC and linked to the RoboAICore module installed on an agent (mobile robot): 22 | 23 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/15780a6c-fa6e-4170-a1f9-37d5b954e09b 24 | 25 | This video demonstrates the control of an agent using the NeuralInterface module. When you press the movement buttons, the mobile robot moves in the corresponding direction, you can also see the learning process of the mobile robot, changing the distance from the rangefinders designed to determine the distance to objects such as HC-SR04 located on the mobile robot. 26 | 27 | To get a result similar to the one in the video, you need to install both library modules: NeuralInterface on a PC, RoboAICore on the STM32F4 debug board or Raspberry pi 3 (model B). The NeuralInterface module must be configured so that requests from the web application are sent to agents, receive and send a response. You also need to have a Yahboom Raspbot AI Vision Robot Car with FPV camera with three HC-SR04 ultrasonic sensors for determining distances to objects installed on it, an STM32F4 debug board or Raspberry pi 3 (model B) with the RoboAICore library installed on this debug board. 28 | Otherwise, the NeuralInterface module will work in demo mode, without communication with agents, and when trying to send a request, it will return an error that will depend on the devices located in the local network and their states. 29 | 30 | Agent characteristics. 31 | 32 | To illustrate the example of the library operation, two Yahboom Raspbot AI Vision Robot Car with FPV camera robots were selected, on which three ultrasonic sensors for determining the distance to objects of the HC-SR04 type were installed, debug boards: one for the STM32 processor family of the STM32F4 series based on the ARM Cortex-M4 architecture, model STM32F429ZI with a bit depth of 32 bits, the second - Raspberry pi 3 (model B). 33 | The operating frequency of the STM32F429ZI processor is 180 MHz, the size of the programmable memory is 2 MB, the amount of RAM is 256 KB. 34 | Characteristics for raspberry pi: processor: 64-bit quad-core ARM Cortex-A53 with a clock frequency of 1.2 GHz on a single-crystal chip Broadcom BCM2837, RAM 1 GB LPDDR2 SDRAM. 35 | 36 | Yahboom Raspbot AI Vision Robot Car with FPV camera specifications: 37 | 38 | - Control controller: Raspberry Pi (not included). 39 | - Programming language: Python. 40 | - Degree of freedom (DOF): 2 degrees of freedom, 180° up, down, left, right. 41 | - Steering: 15kg x 5 + 6kg x 1 serial bus servo. 42 | - Data input: wide-angle camera, infrared obstacle avoidance sensor, IR receiver, ultrasonic distance measurement sensor, four-channel tracking sensor, IIC interface. 43 | - Data output: servo, TT gear motor, passive serial interface buzzer. 44 | - Remote control: mobile APP / PC / IR remote control. 45 | - Sensor: ultrasonic, infrared obstacle avoidance, buzzer, LED. 46 | - Communication method: Wi-Fi network, IR remote control. 47 | - Protection: from overcurrent, from overvoltage. 48 | - Functionality: tracking and recognition of colors, gesture recognition, recognition and tracking of faces, movement along a given trajectory, recognition and avoidance of obstacles, remote control capability. 49 | 50 | ## Why a web application? 51 | Using the web server version of the NeuralInterface module instead of a desktop application allows you to deploy this project not only on the Windows operating system, but also on Linux, as well as on any server, allowing you to combine multiple devices even outside the local network. 52 | 53 | ## Requirements for running the NeuralInterface module on a PC 54 | 1. Operating system of your choice: 55 | - Windows 7/8/10 64-rbit 56 | - Linux (Ubuntu 18.04 LTS or newer recommended) 57 | - macOS Big Sur (version 11) or newer 58 | 3. Processor: Intel Core i3 or AMD equivalent 59 | 4. RAM: 2 GB (4 GB or more recommended for more complex projects) 60 | 5. Hard Drive: 10 GB (minimum for Django and its dependencies) 61 | 6. Python: Python 3.9 or newer 62 | 7. pip package installer: Installed and configured for Python 3 (installed with python) 63 | 8. Git: Installed (Git version 2.0 or higher recommended) 64 | 65 | The installation instructions are provided for Windows operating systems only. 66 | ## Preparing for installation 67 | 68 | 1. Install python with version at least 3.9. 69 | 70 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/cef11f5a-3f76-4a7d-9b8d-bb3c2c39ad46 71 | 72 | Link: https://www.python.org/downloads/ 73 | 74 | Make sure to check the box "Add python.exe to path" 75 | Also, install python for all Windows users. 76 | 2. Install Git. 77 | 78 | [InstallGit.webm](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/c10de4e7-464e-4d73-89af-ec22ccf08b38) 79 | 80 | Link: https://git-scm.com/downloads 81 | 82 | ## Installation 83 | 84 | [InstallProject.webm](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/6f259c2d-492f-4dbb-8bc3-079bdbe7bcd9) 85 | 86 | 1. Create a folder for the project. 87 | 88 | For example: C:\Projects\NeuralInterface 89 | 90 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/2b48d108-8de3-482a-926c-7ac8ccfc7cdf) 91 | 92 | 3. Open a command prompt and specify the path to the folder you just created using the command: 93 | 94 | cd C:\Projects\NeuralInterface 95 | 96 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/197cedf3-e042-4052-bf68-e27cf248f2d1) 97 | 98 | 5. Create a virtual environment using the command: 99 | 100 | python -m venv venv 101 | 102 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/ddff6223-df93-4a33-90a6-87218f15f92c) 103 | 104 | 7. Activate the virtual environment with the command: 105 | 106 | .\venv\Scripts\activate 107 | 108 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/09bbe463-7819-4577-8602-8f309a1a1afd) 109 | 110 | 9. Download the data from the repository with the command: 111 | 112 | git clone https://github.com/Cognitive-systems-and-technologies/NeuralInterface 113 | 114 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/6028bae2-04c4-4f61-8c0c-9fb28f05a875) 115 | 116 | You can also do this without using Git. To do this, click the "Code" button, and then in the 117 | drop-down menu, click Download ZIP. After that, unzip the archive contents to the C: 118 | \Projects\NeuralAlgorithmsInterface folder 119 | 120 | 9. Go to the project folder using the command: 121 | 122 | cd C:\Projects\NeuralInterface\NeuralInterface 123 | 124 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/2b6042bf-54e7-4141-a61f-b2d67782e733) 125 | 126 | 11. Install dependencies using the command: 127 | 128 | pip install -r requirements.txt 129 | 130 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/8a814552-d7b3-4294-b1f7-989c1c80d51b) 131 | 132 | 11. Run the project with the command: 133 | 134 | python manage.py runserver 135 | 136 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/bbdc81f5-ba40-4231-a097-73c5e354e2de) 137 | 138 | 11. Open your browser on the page http://127.0.0.1:8000/ 139 | 140 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/f17937c3-adf7-4b92-bfdf-ccf03633cc29) 141 | 142 | 143 | ## Fast Launch 144 | 145 | Run file C:\Projects\NeuralInterface\NeuralInterface\testing\FastStart\run_server.bat 146 | 147 | ## Manual Launch 148 | 149 | 1. Open a command prompt and specify the path to the folder where the project is located using the command: 150 | 151 | cd C:\Projects\NeuralInterface 152 | 153 | 2. Activate the virtual environment using the command: 154 | 155 | .\venv\Scripts\activate 156 | 157 | 3. Go to the project folder using the command: 158 | 159 | cd C:\Projects\NeuralInterface\NeuralInterface 160 | 161 | 4. Run the project using the command: 162 | 163 | python manage.py runserver 164 | 165 | 5. Open a browser on the page http://127.0.0.1:8000/ 166 | 167 | ## Troubleshooting possible installation errors 168 | 169 | 1. Error: 170 | 171 | Unable to load file D:\...\python\1_PyCharm\django\djsite\venv\Scripts\Activate.ps1 because 172 | script execution is disabled on this system. 173 | 174 | Run the command prompt as administrator and type "powershel" 175 | 176 | Then type "Set-ExecutionPolicy RemoteSigned" 177 | 178 | 2. If errors occur during the installation of the virtual environment or nothing happens when using the command 179 | "python -m venv venv", you need to check that Python is installed correctly. 180 | In order to understand the location of Python, you can use the command: 181 | 182 | where python 183 | 184 | You also need to check whether the "Add python.exe to path" checkbox was checked when installing Python 185 | 186 | ## Usage 187 | 188 | The NeuralInterface module on the "Project Information" page has detailed instructions on how to use it. It is also described insame. 189 | Use the link: http://127.0.0.1:8000/info/ to go to the instructions when you deploy the project. 190 | 191 | Login and password from the admin panel: 192 | 193 | Login: root | Password: 1234 194 | 195 | ## Testing the library in demo mode without robots. 196 | 197 | To check the functionality of the library, in addition to running the NeuralInterface module itself, you must also run the requests.exe file in the C:\Projects\NeuralInterface\NeuralInterface\testing folder. This program simulates the robot API and adds data to the NeuralInterface module database. 198 | 199 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/e1026e9a-83a3-46a4-8bd3-642ff749dc6d) 200 | 201 | After the program starts, the agent training data is simulated to be written to the NeuralInterface module database. Wait until the data writing process is complete. 202 | 203 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/325de00b-761b-42b0-9628-dc651e21af77) 204 | 205 | After that, you can check the functionality of the "Monitoring" page. After each click on the button on the right side of the page, a request will be sent to the agent. Information about this can be seen in the console. 206 | 207 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/17d5d939-c464-4f51-8621-1e01875254e5 208 | 209 | # Description of each page 210 | ## Control panel 211 | Allows you to work with data from the database. You can fully manage data only for tables with agents and agent groups. You can create, modify, and delete records from the corresponding tables. If you try to delete a record that is linked to another record in another table via a foreign key, the system will issue a warning that this cannot be done and that you must first delete all data so that the database retains the structure of the third normal form. Everything is done using buttons. When creating and modifying, a modal window opens to fill in or change data, respectively. The agent types table is static and contains default values. Other tables, if necessary, must be filled in through the site's administrative panel, which allows you to completely change the data. 212 | 213 | Working with agents: 214 | 215 | [Working with agents.webm](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/bca3f481-fb6f-4aa0-bc3c-6b7be5d203b1) 216 | 217 | Important! For the web application to work correctly, the MAC addresses and IP addresses of the agents must be unique. The data in the tables is linked by foreign keys. You cannot delete linked data. For example, you cannot delete an agent if there is data in the table with files for this agent or in any other table. 218 | 219 | Working with groups: 220 | 221 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/18a031e6-caa7-4e54-8fae-f901c9257e4e 222 | 223 | Important! Agent groups are subject to the same restrictions as agents themselves. For example, you cannot delete an agent group if at least one agent belongs to it. 224 | 225 | ## Monitoring 226 | Displays information about agent training, and also allows you to manage agent data. By default, the first record from the agent errors table is always selected. The graph displays agent training data. When you select the required agent in the table, the graph is redrawed based on the error values ​​​​for a specific agent. The panel in the lower right part of the screen allows you to send the necessary commands to agents. 227 | 228 | Working with the graph: 229 | 230 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/fb44d64e-dca6-4530-a515-6f2d56efe3ae 231 | 232 | The buttons in the lower right part of the page are responsible for direct control and interaction with agents. When you click on a button, a request is sent, which, depending on the state of the agent, sends a certain response. As shown in the video, the server cannot find an agent in the local network with such an address and sends an error, which is displayed in full at the bottom of the page. 233 | 234 | Important! The graph does not update automatically. To update the data, click on the graph update button at the top of the screen or on the line with the agent in the table 235 | 236 | ## Admin Panel 237 | Login: root | Password: 1234 238 | 239 | The Django admin panel is a built-in tool provided by Django for managing your web application data. It provides a convenient and powerful interface for working with models and data in your database without the need to create your own user interface. 240 | 241 | Administrative panel view: 242 | 243 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/f22aa1a9-888e-4f31-b673-afd2f28e046a) 244 | 245 | Login to the admin panel 246 | 247 | 1. Go to the admin panel page 248 | Open a web browser and enter the admin panel address (usually /admin) in the address bar of the site or click "Admin panel" in the left menu 249 | 2. Log in 250 | You will be asked to enter your credentials. Enter the login and password specified above 251 | 252 | Important! Be careful when deleting, changing or adding data! Violation of the integrity of the database structure may result in unstable operation of the entire application. If you still need to change the database structure, add new tables, or change foreign keys, we recommend using the free Dbeaver program. 253 | 254 | # License 255 | 256 | This project is licensed under the [MIT License](LICENSE). 257 | 258 | # Общее описание 259 | NeuralInterface - это модуль мониторинга и визуализации, используемый для отображения работы агентов (мобильных роботов). 260 | Данный модуль представляет собой веб-приложение с несколькими страницами, отображающими текущий статус агентов, их принадлежность к определенным группам. 261 | Также реализован функционал прямого управления агентами. Можно задать направление их перемещения, загрузить и выгрузить данные их состояния, начать или прекратить их обучение. 262 | 263 | Практическое применение. 264 | 265 | Библиотека может применяться в направлениях, где требуется разработка систем, использующих нейронные сети, модели глубокого машинного обучения, обучение с подкреплением интеллектуальных агентов. 266 | Основными направлениями прикладного использования библиотеки разработчики считают следующие сферы: 267 | - складская логистика (программирование промышленных роботов на складах); 268 | - образовательная робототехника (обучение программированию мобильных роботов используя алгоритмы глубокого машинного обучения); 269 | - устройства систем умного дома (роботы-пылесосы и др. устройства требующие автономной работы без участия оператора). 270 | 271 | Данный модуль связан с модулем: 272 | 273 | https://github.com/Cognitive-systems-and-technologies/RoboAICore. 274 | 275 | Пример работы модуля NeuralInterface установленным на ПК и связанным с модулем RoboAICore, установленным на агента (мобильного робота): 276 | 277 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/15780a6c-fa6e-4170-a1f9-37d5b954e09b 278 | 279 | В данном видео продемонстрировано управление агентом с помощью модуля NeuralInterface. При нажатии на кнопки передвижения, мобильный робот перемещается в соответствующем направлении, также можно видеть процесс обучения мобильного робота, изменение расстояния от дальномеров, предназначенных для определения расстояний до объектов типа HC-SR04 расположенных на мобильном роботе. 280 | 281 | Для получения подобного результата, как на видео, необходимо установить оба модуля библиотеки: NeuralInterface на ПК, RoboAICore на отладочную плату STM32F4 или Raspberry pi 3 (model B). Модуль NeuralInterface необходимо настроить таким образом, чтобы запросы из веб-приложения отправлялись на агентов, принимали и отсылали ответ. Также необходимо иметь в наличии робота Yahboom Raspbot AI Vision Robot Car with FPV camera с установленными на нем ультразвуковыми датчиками определения расстояний до объектов типа HC-SR04 в количестве трех, отладочную плату STM32F4 или Raspberry pi 3 (model B) с установленной библиотекой RoboAICore на данную отладочную плату. 282 | В противном случае, модуль NeuralInerface будет работать в демо режиме, без связи с агентами, и при попытке отправить запрос будет выдавать ошибку, которая будет зависеть от устройств, расположенных в локальной сети и их состояний. 283 | 284 | Характеристики агентов. 285 | 286 | Для иллюстрации примера работы библиотеки были выбраны два робота Yahboom Raspbot AI Vision Robot Car with FPV camera на которые были установлены ультразвуковые датчики определения расстояний до объектов типа HC-SR04 в количестве трех, отладочные платы: одна для семейства процессоров STM32 серии STM32F4 на базе архитектуры ARM Cortex-M4 модель STM32F429ZI разрядностью 32bit, вторая - Raspberry pi 3 (model B). 287 | Частота работы процессора STM32F429ZI - 180MHz, размер программируемой памяти 2MB, объем оперативной памяти 256KB. 288 | Характеристики для raspberry pi: процессор: 64-битный четырёхъядерный ARM Cortex-A53 с тактовой частотой 1,2 ГГц на однокристальном чипе Broadcom BCM2837, оперативная память 1ГБ LPDDR2 SDRAM. 289 | 290 | Характеристики Yahboom Raspbot AI Vision Robot Car with FPV camera: 291 | 292 | - Управляющий контроллер: Raspberry Pi (не входит в комплект). 293 | - Язык программирование: Python. 294 | - Степень свободы (DOF): 2 степени свободы, 180° вверх, вниз, влево, вправо. 295 | - Рулевое управление: 15 кг х 5 + 6 кг х 1 сервопривод с последовательной шиной. 296 | - Ввод данных: широкоугольная камера, инфракрасный датчик обхода препятствий, ИК приёмник, ультразвуковой датчик измерения расстояния, четырехканальный датчик слежения, интерфейс IIC. 297 | - Вывод данных: сервопривод, ТТ мотор-редуктор, пассивный зуммер последовательного интерфейса. 298 | - Дистанционное управление: мобильное приложение/ПК/ИК пульт дистанционного управления. 299 | - Датчик: ультразвуковой, инфракрасный обход препятствий, зуммер, светодиод. 300 | - Метод связи: сеть Wi-Fi, ИК пульт. 301 | - Защита: от перегрузки по току, от перенапряжения. 302 | - Функциональные возможности: отслеживание и распознавание цветов, распознавание жестов, распознавание и отслеживание лиц, движение по заданной траектории, распознавание и объезд препятсвий, возможность дистанционного управления. 303 | 304 | ## Почему веб-приложение? 305 | Использование веб-серверной версии модуля NeuralInterface вместо десктопного приложения позволяет развернуть данный проект не только на операционной 306 | системе Windows, но и на Linux, а также на любом сервере, позволяя объединять множество устройств даже вне локальной сети. 307 | 308 | ## Требования для запуска модуля NeuralInterface на ПК 309 | 1. Операционная система на выбор: 310 | - Windows 7/8/10 64-разрядная 311 | - Linux (рекомендуется Ubuntu 18.04 LTS или более новая версия) 312 | - macOS Big Sur (версия 11) или более новая 313 | 3. Процессор: Intel Core i3 или эквивалентный AMD 314 | 4. Оперативная память (RAM): 2 ГБ (рекомендуется 4 ГБ и более для более сложных проектов) 315 | 5. Жесткий диск: 10 ГБ (минимально для Django и его зависимостей) 316 | 6. Python: Python 3.9 или более новая версия 317 | 7. Установщик пакетов pip: Установлен и настроен для Python 3 (устанавливается вместе с python) 318 | 8. Git: Установлен (рекомендуется версия Git 2.0 и выше) 319 | 320 | Инструкция по установке представлена только для операционной системы Windows 321 | 322 | ## Подготовка к установке 323 | 324 | 1. Установите python с версией не менее 3.9. 325 | 326 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/cef11f5a-3f76-4a7d-9b8d-bb3c2c39ad46 327 | 328 | Ссылка: https://www.python.org/downloads/ 329 | 330 | Обязательно, установите галочку в пункте "Add python.exe to path" 331 | Также, установите python для всех пользователей Windows. 332 | 2. Установите Git. 333 | 334 | [InstallGit.webm](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/c10de4e7-464e-4d73-89af-ec22ccf08b38) 335 | 336 | Ссылка: https://git-scm.com/downloads 337 | 338 | ## Установка 339 | 340 | [InstallProject.webm](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/6f259c2d-492f-4dbb-8bc3-079bdbe7bcd9) 341 | 342 | 1. Создайте папку для проекта. 343 | 344 | Например: C:\Projects\NeuralInterface 345 | 346 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/2b48d108-8de3-482a-926c-7ac8ccfc7cdf) 347 | 348 | 3. Откройте командную строку и пропишите путь к папке, которую только что создали, используя команду: 349 | 350 | cd C:\Projects\NeuralInterface 351 | 352 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/197cedf3-e042-4052-bf68-e27cf248f2d1) 353 | 354 | 5. Создайте виртуальное окружение с помощью команды: 355 | 356 | python -m venv venv 357 | 358 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/ddff6223-df93-4a33-90a6-87218f15f92c) 359 | 360 | 7. Активируйте виртуальное окружение с помощью команды: 361 | 362 | .\venv\Scripts\activate 363 | 364 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/09bbe463-7819-4577-8602-8f309a1a1afd) 365 | 366 | 9. Загрузите данные из репозитория с помощью команды: 367 | 368 | git clone https://github.com/Cognitive-systems-and-technologies/NeuralInterface 369 | 370 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/6028bae2-04c4-4f61-8c0c-9fb28f05a875) 371 | 372 | Также, Вы можете сделать данное действие, без использования Git. Для этого нажмите на кнопку "Code", а затем в 373 | выпадающем меню нажмите Download ZIP. После этого распакуйте содержимое архива в папку C: 374 | \Projects\NeuralAlgorithmsInterface 375 | 376 | 9. Перейдите в папку проекта с помощью команды: 377 | 378 | cd C:\Projects\NeuralInterface\NeuralInterface 379 | 380 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/2b6042bf-54e7-4141-a61f-b2d67782e733) 381 | 382 | 11. Установите зависимости с помощью команды: 383 | 384 | pip install -r requirements.txt 385 | 386 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/8a814552-d7b3-4294-b1f7-989c1c80d51b) 387 | 388 | 11. Запустите проект с помощью команды: 389 | 390 | python manage.py runserver 391 | 392 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/bbdc81f5-ba40-4231-a097-73c5e354e2de) 393 | 394 | 11. Откройте браузер на странице http://127.0.0.1:8000/ 395 | 396 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/f17937c3-adf7-4b92-bfdf-ccf03633cc29) 397 | 398 | ## Быстрый запуск 399 | 400 | Запустите файл C:\Projects\NeuralInterface\NeuralInterface\testing\FastStart\run_server.bat 401 | 402 | ## Ручной запуск 403 | 404 | 1. Откройте командную строку и пропишите путь к папке, в которой находится проект, используя команду: 405 | 406 | cd C:\Projects\NeuralInterface 407 | 408 | 2. Активируйте виртуальное окружение с помощью команды: 409 | 410 | .\venv\Scripts\activate 411 | 412 | 3. Перейдите в папку проекта с помощью команды: 413 | 414 | cd C:\Projects\NeuralInterface\NeuralInterface 415 | 416 | 4. Запустите проект с помощью команды: 417 | 418 | python manage.py runserver 419 | 420 | 5. Откройте браузер на странице http://127.0.0.1:8000/ 421 | 422 | ## Решение возможных ошибок при установке 423 | 424 | 1. Ошибка: 425 | 426 | Невозможно загрузить файл D:\...\python\1_PyCharm\django\djsite\venv\Scripts\Activate.ps1, так 427 | как выполнение сценариев отключено в этой системе. 428 | 429 | Запустите командную строку от имени администратора и введите "powershel" 430 | 431 | Затем введите "Set-ExecutionPolicy RemoteSigned" 432 | 433 | 2. Если при установке виртуального окружения происходят ошибки или ничего не происходит при использовании команды 434 | "python -m venv venv", необходимо проверить правильность установки Python. 435 | Для того чтобы понять месторасположение Python, можно воспользоваться командой: 436 | 437 | where python 438 | 439 | Также необходимо проверить, была ли поставлена галочка в пункте "Add python.exe to path" при установке Python 440 | 441 | ## Использование 442 | 443 | В модуле NeuralInterface на странице "Информация о проекте" есть подробная инструкция по использованию. Также она описана ниже. 444 | Используйте ссылку: http://127.0.0.1:8000/info/ для перехода к инструкции, когда развернете проект. 445 | 446 | Логин и пароль от панели администратора: 447 | 448 | Логин: root | Пароль: 1234 449 | 450 | ## Тестирование библиотеки в демо-режиме без роботов. 451 | 452 | Для проверки работоспособности библиотеки, необходимо помимо запуска самого модуля NeuralInterface также запустить файл requests.exe в папке C:\Projects\NeuralInterface\NeuralInterface\testing. Эта программа иммитирует API робота и добавляет данные в базу данных модуля NeuralInterface. 453 | 454 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/e1026e9a-83a3-46a4-8bd3-642ff749dc6d) 455 | 456 | После запуска программы происходит иммитация записи данных обучения агента в базу данных модуля NeuralInterface. Дождитесь окончания процесса записи данных. 457 | 458 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/325de00b-761b-42b0-9628-dc651e21af77) 459 | 460 | После этого, можно проверить работоспособность страницы "Мониторинг". После каждого нажатия на кнопку в правой части страницы, будет отправляться запрос на агента. Информацию об этом можно увидеть в консоли. 461 | 462 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/17d5d939-c464-4f51-8621-1e01875254e5 463 | 464 | # Описание каждой страницы 465 | ## Панель управления 466 | Позволяет работать с данными из базы данных. Полностью управлять данными можно только для таблиц с агентами и группами агентов. Возможно создавать, изменять и удалять записи из соответствующих таблиц. При попытке удалить запись, которая связана с другой записью в другой таблицы посредством внешнего ключа, система выдаст предупреждение о том, что сделать это нельзя и необходимо сначала удалить все данные таким образом, чтобы у БД сохранялась структура третьей нормальной формы. Осуществляется всё посредством кнопок. При создании и изменении открывается модальное окно для заполнения или изменения данных соответственно. Таблица типов агентов статичная и содержит значения по умолчанию. Остальные таблицы, если есть необходимость, нужно заполнять через административную панель сайта, которая позволяет полностью изменять данные. 467 | 468 | Работа с агентами: 469 | 470 | [Работа с агентами.webm](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/bca3f481-fb6f-4aa0-bc3c-6b7be5d203b1) 471 | 472 | Важно! Для корректной работы веб-приложения, необходимо, чтобы MAC адреса и IP адреса у агентов были уникальные. Данные в таблицах связаны внешними ключами. Вы не сможете удалить связанные данные. Например, Вы не сможете удалить агента, если есть данные в таблице с файлами для этого агента или в какой-нибудь другой таблице. 473 | 474 | Работа с группами: 475 | 476 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/18a031e6-caa7-4e54-8fae-f901c9257e4e 477 | 478 | Важно! На группы агентов действуют схожие ограничения, что и на самих агентов. Например, Вы не сможете удалить группу агентов, если к ней принадлежит хотя бы один агент. 479 | 480 | ## Мониторинг 481 | Выводит информацию об обучении агентов, а также позволяет управлять данными агентов. По умолчанию, всегда выбирается первая запись из таблицы ошибок агентов. График отображает данные обучения агентов. При выборе необходимого агента в таблице, график перерисовывается, исходя из значений ошибок для определенного агента. Панель в правой нижней части экрана позволяет отправлять необходимые команды агентам. 482 | 483 | Работа с графиком: 484 | 485 | https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/fb44d64e-dca6-4530-a515-6f2d56efe3ae 486 | 487 | Кнопки в правой нижней части страницы отвечают за прямое управление и взаимодействие с агентами. При нажатии на кнопку отправляется запрос, который в зависимости от состояния агента отправляет определенный ответ. Как показано на видео, сервер не может найти агента в локальной сети с таким адресом и присылает ошибку, которая в полном виде отображается в нижней части страницы. 488 | 489 | Важно! График не обновляется автоматически. Для обновления данных нажмите на кнопку обновления графика в верхней части экрана или на строчку с агентом в таблице 490 | 491 | ## Панель администратора 492 | Логин: root | Пароль: 1234 493 | 494 | Административная панель Django - это встроенный инструмент, предоставляемый Django для управления данными вашего веб-приложения. Она обеспечивает удобный и мощный интерфейс для работы с моделями и данными в вашей базе данных без необходимости создания собственного пользовательского интерфейса. 495 | 496 | Вид административной панели: 497 | 498 | ![image](https://github.com/Cognitive-systems-and-technologies/NeuralInterface/assets/47759876/f22aa1a9-888e-4f31-b673-afd2f28e046a) 499 | 500 | Вход в административную панель 501 | 502 | 1. Зайдите на страницу административной панели 503 | Откройте веб-браузер и введите адрес административной панели (обычно это /admin) в адресной строке сайта или нажмите в левом меню "Панель администратора" 504 | 2. Авторизуйтесь 505 | Вам будет предложено ввести учетные данные. Введите логин и пароль, указанные выше 506 | 507 | Важно! С осторожностью удаляйте, изменяйте или добавляйте данные! Нарушение целостности структуры базы данных может повлечь за собой нестабильную работу всего приложения. Если же Вам всё же нужно ка-то изменить структуру базы данных, добавить новые таблицы, или изменить внешние ключи, то рекомендуем пользоваться бесплатной программой Dbeaver. 508 | 509 | # Лицензия 510 | 511 | Этот проект находится под лицензией [MIT License](LICENSE). 512 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/db.sqlite3 -------------------------------------------------------------------------------- /interface/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__init__.py -------------------------------------------------------------------------------- /interface/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /interface/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /interface/__pycache__/admin.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/admin.cpython-311.pyc -------------------------------------------------------------------------------- /interface/__pycache__/admin.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/admin.cpython-39.pyc -------------------------------------------------------------------------------- /interface/__pycache__/apps.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/apps.cpython-311.pyc -------------------------------------------------------------------------------- /interface/__pycache__/apps.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/apps.cpython-39.pyc -------------------------------------------------------------------------------- /interface/__pycache__/models.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/models.cpython-311.pyc -------------------------------------------------------------------------------- /interface/__pycache__/models.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/models.cpython-39.pyc -------------------------------------------------------------------------------- /interface/__pycache__/serializers.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/serializers.cpython-311.pyc -------------------------------------------------------------------------------- /interface/__pycache__/serializers.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/serializers.cpython-39.pyc -------------------------------------------------------------------------------- /interface/__pycache__/views.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/views.cpython-311.pyc -------------------------------------------------------------------------------- /interface/__pycache__/views.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/__pycache__/views.cpython-39.pyc -------------------------------------------------------------------------------- /interface/admin.py: -------------------------------------------------------------------------------- 1 | # Регистрация моделей 2 | from django.contrib import admin 3 | 4 | # Register your models here. 5 | from .models import AgentTypes, AgentGroups, Agents, AgentErrors, AgentFiles, NeuralAlgorithms 6 | from .models import AgentsView, AgentErrorsView, AgentFilesView, AgentNeuralNetworkState, AgentNeuralNetworkStateView 7 | 8 | admin.site.register(AgentTypes) 9 | admin.site.register(AgentGroups) 10 | admin.site.register(Agents) 11 | admin.site.register(AgentErrors) 12 | admin.site.register(AgentFiles) 13 | admin.site.register(NeuralAlgorithms) 14 | admin.site.register(AgentNeuralNetworkState) 15 | 16 | admin.site.register(AgentsView) 17 | admin.site.register(AgentErrorsView) 18 | admin.site.register(AgentFilesView) 19 | admin.site.register(AgentNeuralNetworkStateView) 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /interface/apps.py: -------------------------------------------------------------------------------- 1 | # Регистрация приложений 2 | from django.apps import AppConfig 3 | 4 | 5 | class InterfaceConfig(AppConfig): 6 | default_auto_field = 'django.db.models.BigAutoField' 7 | name = 'interface' 8 | -------------------------------------------------------------------------------- /interface/models.py: -------------------------------------------------------------------------------- 1 | # This is an auto-generated Django model module. 2 | # You'll have to do the following manually to clean this up: 3 | # * Rearrange models' order 4 | # * Make sure each model has one field with primary_key=True 5 | # * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior 6 | # * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table 7 | # Feel free to rename the models, but don't rename db_table values or field names. 8 | from django.db import models 9 | 10 | 11 | # Таблицы базы данных 12 | # Группы агентов 13 | class AgentGroups(models.Model): 14 | agent_group_name = models.CharField(max_length=100) # Название группы агентов 15 | agent_group_priority = models.IntegerField(blank=True, null=True) # Приоритет группы агентов 16 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 17 | datetime_change = models.DateTimeField(blank=True, null=True) # Дата и время последнего изменения 18 | agent_group_description = models.CharField(max_length=250, blank=True, null=True) # Описание группы агентов 19 | 20 | class Meta: 21 | managed = False 22 | db_table = 't_agent_groups' 23 | 24 | 25 | # Типы агентов 26 | class AgentTypes(models.Model): 27 | agent_type = models.CharField(max_length=100) # Тип агента 28 | agent_type_description = models.CharField(max_length=250, blank=True, null=True) # Описание типа агента 29 | 30 | class Meta: 31 | managed = False 32 | db_table = 't_agent_types' 33 | 34 | 35 | # Агенты 36 | class Agents(models.Model): 37 | agent_name = models.CharField(max_length=250, blank=True, null=True) # Имя агента 38 | agent_group = models.ForeignKey(AgentGroups, models.DO_NOTHING, blank=True, null=True) # Группа агента 39 | agent_status = models.IntegerField(blank=True, null=True) # Статус агента 40 | agent_description = models.CharField(max_length=500, blank=True, null=True) # Описание агента 41 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 42 | datetime_change = models.DateTimeField(blank=True, null=True) # Дата и время последнего изменения 43 | agent_type = models.ForeignKey(AgentTypes, models.DO_NOTHING, blank=True, null=True) # Тип агента 44 | agent_mac_address = models.CharField(max_length=250, blank=True, null=True) # MAC-адрес агента 45 | agent_ip_address = models.CharField(max_length=250, blank=True, null=True) # IP-адрес агента 46 | agent_port = models.CharField(max_length=250, blank=True, null=True) # Порт агента 47 | 48 | class Meta: 49 | managed = False 50 | db_table = 't_agents' 51 | 52 | 53 | # Файлы агентов 54 | class AgentFiles(models.Model): 55 | agent = models.ForeignKey(Agents, models.DO_NOTHING, blank=True, null=True) # Агент, связанный с файлом 56 | file_name = models.CharField(max_length=250, blank=True, null=True) # Имя файла 57 | file_type = models.CharField(max_length=250, blank=True, null=True) # Тип файла 58 | file_path = models.CharField(max_length=250, blank=True, null=True) # Путь к файлу 59 | file_description = models.CharField(max_length=250, blank=True, null=True) # Описание файла 60 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 61 | datetime_change = models.DateTimeField(blank=True, null=True) # Дата и время последнего изменения 62 | 63 | class Meta: 64 | managed = False 65 | db_table = 't_agent_files' 66 | 67 | 68 | # Состояние нейросети агентов 69 | class AgentNeuralNetworkState(models.Model): 70 | agent = models.ForeignKey(Agents, models.DO_NOTHING, blank=True, null=True) # Агент, связанный с состоянием нейросети 71 | neural_network_state = models.CharField(max_length=1000000, blank=True, null=True) # Состояние нейросети агента 72 | neural_network_state_description = models.CharField(max_length=250, blank=True, null=True) # Описание состояния нейросети 73 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 74 | datetime_change = models.DateTimeField(blank=True, null=True) # Дата и время создания 75 | 76 | class Meta: 77 | managed = False 78 | db_table = 't_agent_neural_network_state' 79 | 80 | 81 | # Алгоритмы 82 | class NeuralAlgorithms(models.Model): 83 | algorithm_name = models.CharField(max_length=250, blank=True, null=True) # Название алгоритма 84 | algorithm_code_name = models.CharField(max_length=250, blank=True, null=True) # Кодовое имя алгоритма 85 | algorithm_description = models.CharField(max_length=250, blank=True, null=True) # Описание алгоритма 86 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 87 | datetime_change = models.DateTimeField(blank=True, null=True) # Дата и время последнего изменения 88 | 89 | class Meta: 90 | managed = False 91 | db_table = 't_neural_algorithms' 92 | 93 | 94 | # Ошибки агентов 95 | class AgentErrors(models.Model): 96 | agent_step = models.IntegerField(blank=True, null=True) # Шаг агента 97 | agent_error_value = models.FloatField(blank=True, null=True) # Значение ошибки агента 98 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 99 | agent_error_info = models.CharField(max_length=250, blank=True, null=True) # Информация об ошибке агента 100 | agent = models.ForeignKey(Agents, models.DO_NOTHING, blank=True, null=True) # Агент, связанный с ошибкой 101 | algorithm = models.ForeignKey(NeuralAlgorithms, models.DO_NOTHING, blank=True, null=True) # Алгоритм, связанный с ошибкой 102 | 103 | class Meta: 104 | managed = False 105 | db_table = 't_agent_errors' 106 | 107 | 108 | # Представления базы данных 109 | # Представление агентов 110 | class AgentsView(models.Model): 111 | id = models.IntegerField(primary_key=True) # Идентификатор агента 112 | agent_name = models.CharField(max_length=250, blank=True, null=True) # Имя агента 113 | agent_group_name = models.CharField(max_length=100) # Название группы агента 114 | agent_group_id = models.IntegerField() # Идентификатор группы агента 115 | agent_status = models.CharField(max_length=100) # Статус агента 116 | agent_status_id = models.IntegerField() # Идентификатор статуса агента 117 | agent_description = models.CharField(max_length=250, blank=True, null=True) # Описание агента 118 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 119 | datetime_change = models.DateTimeField(blank=True, null=True) # Дата и время последнего изменения 120 | agent_type = models.CharField(max_length=100) # Тип агента 121 | agent_type_id = models.IntegerField() # Идентификатор типа агента 122 | agent_mac_address = models.CharField(max_length=250, blank=True, null=True) # MAC-адрес агента 123 | agent_ip_address = models.CharField(max_length=250, blank=True, null=True) # IP-адрес агента 124 | agent_ip_address_port = models.CharField(max_length=250, blank=True, null=True) # IP-адрес и порт агента 125 | agent_port = models.CharField(max_length=250, blank=True, null=True) # Порт агента 126 | 127 | class Meta: 128 | managed = False 129 | db_table = 'v_agents' 130 | 131 | 132 | # Представление ошибок агентов 133 | class AgentErrorsView(models.Model): 134 | id = models.IntegerField(primary_key=True) # Идентификатор ошибки агента 135 | agent_step = models.IntegerField(blank=True, null=True) # Шаг агента 136 | agent_error_value = models.FloatField(blank=True, null=True) # Значение ошибки агента 137 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 138 | agent_error_info = models.CharField(max_length=250, blank=True, null=True) # Информация об ошибке агента 139 | agent_name = models.CharField(max_length=250, blank=True, null=True) # Имя агента 140 | agent_id = models.IntegerField(blank=True, null=True) # Идентификатор агента 141 | algorithm_id = models.IntegerField(blank=True, null=True) # Идентификатор алгоритма 142 | algorithm_name = models.CharField(max_length=250, blank=True, null=True) # Название алгоритма 143 | algorithm_code_name = models.CharField(max_length=250, blank=True, null=True) # Кодовое имя алгоритма 144 | algorithm_description = models.CharField(max_length=250, blank=True, null=True) # Описание алгоритма 145 | 146 | 147 | class Meta: 148 | managed = False 149 | db_table = 'v_agent_errors' 150 | 151 | 152 | # Представление файлов агентов 153 | class AgentFilesView(models.Model): 154 | id = models.IntegerField(primary_key=True) # Идентификатор файла 155 | agent_name = models.CharField(max_length=100) # Имя агента 156 | file_name = models.CharField(max_length=250, blank=True, null=True) # Имя файла 157 | file_type = models.CharField(max_length=250, blank=True, null=True) # Тип файла 158 | file_path = models.CharField(max_length=250, blank=True, null=True) # Путь к файлу 159 | file_description = models.CharField(max_length=250, blank=True, null=True) # Описание файла 160 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 161 | datetime_change = models.DateTimeField(blank=True, null=True) # Дата и время последнего изменения 162 | 163 | class Meta: 164 | managed = False 165 | db_table = 'v_agent_files' 166 | 167 | 168 | # Представление групп агентов 169 | class AgentGroupsView(models.Model): 170 | agent_group_name = models.CharField(max_length=100) # Название группы агентов 171 | agent_group_priority = models.IntegerField() # Приоритет группы агентов 172 | datetime_create = models.DateTimeField() # Дата и время создания 173 | datetime_change = models.DateTimeField() # Дата и время последнего изменения 174 | agent_group_description = models.CharField(max_length=250, blank=True, null=True) # Описание группы агентов 175 | 176 | class Meta: 177 | managed = False 178 | db_table = 'v_agent_groups' 179 | 180 | 181 | # Представление типов агентов 182 | class AgentTypesView(models.Model): 183 | agent_type = models.CharField(max_length=100) # Тип агента 184 | agent_type_description = models.CharField(max_length=250, blank=True, null=True) # Описание типа агента 185 | 186 | class Meta: 187 | managed = False 188 | db_table = 'v_agent_types' 189 | 190 | 191 | # Представления нейросетевого состояния агентов 192 | class AgentNeuralNetworkStateView(models.Model): 193 | id = models.IntegerField(primary_key=True) # Идентификатор состояния нейросети 194 | count_neural_network_state = models.IntegerField() # Количество состояний нейросети 195 | neural_network_state_description = models.CharField(max_length=250, blank=True, null=True) # Описание состояния нейросети 196 | datetime_create = models.DateTimeField(blank=True, null=True) # Дата и время создания 197 | datetime_change = models.DateTimeField(blank=True, null=True) # Дата и время последнего изменения 198 | agent_name = models.CharField(max_length=250, blank=True, null=True) # Имя агента 199 | agent_group_name = models.CharField(max_length=100) # Название группы агента 200 | agent_group_id = models.IntegerField() # Идентификатор группы агента 201 | agent_status = models.CharField(max_length=100) # Статус агента 202 | agent_status_id = models.IntegerField() # Идентификатор статуса агента 203 | agent_description = models.CharField(max_length=250, blank=True, null=True) # Описание агента 204 | agent_type = models.CharField(max_length=100) # Тип агента 205 | agent_type_id = models.IntegerField() # Идентификатор типа агента 206 | agent_mac_address = models.CharField(max_length=250, blank=True, null=True) # MAC-адрес агента 207 | agent_ip_address = models.CharField(max_length=250, blank=True, null=True) # IP-адрес агента 208 | agent_port = models.CharField(max_length=250, blank=True, null=True) # Порт агента 209 | 210 | class Meta: 211 | managed = False 212 | db_table = 'v_agent_neural_network_state' 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | -------------------------------------------------------------------------------- /interface/serializers.py: -------------------------------------------------------------------------------- 1 | # Сериализатор. Обработка данных перед отправкой пользователю 2 | from rest_framework import serializers 3 | from .models import Agents, AgentGroups, AgentTypes, AgentErrorsView, NeuralAlgorithms, AgentErrors, \ 4 | AgentNeuralNetworkState 5 | 6 | 7 | # Сериализаторы для агентов 8 | # Сериализатор для добавления агента 9 | class AgentAddSerializer(serializers.ModelSerializer): 10 | class Meta: 11 | model = Agents 12 | fields = ('agent_name', 'agent_group_id', 'agent_status', 'agent_description', 'datetime_create', 13 | 'agent_type_id', 'agent_mac_address', 'agent_ip_address', 'agent_port') 14 | 15 | # Сериализатор для изменения агента 16 | class AgentEditSerializer(serializers.ModelSerializer): 17 | class Meta: 18 | model = Agents 19 | fields = '__all__' 20 | 21 | 22 | # Сериализатор для удаления агента 23 | class AgentDeleteSerializer(serializers.ModelSerializer): 24 | class Meta: 25 | model = Agents 26 | fields = '__all__' 27 | 28 | 29 | # Сериализатор для изменения агента 30 | class NeuralAlgorithmsSerializer(serializers.ModelSerializer): 31 | class Meta: 32 | model = NeuralAlgorithms 33 | fields = '__all__' 34 | 35 | # Сериализатор для обработки ошибок 36 | class AgentErrorsSerializer(serializers.ModelSerializer): 37 | class Meta: 38 | model = AgentErrors 39 | fields = '__all__' 40 | 41 | 42 | # Сериализаторы для групп агентов 43 | class GroupAddSerializer(serializers.ModelSerializer): 44 | class Meta: 45 | model = AgentGroups 46 | fields = ('agent_group_name', 'agent_group_priority', 'datetime_create', 'agent_group_description') 47 | 48 | 49 | class GroupSerializer(serializers.ModelSerializer): 50 | class Meta: 51 | model = AgentGroups 52 | fields = '__all__' 53 | 54 | 55 | class SyncAgentDataSerializer(serializers.ModelSerializer): 56 | class Meta: 57 | model = Agents 58 | fields = ('agent_name', 'agent_status', 'datetime_create', 'datetime_change', 59 | 'agent_mac_address', 'agent_ip_address', 'agent_port') 60 | 61 | 62 | # Сериализатор для получения информации, отображаемой графиком 63 | class GraphSerializer(serializers.ModelSerializer): 64 | class Meta: 65 | model = AgentErrorsView 66 | fields = '__all__' 67 | 68 | 69 | class RequestSerializer(serializers.ModelSerializer): 70 | class Meta: 71 | model = AgentErrorsView 72 | fields = ('id', 'agent_step', 'agent_error_value', 'agent_name', 'agent_error_info') 73 | 74 | 75 | class AgentNeuralNetworkStateSerializer(serializers.ModelSerializer): 76 | class Meta: 77 | model = AgentNeuralNetworkState 78 | fields = '__all__' 79 | -------------------------------------------------------------------------------- /interface/static/css/base.css: -------------------------------------------------------------------------------- 1 | #sidebarMenu { 2 | flex: 1 0 0; /* Occupy remaining vertical space */ 3 | background-color: #343a40; 4 | color: #fff; 5 | overflow-y: auto; /* Enable scrolling when content exceeds the height */ 6 | position: sticky; 7 | top: 0; 8 | height: 100vh; 9 | } 10 | 11 | #sidebarMenu::-webkit-scrollbar { 12 | width: 8px; /* Width of the scrollbar */ 13 | } 14 | 15 | #sidebarMenu::-webkit-scrollbar-thumb { 16 | background-color: #6c757d; /* Color of the scrollbar thumb */ 17 | } 18 | 19 | #sidebarMenu::-webkit-scrollbar-track { 20 | background-color: #343a40; /* Color of the scrollbar track */ 21 | } -------------------------------------------------------------------------------- /interface/static/css/index.css: -------------------------------------------------------------------------------- 1 | .scrollable-table { 2 | max-height: 300px; 3 | overflow-y: auto; 4 | } -------------------------------------------------------------------------------- /interface/static/css/info.css: -------------------------------------------------------------------------------- 1 | pre { 2 | white-space: pre-wrap; 3 | word-break: keep-all; 4 | color: #d63384 5 | } 6 | 7 | .list-group-item { 8 | border: none; 9 | } -------------------------------------------------------------------------------- /interface/static/css/monitor.css: -------------------------------------------------------------------------------- 1 | .circular-button { 2 | border-radius: 50%; 3 | width: 50px; 4 | height: 50px; 5 | text-align: center; 6 | padding: 12px; 7 | font-size: 20px; 8 | } 9 | 10 | .scrollable-item { 11 | max-height: 300px; 12 | overflow-y: auto; 13 | } 14 | 15 | .table .table-active { 16 | background-color: #007bff; /* Set the primary color (blue) as the background color */ 17 | color: #fff; /* Set the text color to white */ 18 | cursor: pointer; /* Change cursor to pointer on hover */ 19 | } -------------------------------------------------------------------------------- /interface/static/images/Info/AddAgent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/Info/AddAgent.png -------------------------------------------------------------------------------- /interface/static/images/Info/EditAgent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/Info/EditAgent.png -------------------------------------------------------------------------------- /interface/static/images/admin_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/admin_purple.png -------------------------------------------------------------------------------- /interface/static/images/darkmode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/darkmode.png -------------------------------------------------------------------------------- /interface/static/images/edit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/edit.gif -------------------------------------------------------------------------------- /interface/static/images/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/edit.png -------------------------------------------------------------------------------- /interface/static/images/edit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /interface/static/images/edit_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/edit_purple.png -------------------------------------------------------------------------------- /interface/static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/favicon.ico -------------------------------------------------------------------------------- /interface/static/images/graph.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/graph.gif -------------------------------------------------------------------------------- /interface/static/images/graph_dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/graph_dark.gif -------------------------------------------------------------------------------- /interface/static/images/graph_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/graph_purple.png -------------------------------------------------------------------------------- /interface/static/images/info.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/info.gif -------------------------------------------------------------------------------- /interface/static/images/info_dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/info_dark.gif -------------------------------------------------------------------------------- /interface/static/images/machine_learning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /interface/static/images/neural_brain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/neural_brain.png -------------------------------------------------------------------------------- /interface/static/images/neural_brain_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/neural_brain_purple.png -------------------------------------------------------------------------------- /interface/static/images/neural_map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/neural_map.png -------------------------------------------------------------------------------- /interface/static/images/neural_network.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /interface/static/images/neural_network_weight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/neural_network_weight.png -------------------------------------------------------------------------------- /interface/static/images/settings.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/settings.gif -------------------------------------------------------------------------------- /interface/static/images/settings_dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/settings_dark.gif -------------------------------------------------------------------------------- /interface/static/images/settings_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/images/settings_purple.png -------------------------------------------------------------------------------- /interface/static/js/index.js: -------------------------------------------------------------------------------- 1 | // Вызов функций для прослушивания событий 2 | agentEditButtonListeners(); 3 | groupEditButtonListeners(); 4 | agentDeleteData(); 5 | groupDeleteData(); 6 | 7 | // Функция добавления агента 8 | function agentAddData() { 9 | // Получение значения флажка agentStatusAdd 10 | const checkbox = document.getElementById('agentStatusAdd'); 11 | const checkboxValue = checkbox.checked ? 1 : 0; 12 | 13 | // Получение значений полей ввода 14 | const agentData = { 15 | agent_name: document.getElementById('agentNameAdd').value, // Имя агента 16 | agent_mac_address: document.getElementById('AgentMacAddressAdd').value, // MAC-адрес агента 17 | agent_ip_address: document.getElementById('AgentIPAddressAdd').value, // IP-адрес агента 18 | agent_port: document.getElementById('AgentPortAdd').value, // Порт агента 19 | agent_description: document.getElementById('agentDescriptionAdd').value, // Описание агента 20 | datetime_create: new Date().toISOString(), // Дата и время создания агента 21 | agent_group_id: parseInt(document.getElementById('agentGroupAdd').value), // Идентификатор группы агента 22 | agent_type_id: parseInt(document.getElementById('agentTypeAdd').value), // Идентификатор типа агента 23 | agent_status: checkboxValue // Статус агента (включен или выключен) 24 | }; 25 | 26 | // Функция для проверки значения на null, "None" или "" 27 | function isEmpty(value) { 28 | return value === null || value === "None" || (typeof value === "string" && value.trim() === ""); 29 | } 30 | 31 | // Проверка наличия пустых значений в объекте agentData и вывод соответствующего сообщения. 32 | const fieldsToCheck = ['agent_mac_address', 'agent_ip_address', 'agent_group_id', 'agent_type_id', 'agent_status']; 33 | let isEmptyField = false; // Флаг для отслеживания, было ли обнаружено хотя бы одно пустое поле. 34 | 35 | // Проходимся по каждому ключу из списка fieldsToCheck. 36 | for (const key of fieldsToCheck) { 37 | const value = agentData[key]; 38 | let fieldName = key; // По умолчанию используем ключ как название поля. 39 | 40 | 41 | // Изменяем название поля для вывода сообщения на русском языке. 42 | switch (key) { 43 | case 'agent_mac_address': 44 | fieldName = 'MAC адрес агента'; 45 | break; 46 | case 'agent_ip_address': 47 | fieldName = 'IP-адрес агента'; 48 | break; 49 | case 'agent_group_id': 50 | fieldName = 'группа агента'; 51 | break; 52 | case 'agent_type_id': 53 | fieldName = 'тип агента'; 54 | break; 55 | case 'agent_status': 56 | fieldName = 'статус агента'; 57 | break; 58 | } 59 | 60 | // Проверяем, является ли текущее поле "agent_group_id" или "agent_type_id" и содержит ли пустое или NaN значение. 61 | if ((key === 'agent_group_id' || key === 'agent_type_id') && (value === null || isNaN(value))) { 62 | alert(`Поле ${fieldName} не заполнено!`); 63 | isEmptyField = true; 64 | break; // Останавливаем цикл, если обнаружено пустое или NaN значение для "agent_group_id" или "agent_type_id". 65 | } else if (isEmpty(value)) { 66 | alert(`Поле "${fieldName}" не заполнено!`); 67 | isEmptyField = true; 68 | break; // Останавливаем цикл, если обнаружено пустое значение для другого поля. 69 | } 70 | } 71 | 72 | // Если было обнаружено хотя бы одно пустое или NaN поле, прекращаем выполнение функции. 73 | if (isEmptyField) { 74 | return; 75 | } 76 | // Вывод данных агента в формате JSON в консоль для отладки 77 | console.log(JSON.stringify(agentData)); 78 | 79 | // Получение CSRF-токена из cookie 80 | const csrftoken = getCookie('csrftoken'); 81 | 82 | // Отправка POST-запроса на сервер для добавления данных агента 83 | fetch(`/api/addAgentData`, { 84 | method: 'POST', 85 | headers: { 86 | 'Content-Type': 'application/json', 87 | 'X-CSRFToken': csrftoken, 88 | }, 89 | body: JSON.stringify(agentData) 90 | }).then(response => { 91 | if (response.ok) { 92 | // Проверка статуса ответа (204 - No Content) 93 | if (response.status === 204) { 94 | console.log("Агент удален"); 95 | // Выполнение необходимых обновлений пользовательского интерфейса или удаление элемента 96 | } else { 97 | // Обработка других успешных кодов состояния, если необходимо 98 | // Извлечение данных ответа, если они доступны 99 | return response.json(); 100 | } 101 | } else { 102 | throw new Error(`Не удалось удалить объект с ID ${buttonId}.`); 103 | } 104 | }).then(data => { 105 | if (data !== undefined && data.error) { 106 | console.error(data.error); 107 | // Обработка сообщения об ошибке здесь (например, отображение на пользовательском интерфейсе) 108 | } else if (data !== undefined) { 109 | if (data == 'Агент успешно добавлен') { 110 | location.reload(); 111 | } else if (data != 'Агент успешно добавлен') { 112 | alert(data); 113 | } 114 | // Обработка данных ответа, если они доступны 115 | } 116 | }).catch(error => { 117 | console.error('Произошла ошибка:', error); 118 | }); 119 | } 120 | 121 | // Функция изменения агента 122 | function agentEditData() { 123 | // Получение значения флажка agentStatusEdit 124 | const checkbox = document.getElementById('agentStatusEdit'); 125 | const checkboxValue = checkbox.checked ? 1 : 0; 126 | 127 | // Получение значения ID агента для редактирования 128 | const agent_id = document.getElementById('agentIDEdit').value; 129 | 130 | // Получение значений полей ввода 131 | const agentData = { 132 | id: agent_id, // ID агента 133 | agent_name: document.getElementById('agentNameEdit').value, // Имя агента 134 | agent_mac_address: document.getElementById('AgentMacAddressEdit').value, // MAC-адрес агента 135 | agent_ip_address: document.getElementById('AgentIPAddressEdit').value, // IP-адрес агента 136 | agent_port: document.getElementById('AgentPortEdit').value, // Порт агента 137 | agent_description: document.getElementById('agentDescriptionEdit').value, // Описание агента 138 | datetime_change: new Date().toISOString(), // Дата и время изменения агента 139 | agent_group_id: parseInt(document.getElementById('agentGroupEdit').value), // Идентификатор группы агента 140 | agent_type_id: parseInt(document.getElementById('agentTypeEdit').value), // Идентификатор типа агента 141 | agent_status: checkboxValue // Статус агента (включен или выключен) 142 | }; 143 | 144 | // Функция для проверки значения на null, "None" или "" 145 | function isEmpty(value) { 146 | return value === null || value === "None" || (typeof value === "string" && value.trim() === ""); 147 | } 148 | 149 | // Проверка наличия пустых значений в объекте agentData и вывод соответствующего сообщения. 150 | const fieldsToCheck = ['agent_mac_address', 'agent_ip_address', 'agent_group_id', 'agent_type_id', 'agent_status']; 151 | let isEmptyField = false; // Флаг для отслеживания, было ли обнаружено хотя бы одно пустое поле. 152 | 153 | // Проходимся по каждому ключу из списка fieldsToCheck. 154 | for (const key of fieldsToCheck) { 155 | const value = agentData[key]; 156 | let fieldName = key; // По умолчанию используем ключ как название поля. 157 | 158 | 159 | // Изменяем название поля для вывода сообщения на русском языке. 160 | switch (key) { 161 | case 'agent_mac_address': 162 | fieldName = 'MAC адрес агента'; 163 | break; 164 | case 'agent_ip_address': 165 | fieldName = 'IP-адрес агента'; 166 | break; 167 | case 'agent_group_id': 168 | fieldName = 'группа агента'; 169 | break; 170 | case 'agent_type_id': 171 | fieldName = 'тип агента'; 172 | break; 173 | case 'agent_status': 174 | fieldName = 'статус агента'; 175 | break; 176 | } 177 | 178 | // Проверяем, является ли текущее поле "agent_group_id" или "agent_type_id" и содержит ли пустое или NaN значение. 179 | if ((key === 'agent_group_id' || key === 'agent_type_id') && (value === null || isNaN(value))) { 180 | alert(`Поле ${fieldName} не заполнено!`); 181 | isEmptyField = true; 182 | break; // Останавливаем цикл, если обнаружено пустое или NaN значение для "agent_group_id" или "agent_type_id". 183 | } else if (isEmpty(value)) { 184 | alert(`Поле "${fieldName}" не заполнено!`); 185 | isEmptyField = true; 186 | break; // Останавливаем цикл, если обнаружено пустое значение для другого поля. 187 | } 188 | } 189 | 190 | // Если было обнаружено хотя бы одно пустое или NaN поле, прекращаем выполнение функции. 191 | if (isEmptyField) { 192 | return; 193 | } 194 | 195 | // Вывод данных агента в формате JSON в консоль для отладки 196 | console.log(JSON.stringify(agentData)); 197 | 198 | // Получение CSRF-токена из cookie 199 | const csrftoken = getCookie('csrftoken'); 200 | 201 | // Отправка PUT-запроса на сервер для редактирования данных агента 202 | fetch(`/api/editAgentData/${agent_id}/`, { 203 | method: 'PUT', 204 | headers: { 205 | 'Content-Type': 'application/json', 206 | 'X-CSRFToken': csrftoken, 207 | }, 208 | body: JSON.stringify(agentData) 209 | }).then(response => { 210 | if (response.ok) { 211 | // Проверка статуса ответа (204 - No Content) 212 | if (response.status === 204) { 213 | console.log("Агент удален"); 214 | // Выполнение необходимых обновлений пользовательского интерфейса или удаление элемента 215 | } else { 216 | // Обработка других успешных кодов состояния, если необходимо 217 | // Извлечение данных ответа, если они доступны 218 | return response.json(); 219 | } 220 | } else { 221 | throw new Error(`Не удалось удалить объект с ID ${buttonId}.`); 222 | } 223 | }).then(data => { 224 | if (data !== undefined && data.error) { 225 | console.error(data.error); 226 | // Обработка сообщения об ошибке здесь (например, отображение на пользовательском интерфейсе) 227 | } else if (data !== undefined) { 228 | if (data == 'Агент успешно изменен') { 229 | location.reload(); 230 | } else if (data != 'Агент успешно изменен') { 231 | alert(data); 232 | } 233 | // Обработка данных ответа, если они доступны 234 | } 235 | }).catch(error => { 236 | console.error('Произошла ошибка:', error); 237 | }); 238 | } 239 | 240 | // Функция удаления данных агента 241 | function agentDeleteData() { 242 | // Получение всех кнопок с классом deleteAgent 243 | var buttons = document.querySelectorAll(".deleteAgent"); 244 | 245 | // Добавление обработчиков событий для каждой кнопки 246 | for (var i = 0; i < buttons.length; i++) { 247 | buttons[i].addEventListener("click", handleClick); 248 | } 249 | 250 | // Функция-обработчик события клика 251 | function handleClick(event) { 252 | // Получение значения ID из атрибута data-id кнопки 253 | const buttonId = event.currentTarget.getAttribute("data-id"); 254 | 255 | // Отправка DELETE-запроса на конечную точку Django REST API 256 | const tokenizers = getCookie('csrftoken'); 257 | fetch(`/api/deleteAgentData/${buttonId}/`, { 258 | method: 'DELETE', 259 | headers: { 260 | 'Content-Type': 'application/json', 261 | 'X-CSRFToken': tokenizers, 262 | }, 263 | // Можно включить учетные данные, если требуется (например, для аутентификации) 264 | // credentials: 'include', 265 | }).then(response => { 266 | if (response.ok) { 267 | // Проверка статуса ответа (204 - No Content) 268 | if (response.status === 204) { 269 | console.log("Агент удален"); 270 | // Выполнение необходимых обновлений пользовательского интерфейса или удаление элемента 271 | } else { 272 | // Обработка других успешных кодов состояния, если необходимо 273 | // Извлечение данных ответа, если они доступны 274 | return response.json(); 275 | } 276 | } else { 277 | throw new Error(`Не удалось удалить объект с ID ${buttonId}.`); 278 | } 279 | }).then(data => { 280 | if (data !== undefined && data.error) { 281 | console.error(data.error); 282 | // Обработка сообщения об ошибке здесь (например, отображение на пользовательском интерфейсе) 283 | } else if (data !== undefined) { 284 | if (data == 'Агент успешно удален') { 285 | alert(data); 286 | location.reload(); 287 | } else if (data != 'Агент успешно удален') { 288 | alert(data); 289 | } 290 | // Обработка данных ответа, если они доступны 291 | } 292 | }).catch(error => { 293 | console.error('Произошла ошибка:', error); 294 | }); 295 | } 296 | } 297 | 298 | // Добавление новой группы агента 299 | function groupAddData() { 300 | // Получение значений полей ввода 301 | const groupData = { 302 | agent_group_name: document.getElementById('groupNameAdd').value, // Название группы 303 | agent_group_priority: document.getElementById('groupPriorityAdd').value, // Приоритет группы 304 | agent_group_description: document.getElementById('groupDescriptionAdd').value, // Описание группы 305 | datetime_create: new Date().toISOString() // Дата и время создания группы 306 | }; 307 | 308 | // Вывод данных группы в формате JSON в консоль для отладки 309 | console.log(JSON.stringify(groupData)); 310 | 311 | // Получение CSRF-токена из cookie 312 | const csrftoken = getCookie('csrftoken'); 313 | 314 | // Отправка POST-запроса на сервер для добавления данных группы 315 | fetch(`/api/addGroupData`, { 316 | method: 'POST', 317 | headers: { 318 | 'Content-Type': 'application/json', 319 | 'X-CSRFToken': csrftoken, 320 | }, 321 | body: JSON.stringify(groupData) 322 | }).then(function (response) { 323 | // Проверка успешности ответа (статус 200) 324 | if (response.ok) { 325 | // Перезагрузка страницы 326 | location.reload(); 327 | } else { 328 | // Обработка ошибки 329 | console.log('Ошибка: ' + response.status); 330 | } 331 | }).catch(function (error) { 332 | console.log('Ошибка: ' + error); 333 | }); 334 | } 335 | 336 | // Функция изменения данных группы 337 | function groupEditData() { 338 | // Получение значения ID группы для редактирования 339 | const group_id = document.getElementById('groupIDEdit').value; 340 | 341 | // Получение значений полей ввода 342 | const groupData = { 343 | id: group_id, // ID группы 344 | agent_group_name: document.getElementById('groupNameEdit').value, // Название группы 345 | agent_group_priority: document.getElementById('groupPriorityEdit').value, // Приоритет группы 346 | agent_group_description: document.getElementById('groupDescriptionEdit').value, // Описание группы 347 | datetime_change: new Date().toISOString() // Дата и время изменения группы 348 | }; 349 | 350 | // Вывод данных группы в формате JSON в консоль для отладки 351 | console.log(JSON.stringify(groupData)); 352 | 353 | // Получение CSRF-токена из cookie 354 | const tokenizers = getCookie('csrftoken'); 355 | 356 | // Отправка PUT-запроса на сервер для редактирования данных группы 357 | fetch(`/api/editGroupData/${group_id}/`, { 358 | method: 'PUT', 359 | headers: { 360 | 'Content-Type': 'application/json', 361 | 'X-CSRFToken': tokenizers, 362 | }, 363 | body: JSON.stringify(groupData) 364 | }).then(function (response) { 365 | // Проверка успешности ответа (статус 200) 366 | if (response.ok) { 367 | // Перезагрузка страницы 368 | location.reload(); 369 | } else { 370 | // Обработка ошибки 371 | console.log('Ошибка: ' + response.status); 372 | } 373 | }).catch(function (error) { 374 | console.log('Ошибка: ' + error); 375 | }); 376 | } 377 | 378 | // Удаление группы агентов 379 | function groupDeleteData() { 380 | // Получение всех кнопок с классом deleteGroup 381 | var buttons = document.querySelectorAll(".deleteGroup"); 382 | 383 | // Добавление обработчиков событий для каждой кнопки 384 | for (var i = 0; i < buttons.length; i++) { 385 | buttons[i].addEventListener("click", handleClick); 386 | } 387 | 388 | // Функция-обработчик события клика 389 | function handleClick(event) { 390 | // Получение значения ID из атрибута data-id кнопки 391 | const buttonId = event.currentTarget.getAttribute("data-id"); 392 | 393 | // Отправка DELETE-запроса на конечную точку Django REST API 394 | const tokenizers = getCookie('csrftoken'); 395 | fetch(`/api/deleteGroupData/${buttonId}/`, { 396 | method: 'DELETE', 397 | headers: { 398 | 'Content-Type': 'application/json', 399 | 'X-CSRFToken': tokenizers, 400 | }, 401 | // Можно включить учетные данные, если требуется (например, для аутентификации) 402 | // credentials: 'include', 403 | }).then(response => { 404 | if (response.ok) { 405 | // Проверка статуса ответа (204 - No Content) 406 | if (response.status === 204) { 407 | console.log("Группа удалена"); 408 | // Выполнение необходимых обновлений пользовательского интерфейса или удаление элемента 409 | } else { 410 | // Обработка других успешных кодов состояния, если необходимо 411 | // Извлечение данных ответа, если они доступны 412 | return response.json(); 413 | } 414 | } else { 415 | throw new Error(`Не удалось удалить объект с ID ${buttonId}.`); 416 | } 417 | }).then(data => { 418 | if (data !== undefined && data.error) { 419 | console.error(data.error); 420 | // Обработка сообщения об ошибке здесь (например, отображение на пользовательском интерфейсе) 421 | } else if (data !== undefined) { 422 | if (data == 'Группа успешно удалена') { 423 | alert(data); 424 | location.reload(); 425 | } else if (data != 'Группа успешно удалена') { 426 | alert(data); 427 | } 428 | // Обработка данных ответа, если они доступны 429 | } 430 | }).catch(error => { 431 | console.error('Произошла ошибка:', error); 432 | }); 433 | } 434 | } 435 | 436 | // Прослушивание событий кнопки изменения агента 437 | function agentEditButtonListeners() { 438 | // Получение ссылок на все кнопки "Редактировать" 439 | var editButtons = document.getElementsByClassName("editAgent btn btn-outline-primary btn-sm"); 440 | 441 | // Добавление обработчиков событий для каждой кнопки "Редактировать" 442 | for (var i = 0; i < editButtons.length; i++) { 443 | editButtons[i].addEventListener("click", handleEdit); 444 | } 445 | 446 | // Функция-обработчик события клика по кнопке "Редактировать" 447 | function handleEdit(event) { 448 | // Получение родительской строки таблицы (tr) 449 | const row = event.target.closest("tr"); 450 | console.log(row) 451 | // Заполнение полей ввода 452 | document.getElementById('agentIDEdit').value = row.cells[0].innerText; // Значение ID агента 453 | document.getElementById('agentNameEdit').value = row.cells[2].innerText; // Значение имени агента 454 | document.getElementById('AgentMacAddressEdit').value = row.cells[5].innerText; // Значение MAC-адреса агента 455 | document.getElementById('agentDescriptionEdit').value = row.cells[9].innerText; // Значение описания агента 456 | document.getElementById('AgentIPAddressEdit').value = row.cells[10].innerText; // Значение IP-адреса агента 457 | document.getElementById('AgentPortEdit').value = row.cells[11].innerText; // Значение порта агента 458 | document.getElementById('agentGroupEdit').value = row.cells[12].innerText; // Значение ID группы агента 459 | document.getElementById('agentTypeEdit').value = row.cells[13].innerText; // Значение ID типа агента 460 | document.getElementById('agentStatusEdit').checked = parseInt(row.cells[14].innerText); // Значение статуса агента 461 | } 462 | } 463 | 464 | // Прослушивание событий кнопки изменения группы агента 465 | function groupEditButtonListeners() { 466 | // Получение ссылок на все кнопки "Редактировать" 467 | var editGroupButtons = document.getElementsByClassName("editGroup btn btn-outline-primary btn-sm"); 468 | 469 | // Добавление обработчиков событий для каждой кнопки "Редактировать" 470 | for (var i = 0; i < editGroupButtons.length; i++) { 471 | editGroupButtons[i].addEventListener("click", handleEdit); 472 | } 473 | 474 | // Функция-обработчик события клика по кнопке "Редактировать" 475 | function handleEdit(event) { 476 | // Получение родительской строки таблицы (tr) 477 | const row = event.target.closest("tr"); 478 | console.log(row) 479 | // Заполнение полей ввода 480 | document.getElementById('groupIDEdit').value = row.cells[0].innerText; // Значение ID группы 481 | document.getElementById('groupNameEdit').value = row.cells[1].innerText; // Значение названия группы 482 | document.getElementById('groupPriorityEdit').value = row.cells[2].innerText; // Значение приоритета группы 483 | document.getElementById('groupDescriptionEdit').value = row.cells[3].innerText; // Значение описания группы 484 | } 485 | } 486 | 487 | function getCookie(name) { 488 | // Ищем значение cookie по имени с помощью регулярного выражения 489 | const cookieValue = document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)'); 490 | // Если найдено значение cookie, возвращаем его 491 | // Используем метод pop(), чтобы получить последний элемент массива с найденным значением cookie 492 | return cookieValue ? cookieValue.pop() : ''; 493 | } 494 | 495 | -------------------------------------------------------------------------------- /interface/static/js/info.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/js/info.js -------------------------------------------------------------------------------- /interface/static/js/monitor.js: -------------------------------------------------------------------------------- 1 | graphTableClickListeners() 2 | agentCommandClickListeners() 3 | var agentIDGraph = parseInt(document.querySelector('.clickable-row td:first-child').textContent) 4 | // Получаем ID агента для отображения графика. 5 | // Находим элемент таблицы с классом "clickable-row" и первым дочерним элементом ячейку td. 6 | // Извлекаем текстовое содержимое ячейки и преобразуем его в целое число с помощью parseInt(). 7 | 8 | // Инициализируем контейнер для графика 9 | var chartContainer = document.getElementById('chart'); 10 | var chart = echarts.init(chartContainer); 11 | 12 | window.addEventListener('DOMContentLoaded', (event) => { 13 | // Находим первую строку в таблице 14 | const firstRow = document.querySelector('table tbody tr'); 15 | 16 | // Симулируем событие клика на первой строке 17 | if (firstRow) { 18 | firstRow.click(); 19 | } 20 | }); 21 | // При загрузке страницы добавляем обработчик события для выполнения кода после полной загрузки контента (DOMContentLoaded). 22 | // Находим первую строку в таблице с помощью селектора 'table tbody tr'. 23 | // Если первая строка найдена, симулируем событие клика на этой строке. 24 | 25 | 26 | function graphDraw(agentIDGraph) { 27 | // Запрос к API для получения данных графика 28 | fetch(`/api/graphData/?agent_id=${agentIDGraph}`) 29 | .then(response => response.json()) 30 | .then(data => { 31 | // Проверка наличия данных 32 | if (data.length > 0) { 33 | console.log(data); 34 | 35 | /* Формирование данных для оси X */ 36 | const agentStepValues = data.map(obj => obj.agent_step); 37 | const uniqueAgentStepValues = [...new Set(agentStepValues)]; 38 | const xAxisData = uniqueAgentStepValues.sort((a, b) => a - b); 39 | console.log(xAxisData); 40 | 41 | /* Формирование данных для графика */ 42 | const errorValuesByAlgorithm = {}; 43 | data.forEach(obj => { 44 | const algorithmCodeName = obj.algorithm_code_name; 45 | const errorValue = obj.agent_error_value; 46 | 47 | // Группировка значений ошибки по алгоритму 48 | if (!errorValuesByAlgorithm.hasOwnProperty(algorithmCodeName)) { 49 | errorValuesByAlgorithm[algorithmCodeName] = []; 50 | } 51 | errorValuesByAlgorithm[algorithmCodeName].push(errorValue); 52 | }); 53 | 54 | const seriesData = []; 55 | 56 | // Формирование данных серий для графика 57 | for (const algorithmCodeName in errorValuesByAlgorithm) { 58 | const errorValues = errorValuesByAlgorithm[algorithmCodeName]; 59 | 60 | seriesData.push({ 61 | name: algorithmCodeName, 62 | data: errorValues, 63 | type: 'line' 64 | }); 65 | } 66 | 67 | console.log(seriesData); 68 | 69 | // Установка опций графика и загрузка данных 70 | chart.setOption({ 71 | xAxis: [ 72 | { 73 | type: 'category', 74 | name: 'Шаг', 75 | axisTick: { 76 | alignWithLabel: true 77 | }, 78 | data: xAxisData 79 | } 80 | ], 81 | yAxis: [ 82 | { 83 | type: 'value', 84 | name: 'Значение ошибки', 85 | position: 'left', 86 | } 87 | ], 88 | series: seriesData, 89 | tooltip: { 90 | trigger: 'axis', 91 | axisPointer: { type: 'cross' } 92 | }, 93 | toolbox: { 94 | show: true, 95 | feature: { 96 | dataZoom: { 97 | show: true, 98 | yAxisIndex: 'none' 99 | }, 100 | restore: { 101 | show: true, 102 | title: 'Перезагрузить график', 103 | onclick: chart.on('restore', function (params) { 104 | graphDraw(agentIDGraph); 105 | }) 106 | } 107 | } 108 | }, 109 | legend: {}, 110 | graphic: [{ 111 | type: 'text', 112 | left: 'center', 113 | top: 'middle', 114 | style: { 115 | text: '', 116 | textAlign: 'center', 117 | fontSize: 28 118 | } 119 | }] 120 | }, true); 121 | 122 | // Обновление статуса в футере 123 | const footerStatus = document.getElementById('footerStatus'); 124 | if (footerStatus) { 125 | footerStatus.textContent = 'Данные успешно загружены'; 126 | footerStatus.classList.remove('text-success'); 127 | footerStatus.classList.remove('text-danger'); 128 | footerStatus.classList.add('text-success'); 129 | } 130 | } else { 131 | // Отображение сообщения "Нет данных" вместо графика 132 | chart.setOption({ 133 | graphic: [{ 134 | type: 'text', 135 | left: 'center', 136 | top: 'middle', 137 | style: { 138 | text: 'Нет данных для данного агента', 139 | textAlign: 'center', 140 | fontSize: 28 141 | } 142 | }], 143 | }, true); 144 | 145 | // Обновление статуса в футере 146 | const footerStatus = document.getElementById('footerStatus'); 147 | if (footerStatus) { 148 | footerStatus.textContent = 'Нет данных в базе данных'; 149 | footerStatus.classList.remove('text-success'); 150 | footerStatus.classList.remove('text-danger'); 151 | footerStatus.classList.add('text-danger'); 152 | } 153 | } 154 | }) 155 | .catch(error => console.error(error)); 156 | } 157 | 158 | 159 | // Задаем функцию для кнопки после вызова graphDraw() 160 | chart.on('restore', function (params) { 161 | graphDraw(agentIDGraph); 162 | }); 163 | 164 | // Функция обработки событий нажатия на строку таблицы 165 | function graphTableClickListeners() { 166 | // Добавление обработчиков событий клика к каждой кликабельной строке 167 | var rows = document.getElementsByClassName('clickable-row'); 168 | for (var i = 0; i < rows.length; i++) { 169 | rows[i].addEventListener('click', handleRowClick); 170 | } 171 | 172 | // Функция для обработки клика по строке 173 | function handleRowClick(event) { 174 | // Получение выбранной строки 175 | const row = event.currentTarget; 176 | 177 | // Удаление класса "table-active" у всех строк 178 | const table = row.closest('table'); 179 | let rows = table.getElementsByClassName('clickable-row'); 180 | for (let i = 0; i < rows.length; i++) { 181 | rows[i].classList.remove('table-active'); 182 | } 183 | 184 | // Переключение класса "table-active" для кликнутой строки 185 | row.classList.toggle('table-active'); 186 | 187 | // Получение данных из каждой ячейки строки 188 | const rowData = Array.from(row.cells).map(cell => cell.textContent.trim()); 189 | 190 | // Вывод собранных данных в консоль (эту часть можно изменить по необходимости) 191 | const agentIDGraph = rowData[0]; 192 | 193 | const agentName = rowData[2]; 194 | console.log(agentName); 195 | 196 | const headerStatus = document.getElementById('headerStatus'); 197 | if (headerStatus) { 198 | headerStatus.value = agentIDGraph; 199 | } 200 | 201 | // Вызов функции graphDraw с использованием идентификатора агента 202 | graphDraw(agentIDGraph); 203 | } 204 | } 205 | 206 | // Функция обработки событий нажатия кнопок управления агентом 207 | function agentCommandClickListeners() { 208 | // Добавление обработчиков событий клика к каждой кнопке 209 | const agentCommandButtons = document.querySelectorAll('.agentCommand'); 210 | agentCommandButtons.forEach((button) => { 211 | button.addEventListener('click', () => { 212 | // Получение команды агента из значения кнопки 213 | const agentCommand = button.value; 214 | console.log(agentCommand); // Вывод значения кликнутой кнопки в консоль 215 | SendRequestToAgent(agentCommand); 216 | }); 217 | }); 218 | } 219 | 220 | // Функция отправки запроса агенту 221 | function SendRequestToAgent(agentCommand) { 222 | // Получение идентификатора агента из элемента с id "headerStatus" 223 | const agentId = document.getElementById('headerStatus').value; 224 | 225 | // Формирование данных запроса 226 | const requestData = { 227 | agent_id: agentId, 228 | agent_command: agentCommand, 229 | t: 'command' 230 | }; 231 | 232 | console.log(JSON.stringify(requestData)); 233 | 234 | // Получение CSRF-токена 235 | const csrftoken = getCookie('csrftoken'); 236 | 237 | // Отправка POST-запроса на сервер 238 | fetch(`/api/SendRequestToAgent`, { 239 | method: 'POST', 240 | headers: { 241 | 'Content-Type': 'application/json', 242 | 'X-CSRFToken': csrftoken, 243 | }, 244 | body: JSON.stringify(requestData) 245 | }).then(function (response) { 246 | // Проверка успешности ответа (статус 200) 247 | if (response.ok) { 248 | return response.json(); 249 | } else { 250 | throw new Error('Network response was not OK.'); 251 | } 252 | }).then(data => { 253 | console.log(data); 254 | if (data !== undefined && data.error) { 255 | console.error(data.error); 256 | // Обработка сообщения об ошибке (например, отображение на пользовательском интерфейсе) 257 | } else if (data !== undefined) { 258 | // Проверка наличия сообщения об ошибке 259 | const errorMessageCheck = data.substring(0, 6); 260 | if (errorMessageCheck === 'Ошибка') { 261 | // Обновление статуса внизу страницы при ошибке 262 | const footerStatus = document.getElementById('footerStatus'); 263 | if (footerStatus) { 264 | /* footerStatus.textContent = data; */ 265 | footerStatus.textContent = 'Запрос успешно отправлен' 266 | footerStatus.classList.remove('text-success'); 267 | footerStatus.classList.remove('text-danger'); 268 | footerStatus.classList.add('text-success'); 269 | } 270 | } else if (errorMessageCheck !== 'Ошибка') { 271 | // Обновление статуса внизу страницы при успешном выполнении 272 | const footerStatus = document.getElementById('footerStatus'); 273 | if (footerStatus) { 274 | /* footerStatus.textContent = data; */ 275 | footerStatus.textContent = 'Запрос успешно отправлен' 276 | footerStatus.classList.remove('text-success'); 277 | footerStatus.classList.remove('text-danger'); 278 | footerStatus.classList.add('text-success'); 279 | } 280 | } 281 | } 282 | }).catch(function (error) { 283 | console.log('Error: ' + error); 284 | }); 285 | } 286 | 287 | // Функция удаления данных графика для определенного агента 288 | function deleteAgentErrors() { 289 | // Получение CSRF-токена 290 | const tokenizers = getCookie('csrftoken'); 291 | 292 | // Получение идентификатора агента из элемента с id "headerStatus" 293 | const agentIDGraph = document.getElementById('headerStatus').value; 294 | 295 | // Отправка DELETE-запроса на сервер для удаления данных об ошибках агента 296 | fetch(`api/deleteAgentErrorsData/${agentIDGraph}/`, { 297 | method: 'DELETE', 298 | headers: { 299 | 'Content-Type': 'application/json', 300 | 'X-CSRFToken': tokenizers 301 | } 302 | }).then(response => { 303 | if (response.ok) { 304 | // Проверка статуса ответа (204 - No Content) 305 | if (response.status === 204) { 306 | console.log("Agent deleted"); 307 | // Выполнение необходимых обновлений пользовательского интерфейса или удаление элементов 308 | } else { 309 | // Обработка других успешных статусов кодов, если необходимо 310 | // Извлечение данных ответа, если доступно 311 | return response.json(); 312 | } 313 | } else { 314 | throw new Error(`Failed to delete object with ID ${agentIDGraph}.`); 315 | } 316 | }) 317 | .then(data => { 318 | if (data !== undefined && data.error) { 319 | console.error(data.error); 320 | // Обработка сообщения об ошибке (например, отображение на пользовательском интерфейсе) 321 | } else if (data !== undefined) { 322 | // Проверка сообщения об успешном удалении данных 323 | if (data == 'Данные успешно удалены') { 324 | // Перерисовка графика после удаления данных об ошибках агента 325 | graphDraw(agentIDGraph); 326 | } else if (data != 'Группа успешно удалена') { 327 | // Обновление статуса внизу страницы при ошибке 328 | const footerStatus = document.getElementById('footerStatus'); 329 | if (footerStatus) { 330 | footerStatus.textContent = data; 331 | footerStatus.classList.remove('text-success'); 332 | footerStatus.classList.remove('text-danger'); 333 | footerStatus.classList.add('text-danger'); 334 | } 335 | } 336 | // Обработка данных ответа, если доступны 337 | } 338 | }) 339 | .catch(error => { 340 | console.error('An error occurred:', error); 341 | }); 342 | } 343 | 344 | 345 | function getCookie(name) { 346 | // Ищем значение cookie по имени с помощью регулярного выражения 347 | const cookieValue = document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)'); 348 | // Если найдено значение cookie, возвращаем его 349 | // Используем метод pop(), чтобы получить последний элемент массива с найденным значением cookie 350 | return cookieValue ? cookieValue.pop() : ''; 351 | } -------------------------------------------------------------------------------- /interface/static/video/InstallGit.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/video/InstallGit.mp4 -------------------------------------------------------------------------------- /interface/static/video/InstallProject.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/video/InstallProject.mp4 -------------------------------------------------------------------------------- /interface/static/video/InstallPython.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/video/InstallPython.mp4 -------------------------------------------------------------------------------- /interface/static/video/info/AgentUse.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/video/info/AgentUse.mp4 -------------------------------------------------------------------------------- /interface/static/video/info/GraphUse.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/video/info/GraphUse.mp4 -------------------------------------------------------------------------------- /interface/static/video/info/GroupUse.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/interface/static/video/info/GroupUse.mp4 -------------------------------------------------------------------------------- /interface/templates/interface/base.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | {% load bootstrap5 %} 4 | 5 | {% bootstrap_css %} 6 | {% bootstrap_javascript %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 22 | Панель управления 23 | 24 | 25 | 26 |
27 |
28 | 61 |
62 | {% block content %} 63 | {% endblock %} 64 |
65 |
66 |
67 | 68 | {% block modals %} 69 | {% endblock %} 70 | 71 | {% block scripts %} 72 | {% endblock %} 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /interface/templates/interface/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'interface/base.html' %} 2 | {% load static %} 3 | {% block content %} 4 | 5 | Управление агентами 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 23 | 24 | 25 | 26 | {% for a in agents %} 27 | 28 | 29 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 76 | 77 | {% endfor %} 78 | 79 |
СтатусНазваниеГруппаТипMAC адресIP адрес и портДата созданияДата изменения 19 | 22 |
{{ a.id }}{% if a.agent_status == "Активен" %} 30 | 32 | 33 | 34 | {% else %} 35 | 36 | 38 | 40 | 41 | {% endif %} 42 | {{ a.agent_name|default:"" }}{{ a.agent_group_name|default:"" }}{{ a.agent_type|default:"" }}{{ a.agent_mac_address|default:"" }}{{ a.agent_ip_address_port|default:"" }}{{ a.datetime_create|default:"" }}{{ a.datetime_change|default:"" }}{{ a.agent_description }}{{ a.agent_ip_address }}{{ a.agent_port }}{{ a.agent_group_id }}{{ a.agent_type_id }}{{ a.agent_status_id }} 57 | 66 | 75 |
80 |
81 |
82 |
83 | Управление группами 84 |
85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 97 | 98 | 99 | 100 | {% for i in agentGroups %} 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 127 | 128 | {% endfor %} 129 | 130 |
НазваниеПриоритетДата созданияДата изменения 93 | 96 |
{{ i.id }}{{ i.agent_group_name|default:"" }}{{ i.agent_group_priority|default:"" }}{{ i.agent_group_description|default:"" }}{{ i.datetime_create|default:"" }}{{ i.datetime_change|default:"" }} 109 | 118 | 126 |
131 |
132 |
133 |
134 | Типы агентов 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | {% for i in agentTypes %} 144 | 145 | 146 | 147 | 148 | {% endfor %} 149 | 150 |
НазваниеОписание
{{ i.agent_type|default:"" }}{{ i.agent_type_description|default:"" }}
151 |
152 |
153 | Состояние нейронных сетей 154 |
155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | {% for i in agentNeuralNetworkState %} 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | {% endfor %} 175 | 176 |
Имя агентаКоличество символов состояние нейронной сетиОписаниеДата созданияДата изменения
{{ i.agent_name|default:"" }}{{ i.count_neural_network_state|default:"" }}{{ i.neural_network_state_description|default:"" }}{{ i.datetime_create|default:"" }}{{ i.datetime_change|default:"" }}
177 |
178 | Файлы агентов 179 |
180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | {% for i in agentFiles %} 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | {% endfor %} 204 | 205 |
Имя агентаИмя файлаТип файлаПуть к файлуОписание файлаДата созданияДата изменения
{{ i.agent_name }}{{ i.file_name }}{{ i.file_type }}{{ i.file_path }}{{ i.file_description }}{{ i.datetime_create|default:"" }}{{ i.datetime_change|default:"" }}
206 |
207 | Алгоритмы агентов 208 |
209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | {% for i in neuralAlgorithms %} 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | {% endfor %} 231 | 232 |
ID алгоритмаИмя алгоритмаКодовое имя алгоритмаОписание алгоритмаДата созданияДата изменения
{{ i.id }}{{ i.algorithm_name }}{{ i.algorithm_code_name }}{{ i.algorithm_description }}{{ i.datetime_create|default:"" }}{{ i.datetime_change|default:"" }}
233 |
234 | {% endblock %} 235 | 236 | {% block modals %} 237 | 308 | 309 | 382 | 383 | 418 | 419 | 455 | {% endblock %} 456 | 457 | {% block scripts %} 458 | 459 | {% endblock %} 460 | 461 | 462 | -------------------------------------------------------------------------------- /interface/templates/interface/info.html: -------------------------------------------------------------------------------- 1 | {% extends 'interface/base.html' %} 2 | {% load static %} 3 | {% block content %} 4 | 5 | Информация 6 |
7 | 34 |
35 |
36 |
37 |
Общая информация
38 |

Позволяет работать с данными из базы данных. Полностью управлять данными можно только для таблиц с 39 | агентами и группами агентов. Позволяется создавать, изменять и удалять записи. При попытке удалить 40 | запись, которая связана с другой записью в другой таблицы посредством внешнего ключа, система выдаст 41 | предупреждение о том, что сделать это нельзя и необходимо сначала удалить все данные таким образом, 42 | чтобы у БД сохранялась структура третьей нормальной формы. Осуществляется всё посредством кнопок. 43 | При создании и изменении открывается модальное окно для заполнения или изменения данных соответственно. 44 | Таблица типов агентов статичная и содержит значения по умолчанию. Остальные таблицы, если есть 45 | необходимость, нужно заполнять через административную панель сайта, которая позволяет полностью изменять 46 | данные.

47 |
Работа с агентами
48 | 52 | 60 |
Работа с группами
61 | 65 | 71 |
72 |
73 |
74 |
75 |
Общая информация
76 |

Выводит информацию об обучении агентов, а также позволяет управлять данными агентов. 77 | По умолчанию, всегда выбирается первая запись из таблицы ошибок агентов. График отображает данные 78 | обучения агентов. При выборе необходимого агента в таблице, график отрисовывается заново, исходя из значений 79 | ошибок для определенного агента. Панель в правой нижней части экрана позволяет отправлять необходимые 80 | команды агентам.

81 |
Работа с графиком
82 | 86 |

Кнопки в правой нижней части страницы отвечают за прямое управление и взаимодействие с агентами. При 87 | нажатии на кнопку отправляется запрос, который в зависимости от состояния агента отправляет определенный 88 | ответ. Как показано на видео, сервер не может найти агента в локальной сети с таким адресом и присылает 89 | ошибку, которая в полном виде отображается в нижней части страницы.

90 | 94 |
95 |
96 |
97 |
98 |
99 | Логин: root | Пароль: 1234 100 |
101 |
Общая информация
102 |

Административная панель Django - это встроенный инструмент, предоставляемый Django для управления данными 103 | вашего веб-приложения. Она обеспечивает удобный и мощный интерфейс для работы с моделями и данными в 104 | вашей базе данных без необходимости создания собственного пользовательского интерфейса. Это мощный 105 | инструмент, который значительно упрощает управление данными в вашем веб-приложении, и она поставляется с 106 | Django "из коробки", что делает ее одним из популярных выборов для административного интерфейса.

107 |
Вход в административную панель
108 |
    109 |
  1. 110 |
    111 |
    Зайдите на страницу административной панели
    112 | Откройте веб-браузер и введите адрес административной панели (обычно это 113 | /admin) в адресной 114 | строке сайта или нажмите в левом меню "Панель администратора" 115 |
    116 |
  2. 117 |
  3. 118 |
    119 |
    Авторизуйтесь
    120 | Вам будет предложено ввести учетные данные. Введите логин и пароль, 121 | указанные выше 122 |
    123 |
  4. 124 |
125 |
Возможности панели администратора
126 |

Аутентификация и авторизация: Административная панель предоставляет механизмы 127 | аутентификации для входа в систему. Пользователь должен ввести правильные учетные данные (логин и 128 | пароль), чтобы получить доступ к административной панели. Кроме того, она поддерживает систему 129 | авторизации, что позволяет управлять правами доступа пользователей, включая суперпользователя.

130 | 131 |

Доступ к моделям приложения: Административная панель автоматически анализирует ваше 132 | Django-приложение и создает интерфейс для работы с моделями, определенными в приложении. Она позволяет 133 | вам просматривать все модели, доступные в вашем приложении, и взаимодействовать с ними.

134 | 135 |

CRUD операции: CRUD - это аббревиатура, означающая "Create", "Read", "Update" и 136 | "Delete". Административная панель позволяет выполнять все эти операции с данными вашей базы данных. Вы 137 | можете создавать новые записи, просматривать их, обновлять значения полей и удалять записи.

138 | 139 |

Фильтрация, поиск и сортировка: Административная панель предоставляет удобные средства 140 | для фильтрации данных, поиска и сортировки записей. Это очень полезно, когда у вас есть большое 141 | количество данных и вы хотите быстро найти нужные записи.

142 | 143 |

Валидация данных: При создании или редактировании записей, административная панель 144 | выполняет проверку валидности данных, чтобы убедиться, что введенные значения соответствуют определенным 145 | правилам и ограничениям.

146 | 147 |

Отображение связей: Если у ваших моделей есть взаимосвязи через внешние ключи или другие 148 | отношения, административная панель отображает эти связи и позволяет легко перемещаться между связанными 149 | записями.

150 | 151 |

Настройка интерфейса: Вы можете настроить внешний вид и функциональность 152 | административной панели, добавлять или скрывать поля, настраивать формы и управлять внешним видом 153 | моделей.

154 | 155 |
156 | Важно! С осторожностью удаляйте, изменяйте или добавляйте данные! Нарушив целостность 157 | структуры базы данных может полечь за собой нестабильную работу всего приложения. Если же Вам всё же 158 | нужно ка-то изменить структуру базы данных, добавить новые таблицы или изменить внешние ключи, то 159 | рекомендуем пользоваться бесплатной программой Dbeaver. 160 |
161 |
162 |
163 |
164 |
165 |
Команды управления агентом
166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 178 | 179 | 180 | 181 | 184 | 185 | 186 | 187 | 190 | 191 | 192 | 193 | 196 | 197 | 198 | 199 | 202 | 203 | 204 | 205 | 208 | 209 | 210 | 211 | 214 | 215 | 216 | 217 | 220 | 221 | 222 | 223 |
КомандаОписание
176 |
{
    "r":"domain",
    "t":"command",
    "m":"forward"
}
177 |
Движение вперед
182 |
{
    "r":"domain",
    "t":"command",
    "m":"backward"
}
183 |
Движение назад
188 |
{
    "r":"domain",
    "t":"command",
    "m":"left"
}
189 |
Движение налево
194 |
{
    "r":"domain",
    "t":"command",
    "m":"right"
}
195 |
Движение направо
200 |
{
    "r":"domain",
    "t":"command",
    "m":"stop"
}
201 |
Остановить движение
206 |
{
    "r":"domain",
    "t":"command",
    "m":"start_learning"
}
207 |
Начать обучение
212 |
{
    "r":"domain",
    "t":"command",
    "m":"stop_learning"
}
213 |
Остановить обучение
218 |
{
    "r":"domain",
    "t":"command",
    "m":"reset"
}
219 |
Сбросить обучение
224 |
Запросы агенту
225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 237 | 239 | 240 | 241 | 244 | 245 | 246 | 247 |
КомандаОписание
235 |
{
    "r":"domain",
    "t":"request",
    "m":"download",
    "b":{}
}
236 |
Получить на получение данных с агента. Запрос приходит обратно с агента уже с набором данных 238 |
242 |
{
    "r":"domain",
    "t":"request",
    "m":"upload",
    "b":{some data}
}
243 |
Загрузить данные на агента
248 |
Запросы от агента
249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 261 | 263 | 264 | 265 | 268 | 269 | 270 | 271 | 274 | 275 | 276 | 277 | 280 | 285 | 286 | 287 | 290 | 291 | 292 | 293 |
КомандаОписание
259 |
{
    "r":"domain",
    "t":"request",
    "m":"download",
    "b":{}
}
260 |
Получить на получение данных с агента. Запрос приходит обратно с агента уже с набором данных 262 |
266 |
{
    "r":"domain",
    "t":"request",
    "m":"upload",
    "b":{some data}
}
267 |
Загрузить данные на агента
272 |
{
    "r":"domain",
    "t":"request",
    "m":"download",
    "b":{some data}
}
273 |
Запрос от агента на получение данных
278 |
{
    "r":"domain",
    "t":"info",
    "m":"loss",
    "b":
        "points":{
            "actor": [0,0.73, 1,0.35, 2,0.12],
            "critic": [1,0.53, 2,0.44, 3,0.12],
            "test": [0,0.89, 1,0.7, 2,0.56]
        }
    }
}
279 |
Обучение агента. Рассмотрим на примере "actor": [0,0.73, 1,0.35, 2,0.12] 281 | actor - алгоритм, используемый для обучения. Числа идут парами, где первое число - шаг агента 282 | (int), а второе число ошибка (float). Таких пар чисел может быть бесконечное множество. Внутри 283 | points может быть бесконечно множество ключей, а у ключей - значений. 284 |
288 |
{
    "r":"agent",
    "t":"info",
    "m":"authorization",
    "b":{
        "name":"RaspAgent",
        "mac":"b8:27:eb:2e:10:8d",
        "port":8081
    }
}
289 |
Авторизация агента
294 |
295 |
296 |
297 |
298 |
Наименование проекта
299 |

Библиотека глубокого обучения для мобильных роботов и роботизированных систем на 300 | ARM-процессорах

301 | 302 |
Цель выполнения проекта
303 |

Разработка библиотеки для глубокого иерархического обучения интеллектуальных агентов 304 | (мобильных роботов и роботизированных систем) на базе ARM процессоров.

305 | 306 |
Задачи по проекту
307 |
    308 |
  1. Создание ядра библиотеки для глубокого обучения. Создание основных 309 | нейросетевых структур (разные типы слоев, сетей и алгоритмов их обучения). 310 |
  2. 311 |
  3. Реализация алгоритмов самообучения интеллектуальных агентов. Реализация 312 | алгоритмов глубокого обучения с подкреплением. 313 |
  4. 314 |
  5. Реализация алгоритмов мультиагентного взаимодействия. Реализация алгоритмов 315 | взаимодействия агентов внутри мультиагентных систем. Реализация алгоритмов обмена сообщениями между 316 | интеллектуальными агентами при работе в группах. 317 |
  6. 318 |
  7. Создание модулей визуализации и удаленного мониторинга. Создание 319 | пользовательских локальных и веб интерфейсов для управления и мониторинга процессами работы 320 | нейросетевых алгоритмов на аппаратной части. 321 |
  8. 322 |
323 | 324 |
Область применения научно-технического продукта и т.п.
325 |
    326 |
  • Системы беспилотных автоматических наземных аппаратов применяемых для 327 | доставки небольших грузов (интеллектуальные роботы-доставщики). 328 |
  • 329 |
  • Роботы-конструкторы для обучающих комплексов.
  • 330 |
  • «Умные» автономные и работающие совместно приборы для систем умного дома 331 | (регулируемые датчики, выключатели, регулировщики) и интернета вещей. 332 |
  • 333 |
  • Сфера развлечений: групповые игры в соревнованиях по робототехнике.
  • 334 |
  • Наука: создание прототипов многоагентных роботизированных систем для 335 | изучения и разработки методов коллективного взаимодействия. 336 |
  • 337 |
338 |
Проектная группа
339 |
    340 |
  1. 341 |
    342 |
    Дубенко Юрий Владимирович
    343 |
      344 |
    • Анализ структур, методов и алгоритмов, которые будут реализованы 345 | в рамках работы над библиотекой. 346 |
    • 347 |
    • Определение целевых алгоритмов для использования при реализации 348 | мультиагентного взаимодействия и методов самообучения интеллектуальных агентов. 349 |
    • 350 |
    • Проектирование архитектуры библиотеки глубокого иерархического 351 | обучения интеллектуальных агентов. 352 |
    • 353 |
    • Проектирование API библиотеки.
    • 354 |
    • Разработка методов реализации модулей визуализации и удаленного 355 | мониторинга процессами работы нейросетевых алгоритмов. 356 |
    • 357 |
    • Контроль исполнения всех этапов работы над проектом, научное 358 | руководство и организация работы соисполнителей. 359 |
    • 360 |
    • Разработка научно-технического отчета по результатам всей работы 361 | над проектом. 362 |
    • 363 |
    364 |
    365 |
  2. 366 |
  3. 367 |
    368 |
    Тимченко Николай Николаевич
    369 |
      370 |
    • Анализ структур, методов и алгоритмов, которые будут реализованы 371 | в рамках работы над библиотекой. 372 |
    • 373 |
    • Определение целевых алгоритмов для использования при реализации 374 | мультиагентного взаимодействия и методов самообучения интеллектуальных агентов. 375 |
    • 376 |
    • Проектирование архитектуры библиотеки глубокого иерархического 377 | обучения интеллектуальных агентов. 378 |
    • 379 |
    • Проектирование API библиотеки.
    • 380 |
    • Разработка методов реализации модулей визуализации и удаленного 381 | мониторинга процессами работы нейросетевых алгоритмов. 382 |
    • 383 |
    • Контроль исполнения всех этапов работы над проектом, научное 384 | руководство и организация работы соисполнителей. 385 |
    • 386 |
    • Разработка научно-технического отчета по результатам всей работы 387 | над проектом. 388 |
    • 389 |
    390 |
    391 |
  4. 392 |
  5. 393 |
    394 |
    Шершаков Денис Владимирович
    395 |
      396 |
    • Проверка, что использованные при разработке библиотеки с 397 | открытым кодом зарубежных разработчиков не должны содержать вредоносных компонентов. 398 |
    • 399 |
    • Создание на языках программирования высокого уровня 400 | пользовательских локальных и веб интерфейсов для управления и удаленного мониторинга 401 | процессами работы нейросетевых алгоритмов на аппаратной части. 402 |
    • 403 |
    • Разработка API библиотеки.
    • 404 |
    • Тестирование разработанного программного кода.
    • 405 |
    • Финальное тестирование работы всей библиотеки.
    • 406 |
    407 |
    408 |
  6. 409 |
  7. 410 |
    411 |
    Рудешко Никита Андреевич
    412 |
      413 |
    • Разработка программных интерфейсов для обмена сообщениями между 414 | пользовательской и аппаратной частями. Тестирование разработанного программного кода. 415 |
    • 416 |
    • Разработка технической документации для функций библиотеки.
    • 417 |
    • Проверка, что использованные при разработке библиотеки с 418 | открытым кодом зарубежных разработчиков не должны содержать вредоносных компонентов. 419 |
    • 420 |
    • Создание на языках программирования высокого уровня 421 | пользовательских локальных и веб интерфейсов для управления и удаленного мониторинга 422 | процессами работы нейросетевых алгоритмов на аппаратной части. 423 |
    • 424 |
    425 |
    426 |
  8. 427 |
428 |
429 |
430 |
431 | {% endblock %} 432 | 433 | {% block scripts %} 434 | {% load static %} 435 | 436 | {% endblock %} 437 | 438 | -------------------------------------------------------------------------------- /interface/templates/interface/monitor.html: -------------------------------------------------------------------------------- 1 | {% extends 'interface/base.html' %} 2 | {% load static %} 3 | {% block content %} 4 | 5 | Мониторинг 6 |
7 |
8 |
9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | {% for a in agents %} 24 | 25 | 26 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | {% endfor %} 55 | 56 |
СтатусНазваниеГруппаТипMAC адресIP адрес и портДата изменения
{{ a.id }}{% if a.agent_status == "Активен" %} 27 | 28 | 30 | 31 | {% else %} 32 | 33 | 35 | 37 | 38 | {% endif %} 39 | {{ a.agent_name|default:"" }}{{ a.agent_group_name|default:"" }}{{ a.agent_type|default:"" }}{{ a.agent_mac_address|default:"" }}{{ a.agent_ip_address_port|default:"" }}{{ a.datetime_create|default:"" }}{{ a.datetime_change|default:"" }}{{ a.agent_description }}{{ a.agent_ip_address }}{{ a.agent_port }}{{ a.agent_group_id }}{{ a.agent_type_id }}{{ a.agent_status_id }}
57 |
58 |
59 |
60 |
61 |
62 |
64 |
65 |
66 | Прямое управление агентом 67 |
68 |
69 | 76 | 83 | 90 | 97 | 104 |
105 |
106 |
107 |
108 | Обучение агента 109 |
110 |
111 | 119 | 127 | 134 |
135 |
136 |
137 |
138 | Управление данными обучения агентов 139 |
140 |
141 | 151 | 161 | 168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 | {% endblock %} 181 | 182 | {% block scripts %} 183 | {% load static %} 184 | 185 | 186 | 187 | 188 | {% endblock %} -------------------------------------------------------------------------------- /interface/tests.py: -------------------------------------------------------------------------------- 1 | # Тесты 2 | from django.test import TestCase 3 | 4 | # Create your tests here. 5 | -------------------------------------------------------------------------------- /interface/views.py: -------------------------------------------------------------------------------- 1 | # Представления. Формирование шаблонов и данных для серверного рендеринга 2 | import requests 3 | import json 4 | from rest_framework import generics 5 | from rest_framework.decorators import api_view 6 | from rest_framework.response import Response 7 | from rest_framework import status 8 | from rest_framework.views import APIView 9 | from django.http import HttpResponse 10 | from django.template import loader 11 | from datetime import datetime 12 | # Представления из модели 13 | from .models import AgentsView, AgentGroupsView, AgentTypesView, AgentErrorsView, AgentFilesView, \ 14 | AgentNeuralNetworkStateView 15 | # Таблицы из модели 16 | from .models import Agents, AgentGroups, AgentTypes, AgentErrors, AgentFiles, AgentNeuralNetworkState, NeuralAlgorithms 17 | # Сериализаторы 18 | from .serializers import GraphSerializer, AgentAddSerializer, SyncAgentDataSerializer, AgentDeleteSerializer, \ 19 | AgentEditSerializer, GroupAddSerializer, GroupSerializer, NeuralAlgorithmsSerializer, AgentErrorsSerializer, \ 20 | AgentNeuralNetworkState, AgentNeuralNetworkStateSerializer 21 | 22 | 23 | # Формирование данных для веб-страниц и рендер шаблона 24 | # Формирование шаблона и данных для серверного рендеринга базовой страницы 25 | def index(request): 26 | template = loader.get_template('interface/index.html') 27 | agents = AgentsView.objects.all() 28 | agentGroups = AgentGroupsView.objects.all() 29 | agentTypes = AgentTypesView.objects.all() 30 | agentFiles = AgentFilesView.objects.all() 31 | agentNeuralNetworkState = AgentNeuralNetworkStateView.objects.all() 32 | neuralAlgorithms = NeuralAlgorithms.objects.all() 33 | array = {'agents': agents, 34 | 'agentGroups': agentGroups, 35 | 'agentTypes': agentTypes, 36 | 'agentFiles': agentFiles, 37 | 'agentNeuralNetworkState': agentNeuralNetworkState, 38 | 'neuralAlgorithms': neuralAlgorithms} 39 | return HttpResponse(template.render(array, request)) 40 | 41 | 42 | # Формирование шаблона и данных для серверного рендеринга страницы с графиком 43 | def monitor(request): 44 | template = loader.get_template('interface/monitor.html') 45 | agents = AgentsView.objects.all() 46 | agentErrors = AgentErrorsView.objects.all() 47 | array = {'agents': agents, 48 | 'agentErrors': agentErrors} 49 | return HttpResponse(template.render(array, request)) 50 | 51 | 52 | # Формирование шаблона и данных для серверного рендеринга страницы с информацией 53 | def info(request): 54 | template = loader.get_template('interface/info.html') 55 | agents = AgentsView.objects.all() 56 | array = {'agents': agents} 57 | return HttpResponse(template.render(array, request)) 58 | 59 | 60 | # Управление агентами 61 | # Добавление нового агента 62 | class AgentAddData(generics.ListAPIView): 63 | def post(self, request): 64 | # Создание экземпляра сериализатора с полученными данными запроса 65 | serializer = AgentAddSerializer(data=request.data) 66 | 67 | # Проверка валидности данных сериализатора 68 | if serializer.is_valid(): 69 | # Извлечение необходимых данных из запроса 70 | agent_group_id = request.data.get('agent_group_id') 71 | agent_type_id = request.data.get('agent_type_id') 72 | agent_mac_address = request.data.get('agent_mac_address') 73 | 74 | # Проверка наличия агента с указанным MAC-адресом в базе данных 75 | agent_mac_address_check = Agents.objects.filter(agent_mac_address=agent_mac_address).exists() 76 | 77 | if agent_mac_address_check: 78 | # Если агент с указанным MAC-адресом уже существует, возвращается сообщение об ошибке 79 | message = "Агент с таким MAC адрессм уже существует" 80 | return Response(message, status=status.HTTP_200_OK) 81 | 82 | try: 83 | # Получение группы агента по указанному agent_group_id 84 | agent_group = AgentGroups.objects.get(id=agent_group_id) 85 | except AgentGroups.DoesNotExist: 86 | # Если указанный agent_group_id не существует, возвращается сообщение об ошибке 87 | return Response({"agent_group_id": "Invalid agent group ID"}, status=400) 88 | 89 | try: 90 | # Получение типа агента по указанному agent_type_id 91 | agent_type = AgentTypes.objects.get(id=agent_type_id) 92 | except AgentTypes.DoesNotExist: 93 | # Если указанный agent_type_id не существует, возвращается сообщение об ошибке 94 | return Response({"agent_type_id": "Invalid agent type ID"}, status=400) 95 | 96 | try: 97 | # Проверка существования агента по указанному agent_type_id 98 | agent_mac_address_check = Agents.objects.get(id=agent_type_id) 99 | except AgentTypes.DoesNotExist: 100 | # Если указанный agent_type_id не существует, возвращается сообщение об ошибке 101 | return Response({"agent_type_id": "Invalid agent type ID"}, status=400) 102 | 103 | # Назначение связанных объектов в данных сериализатора 104 | serializer.validated_data['agent_group'] = agent_group 105 | serializer.validated_data['agent_type'] = agent_type 106 | 107 | # Сохранение сериализатора 108 | serializer.save() 109 | 110 | # Возвращение успешного ответа 111 | return Response("Агент успешно добавлен", status=status.HTTP_200_OK) 112 | 113 | # Если данные сериализатора невалидны, возвращается сообщение об ошибке 114 | return Response(serializer.errors, status=400) 115 | 116 | 117 | # Изменение данных агента 118 | class AgentEditData(generics.UpdateAPIView): 119 | queryset = Agents.objects.all() 120 | serializer_class = AgentEditSerializer 121 | 122 | def update(self, request, *args, **kwargs): 123 | global agent_another 124 | instance = self.get_object() 125 | serializer = self.get_serializer(instance, data=request.data, partial=True) 126 | 127 | if serializer.is_valid(): 128 | # Получение данных из запроса 129 | agent_group_id = request.data.get('agent_group_id') 130 | agent_type_id = request.data.get('agent_type_id') 131 | agent_mac_address_query = request.data.get('agent_mac_address') 132 | 133 | # Получение ID агента 134 | agent_id = instance.id 135 | 136 | # Получение данных из БД по ID агента 137 | agent_current = Agents.objects.get(id=agent_id) 138 | 139 | try: 140 | # Попытка получить данные из БД по MAC-адресу 141 | agent_another = Agents.objects.get(agent_mac_address=agent_mac_address_query) 142 | 143 | # Если ID агента, полученного из БД по ID агента (текущий агент), 144 | # не совпадает с ID агента, полученного из БД по MAC-адресу 145 | # (другой агент с таким же MAC-адресом), выводится соответствующее сообщение 146 | if agent_current.id != agent_another.id: 147 | message = "Агент с таким MAC адресом уже существует" 148 | return Response(message, status=status.HTTP_200_OK) 149 | 150 | except Agents.DoesNotExist: 151 | # Если данных нет, код продолжает выполняться 152 | pass 153 | 154 | try: 155 | agent_group = AgentGroups.objects.get(id=agent_group_id) 156 | except AgentGroups.DoesNotExist: 157 | return Response({"agent_group_id": "Invalid agent group ID"}, status=400) 158 | 159 | try: 160 | agent_type = AgentTypes.objects.get(id=agent_type_id) 161 | except AgentTypes.DoesNotExist: 162 | return Response({"agent_type_id": "Invalid agent type ID"}, status=400) 163 | 164 | # Присваивание связанных объектов данным сериализатора 165 | serializer.validated_data['agent_group'] = agent_group 166 | serializer.validated_data['agent_type'] = agent_type 167 | 168 | self.perform_update(serializer) 169 | return Response("Агент успешно изменен", status.HTTP_200_OK) 170 | 171 | return Response(serializer.errors, status=400) 172 | 173 | 174 | # Удаление агента 175 | class AgentDeleteData(generics.DestroyAPIView): 176 | queryset = Agents.objects.all() 177 | serializer_class = AgentDeleteSerializer 178 | 179 | def destroy(self, request, *args, **kwargs): 180 | instance = self.get_object() 181 | agent_id = instance.id 182 | 183 | # Проверка наличия связанных записей агента в различных таблицах 184 | errors_exist = AgentErrors.objects.filter(agent_id=agent_id).exists() 185 | neural_state_exist = AgentNeuralNetworkState.objects.filter(agent_id=agent_id).exists() 186 | errors_file_exist = AgentFiles.objects.filter(agent_id=agent_id).exists() 187 | 188 | if errors_file_exist: 189 | # Если связанные записи существуют в таблице файлов агентов, 190 | # возвращается сообщение об ошибке 191 | message = "Запись с привязкой данного агента существует в таблице файлов агентов" 192 | elif errors_exist: 193 | # Если связанные записи существуют в таблице обучения агентов, 194 | # возвращается сообщение об ошибке 195 | message = "Запись с привязкой данного агента существует в таблице обучения агентов" 196 | elif neural_state_exist: 197 | # Если связанные записи существуют в таблице состояний нейросети, 198 | # возвращается сообщение об ошибке 199 | message = "Запись с привязкой данного агента существует в таблице состояний нейросети" 200 | else: 201 | # Если связанные записи отсутствуют, производится удаление записи агента 202 | message = 'Агент успешно удален' 203 | instance.delete() 204 | return Response(message, status=status.HTTP_200_OK) 205 | 206 | return Response(message, status=status.HTTP_200_OK) 207 | 208 | 209 | # Классы для страницы index.js 210 | # Управление группами агентов 211 | # Добавление группы агентов 212 | class GroupAddData(generics.ListAPIView): 213 | def post(self, request): 214 | # Создание экземпляра сериализатора с полученными данными запроса 215 | serializer = GroupAddSerializer(data=request.data) 216 | 217 | # Проверка валидности данных сериализатора 218 | if serializer.is_valid(): 219 | # Сохранение сериализатора 220 | serializer.save() 221 | # Возвращение данных сериализатора вместе с успешным статусом 222 | return Response(serializer.data, status=201) 223 | 224 | # Если данные сериализатора невалидны, возвращается сообщение об ошибке 225 | return Response(serializer.errors, status=400) 226 | 227 | 228 | # Изменение группы агентов 229 | class GroupEditData(generics.UpdateAPIView): 230 | queryset = AgentGroups.objects.all() 231 | serializer_class = GroupSerializer 232 | 233 | def update(self, request, *args, **kwargs): 234 | instance = self.get_object() 235 | serializer = self.get_serializer(instance, data=request.data, partial=True) 236 | 237 | if serializer.is_valid(): 238 | # Обновление данных сериализатора 239 | self.perform_update(serializer) 240 | # Возвращение обновленных данных сериализатора 241 | return Response(serializer.data) 242 | 243 | # Если данные сериализатора невалидны, возвращается сообщение об ошибке 244 | return Response(serializer.errors, status=400) 245 | 246 | 247 | # Удаление группы агентов 248 | class GroupDeleteData(generics.DestroyAPIView): 249 | queryset = AgentGroups.objects.all() 250 | serializer_class = GroupSerializer 251 | 252 | def destroy(self, request, *args, **kwargs): 253 | instance = self.get_object() 254 | group_id = instance.id 255 | 256 | # Проверка наличия связанных записей группы в таблице агентов 257 | group_exist = Agents.objects.filter(agent_group_id=group_id).exists() 258 | 259 | if group_exist: 260 | # Если связанные записи существуют в таблице агентов, 261 | # возвращается сообщение об ошибке 262 | message = "Запись с привязкой данной группы существует в таблице агентов" 263 | else: 264 | # Если связанные записи отсутствуют, производится удаление записи группы агентов 265 | message = "Группа успешно удалена" 266 | instance.delete() 267 | return Response(message, status=status.HTTP_200_OK) 268 | 269 | return Response(message, status=status.HTTP_200_OK) 270 | 271 | 272 | # Классы для страницы index.js 273 | # Данные для получения данных графика для определенного агента 274 | class GraphApiData(generics.ListAPIView): 275 | serializer_class = GraphSerializer 276 | 277 | def get_queryset(self): 278 | agent_id = self.request.query_params.get('agent_id') 279 | 280 | if agent_id is None: 281 | # Если параметр agent_id отсутствует, возвращается сообщение об ошибке 282 | return Response("agent_id parameter is required.", status=400) 283 | 284 | # Фильтрация записей AgentErrorsView по agent_id 285 | return AgentErrorsView.objects.filter(agent_id=agent_id) 286 | 287 | 288 | # Удаление данных определенного агента из таблицы обучения агентов 289 | class AgentErrorsDeleteData(APIView): 290 | def delete(self, request, agent_id): 291 | try: 292 | # Удаление данных об ошибках агента с помощью фильтрации по agent_id 293 | deleted_data = AgentErrors.objects.filter(agent_id=agent_id).delete() 294 | 295 | # Создание сериализатора с удаленными данными 296 | serializer = AgentErrorsSerializer(deleted_data, many=True) 297 | 298 | # Возвращение сообщения об успешном удалении 299 | return Response("Данные успешно удалены", status=status.HTTP_200_OK) 300 | except Exception as e: 301 | # Возвращение сообщения об ошибке при возникновении исключения 302 | return Response("Error: " + str(e), status=200) 303 | 304 | 305 | # Синхронизация данных между агентом и базой данных сервера 306 | class SyncAgentData(generics.ListAPIView): 307 | def post(self, request): 308 | mes_data = request.data 309 | 310 | if mes_data['m'] == 'authorization': 311 | # Получение данных агента из запроса 312 | agent_data = mes_data['b'] 313 | agent_name = agent_data['name'] 314 | agent_ip_address = request.META.get('REMOTE_ADDR') 315 | agent_mac_address = agent_data['mac'] 316 | agent_port = agent_data['port'] 317 | 318 | # Подготовка данных для добавления или обновления записи агента 319 | agent_data_add = { 320 | 'agent_name': agent_name, 321 | 'agent_mac_address': agent_mac_address, 322 | 'agent_ip_address': agent_ip_address, 323 | 'agent_port': agent_port, 324 | 'agent_status': '1', 325 | 'datetime_change': datetime.now(), 326 | 'datetime_create': datetime.now() 327 | } 328 | 329 | # Создание сериализатора с подготовленными данными агента 330 | serializer = SyncAgentDataSerializer(data=agent_data_add) 331 | 332 | if serializer.is_valid(): 333 | try: 334 | # Проверка существования записи агента по MAC адресу 335 | agent = Agents.objects.get(agent_mac_address=agent_mac_address) 336 | agent.agent_name = agent_name 337 | agent.agent_ip_address = agent_ip_address 338 | agent.agent_port = agent_port 339 | agent.agent_status = 1 340 | agent.datetime_change = datetime.now() 341 | agent.save() 342 | except Agents.DoesNotExist: 343 | # Создание новой записи агента 344 | Agents.objects.create( 345 | agent_name=agent_name, 346 | agent_mac_address=agent_mac_address, 347 | agent_ip_address=agent_ip_address, 348 | agent_port=agent_port, 349 | agent_status=1, 350 | datetime_create=datetime.now() 351 | ) 352 | 353 | return Response({'message': 'Agent info saved/updated successfully.'}) 354 | else: 355 | return Response(serializer.errors, status=400) 356 | 357 | 358 | # Отправка запроса агенту 359 | class SendRequestToAgent(generics.ListAPIView): 360 | def post(self, request): 361 | csrf_token = request.META.get('CSRF_COOKIE', '') 362 | headers = { 363 | 'X-CSRFToken': csrf_token # Include the CSRF token in the headers 364 | } 365 | agent_id = request.data.get('agent_id') 366 | agent_command = request.data.get('agent_command') 367 | agent_data = Agents.objects.get(id=agent_id) 368 | agent_ip_address = agent_data.agent_ip_address 369 | agent_port = agent_data.agent_port 370 | print(agent_id) 371 | if agent_ip_address is None or agent_port is None or agent_ip_address == '' or agent_port == '': 372 | return Response("Проверьте данные IP адреса и порта агента", status=status.HTTP_200_OK) 373 | # Получить данные из таблицы и отправить на агента 374 | if agent_command == 'upload': 375 | try: 376 | neural_network_state = AgentNeuralNetworkState.objects.get(agent_id=agent_id) 377 | b_value = neural_network_state.neural_network_state 378 | print(b_value) 379 | except AgentNeuralNetworkState.DoesNotExist: 380 | return Response("Для текущего агента нет данных в таблице состояний нейросети", 381 | status=status.HTTP_200_OK) 382 | elif agent_command == 'download': 383 | b_value = '' 384 | pass 385 | 386 | # Обычный запрос на получения данных с агента и сохранение ответа в БД 387 | if agent_command != 'download' and agent_command != 'upload': 388 | data = { 389 | 'r': 'domain', 390 | 't': 'command', 391 | 'm': agent_command 392 | } 393 | else: 394 | data = { 395 | 'r': 'domain', 396 | 't': 'request', 397 | 'm': agent_command, 398 | 'b': b_value 399 | } 400 | print('JSON: ', data) 401 | url = 'http://' + agent_ip_address + ':' + agent_port 402 | print('URL: ', url) 403 | # Отправить HTTP запрос, используя полученные данные 404 | try: 405 | response = requests.post(url, headers=headers, json=data) 406 | response.raise_for_status() 407 | # Сохранить данные, полученные от запроса 408 | result = response.json() 409 | # Вернуть сообщение об успехе 410 | return Response(result, status=status.HTTP_200_OK) 411 | except ConnectionError as e: 412 | # Вернуть сообщение об ошибке при отсутствии соединения 413 | message = 'Ошибка: Ошибка соединения - ' + str(e) 414 | return Response(message, status=status.HTTP_200_OK) 415 | except requests.exceptions.RequestException as e: 416 | # Вернуть сообщение об ошибке при других исключениях 417 | message = 'Ошибка: ' + str(e) 418 | return Response(message, status=status.HTTP_200_OK) 419 | 420 | 421 | # Добавление данных в таблицу агента 422 | class GraphAgentDataAdd(generics.ListAPIView): 423 | def post(self, request): 424 | mes_data = request.data 425 | if mes_data['m'] == 'loss': 426 | agent_data = mes_data['b'] 427 | # Данные для тестирования 428 | # agent_data = '{"points":{"actor": [0,0.7345353,1,0.353553,2,0.12313123], "critik": [1,0.5345345345,2,0.446464645,3,0.1213123131], "acto": [0,0.8912,1,0.7689,2,0.56787578], "actor": [0,0.7345353,1,0.353553,2,0.12313123]}}' 429 | # data_conversion = json.loads(agent_data) 430 | # Получаем IP-адрес агента, откуда пришел запрос 431 | points = agent_data['points'] 432 | agent_ip_address = request.META.get('REMOTE_ADDR') 433 | agents = Agents.objects.filter(agent_ip_address=agent_ip_address) 434 | if len(agents) == 0: 435 | # Агенты не найдены 436 | return Response("Ошибка: IP-адрес не существует в базе данных", status=status.HTTP_200_OK) 437 | elif len(agents) > 1: 438 | # Найдено несколько агентов 439 | return Response("Ошибка: В базе данных существует более одного значения с таким IP-адресом", 440 | status=status.HTTP_200_OK) 441 | # Получаем идентификатор агента 442 | agent_id = agents[0].id 443 | print('ID агента: ', agent_id) 444 | for key, values in points.items(): 445 | # Запрос к таблице NeuralAlgorithms для каждого значения 446 | matching_records = NeuralAlgorithms.objects.filter(algorithm_code_name=key) 447 | print('Ключ: ', key, 'Значение: ', values) 448 | # Проверяем, найдены ли соответствующие записи 449 | algorithm_id = 0 450 | if matching_records: 451 | algorithm_id = matching_records[0].id 452 | else: 453 | # Создаем новую запись с извлеченным значением 454 | if key: 455 | data = { 456 | 'algorithm_code_name': key, 457 | 'datetime_create': datetime.now() 458 | } 459 | serializer = NeuralAlgorithmsSerializer(data=data) 460 | if serializer.is_valid(): 461 | instance = serializer.save() 462 | algorithm_id = instance.pk 463 | else: 464 | return Response("Ошибка: Ошибка записи нового алгоритма в базу данных", 465 | status=status.HTTP_200_OK) 466 | 467 | for i in range(0, len(values), 2): 468 | agent_step = values[i] if i < len(values) else None 469 | agent_error_value = values[i + 1] if i + 1 < len(values) else None 470 | 471 | if agent_step is not None and agent_error_value is not None: 472 | agent_error_data = { 473 | 'agent_step': agent_step, 474 | 'agent_error_value': agent_error_value, 475 | 'datetime_create': datetime.now(), 476 | 'agent_error_info': '', 477 | 'agent': agent_id, 478 | 'algorithm': algorithm_id 479 | } 480 | serializer = AgentErrorsSerializer(data=agent_error_data) 481 | if serializer.is_valid(): 482 | serializer.save() 483 | else: 484 | return Response({"Ошибка": "Ошибка записи ошибки агента в базу данных"}, 485 | status=status.HTTP_200_OK) 486 | 487 | return Response("Успех: Данные успешно занесены в базу данных") 488 | else: 489 | return Response("Ошибка: Тип запроса должен быть POST", status=status.HTTP_200_OK) 490 | 491 | 492 | class DownloadNeuralNetworkStateData(APIView): 493 | def post(self, request): 494 | request_data = request.data 495 | # Данные для тестирования 496 | # request_data = '{"r": "domain", "t": "request", "m": "download", "b": "Тут не лежат данные"}' 497 | # data_conversion = json.loads(request_data) 498 | if request_data['m'] == 'download': 499 | neural_network_state_data = request_data['b'] 500 | agent_ip_address = request.META.get('REMOTE_ADDR') 501 | print(agent_ip_address) 502 | agents = Agents.objects.filter(agent_ip_address=agent_ip_address) 503 | if len(agents) == 0: 504 | return Response({"Ошибка": "IP адреса не существует в базе данных"}, status=400) 505 | elif len(agents) > 1: 506 | return Response({"Ошибка": "В базе данных существует больше одного значения с таким IP адресом"}, 507 | status=400) 508 | agent_id = agents[0].id 509 | print('ID агента: ', agent_id) 510 | save_data = { 511 | 'agent_id': agent_id, 512 | 'neural_network_state': neural_network_state_data, 513 | 'datetime_create': datetime.now(), 514 | 'datetime_change': datetime.now() 515 | } 516 | print(save_data) 517 | serializer = AgentNeuralNetworkStateSerializer(data=save_data) 518 | if serializer.is_valid(): 519 | try: 520 | agent = AgentNeuralNetworkState.objects.get(agent_id=agent_id) 521 | agent.neural_network_state = neural_network_state_data 522 | agent.datetime_change = datetime.now() 523 | agent.save() 524 | except AgentNeuralNetworkState.DoesNotExist: 525 | AgentNeuralNetworkState.objects.create( 526 | agent_id=agent_id, 527 | neural_network_state=neural_network_state_data, 528 | datetime_create=datetime.now() 529 | ) 530 | 531 | return Response({'Успех': 'Данные успешно занесены в базу данных'}) 532 | else: 533 | return Response(status=400) 534 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NeuralInterface.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/requirements.txt -------------------------------------------------------------------------------- /testing/FastStart/run_server.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | cd C:\Projects\NeuralInterface 3 | call C:\Projects\NeuralInterface\venv\Scripts\activate 4 | 5 | cd C:\Projects\NeuralInterface\NeuralInterface 6 | start cmd /k "C:\Projects\NeuralInterface\venv\Scripts\python.exe manage.py runserver" 7 | 8 | timeout /t 5 9 | 10 | start "" "http://127.0.0.1:8000" -------------------------------------------------------------------------------- /testing/cpr.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/testing/cpr.dll -------------------------------------------------------------------------------- /testing/libcurl-d.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/testing/libcurl-d.dll -------------------------------------------------------------------------------- /testing/libcurl.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/testing/libcurl.dll -------------------------------------------------------------------------------- /testing/requests.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cognitive-systems-and-technologies/NeuralInterface/dc16453634c131c41261e6ba224107990d07f7f4/testing/requests.exe --------------------------------------------------------------------------------