`
wanghailiang333
  • 浏览: 199144 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

自己构建一个设备自发现的应用

 
阅读更多
最近在研究一个国产协议IGRS,貌似是根据UPNP改的

研究得不深,只是看了它的基础协议文档而已。

分享自己的一点小心得,向大家介绍一下,

如何实现局域网内的所有终端(phone/comper/TV...)能相互发现。

所谓相互发现就是指:不需要自己手动的输入IP来指定相应的电脑。

接下来,开始创建我们自己的设备发现协议:

1、协议在TCP/IP协议栈的实现位置

(应用层)借用HTTP的规范,在应用层实现我们的协议数据包。

(传输层)使用组播的方法,实现数据包在组播范围内发送。

(网络层)默认

(数据链路层)默认

2、实现的原理

当知道数据的发送是通过组播的方式时,聪明的你可能已经猜出答案了,

那就是定时发送自己的“在线宣告”告诉组内的所有成员我“在线”,

“在线宣告”就是我们要定义的第一个数据包(后文再说)。

当组内的其他成员在收到你的“在线宣告”后,就能知道你的设备信息了,

其他的设备可以回复你,也可以不回复你,这里为了简化就当做不回复处理了。

当你完成了“在线宣告”后,接下来就是接收其他成员的信息,

在大多数情况下都会接收到其他成员的“在线宣告”,

这时你要做的事情就是——记录,这样一段时间后局域网内所有设备信息你都会知道了。

设备在线的时候会不停的发送“在线宣告”,所以你知道他一直在线,

但不可能所有设备都是24小时处于开机状态的,

所以当设备关机,也就是离线的时候需要告知局域网内的其他成员,他下线了

这时他就需要发送一个“离线宣告”,

当其他成员再收到“离线宣告”后,就需要将这台离线设备的信息删除(或标注离线)。

以上都是在理想的状态下的在线与离线,

但网络这东西经常会出错,所以必须考虑发生错误后如何处理,

这里我们进行简化,假设只会出现:设备异常离线(断电、死机...)这个错误情况

设备异常离线会导致“离线宣告”无法发出,不能通知其他成员自己已经下线。

所以此处需要添加一个设备在线的超时操作,超时后将该设备判断为异常离线,

当接收到一个“在线宣告”时,就开始记录这个设备的在线状况,比如:最大生存时间(单位s)

在最大生存期内,再次接到相同设备的“在线宣告”就刷新最大生存时间,

当最大生存时间没能得到及时刷新,就可能变为0(时间不断减少),、

当为0时可以判断此设备已经异常离线。

这样的超时操作可以比较好的判断设备是否异常离线了,

但需要不停的发送“在线宣告”,用来刷新最大生存时间。

3、协议数据包的实现

基于HTTP协议的实现方法

在线宣告:告知网内的其他设备自己的在线状况,刷新生存时间

NOTIFY * HTTP/1.1\r\n                  //头部
01-MessageType:DeviceOnline\r\n   //消息类型
01-MaxAge:60\r\n                          //60秒的生存时间
01-PipeIp:192.168.0.1\r\n            //自己设备的ip地址
01-PipePort:3880\r\n                    //通信用的端口号
01-DeviceName:dev\r\n               //设备名称

在线宣告发送的时间间隔要小于生存时间

离线宣告:告知网内的其他设备自己离开网络

NOTIFY * HTTP/1.1\r\n                  //头部
01-MessageType:DeviceOffline\r\n   //消息类型


4、用途

当你可以通过实现了此协议的程序,获得其他设备的信息时,

你会发现可以让很多过去很麻烦的事情变得简单,

最简单的实例就是:不同设备间的资源共享(指不同操作系统间)。

其他的由你自由发挥啦。

今天太累了,就到这吧,还有没考虑到的地方以后再补充吧。

0
5
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics