RT-Thread 网络工具集 (NetUtils) 应用笔记

摘要

本应用笔记介绍 RT-Thread NetUtils 的使用方法,帮助开发者更好地使用 RT-Thread NetUtils 组件来解决网络开发过程中遇到的问题。

本文的目的和背景

在进行网络相关的产品开发和调试时,一些好用的小工具往往能取到事半功倍的效果。 RT-Thread NetUtils 组件基于此应用场景,开发和封装了一系列简洁好用的网络工具集合,为开发者提供便利。

为了方便用户开发网络应用,RT-Thread 将常用的网络工具制作 NetUtils 组件包,通过 env 动态配置,即开即用, 有效降低资源的占用。

本文的结构

  • NetUtils 组件介绍
  • Ping 工具的配置和使用
  • NTP 时间同步工具的配置和使用
  • TFTP 文件传输工具的使用
  • Iperf 网络带宽测试工具的配置和使用
  • 其他网络调试工具的配置和使用

    问题阐述

本应用笔记将围绕下面几个问题来介绍 RT-Thread NetUtils 组件。- RT-Thread NetUtils 主要包括哪些?分别有什么功能?- 如何使用 Ping 工具诊断网络稳定性?- 如何测试网络稳定性和带宽?- 如何通过网络传输文件?

问题的解决

NetUtils 组件介绍

RT-Thread NetUtils 作为网络工具合集,既有用于测试调试的 Ping 命令, 同步时间的 NTP 工具, 性能和带宽测试的 Iperf 、 NetIO,还有在嵌入式系统中广泛使用的轻量级文件传输工具 TFTP,方便地通过网络完成两个设备间的文件互传。另外, RT-Thread 还针对开发中的实际问题,提供了一些高级的辅助工具,如可以远程登录到 RT-Thread Finsh/MSH Shell 的 Telnet 工具,以及基于 lwIP 的网络抓包工具 tcpdump。

下面是 RT-Thread NetUtils的分类和简介:

名称 分类 功能简介
Ping 调试测试 利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障
NTP 时间同步 网络时间协议
TFTP 文件传输 TFTP是一个传输文件的简单协议,比 FTP 还要轻量级
Iperf 性能测试 测试最大 TCP 和 UDP 带宽性能,可以报告带宽、延迟抖动和数据包丢失
NetIO 性能测试 测试网络的吞吐量的工具
Telnet 远程访问 可以远程登录到 RT-Thread 的 Finsh/MSH Shell
tcpdump 网络调试 tcpdump 是 RT-Thread 基于 lwIP 的网络抓包工具

每个小工具可使用 menuconfig 独立控制启用/停用,并提供了 Finsh/MSH 的使用命令。首先打开 env 工具,进入 BSP 目录,在 env 命令行输入 menuconfig 进入配置界面配置工程,根据需求选择合适的 NetUtils 功能,如图所示(注意: Ping 和 TFTP 依赖于 lwIP,需要先开启 lwIP 的依赖后才能显示)

  1. RT-Thread online packages
  2. -> IoT - internet of things
  3. -> netutils: Networking utilities for RT-Thread

env 配置

Ping工具的配置与使用

介绍

Ping 是一种网络诊断工具,用来测试数据包能否通过 IP 协议到达特定主机。估算与主机间的丢失数据包率(丢包率)和数据包往返时间(网络时延,Round-trip delay time)

使用

Ping 工具依赖 lwIP,需要先在 env 工具 开启 lwIP 的依赖才可见,步骤如下:

  1. -> RT-Thread Components
  2. -> Network stack
  3. -> light weight TCP/IP stack
  4. -> Enable lwIP stack

在NetUtils菜单栏使能 Ping 选项:

  1. RT-Thread online packages
  2. -> IoT - internet of things
  3. -> netutils: Networking utilities for RT-Thread
  4. [*] Enable Ping utility

Ping 支持访问 IP 地址域名 ,使用 Finsh/MSH 命令进行测试,大致使用效果如下:

  • Ping 域名
  1. msh />ping rt-thread.org
  2. 60 bytes from 116.62.244.242 icmp_seq=0 ttl=49 time=11 ticks
  3. 60 bytes from 116.62.244.242 icmp_seq=1 ttl=49 time=10 ticks
  4. 60 bytes from 116.62.244.242 icmp_seq=2 ttl=49 time=12 ticks
  5. 60 bytes from 116.62.244.242 icmp_seq=3 ttl=49 time=10 ticks
  6. msh />
  • Ping IP
  1. msh />ping 192.168.10.12
  2. 60 bytes from 192.168.10.12 icmp_seq=0 ttl=64 time=5 ticks
  3. 60 bytes from 192.168.10.12 icmp_seq=1 ttl=64 time=1 ticks
  4. 60 bytes from 192.168.10.12 icmp_seq=2 ttl=64 time=2 ticks
  5. 60 bytes from 192.168.10.12 icmp_seq=3 ttl=64 time=3 ticks
  6. msh />

NTP工具的配置与使用

介绍

NTP 是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机时间的协议。在 RT-Thread 上实现了 NTP 客户端,连接上网络后,可以获取当前 UTC 时间,并更新至 RTC 中。

