Latmon 网络服务
概述
提供基于网络的时延监测所需的功能,包括 socket 管理、客户端-服务器通信,以及与运行在被测系统(System Under Test,SUT)上的 Latmus 服务进行数据交换。
Latmon 网络服务负责在 Latmon 应用(运行于基于 Zephyr 的开发板)与 Latmus 服务(运行于被测系统)之间建立并管理网络通信。
它使用 TCP socket 进行可靠通信,并使用 UDP socket 广播 Latmon 设备的 IP 地址。
API 参考
功能
Socket 管理:创建并管理用于通信的 TCP 和 UDP socket。
客户端-服务器通信:处理来自 Latmus 服务的传入连接。
数据交换:向 Latmus 服务发送时延指标和直方图数据。
IP 地址广播:广播 Latmon 设备的 IP 地址,以便 Latmus 服务发现该设备。
线程安全设计:使用 Zephyr 内核原语(例如消息队列和信号量)进行同步。
工作流
Socket 创建
调用 net_latmon_get_socket() 函数创建并配置用于与 Latmus 服务通信的 TCP socket。可以将连接地址作为参数传入,以便将 socket 绑定到特定接口和端口。
连接处理
net_latmon_connect() 函数等待来自 Latmus 服务的连接。如果在超时时间内未收到连接,该服务将使用 UDP 广播其 IP 地址并返回 -EAGAIN。如果无法发送广播请求,该函数将返回 -1,此时客户端应退出。
启动监测
建立连接后,调用 net_latmon_start() 函数以启动监测过程。该函数使用回调计算时延差值,并将数据发送到 Latmus 服务。
监测状态
可以使用 net_latmon_running() 函数检查监测过程是否处于活动状态。
线程管理
该服务使用 Zephyr 线程处理传入连接并管理监测过程。
启用 Latmon 服务
必须在 prj.conf 文件中启用以下配置选项。
可以配置以下选项来自定义 Latmon 服务:
示例用法
#include <zephyr/net/latmon.h>
#include <zephyr/net/socket.h>
void main(void)
{
struct in_addr ip;
int server_socket, client_socket;
/* Create and configure the server socket */
server_socket = net_latmon_get_socket(NULL);
while (1) {
/* Wait for a connection from the Latmus service */
client_socket = net_latmon_connect(server_socket, &ip);
if (client_socket < 0) {
if (client_socket == -EAGAIN) {
continue;
}
goto out;
}
/* Start the latency monitoring process */
net_latmon_start(client_socket, measure_latency_cycles);
}
out:
close(server_socket);
}