【车联网原型系统|二】数据库+应用层协议设计


物联网原型系统导航

【车联网原型系统|一】项目介绍+需求分析+概要设计 https://blog.csdn.net/weixin_46291251/article/details/125807297

【车联网原型系统|二】数据库+应用层协议设计 https://blog.csdn.net/weixin_46291251/article/details/125808107

【车联网原型系统|三】树莓派设计+模拟基站程序 https://blog.csdn.net/weixin_46291251/article/details/125808229

【车联网原型系统|四】adhoc组网+frp内网穿透 https://blog.csdn.net/weixin_46291251/article/details/125808621

【车联网原型系统|五】前后端分离 https://blog.csdn.net/weixin_46291251/article/details/125808674

【车联网原型系统|六】效果展示 https://blog.csdn.net/weixin_46291251/article/details/125808845

【源码下载】 https://download.csdn.net/download/weixin_46291251/86227197


【车联网原型系统|二】数据库+应用层协议设计

应用层协议设计

后端与小车树莓派的通信是通过socket进行的,因此需要定义一个私有协议,区分不同类型的数据报文。数据报文采用json格式进行传输。

总体而言,报文可以分为两类,一类是控制报文,一类是数据报文。控制报文用于用户控制小车,数据报文用于传输数据信息。

字段总体设计

具体的字段和对应的描述如下表:

数据字段内容描述
pac_type数据包类型
control_type区分不同的消息功能类型
src_id发送方id
dst_id接收方id
piece报文分片标记
time发送方时间戳
ack标识ack
length消息长度
state状态码
alternate保留字段

具体字段

pac_type

首先是数据报文类型字段,这个字段主要原来标识报文的流向,主要有三种方向:

  • 树莓派 到 基站
  • 基站 到 树莓派
  • 树莓派 到 树莓派 (对应转发到情况)
数据包类型(pac_type)数据流向编码
pi -> pc01
pc -> pi10
pi -> pi11
保留类型00

control_type

控制类型字段用来标识报文具体对应的功能,这部分要根据pac_type来综合判断,不同的pac_type会对应不同的含义:

  • 对于树莓派到基站到类型,是树莓派反馈数据到基站到报文,分为轨迹数据、传感器数据、和树莓派电量低三种。
  • 对于基站到树莓派到报文类型,主要是基站下发的控制命令,有开始/停止移动、打开/关闭传感器、一键返航和转发(转发指令给不在基站范围内的小车)。
  • 对于树莓派到树莓派类型,和第二张类似,少了转发功能。
字段指令含义编码
control_typepac_type == pi -> pc轨迹数据000
传感器数据001
电量低010
无法避障011
保留指令100
保留指令101
保留指令110
保留指令111
pac_type == pc -> pi运动000
停止001
返航010
打开传感器011
关闭传感器100
转发101
保留指令110
保留指令111
pac_type == pi -> pi运动000
停止001
返航010
打开传感器011
关闭传感器100
保留指令101
保留指令110
保留指令111

state字段

state字段主要用来反馈指令执行的数据,有成功、失败、超时等,还预留了一些编码用来传递自定义的状态。

状态码(state)含义编码
成功000
失败(超时)001
失败(指令非法)010
失败(原因3)011
失败(原因4)100
保留状态101
保留状态110
保留状态111

其他字段

ack字段:

系统在收到一个报文之后,可以回复一个ack报文,表示自己收到了报文(可以结合数字签名实现双向的不可否认)

- 每次收取一个报文,按照上述的逻辑收完之后,就发送一个ack报文给发送方,表示已经完成报文的接收。

- 每次发送一个报文,按照上述逻辑发送完之后,就收取一个ack报文,验证这个报文就表示本次发送结束。

piece字段:

这个字段主要是用来处理大报文的 分片问题的。

采用分片的方法,头部pieces字段来指定当前报文是否是最后一个分片,每次都发送一个完成的报头和部分的报文(取决于MTU)。

接收方每次都接收一个MTU大小的报文,解析出头部的pieces字段,判断结束条件,接收完之后将所有的数据字段组合起来即可得到完成的大报文

数据结构设计

这部分主要是小车和基站之间传递报文的内容字段的结构

指令

字段含义举例
direction(list)四个按钮的状态[False,False,False,False]
speed速度50
diff_speed转向差速20

数据

字段含义举例
sensor_list传感器列表
data_list数据列表
trace_stack路径栈

数据库设计

概念模型

表结构设计

设计了以下表:
  • user表:存储用户的账号、密码、用户类型(等级)、登陆时间
  • sensor_info表:存储传感器的类型编号、名称、分组、描述信息
  • pi表:存储系统中的所有树莓派编号、权限等级、描述信息等
  • sensors表:存储系统中所有的传感器列表,包括传感器的编号、所属树莓派编号、传感器类型、SN编码(如果有)、权限等级
  • data_instruction表:系统下发/执行的所有指令,包括指令id、用户id、树莓派id、时间、执行状态、指令类型、指令的具体数据
  • data_sensor:表:树莓派反馈的传感器数据表,包括数据id、传感器id、用户id、时间、具体的传感器数据
  • data_trace表:树莓派反馈的轨迹数据表,包括数据id、用户id、树莓派id、时间、具体的轨迹数据。
具体有以下字段
  • data_instruction : [‘id’, ‘user_id’, ‘pi_id’, ‘time’, ‘state’, ‘type’, ‘data’]

  • data_sensor : [‘id’, ‘sensor_id’, ‘user_id’, ‘data’, ‘time’]

  • data_trace : [‘id’, ‘user_id’, ‘pi_id’, ‘time’, ‘data’]

  • pi : [‘id’, ‘level’, ‘description’]

  • sensor_info : [‘id’, ‘name’, ‘group’, ‘description’]

  • sensors : [‘id’, ‘pi_id’, ‘sensor_type’, ‘SN’, ‘level’]

  • user : [‘id’, ‘passwd’, ‘level’, ‘reg_time’]

ER图

传感器表部分

image-20220714151252012

指令存储部分

image-20220714151313408

路径存储部分

image-20220714151326221

传感器数据部分

image-20220714151348806

image-20220714151403831

物理模型:

略,见sql文件内

Crow‘foot图

image-20220714151516002

posted @ 2022-07-17 17:57  Cheney822  阅读(86)  评论(0编辑  收藏  举报