使用

在 NetUtils 菜单栏使能 NTP 选项:

  1. RT-Thread online packages
  2. -> IoT - internet of things
  3. -> netutils: Networking utilities for RT-Thread
  4. [*] Enable NTP(Network Time Protocol) client
  • 获取 UTC 时间UTC 时间 又称世界统一时间、世界标准时间、国际协调时间。北京时间为 UTC+8 时间,比 UTC 时间多 8 小时,或者理解为早 8 小时。
    API: time_t time_t ntp_get_time(void)
参数 描述
返回 描述
>0 当前 UTC 时间
=0 获取时间失败

示例代码:

  1. #include <ntp.h>
  2.  
  3. void main(void)
  4. {
  5. time_t cur_time;
  6.  
  7. cur_time = ntp_get_time();
  8.  
  9. if (cur_time)
  10. {
  11. rt_kprintf("NTP Server Time: %s", ctime((const time_t*) &cur_time));
  12. }
  13. }
  • 获取本地时间
    本地时间比 UTC 时间多了时区的概念,例如:北京时间为东八区,比 UTC 时间多 8 个小时。

menuconfig 中可以设置当前时区,默认为 8

API: time_t ntp_get_local_time(void)

参数 描述
返回 描述
>0 当前本地时间
=0 获取时间失败

该 API 使用方法与 ntp_get_time() 类似

  • 同步本地时间至 RTC
    如果开启 RTC 设备,还可以使用下面的命令及 API 同步 NTP 的本地时间至 RTC 设备。

Finsh/MSH 命令效果如下:

  1. msh />ntp_sync
  2. Get local time from NTP server: Sat Feb 10 15:22:33 2018
  3. The system time is updated. Timezone is 8.
  4. msh />

API: time_t ntp_sync_to_rtc(void)

参数 描述
返回 描述
>0 当前本地时间
=0 同步时间失败
  • 注意事项1、NTP API 方法执行时会占用较多的线程堆栈,使用时保证堆栈空间充足(≥1.5K);2、NTP API 方法 不支持可重入 ,并发使用时,请注意加锁。

    TFTP工具的配置与使用

介绍

TFTP (Trivial File Transfer Protocol, 简单文件传输协议)是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,端口号为 69 ,比传统的 FTP 协议要轻量级很多,适用于小型的嵌入式产品上。

RT-Thread 目前支持的是 TFTP 服务器。

使用

TFTP 工具依赖 lwIP,需要先在 env 工具 开启 lwIP 的依赖才可见,步骤如下:

  1. -> RT-Thread Components
  2. -> Network stack
  3. -> light weight TCP/IP stack
  4. -> Enable lwIP stack

在NetUtils菜单栏使能 TFTP 选项:

  1. RT-Thread online packages
  2. -> IoT - internet of things
  3. -> netutils: Networking utilities for RT-Thread
  4. [*] Enable TFTP(Trivial File Transfer Protocol) server
  • 安装 TFTP 客户端
    安装文件位于 netutils/tools/Tftpd64-4.60-setup.exe ,使用 TFTP 前,请先安装该软件。

  • 启动 TFTP 服务器
    在传输文件前,需要在 RT-Thread 上使用 Finsh/MSH 命令来启动 TFTP 服务器,大致效果如下:

  1. msh />tftp_server
  2. TFTP server start successfully.
  3. msh />
  • 传输文件
    打开刚安装的 Tftpd64 软件,按如下操作进行配置:

1、选择 Tftp Client ;2、在 Server interfaces 下拉框中,务必选择好与 RT-Thread 处于同一网段的网卡;3、填写 TFTP 服务器的 IP 地址。可以在 RT-Thread 的 MSH 下使用 ifconfig 命令查看;4、填写 TFTP 服务器端口号,默认: 69

tftpd config

  • 发送文件到 RT-Thread
    1、在 Tftpd64 软件中,选择好要发送文件;2、Remote File 是服务器端保存文件的路径(包括文件名),选项支持相对路径和绝对路径。由于 RT-Thread 默认开启 DFS_USING_WORKDIR 选项,此时相对路径是基于 Finsh/MSH 当前进入的目录。所以,使用相对路径时,务必提前切换好目录;3、点击 Put 按钮即可。

如下图所示,将文件发送至 Finsh/MSH 当前进入的目录下,这里使用的是 相对路径

tftpd get

注意:如果 DFS_USING_WORKDIR 未开启,同时 Remote File 为空,文件会将保存至根路径下。
  • 从 RT-Thread 接收文件
    1、在 Tftpd64 软件中,填写好要接收保存的文件路径(包含文件名);2、Remote File 是服务器端待接收回来的文件路径(包括文件名),选项支持相对路径和绝对路径。由于 RT-Thread 默认开启 DFS_USING_WORKDIR 选项,此时相对路径是基于 Finsh/MSH 当前进入的目录。所以,使用相对路径时,务必提前切换好目录;3、点击 Get 按钮即可。

如下所示,将 /web_root/image.jpg 保存到本地,这里使用的是 绝对路径

  1. msh /web_root>ls ##查看文件是否存在
  2. Directory /web_root:
  3. image.jpg 10559
  4. msh /web_root>

