一、前言
在上位机软件开发中离不开要连接下位机设备(如果离开了就不算是上位机软件了)。而连接设备的方式如果做不好,非常影响使用使用者的体验。想要做好就一个方向,那就是实现连接设备的“傻瓜化”(就像当时傻瓜相机的发明一样)。对应到上位机软件的设备连接就是实现自动化或半自动化连接设备。尽量避免让用户“填”或“选”)。比如,用户打开软件查找设备发现好几个串口号,那么用户该选哪个号连接呢?只能一个一个的试。这就是典型的失败案例。因此本章主要介绍实现“自动化或半自动化实现连接设备的方法”。
二、实现自动化连接设备的原理
实现自动或半自动连接设备的根本原理是,在上位机软件和下位机硬件之间建立一个“握手机制”。即上位机软件和软件所能连接的所有设备都打一下招呼,看哪个硬件能正确回应这个“招呼”就能最终确定这个设备是可以连接的并完成连接。以上是对“自动或半自动连接”设备的拟人化说明。实际在开发中应该被称作“握手协议”。
简单“握手协议”举例:
{
上位机给下位机发送:“你是xx设备吗?”
下位机收到“你是xx设备吗?”后给出回复:“我是xx设备”
}
如果某个下位机设备对“你是xx设备吗?”没有任何回应或回应字符不满足协议要求。说明这个设备不是目标要连接的设备。在通过“握手协议”确认了目标设备后,代码编程直接连接这个设备即可,从而完成自动化连接设备。不需要用户做任何“填”或“选”。顶多需要用户在确认设备插入电脑后,手工点击“查找设备”按钮。因此把这样的操作叫做“半自动化连接设备”。如果你能编程监听硬件插入计算机的“事件”,那么你可以进一步做到完整的“自动化连接设备”。最常见的“自动化连接设备”的例子是“USB鼠标”。把鼠标插入计算机,计算机能检测到设备插入,并且可以通过握手协议判断这个USB设备是鼠标。很显然所有USB设备都有“握手协议功能”。
-
使用串口通信,实现自动连接“目标设备”的过程
软件编程中常有个系统函数可以获取连接到计算机的所有串口设备(设备com号)。可以编程实现依次打开这些设备,向每一个设备依次打开串口,然后给发送“握手协议所规定的字符串”并等待回应,如果超时没有任何回应,那么这个设备不是“目标设备”。再打卡下一个设备的串口并进行“握手通信”。如果这个串口设备按照“握手协议”正确回复。则说明这个串口设备是“目标设备”。把这个目标设备的设备串口号,返回给连接设备的代码进行设备连接即可。 -
使用网络通信,实现自动连接“目标设备”的过程
网络设备和串口设备的区别是,计算机上没有一个系统函数可以获取当前连接到计算机的网络设备。网络查找设备有其自己的方法。一般使用网络的上位机和下位机通信时,上位机(一般计算机)有自己的IP,下位机有自己的IP。通信的时候一般要求这两个IP在同一个网段。即要求上位机和下位机在同一个局域网下(一般是指在同一个路由器下)。因此在这个局域网中发送“广播数据”,在这个局域网内的所有网络设备都可以收到这个“广播数据”。因此可以利用这个特性来实现查找“目标设备”。具体步骤是,上位机端使用广播发送“握手协议所规定的字符串”,在局域网中收到此广播的下位机设备就会根具“握手协议”来回复上位机端,上位收到回复数据包就可以拿到这个包的IP地址,然后就可以使用这个IP地址连接“目标设备”。局域网中的非目标设备则不会给上位机端反馈任何消息(或回馈的消息不满足握手协议)。从而实现网络设备的查找。使用查找到的IP连接设备即可完成自动连接。
三、定制握手协议
以上举例的简单协议很显然不能直接用在编程中,虽然按照确实能完成查找设备。但是实在是太随意不够规范。因此这里按照正规的协议定制方法。举例编制一个正规“握手协议”。
制定协议包规则:(数字表示长度,单位byte,方括号不计入协议,仅为方便阅读)
[包头(1) + 指令名称(1) + 参数(n) + 校验(2) + 包尾(1)] //整个包使用byte组成。
包头:EE
包尾:BB
参数:参数可以是0个byte,也可以是n个byte
校验:16位CRC 或其他校验算法
-
上位机发送握手指令(空格不计入协议,仅为方便阅读):
[EE 01 A34E BB] //命令编号是1,这里1表示:和下位机设备握手命令 -
下位反馈握手指令(空格不计入协议,仅为方便阅读):
[EE 01 6d796e616d653b303030323233313b56312e322e33 7ed6 BB]
//模拟下位机工具所发送的16进制字符串如下:
EE 01 6d 79 6e 61 6d 65 3b 30 30 30 32 32 33 31 3b 56 31 2e 32 2e 33 7e d6 BB
//1表示对命令1的反馈,参数为:“myname;0002231;V1.2.3”
注:
- 上下位机开发中,对所有的通信命令都要按以上类似方法来设计所有通信命令,并编入一个文档作为“通信协议文档”。下位机程序猿和上位机程序猿都遵照“通信协议文档”来完成编程。
- 以上设计的命令中,下位机给上位机反馈的包中有参数,参数中包含设备的“名称”和“版本号”,便于上位机显示查找到的设备的额外信息。以及上位机代码根据不同版本的硬件做出特殊处理。
总结
实现局域网查找设备的关键是以下几点:
- 定制确认设备的“握手协议”
- 按照“握手协议”发送局域网广播,让局域网设备都能收到查找命令
- 发送广播之后,监听局域网反馈的UDP数据包并对包按照“握手协议”做解析,从而查找出下位机设备以及获取设备连接参数。
关于局域网查找网络设备的代码实现请参考“2.9-局域网查找设备的实现代码(支持有虚拟网卡)”