Qualcomm DragonBoard
一.背景
博主通过这个系列的博客给大家介绍了如何基于DragonBoard 410c开发怕得板去实现远程遥控炮台的demo制作,包括炮台底层基础从机构建与手机上位机远程遥控的设计。但是,作为一个完整的遥控炮台项目,有很多核心细节问题才是童鞋们比较关注的,本系列博客我们花几个小章节来谈谈关于远程控制协议的优化问题。
二.思路
1.问题:炮台控制效果延后,不够灵敏?
2.分析:
相信使用过前几章节博主分析的炮台遥控方式的创客们都会发现,炮台在与手机远程建立通讯后,使用手机进行遥控的时候,会发现炮台不定期地出现控制滞后,转向不灵敏的现象,这是让用户体验变得相当糟糕的现象。博主在最开始的时候还以为是舵机负荷过度的原因,后面经过详细的分析,最后定位的关键点是远程控制协议,其实质就是在于TCP传输协议的问题。
博主的遥控炮台的远程控制借助的是局域网络,其物理载体是DragonBoard 410c的wifi模块与手机的wifi模块,基于此建立局域网络,通过将DragonBoard
410c作为服务端,手机作为客户端,通过Socket建立起通讯链路。而这里的Socket正是基于TCP协议,所以我们的远程控制其实质就是基于TCP传输协议的通信!
三.Socket介绍
1.什么是Socket
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP
也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示
数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套
接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通
信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并
绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台
主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流
电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
最重要的是,Socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调
用。客户随机申请一个Socket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为
之分配一个Socket号;服务器拥有全局公认的Socket,任何客户都可以向它发出连接请求和信息请求(相
当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。
Socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器Socket半相关为全局所
公认非常重要。读者不妨考虑一下,两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何
一方的Socket固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。
2.Socket的通信三握手:
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监
听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监
控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客
户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向
服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端
套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连
接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
图1 Socket三握手
四.方向
针对炮台控制效果延后的特点,博主分析了下炮台作为服务端(下位机)接收到的指令信号,发现在通讯建立后,指令信号会不定期地出现:
图2 服务端接收的信号
了解过Socket的童鞋,基本都会知道Socket通讯会出现经典的分包与粘包问题,场景如下:
(1)完整的一条消息被系统拆分成几条发送,例如要发送一条消息:Hello
World ,却被系统分成两条
消息发送,分别为:Hello 和 World。
(2)几条独立的消息被系统合成一条消息发送,例如要发送两条消息分别为:a memory from my past和
it’s been a year,却被系统和成一条消息发送:a memory from my pastit’s been a year。
看到这里,再结合博主发的指令信号图,想必大家都能看出本章问题的产生的根源----Socket通信的分包问题导致遥控信号的不稳定!!!
那么如何解决这个问题呢?容博主卖个关子,在下个章节解答。
更多回帖