tftpd put

Iperf工具的配置与使用

介绍

Iperf 是一个网络性能测试工具。Iperf 可以测试最大 TCP 和 UDP 带宽性能,具有多种参数和 UDP 特性,可以根据需要调整,可以报告带宽、延迟抖动和数据包丢失。

使用

在NetUtils菜单栏使能 Iperf 选项:

  1. RT-Thread online packages
  2. -> IoT - internet of things
  3. -> netutils: Networking utilities for RT-Thread
  4. [*] Enable iperf-liked network performance tool

Iperf 使用的是主从式架构,即一端是服务器,另一端是客户端,我们提供的 Iperf 软件包实现了 TCP 服务器模式和客户端模式,暂不支持 UDP 测试。下面将具体讲解 2 种模式的使用方法。

Iperf 服务器模式

  • 获取 IP 地址
    需要在 RT-Thread 上使用 Finsh/MSH 命令来获取 IP 地址,大致效果如下:
  1. msh />ifconfig
  2. network interface: e0 (Default)
  3. MTU: 1500
  4. MAC: 00 04 9f 05 44 e5
  5. FLAGS: UP LINK_UP ETHARP
  6. ip address: 192.168.12.71
  7. gw address: 192.168.10.1
  8. net mask : 255.255.0.0
  9. dns server #0: 192.168.10.1
  10. dns server #1: 223.5.5.5

记下获得的 IP 地址 192.168.12.71(按实际情况记录)

  • 启动 Iperf 服务器
    需要在 RT-Thread 上使用 Finsh/MSH 命令来启动 Iperf 服务器,大致效果如下:
  1. msh />iperf -s -p 5001

-s 表示作为服务器启动-p 表示监听 5001 端口

  • 安装 JPerf 测试软件
    安装文件位于 netutils/tools/jperf.rar ,这个是绿色软件,安装实际上是解压的过程,解压到新文件夹即可。

  • 进行 jperf 测试
    打开 jperf.bat软件,按如下操作进行配置:

1、 选择 Client 模式;2、 输入刚刚获得的 IP 地址 192.168.12.71(按实际地址填写);3、 修改端口号为 5001;4、 点击 run Lperf! 开始测试;5、 等待测试结束。测试时,测试数据会在 shell 界面和 JPerf 软件上显示。

iperf server

Iperf 客户端模式

  • 获取 PC 的 IP 地址
    在 PC 的命令提示符窗口上使用 ipconfig 命令获取 PC 的 IP 地址,记下获得的 PC IP 地址为 192.168.12.45(按实际情况记录)。

  • 安装 JPerf 测试软件
    安装文件位于 netutils/tools/jperf.rar ,这个是绿色软件,安装实际上是解压的过程,解压到新文件夹即可。

  • 开启 jperf 服务器
    打开 jperf.bat软件,按如下操作进行配置:

1、 选择 Server 模式2、 修改端口号为 50013、 点击 run Lperf! 开启服务器

  • 2.2.4 启动 Iperf 客户端
    需要在 RT-Thread 上使用 Finsh/MSH 命令来启动 Iperf 客户端,大致效果如下:
  1. msh />iperf -c 192.168.12.45 -p 5001

-c 表示作为客户端启动,后面需要加运行服务器端的pc的 IP 地址-p 表示连接 5001 端口等待测试结束。测试时,测试数据会在 shell 界面和 JPerf 软件上显示。

iperf client

其他网络调试工具的介绍和使用

除了上述常用的网络工具,RT-Thread 也提供一些开发调试中比较实用的网络工具,如 NetIO 工具、 Telnet 工具和 tcpdump 工具。

NetIO 工具

NetIO 用于在 OS/2 2.x 、 Windows 、 Linux 和 Unix 上进行网络性能测试的工具。它会通过 TCP/UDP 方式,使用不同大小的数据包进行网络净吞吐量测试。

RT-Thread 目前支持的是 NetIO TCP 服务器。

NetIO 的使用请参考组件目录下的 README ,此处不再赘述。

Telnet 工具

Telnet 协议是一种应用层协议,使用于互联网及局域网中,使用虚拟终端机的形式,提供双向、以文字字符串为主的交互功能。属于 TCP/IP 协议族的其中之一,是 Internet 远程登录服务的标准协议和主要方式,常用于网页服务器的远程控制,可供用户在本地主机运行远程主机上的工作。

RT-Thread 目前支持的是 Telnet 服务器, Telnet 客户端连接成功后,将会远程连接到设备的 Finsh/MSH ,实现设备的远程控制。

Telnet 的使用请参考组件目录下的 README ,此处不再赘述。

tcpdump 工具

tcpdump 是一款基于 RT-Thread 的捕获IP报文的小工具, 抓包的数据可以通过文件系统保存,或者通过 rdb 工具导入PC,利用 wireshark 软件解析。

tcpdump 的使用请参考组件目录下的 README ,此处不再赘述。

原文: https://www.rt-thread.org/document/site/rtthread-application-note/packages/netutils/an0018-rtthread-system-netutils/