tcpip网络编程 尹圣雨源码_Matlab Socket通信编程

在汽车ADAS系统开发过程中,需要将图像感知算法的计算结果,发送出去。这里,选择Socket作为通信方式。

本文介绍了matlab Socket通信编程原理,并展示了实践案例,重点讲述tcp ip通信中的参数设定问题,已经开发过程中遇到的问题事项。

一:什么是Socket套接字

在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。

在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应。为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端 口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过Socket接口来实现。

简单的来说,socket非常类似于电话插座。以一个电话网为例。电话的通话双方相当于相互通信的2个程序,电话号码就是IP地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求。对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。

二:Socket的一般应用模式(Server-Client)

532304850764d0e6db01a1f4cae56958.png

客户端Client Socket连接服务端指定的端口(负责接收和发送服务端消息)

  • 必须指定要连接的服务端地址和断口。
  • 通过创建一个Socket对象来初始化一个到服务端的连接。

服务端Welcoming Socket监听到客户端连接,创建Connection Socket(负责和客户端通讯)

  • 一个负责接监听客户端连接的套接字
  • 每成功接收到一个客户端连接便在服务端产生一个对应Socket

三 Socket的通讯过程

客户端:

  • 1. 申请一个Socket
  • 2. 连接到指定服务器(指明了IP地址和端口号)

服务器端:

  • 1. 申请一个Socket
  • 2. 绑定到一个IP地址和端口上
  • 3. 开启侦听,等待接受连接

socket通信的基本流程图:

0d66283dbab331f875c838865e433746.png

四:基于socket的数据收发的实践案例

发送端,Sender,又称客户端

% client 发送方Sender
% 设置网络IP后,即可发送信息至指定服务端。
% Author: 380545156@qq.com
% Date: Aug 3rd, 2020

% Prepare data for transmiss
% 一个来自从图像中识别出来的目标的信息表现
Image_ID = 2233; % int
BBox_2D = [911 513 95 118] % 1*4 double
BBox_3D = [911 513 500 95 118 120]  % 1*6 double
Object_type = 'boat'   % string
Azi_2D = 283.92  % double;
Azi_3D = [0.5774 0.5774 0.5774] % 1*3 double
Dist_Center = 1564.9;  % double
Dist_3D = 1564.9;  % double

t_client = tcpip('192.168.88.60',30000,'NetworkRole','client') %与本地主机建立连接,端口号为30000,作为客户机连接
% t_client = tcpip('localhost',30000,'NetworkRole','client') %与本地主机建立连接,端口号为30000,作为客户机连接

t_client.OutputBuffersize = 1000000
fopen(t_client);                                              %与一个服务器建立连接,直到建立完成返回,否则报错
% 需要对
OD_Result_send =  strcat(num2str(Image_ID),',',num2str(BBox_2D(1)),',',num2str(BBox_2D(2)),',',num2str(BBox_2D(3)),',',num2str(BBox_2D(4)),',',...
    num2str(BBox_3D(1)),',',num2str(BBox_3D(2)),',',num2str(BBox_3D(3)),',',num2str(BBox_3D(4)),',',num2str(BBox_3D(5)),',',num2str(BBox_3D(6)),',',...
    Object_type,',',num2str(Azi_2D),',',num2str(Azi_3D(1)),',',num2str(Azi_3D(2)),',',num2str(Azi_3D(3)),',',num2str(Dist_Center),',',num2str(Dist_3D))
data_send = [200 10000  100000  ]                                              % 发送的数字数据
txt_send = 'HELLO'                                           % 发送的文本数据
% pause(0.1);                                                % 等待连接稳定,随意设置
% fprintf(t_client,data_send)  
fwrite(t_client,data_send,'uint16')                             % 写入数字数据
% pause(0.5);
fprintf(t_client,OD_Result_send)                             % 发送文本数据
fclose(t_client)

接收端,Receiver,又称服务器

% Server, 接收Receive

close all;
clear all;
clc;

t_server = tcpip('0.0.0.0',30000,'NetworkRole','server')  %与第一个请求连接的客户机建立连接,端口号为30000,类型为服务器。

t_server.InputBuffersize = 1000000;
fopen(t_server);                                          %打开服务器,直到建立一个TCP连接才返回;
get(t_server)
while(1)
    if  t_server.BytesAvailable > 0
        t_server.BytesAvailable
        break;
    end
end
pause(1);   % 等待tcp ip完整地把信息传输完成。否则
% data_string_recv = fread(t_server,t_server.BytesAvailable,'string') 
%从缓冲区读取数字数据
data_recv = fread(t_server,t_server.BytesAvailable/8,'double')  
%从缓冲区读取文本数据

fclose(t_server);
% 把收到的结果,可视化表现
plot(data_recv)

五.常见问题

1. 通信时间延迟问题

要预设数据无法完全传输时,接收端对数据的处理方法。

2. 通信数据包的大小问题

如下图,原本的数据量,只有158*1,如下图,并且显示正常。

ddda54a38abcbac1d451a67a115b75d6.png

结果,在将Pause(0.1)修改成Pause(1)后,在接收的数据末尾,多了九个0,变成了167*1.

a092399b80475e211808b3ca149532a1.png

出现这个现象的原因是,数据不完全传输的缘故。


以上就这么多了。有更多实践内容,和问题解决方案, 再来更新。

欢迎自动驾驶行业从业者,加入《自动驾驶行业交流群》

若谷:《自动驾驶行业交流群》及公约​zhuanlan.zhihu.com
d2a40d98619dbfc10c22e3fcac035edf.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值