大学嵌入式-linux远程led控制实验报告

大学嵌入式-linux远程led控制实验报告

2023年7月15日发(作者:)

20XX年复习资料

专 业:

班 级:

科目老师:

日 期:

1 / 10 linux远程led控制实验报告

陈昊 20XXXX20XXXX0XX020XXXX8

1)实验目的

网络接口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的以太网是RJ45接口。通过本次实验,主要对Linux网络socket通讯的工作原理进行进一步了解,同时,进一步熟悉Linux网络编程。此外,在了解网络通信的同时,掌握一系列网络通讯调试时基本的检测方法。

2)网络编程原理

linux下进行网络编程的基础是TCP/IP协议族,虽然TCP/IP 名称只包含了两个协议,但实际上,TCP/IP 是一个庞大的协议族,它包括了各个层次上的众多协议(见图一):

图1 TCP/IP协议族

· ARP:用于获得同一物理网络中的硬件主机地址。

· MPLS:多协议标签协议,是很有发展前景的下一代网络协议。

· IP:负责在主机和网络之间寻址和路由数据包。

· ICMP:用于发送报告有关数据包的传送错误的协议。

· IGMP:被IP主机用来向本地多路广播路由器报告主机组成员的协议。

· TCP:为应用程序提供可靠的通信连接。适合于一次传输大批数据的情况。并适用于要求得到响应的应用程序。

· UDP:提供了无连接通信,且不对传送包进行可靠的保证。适合于一次传输少量数据,可靠性则由应用层来负责。

其中最重要的是TCP协议和UDP协议:

2 / 10 1.TCP

同其他任何协议栈一样,TCP向相邻的高层提供服务。因为TCP的上一层就是应用层,

因此,TCP数据传输实现了从一个应用程序到另一个应用程序的数据传递。应用程序通过编程调用TCP并使用TCP服务,提供需要准备发送的数据,用来区分接收数据应用的目的地址和端口号。

通常应用程序通过打开一个socket来使用TCP服务,TCP管理到其他socket的数据传

递。可以说,通过IP的源/目的可以惟一地区分网络中两个设备的关联,通过socket的源/目的可以惟一地区分网络中两个应用程序的关联。

TCP对话通过三次握手来初始化的。三次握手的目的是使数据段的发送和接收同步,告诉其他主机其一次可接收的数据量,并建立虚连接。(见图二) :

图2 TCP三次握手协议

· 初始化主机通过一个同步标志置位的数据段发出会话请求。

· 接收主机通过发回具有以下项目的数据段表示回复:同步标志置位、即将发送的数据

段的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。

· 请求主机再回送一个数据段,并带有确认顺序号和确认号。

TCP实体所采用的基本协议是滑动窗口协议。当发送方传送一个数据报时,它将启动计时器。当该数据报到达目的地后,接收方的TCP实体向回发送一个数据报,其中包含有一个确认序号,它意思是希望收到的下一个数据报的顺序号。如果发送方的定时器在确认信息到达之前超时,那么发送方会重发该数据报。

2.UDP

UDP即用户数据报协议,它是一种无连接协议,因此不需要像TCP那样通过三次握手

来建立一个连接。同时,一个UDP应用可同时作为应用的客户或服务器方。由于UDP协议并不需要建立一个明确的连接,因此建立UDP应用要比建立TCP应用简单得多。

UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是在网络质量越来越高的今天,UDP的应用得到了大大的增强。它比TCP协议更为高效,也能更好地解决实时性的问题。如今,包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都使用UDP协议。

3.协议的选择

3 / 10 协议的选择应该考虑到以下3个方面。

(1)对数据可靠性的要求

对数据要求高可靠性的应用需选择TCP协议,如验证、密码字段的传送都是不允许出错的,而对数据的可靠性要求不那么高的应用可选择UDP传送。

(2)应用的实时性

由于TCP协议在传送过程中要进行三次握手、重传确认等手段来保证数据传输的可靠

性。使用TCP协议会有较大的时延,因此不适合对实时性要求较高的应用,如VOIP、视频监控等。相反,UDP协议则在这些应用中能发挥很好的作用。

(3)网络的可靠性

由于TCP协议的提出主要是解决网络的可靠性问题,它通过各种机制来减少错误发生的概率。因此,在网络状况不是很好的情况下需选用TCP协议(如在广域网等情况),但是若在网络状况很好的情况下(如局域网等)就不需要再采用TCP协议,选择UDP协议来减少网络负荷。

3)socket编程

1.socket定义

