Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DIY综合交流区
[RealTouch例程]TCP/IP网络组件Lwip之telnet远程命令行交互
发布于 2012-08-30 08:55:59 浏览:26139
订阅该版
实验目的 ? 快速了解Lwip组件,熟悉使用网络telnet的方式使用finsh,进行内核信息查看等远程命令行交互。 ? 帮助读者了解telnet 服务器端的实现过程以及telnet客户端配置和连接方法。 硬件说明 本实验使用RT-Thread官方的Realtouch开发板作为实验平台。涉及到的硬件主要为 ? RJ45接口,作为网络连接的需要,我们需要用网线将Realtouch和目标机连接起来,具体请参见《Realtouch开发板使用手册》 ? 串口3,作为rt_kprintf输出,需要连接JTAG扩展板 实验原理及程序结构 telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在这里,我们利用telnet的方式访问finsh,使得finsh操作可通过网络方式进行,这是 RT-Thread 又一个强大而实用的功能。 实验设计 本实验在 RealTouch 端实现并运行了 telnet 服务器端程序,在 PC 上使用 telnet 客户机端程序来访问 telnet 服务器,从而进行 telnet 通信。 源程序说明 系统依赖 在rtconfig.h中需要开启 ``` #define RT_USING_HEAP``` 此项可选,开启此项可以创建动态线程和动态信号量,如果使用静态线程和静态信号量,则此项不是必要的 ``` #define RT_USING_LWIP``` 此项必须,本实验使用LWIP组件,因此需要开启此项 ``` #define RT_USING_CONSOLE``` 此项必须,在系统初始化过程中仍需通过串口进行显示相关的工作 主程序说明 关于LwIP在rtconfig.h中相关宏的开启、IP相关设置可参见上一节。在application.c中, 建立了一个初始化线程,在其中初始化了lwip 线程栈,注册以太网设备,并初始化lwip系统,这些都包含在了rt_component_init()中。接着启动telnet server,具体的实现在在telnet.c 文件中。 ```void rt_init_thread_entry(void* parameter) { #ifdef RT_USING_LWIP /* initialize eth interface */ rt_hw_stm32_eth_init(); #endif #ifdef RT_USING_COMPONENTS_INIT /* initialization RT-Thread Components */ rt_components_init(); #endif rt_platform_init(); /* do some thing here. */ telnet_srv(); } int rt_application_init() { rt_thread_t init_thread; init_thread = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048, 8, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread); return 0; } ```下面是 telnet 服务器线程的创建 ```void telnet_srv() { rt_thread_t tid; if (telnet == RT_NULL) { rt_uint8_t *ptr; telnet = rt_malloc (sizeof(struct telnet_session)); if (telnet == RT_NULL) { rt_kprintf("telnet: no memory "); return; } /* init ringbuffer */ ptr = rt_malloc (TELNET_RX_BUFFER); rb_init(&telnet->rx_ringbuffer, ptr, TELNET_RX_BUFFER); /* create rx ringbuffer lock */ telnet->rx_ringbuffer_lock = rt_sem_create("rxrb", 1, RT_IPC_FLAG_FIFO); ptr = rt_malloc (TELNET_TX_BUFFER); rb_init(&telnet->tx_ringbuffer, ptr, TELNET_TX_BUFFER); /* create tx ringbuffer lock */ telnet->tx_ringbuffer_lock = rt_sem_create("txrb", 1, RT_IPC_FLAG_FIFO); /* create network event */ telnet->nw_event = rt_event_create("telnet", RT_IPC_FLAG_FIFO); } tid = rt_thread_create("telnet", telnet_thread, RT_NULL, 2048, 25, 5); if (tid != RT_NULL) rt_thread_startup(tid); } ```接下来,再来看看finsh是如何设置成telnet形式实现的,具体内容在telnet_thread()函数中,这也是telnet线程的entry。 ```/* Process the new connection. */ /* set console */ rt_console_set_device("telnet"); /* set finsh device */ finsh_set_device("telnet"); ```可以看到,在telnet 线程中对 finsh 使用的设备做了重定向,从原先默认的串口设备重定向到了 telnet 设备。 到目前为止,需要注意的代码都已经提及,下面就可以编译下载运行了。 编译调试及观察输出信息 编译请参见《RT-Thread配置开发环境指南》完成编译烧录,参考《Realtouch开发板使用手册》完成硬件连接,连接好串口线,连上网线。 运行后可以看到串口打印如下的信息: | / - RT - Thread Operating System / | 1.1.0 build Aug 26 2012 2006 - 2012 Copyright by rt-thread team TCP/IP initialized! finsh>>telnet server waiting for connection 此时你需要telnet的server端已经打开了,正在监听23号端口,等待客户端的连接。所以你现在要做的就是打开你的telnet客户端,将其连接到主机名为192.168.1.30(即realtouch所设的IP),端口为23的telnet server(笔者微软自带的telnet客户端此时可以连接成功,但之后无法实现finsh功能,所以转而使用了securecrt的telnet连接)。设置如下: ![1_kernel_sem_basic.zip](/uploads/3089_27071ed2a7aafe2e8d78db39e4b807fa.zip) 输入确认后,就可以连上RealTouch上的server端了。此时串口也会发出最后一条消息: new telnet connection, switch console to telnet... 接下来就可以像使用串口线时一样,使用网络方式通过telnet客户端进行 finsh 命令行交互了,使起那心爱的 list()。 list() --Function List: telnet_srv -- startup telnet server list_mem -- list memory usage information version -- show RT-Thread version information list_thread -- list thread list_sem -- list semaphone in system list_event -- list event in system list_mutex -- list mutex in system list_mailbox -- list mail box in system list_msgqueue -- list message queue in system list_mempool -- list memory pool in system list_timer -- list timer in system list_device -- list device in system list -- list all symbol in system set_if -- set network interface address set_dns -- set DNS server address list_if -- list network interface information list_tcps -- list all of tcp connections --Variable List: dummy -- dummy variable for finsh 0, 0x00000000 finsh>>list_thread() thread pri status sp stack size max used left tick error -------- ---- ------- ---------- ---------- ---------- ---------- --- telnet 0x19 ready 0x00000134 0x00000800 0x000001cc 0x00000004 000 tcpip 0x0c suspend 0x00000160 0x00000400 0x00000270 0x00000011 000 etx 0x0f suspend 0x0000011c 0x00000200 0x0000011c 0x00000010 000 erx 0x0f suspend 0x0000011c 0x00000200 0x0000014c 0x00000010 000 tshell 0x14 ready 0x00000110 0x00000800 0x000001b0 0x0000000a 000 tidle 0x1f ready 0x000000e0 0x00000400 0x000000e0 0x00000009 000 0, 0x00000000 结果分析 通过以上内容的实际操作,就可以实现用telnet网络的方式使用finsh了。 ![1_kernel_message_queue.zip](/uploads/3089_b66479d9ece8241ffc9a3b6f9f075557.zip) ![component_lwip_telnet.zip](/uploads/88_a38bc819e98fb60c44c54405441af2d6.zip) ![telnet.png](https://oss-club.rt-thread.org/uploads/88_caf40cdb7c1e8c046d7c845e676ef91a.png) 下载附件 [实验7_2TCPIP网络组件Lwip之telnet远程命令行交互.pdf](https://oss-club.rt-thread.org/uploads/88_9008426e6b09aabc2c9b0fcc7bfc344f.pdf) 下载附件 [Win7下telnet使用.pdf](https://oss-club.rt-thread.org/uploads/4221_81fcd495cf5e4d4289c589afcc4fdc29.pdf)
查看更多
22
个回答
默认排序
按发布时间排序
bernard
2012-08-30
这家伙很懒,什么也没写!
这个例程一直是非常赞的!能够让shell输出到远端,这也得力于RT-Thread灵活的构架。
lindabell
2012-08-30
这家伙很懒,什么也没写!
struct telnet_session是什么找不到定义的,是自定义的吗,不是RTT里面的吗? 还有缺少telnet_thread()的代码没有贴出来
xinghui_fly
2012-08-30
这家伙很懒,什么也没写!
很帅…… talnet是什么软件还是什么东东 怎么弄? 请楼主能不能详细的说下 谢谢……
shaolin
2012-08-30
这家伙很懒,什么也没写!
加入例程代码。
xinghui_fly
2012-08-30
这家伙很懒,什么也没写!
在网上找了找 telnet 的资料和相关应用!!
xinghui_fly
2012-08-30
这家伙很懒,什么也没写!
自己在在网上找的,怎么开启telnet!
lan_tian88
2012-09-05
这家伙很懒,什么也没写!
该例程上传的代码不是telnet的例程吧,是测网速的例程啊!
shaolin
2012-09-05
这家伙很懒,什么也没写!
>该例程上传的代码不是telnet的例程吧,是测网速的例程啊! --- 已更新
jichong211
2012-09-06
这家伙很懒,什么也没写!
使用网络连接 finsh 后,是不是不能使用串口了?
shaolin
2012-09-06
这家伙很懒,什么也没写!
是的,如果需要同时让串口和网络支持 Finsh,可以自己做下改进。
撰写答案
登录
注册新账号
关注者
0
被浏览
26.1k
关于作者
shaolin
这家伙很懒,什么也没写!
提问
115
回答
444
被采纳
0
关注TA
发私信
相关问题
1
[项目]搞个开源的硬件项目
2
硬件计划贴,及时更新,欢迎提意见
3
软件计划贴,及时更新,欢迎提意见::WMA,MOUNT,LWIP等问题急需解决.
4
MMS协议
5
定点的wma解压库-libwma
6
QQ群记录 [20090821]
7
STM32网络收音机PCB报名征集
8
第一版调试记录
9
第二版硬件讨论
10
RADIO项目相关模块规格--欢迎大家自己做板时规格与此兼容,减少重复劳动
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
5
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部