恩吉。集成和套接字
这个例子着重于使用SOCKET的可能性,这是一个在Engee和你的电脑之间进行数据交换的接口。 在Engee中,它通过一个子系统在客户端程序端起作用 Engee.Интеграции,允许浏览器中的模型或脚本与外部程序和硬件交换数据。 我们将使用为RHYTHM SDR USRP请求固件版本的示例演示此工具的操作。
组件的安装和初始化执行如下:
这是本段的更正版本:
-
engee.package.install("Engee-Device-Manager")-安装用于连接到硬件的基本支持包,并且还提供到PC程序的链接。
-
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交互的简单示例—我们将获得固件版本。 让我们从创建一个socket对象开始:
SDR_IP-设置本地网络中KPM RHYTHM设备的IP地址RHYTHM SDR USRP服务器的地址。SDR_PORT-定义控制端口。 12345是RHYTHM 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} 并通过创建的socket对象传输到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)
交互的完整日志,包括发送的所有命令和接收的响应,可在Engee日志中进行分析。整合。 你可以通过运行看到它们 ./engee-device-manager.exe -d 例如,通过Git Bash。
在下面的日志片段中,当请求版本时,我们看到:
- 套接字的初始化-创建用于网络交互的对象。
- 连接建立-成功连接到
192.168.2.70:12345. - 发送命令-发送对应于字符串的30个字节
"COMMAND:GET_SDR_SERVER_VERSION"(日志表示为ASCII码数组)。 - 接收响应正在从服务器接收100字节的数据。
- 关闭连接-通信会话结束。
调试级别的日志记录允许您详细监控数据交换的每个阶段,这是调试和验证系统正确性的宝贵工具。
下面的代码部分从响应中提取服务器版本。 她找到了标记 "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
结论
所考虑的示例演示了如何在Engee中使用SOCKET组织与RHYTHM SDR USRP的客户端-服务器交互。 该过程包括创建套接字,连接到给定的IP和端口,发送命令,接收响应,稍后处理,以及关闭连接。
日志记录在调试级别通过 engee-device-manager.exe -d 它允许您详细跟踪数据交换的所有阶段,这简化了调试和硬件集成到您的项目中。
基于所考虑的基本操作(Socket, connect, send, receive, close)和数据后处理的原则整个库构建 ritm_sdr_core.jl. 每个RHYTHM SDR USRP控制命令根据单个模式实现:
- 以协议格式组建团队(
"COMMAND:..."). - 通过可靠的运输
SOCKET.send(). - 通过以下方式接收响应
SOCKET.receive(). - 解析和验证响应。
- 以键入的形式返回结果。