在Linux中的网络编程是通过socket接口来进行的。人们常说的socket接口是一种特殊的I/O,它也是一种文件描述符。每一个socket都用一个半相关描述{协议,本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述{协议,本地地址、本地端口、远程地址、远程端口}。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过socket来实现的。

2.socket类型

常见的socket有3种类型如下。

(1)流式socket(SOCK_STREAM)

流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。

(2)数据报socket(SOCK_DGRAM)

数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP。

(3)原始socket

原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。

3. socket基础编程

(1)函数说明

4 / 10 进行socket编程的基本函数有socket、bind、listen、accept、send、sendto、recv、recvfrom这几个,其中对于客户端和服务器端以及TCP和UDP的操作流程都有所区别,这里先对每个函数进行一定的说明,再给出不同情况下使用的流程图。

· socket:该函数用于建立一个socket连接,可指定socket类型等信息。在建立了socket连接之后,可对socketadd或sockaddr_in进行初始化,以保存所建立的socket信息。

· bind:该函数是用于将本地IP 地址绑定端口号的,若绑定其他地址则不能成功。另外,它主要用于TCP的连接,而在UDP的连接中则无必要。

· connect:该函数在TCP中是用于bind的之后的client端,用于与服务器端建立连接,而在UDP中由于没有了bind函数,因此用connect有点类似bind函数的作用。

· send和recv:这两个函数用于接收和发送数据,可以用在TCP中,也可以用在UDP中。当用在UDP时,可以在connect函数建立连接之后再用。

· sendto和recvfrom:这两个函数的作用与send和recv函数类型,也可以用在TCP和UDP中。当用在TCP时,后面的几个与地址有关参数不起作用,函数作用等同于send和recv;当用在UDP时,可以用在之前没有使用connect的情况时,这两个函数可以自动寻找制定地址并进行连接。

服务器端和客户端使用TCP协议的流程图如图2所示。

图3 使用TCP协议socket编程流程图

服务器端和客户端使用UDP协议的流程图如图3所示。

5 / 10

图4 使用UDP协议socket编程流程图

3)设计思想

本次实验主要实现在PC上的Linux和9261开发板上的嵌入式Linux之间建立一个TCP连接,开发板作为服务器,PC作为客户机,通过PC上发送指令来控制开发板上的LED的亮灭。

本实验由3个程序组成,分别为server.c、client.c和app_leds.c。其中server.c运行在开发板上,用来接收客户机的控制;client.c运行在PC上,它接收用户的指令输入并发送到开发板;app_leds.c试运行在开发板上的独立用户程序,负责控制led的亮灭。

程序所实现的功能具体描述为:

(1)PC上的客户程序:该客户程序在运行时首先会和开发板建立socket连接,然后请用户输入指令,要将1~4号led点亮或者关闭,它判断用户的指令是否输入正确,如果正确的话就发送到开发板。最后如果用户需要退出,就发送close,客户程序就会关闭套接字并结束。

(2)开发板上的服务器程序:服务器程序在开始运行时也要建立一条连接并等待用户的到来,如果用户的指令传来。它就建立一个新的进程,并在该进程上运行一个新的程序,将收到的指令作为该程序的输入。led控制程序就按照指令打开或关闭相应的灯。

4)软件设计过程

服务器程序设计过程:

(1)建立socket描述符并绑定动态端口,将端口打印在终端上面,开始监听来自客户 的TCP连接,服务器的IP地址为20XXXX2.20XXXX8.81.72

(2)收到来自客户机的连接,开始接收客户请求

(3)用户的请求到来,打开LED设备描述符

(4)向开发板开机自启动的流水灯进程发送SIG_STP信号

(5)调用ioctl函数将相应的led按照指令进行控制

(6)收到客户的退出指令后就关闭套接字和设备描述符并向流水灯发送继续运行的信号

(7)结束该次通讯连接,关闭套接字描述符

(8)继续等待其他客户的连接

客户机程序设计过程:

6 / 10 (1)建立套接字并尝试连接20XXXX2.20XXXX8.81.72主机上的端口

(2)连接成功后向终端打印消息,要求用户输入控制指令

(3)接收用户输入的指令并判断是否有效

(4)将用户的指令传输到开发板

(5)如果收到退出指令则向服务器发送客户机关闭信号

(6)关闭套接字及回收已经打开的资源

(7)程序结束

5)软件流程图

建立socket并绑定监听是否建立连接用户是否传来请求客户传来的是否是退出指令删除套接字描述符并回收资源创建子进程运行LED应用程序并将控制量输入

图5 服务器程序

7 / 10 建立socket并绑定尝试连接服务器等待用户传来指令用户输入的命令是否合法?要求重新输入是否是退出指令将命令发送往开发板向服务器发送退出指令关闭描述符并打印完成信息结束

图6 客户机程序

开始输入是否合法暂停流水灯程序向底层驱动发送指令继续流水灯程序结束

8 / 10 图7 led控制程序

6)软件测试截图

图4 Linux下eclipse编程界面

图5 PC下客户机端的命令输入界面

9 / 10

图6 9261开发板超级终端服务器响应界面

图7 9261开发板LED的亮灭情况

10 / 10

发布者:admin,转转请注明出处:http://www.yc00.com/news/1689410584a243587.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信