1. 源由
最近更新代码发现wfb_tx
的代码已经有所调整,与之前《wfb-ng 开源代码之wfb_tx&wfb_rx》的时候做了调整。
主要还是整理了关于tx端的工作模式例程的问题。
2. 模式例程
前面初始化以及参数初始化部分不做重复赘述。这里直接从工作模式分类开始:
try
├──> auto radiotap_header = init_radiotap_header(stbc, ldpc, short_gi, bandwidth, mcs_index, vht_mode, vht_nss);
├──> uint32_t channel_id = (link_id << 8) + radio_port;
├──>
├──>
│ └──> injector_loop(argc, argv, optind, srv_port, rcv_buf, use_qdisc, log_interval);
├──>
│ └──> local_loop(argc, argv, optind, srv_port, rcv_buf, log_interval,
│ udp_port, debug_port, k, n, keypair, fec_timeout,
│ epoch, channel_id, fec_delay, use_qdisc, fwmark,
│ radiotap_header, frame_type, control_port, mirror);
└──>
└──> distributor_loop(argc, argv, optind, srv_port, rcv_buf, log_interval,
udp_port, k, n, keypair, fec_timeout,
epoch, channel_id, fec_delay, use_qdisc, fwmark,
radiotap_header, frame_type, control_port, mirror);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
2.1 injector_loop
【无加密】将本地的udp数据通过WiFi发送出去。
injector_loop
├──> 初始化
│ ├──> [V] 创建UDP套接字
│ │ ├──> open_udp_socket_for_rx() 创建UDP套接字
│ │ └──> getsockname() 获取绑定端口信息(如果 srv_port == 0)
│ └──> [V] 记录日志
│ ├──> 打印监听端口
│ └──> 输出时间戳及监听信息
├──> 套接字管理
│ ├──> [V] rx_fd 文件描述符管理
│ │ └──> 将UDP套接字文件描述符加入 rx_fd 向量
│ └──> [V] wlans 无线接口管理
│ └──> 将无线接口名称加入 wlans 向量
└──> 驱动程序
├──> [V] RawSocketInjector 实例化
│ └──> 初始化并传递 wlans 和 use_qdisc 参数
└──> [V] packet_injector()
└──> 通过 packet_injector() 处理接收到的数据包并注入
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
2.2 local_loop
【加密】将本地的udp数据通过WiFi发送出去。
local_loop
├──> 初始化
│ ├──> [V] 创建UDP套接字
│ │ ├──> open_udp_socket_for_rx() 创建UDP套接字
│ │ ├──> getsockname() 获取绑定端口信息(如果 udp_port == 0)
│ │ └──> 打印监听端口信息
│ └──> [V] 记录日志
│ ├──> 输出时间戳及监听信息
│ └──> 记录WLAN仿真端口使用情况(如果 debug_port 存在)
├──> 套接字管理
│ ├──> [V] rx_fd 文件描述符管理
│ │ └──> 将UDP套接字文件描述符加入 rx_fd 向量
│ └──> [V] wlans 无线接口管理
│ └──> 将无线接口名称加入 wlans 向量
├──> Transmitter 创建
│ ├──> [V] UdpTransmitter(如果 debug_port 非0)
│ │ ├──> 传递参数 k, n, keypair, epoch, channel_id, 等
│ │ └──> 用于 UDP 数据传输
│ └──> [V] RawSocketTransmitter(如果 debug_port 为0)
│ ├──> 传递参数 k, n, wlans, radiotap_header 等
│ └──> 用于 Raw Socket 数据传输
├──> 控制通道
│ ├──> [V] control_fd 控制文件描述符
│ │ └──> open_control_fd() 打开控制端口的套接字
│ └──> [V] 通过 control_fd 进行控制操作
└──> 数据处理
└──> data_source() 处理数据源
├──> 使用 t(Transmitter 对象)
├──> 监听 rx_fd 套接字
└──> 处理 fec_timeout、mirror、log_interval 等逻辑
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
2.3 distributor_loop
【加密】将远端的udp数据通过WiFi转发出去。
distributor_loop
├──> 初始化
│ ├──> [V] 解析远程主机及端口
│ │ ├──> 通过 `strsep()` 分割主机和端口字符串
│ │ ├──> 检查是否有重复主机
│ │ └──> 将远程主机和端口添加到 `remote_hosts` 和 `hosts` 集合中
│ ├──> [V] 创建UDP套接字
│ │ ├──> open_udp_socket_for_rx() 为每个端口创建UDP套接字
│ │ └──> getsockname() 获取绑定端口信息(如果 udp_port == 0)
│ └──> [V] 记录日志
│ ├──> 打印监听的主机及端口
│ ├──> 输出时间戳及监听信息
│ └──> 打印 WLAN ID(远程主机地址和端口索引)
├──> 套接字管理
│ ├──> [V] rx_fd 文件描述符管理
│ │ └──> 将UDP套接字文件描述符加入 rx_fd 向量
│ └──> [V] remote_hosts 远程主机和端口管理
│ └──> 记录远程主机地址及其对应的端口列表
├──> Transmitter 创建
│ ├──> [V] RemoteTransmitter 实例化
│ │ └──> 传递 k, n, keypair, epoch, channel_id, 等参数,以及 `remote_hosts` 用于远程传输
├──> 控制通道
│ ├──> [V] control_fd 控制文件描述符
│ │ └──> open_control_fd() 打开控制端口的套接字
│ └──> [V] 通过 control_fd 进行控制操作
└──> 数据处理
└──> data_source() 处理数据源
├──> 使用 t(RemoteTransmitter 对象)
├──> 监听 rx_fd 套接字
└──> 处理 fec_timeout、mirror、log_interval 等逻辑
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
3. 重要类
- class RawSocketInjector
- class Transmitter
- class RawSocketTransmitter : public Transmitter
- class RemoteTransmitter : public Transmitter
- class UdpTransmitter : public Transmitter
后面有空,再整理相关类实现细节。不过可以通过这个学习下“望文生义”的感觉。
4. 参考资料
【1】Ardupilot & OpenIPC & 基于WFB-NG构架分析和数据链路思考
【2】wfb-ng 开源工程结构&代码框架简明介绍
【3】wfb-ng 开源代码之wfb_tx&wfb_rx
评论记录:
回复评论: