AnyMath 文档
Notebook

恩吉。集成和套接字

这个例子着重于使用SOCKET的可能性,这是一个在Engee和你的电脑之间进行数据交换的接口。 在Engee中,它通过一个子系统在客户端程序端起作用 Engee.Интеграции,允许浏览器中的模型或脚本与外部程序和硬件交换数据。 我们将使用为RHYTHM SDR USRP请求固件版本的示例演示此工具的操作。

组件的安装和初始化执行如下:

这是本段的更正版本:

  • engee.package.install("Engee-Device-Manager")-安装用于连接到硬件的基本支持包,并且还提供到PC程序的链接。

    ![图像。png](附件:图片。png)

  • engee.package.start("Engee-Device-Manager")-运行此包以将Engee链接到计算机上的客户端程序。

    ![未命名。png](附件:没有名字。png)

  • using .EngeeDeviceManager.Devices.SOCKET-连接模块 SOCKET 在Julia的代码中,提供对用于创建套接字和交换数据的函数的访问。

In [ ]:
engee.package.install("Engee-Device-Manager")
engee.package.start("Engee-Device-Manager")
using .EngeeDeviceManager.Devices.SOCKET

接下来,让我们来看一个与节奏SDR USRP交互的简单示例—我们将获得固件版本。 让我们从创建一个socket对象开始:

  • SDR_IP-设置本地网络中KPM RHYTHM设备的IP地址RHYTHM SDR USRP服务器的地址。
  • SDR_PORT-定义控制端口。 12345是RHYTHM SDR USRP命令接口的标准端口。
In [ ]:
SDR_IP = "192.168.2.70"
SDR_PORT = 12345
socket = SOCKET.Socket("AF_INET", "SOCK_STREAM")

创建套接字后的下一步是使用该方法建立与服务器的连接 SOCKET.connect(). 它激活创建的网络对象并启动双向数据交换。

In [ ]:
SOCKET.connect(socket, SDR_IP, SDR_PORT)
Out[0]:
1828

下面的命令发送获取SDR版本的请求。 方法 SOCKET.send() 将命令字符串转换为类型的字节数组 Vector{UInt8} 并通过创建的socket对象传输到SDR USRP服务器。 旗帜 true 指定所有数据必须完整发送,这可确保命令的可靠传输。

In [ ]:
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),其中填充缓冲区的其余部分。

In [ ]:
response = SOCKET.receive(socket, 35)
answer = response === nothing ? "" : String(response.data)
Out[0]:
"COMMAND:SDR_SERVER_VERSION=v5.1.5\r\n"

下面的命令终止网络连接。 方法 SOCKET.close(socket) 释放与套接字对象关联的所有系统资源,并使对象 socket 不适合进一步使用。

执行此命令后,您需要为后续连接创建一个新的套接字。

In [ ]:
SOCKET.close(socket)
image.png

交互的完整日志,包括发送的所有命令和接收的响应,可在Engee日志中进行分析。整合。 你可以通过运行看到它们 ./engee-device-manager.exe -d 例如,通过Git Bash。

image.png

在下面的日志片段中,当请求版本时,我们看到:

  1. 套接字的初始化-创建用于网络交互的对象。
  2. 连接建立-成功连接到 192.168.2.70:12345.
  3. 发送命令-发送对应于字符串的30个字节 "COMMAND:GET_SDR_SERVER_VERSION" (日志表示为ASCII码数组)。
  4. 接收响应正在从服务器接收100字节的数据。
  5. 关闭连接-通信会话结束。
image.png

调试级别的日志记录允许您详细监控数据交换的每个阶段,这是调试和验证系统正确性的宝贵工具。

下面的代码部分从响应中提取服务器版本。 她找到了标记 "COMMAND:SDR_SERVER_VERSION=",取其后的文本并切断服务字符(\r, \n, \0)到第一个不可打印字符,返回一个空白版本字符串。

In [ ]:
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
Out[0]:
"v5.1.5"

结论

所考虑的示例演示了如何在Engee中使用SOCKET组织与RHYTHM SDR USRP的客户端-服务器交互。 该过程包括创建套接字,连接到给定的IP和端口,发送命令,接收响应,稍后处理,以及关闭连接。

日志记录在调试级别通过 engee-device-manager.exe -d 它允许您详细跟踪数据交换的所有阶段,这简化了调试和硬件集成到您的项目中。

基于所考虑的基本操作(Socket, connect, send, receive, close)和数据后处理的原则整个库构建 ritm_sdr_core.jl. 每个RHYTHM SDR USRP控制命令根据单个模式实现:

  1. 以协议格式组建团队("COMMAND:...").
  2. 通过可靠的运输 SOCKET.send().
  3. 通过以下方式接收响应 SOCKET.receive().
  4. 解析和验证响应。
  5. 以键入的形式返回结果。