Skip to content

计网课设,实现一个基于socket的物联网协议

Notifications You must be signed in to change notification settings

etoyz/CourseDesign-ComputerNetwork

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

下载课设报告>>>

计算机网络课程设计

课设要求

  • 实现一个基于socket的物联网服务器,可以接收来自客户端的数据。
  • 实现一个物联网客户端,用于模拟物联网设备。客户端产生数据,发送至服务器,服务器根据协议对数据做出处理。

协议设计

drawing

报文格式

  • 客户端到服务器的请求报文

drawing

其中,前4字节为首部,表示请求方法。后17字节为数据部分,表示具体请求数据。目前有两种请求方法,分别是DATA方法和STAT方法,DATA方法表示发送的是当前的传感器数据,STAT方法表示发送的是对应电子设备是否成功执行了来自服务器的指令。

  • 服务器到客户端的请求报文

drawing

其中,前3字节为首部,表示请求方法。后9字节为数据部分,表示具体请求数据。目前有两种请求方法,分别是SET方法和GET方法。

项目实现流程

  • 设计网络协议
    首先,我参考了同为应用层协议的HTTP协议。为了保证协议的简单性,便于高效的处理大量的事务, HTTP被设计成了一种无状态的协议。而根据我们这次实验的具体需求,我们应该设计一种可以管理、记录各种状态的协议。 由于本实验中服务器和客户端之间的数据传输逻辑并不复杂,因此可以指定传输固定长度的数据报,预先定义好数据报的每一部分所代表的意义,然后通过编程语言提供的数据处理函数来对数据报进行解析,从而完成相应的操作。 通过理解TCP、UDP等通用网络协议的设计思想,我了解到了数据报的首部一般存储一些协议规定的或者比较重要的部分,而数据部则存储真正需要传输的数据;又通过学习HTTP等应用层协议的设计思想,数据报首部往往会指定一种请求方法,比如HTTP中的GET请求和POST请求,每一种请求方法都对应不同的操作;因此,我决定在自己设计的网络协议的首部存储各种自定义的请求方法,数据部则存储真正需要传的数据,比如传感器数据、控制数据等。

  • 选择编程语言
    本实验将使用C++作为编程语言。我个人认为, Java,Python等比较主流的编程语言屏蔽了太多系统底层的细节,使用这些语言,只需要调用语言本身提供的比较友好的接口,就可以很轻易的实现一些实际上比较复杂的功能,不利于学习底层实现的原理。而C++则可以直接控制底层,可以更好的学到某些功能实现的具体细节和原理。因此,本次实验我将使用C++来进行socket编程。

  • 增加多线程支持
    通过查阅资料,我完成了服务端和客户端的初始版本。但是经过简单的测试,我发现了一个致命的问题,就是服务端只能阻塞的等待客户端的连接请求,当与某一个客户端建立TCP连接后,服务端将不能接受新的连接。因此,我决定增加多线程的功能,来让服务端能够同时与多个客户端建立TCP连接。 当多线程相关的代码完成后,服务端软件就可以同时接收多个客户端连接了。每当服务端监听到新的连接请求时,就会创建一个线程来专门处理这个请求,而主线程不在是之前那样阻塞等待TCP连接的断开,而是继续监听新的连接请求,这样就实现了一个服务端与多个客户端建立TCP连接。

  • 为Linux系统编写客户端
    在Windows环境下进行socket编程,不可避免的要用到Windows系统的API,为了体验更纯粹的socket编程,我决定为Linux编写一个客户端,这样顺便也可以测试一下一个服务端与多个客户端进行连接的能力

项目实现

  • 服务端代码流程图

drawing

  • 客户端代码流程图(Windows版本和Linux版本流程相同)

drawing

About

计网课设,实现一个基于socket的物联网协议

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages