Engee.Интеграции и SOCKET
Engee.Интеграции и SOCKET
Этот пример посвящён возможностям работы с SOCKET — интерфейс для обмена данными между процессами в Engee и вашим ПК. В Engee он функционирует на стороне клиентской программы через подсистему Engee.Интеграции, позволяя модели или скрипту в браузере обмениваться данными с внешними программами и оборудованием. Работу этого инструмента продемонстрируем на примере запроса версии прошивки для РИТМ SDR USRP.
Установка и инициализация компонентов выполняется следующим образом:
Вот исправленный вариант этого пункта:
-
engee.package.install("Engee-Device-Manager")— устанавливает основной пакет поддержки для подключения к оборудованию, а также даёт ссылку на программу для ПК.
-
engee.package.start("Engee-Device-Manager")— запускает этот пакет, чтобы связать Engee с клиентской программой на вашем компьютере.
-
using .EngeeDeviceManager.Devices.SOCKET— подключает модульSOCKETв коде Julia, предоставляя доступ к функциям для создания сокетов и обмена данными.
engee.package.install("Engee-Device-Manager")
engee.package.start("Engee-Device-Manager")
using .EngeeDeviceManager.Devices.SOCKET
Далее рассмотрим простой пример взаимодействия с РИТМ SDR USRP — получим версию прошивки. Начнём с создания сокетного объекта:
SDR_IP— задаёт IP-адрес устройства КПМ РИТМ в локальной сети (адрес сервера РИТМ SDR USRP).SDR_PORT— определяет порт для управления. 12345 — стандартный порт для командного интерфейса РИТМ SDR USRP.
SDR_IP = "192.168.2.70"
SDR_PORT = 12345
socket = SOCKET.Socket("AF_INET", "SOCK_STREAM")
Следующий шаг после создания сокета — установление соединения с сервером с помощью метода SOCKET.connect(). Он активирует созданный сетевой объект и запускает двусторонний обмен данными.
SOCKET.connect(socket, SDR_IP, SDR_PORT)
Команда ниже отправляет запрос на получение версии SDR. Метод SOCKET.send() преобразует строку команды в байтовый массив типа Vector{UInt8} и передаёт его через созданный сокет‑объект на РИТМ SDR USRP. Флаг true указывает, что все данные должны быть отправлены полностью, что обеспечивает надёжную передачу команды.
SOCKET.send(socket, Vector{UInt8}("COMMAND:GET_SDR_SERVER_VERSION"), true)
Этот код получает ответ от SDR. Метод SOCKET.receive(socket, 35) пытается прочитать до 35 байт из сокета. Если данные получены (response !== nothing), они преобразуются из байтового массива в строку. Полученный ответ содержит полезную информацию (например, SDR_SERVER_VERSION=v5.1.5), но также включает служебные символы (\r\n) и нулевые байты (\0), которые заполняют оставшуюся часть буфера.
response = SOCKET.receive(socket, 35)
answer = response === nothing ? "" : String(response.data)
Команда ниже завершает сетевое соединение. Метод SOCKET.close(socket) освобождает все системные ресурсы, связанные с сокет-объектом, и делает объект socket непригодным для дальнейшего использования.
После выполнения этой команды необходимо создать новый сокет для последующих подключений.
SOCKET.close(socket)
.png)
Полный журнал взаимодействия, включая все отправленные команды и полученные ответы, доступен для анализа в логах Engee.Интеграции. Их можно увидеть, запустив ./engee-device-manager.exe -d, например через Git Bash.
В представленном ниже фрагменте лога при запросе версии мы видим:
- Инициализацию сокета — создание объекта для сетевого взаимодействия.
- Установку соединения — успешное подключение к
192.168.2.70:12345. - Отправку команды — передачу 30 байт, соответствующих строке
"COMMAND:GET_SDR_SERVER_VERSION"(в логе представлена в виде массива ASCII-кодов). - Получение ответа — приём 100 байт данных от сервера.
- Закрытие соединения — завершение сеанса связи.
Логирование на уровне DEBUG позволяет детально отслеживать каждый этап обмена данными, что является ценным инструментом для отладки и проверки корректности работы ваших систем.
Часть кода, представленная ниже, извлекает версию сервера из ответа. Она находит маркер "COMMAND:SDR_SERVER_VERSION=", берёт текст после него и обрезает служебные символы (\r, \n, \0) до первого непечатаемого символа, возвращая чистую строку версии.
if occursin("COMMAND:SDR_SERVER_VERSION=", answer)
start_idx = findfirst("COMMAND:SDR_SERVER_VERSION=", answer).stop + 1
version = ""
for char in answer[start_idx:end]
(char == '\r' || char == '\n' || char == '\0') && break
isprint(char) && (version *= char)
end
return strip(version)
end
Вывод
Рассмотренный пример демонстрирует, как с помощью SOCKET в Engee организовать клиент-серверное взаимодействие с РИТМ SDR USRP. Процесс включает создание сокета, подключение к заданному IP и порту, отправку команды, приём ответа, его последующую обработку и закрытие соединения.
Логирование на уровне DEBUG через engee-device-manager.exe -d позволяет детально отслеживать все этапы обмена данными, что упрощает отладку и интеграцию оборудования в ваши проекты.
На основе рассмотренных базовых операций (Socket, connect, send, receive, close) и принципов постобработки данных построена вся библиотека ritm_sdr_core.jl. Каждая команда управления РИТМ SDR USRP реализована по единому паттерну:
- Формирование команды в формате протокола (
"COMMAND:..."). - Надёжная отправка через
SOCKET.send(). - Приём ответа через
SOCKET.receive(). - Парсинг и валидация ответа.
- Возврат результата в типизированном виде.