zoukankan      html  css  js  c++  java
  • 自己构建一个设备自发现的应用

    http://wanghailiang.iteye.com/blog/1696846

    最近在研究一个国产协议IGRS,貌似是根据UPNP改的
     
    研究得不深,只是看了它的基础协议文档而已。
     
    分享自己的一点小心得,向大家介绍一下,
     
    如何实现局域网内的所有终端(phone/comper/TV...)能相互发现。
     
    所谓相互发现就是指:不需要自己手动的输入IP来指定相应的电脑。
     
    接下来,开始创建我们自己的设备发现协议:
     
    1、协议在TCP/IP协议栈的实现位置
     
    (应用层)借用HTTP的规范,在应用层实现我们的协议数据包。
     
    (传输层)使用组播的方法,实现数据包在组播范围内发送。
     
    (网络层)默认
     
    (数据链路层)默认
     
    2、实现的原理
     
    当知道数据的发送是通过组播的方式时,聪明的你可能已经猜出答案了,
     
    那就是定时发送自己的“在线宣告”告诉组内的所有成员我“在线”,
     
    “在线宣告”就是我们要定义的第一个数据包(后文再说)。
     
    当组内的其他成员在收到你的“在线宣告”后,就能知道你的设备信息了,
     
    其他的设备可以回复你,也可以不回复你,这里为了简化就当做不回复处理了。
     
    当你完成了“在线宣告”后,接下来就是接收其他成员的信息,
     
    在大多数情况下都会接收到其他成员的“在线宣告”,
     
    这时你要做的事情就是——记录,这样一段时间后局域网内所有设备信息你都会知道了。
     
    设备在线的时候会不停的发送“在线宣告”,所以你知道他一直在线,
     
    但不可能所有设备都是24小时处于开机状态的,
     
    所以当设备关机,也就是离线的时候需要告知局域网内的其他成员,他下线了
     
    这时他就需要发送一个“离线宣告”,
     
    当其他成员再收到“离线宣告”后,就需要将这台离线设备的信息删除(或标注离线)。
     
    以上都是在理想的状态下的在线与离线,
     
    但网络这东西经常会出错,所以必须考虑发生错误后如何处理,
     
    这里我们进行简化,假设只会出现:设备异常离线(断电、死机...)这个错误情况
     
    设备异常离线会导致“离线宣告”无法发出,不能通知其他成员自己已经下线。
     
    所以此处需要添加一个设备在线的超时操作,超时后将该设备判断为异常离线,
     
    当接收到一个“在线宣告”时,就开始记录这个设备的在线状况,比如:最大生存时间(单位s)
     
    在最大生存期内,再次接到相同设备的“在线宣告”就刷新最大生存时间,
     
    当最大生存时间没能得到及时刷新,就可能变为0(时间不断减少),、
     
    当为0时可以判断此设备已经异常离线。
     
    这样的超时操作可以比较好的判断设备是否异常离线了,
     
    但需要不停的发送“在线宣告”,用来刷新最大生存时间。
     
    3、协议数据包的实现
     
    基于HTTP协议的实现方法
     
    在线宣告:告知网内的其他设备自己的在线状况,刷新生存时间
     
    NOTIFY * HTTP/1.1                  //头部
    01-MessageType:DeviceOnline   //消息类型
    01-MaxAge:60                          //60秒的生存时间
    01-PipeIp:192.168.0.1            //自己设备的ip地址
    01-PipePort:3880                    //通信用的端口号
    01-DeviceName:dev               //设备名称
     
    在线宣告发送的时间间隔要小于生存时间
     
    离线宣告:告知网内的其他设备自己离开网络
     
    NOTIFY * HTTP/1.1                  //头部
    01-MessageType:DeviceOffline   //消息类型
     
     
    4、用途
     
    当你可以通过实现了此协议的程序,获得其他设备的信息时,
     
    你会发现可以让很多过去很麻烦的事情变得简单,
     
    最简单的实例就是:不同设备间的资源共享(指不同操作系统间)。
  • 相关阅读:
    堆排序
    append、appendTo、prepend、prependTo、before、insertBefore、after、insertAfter、replaceAll方法被调用后,原本在页面上显示的元素会消失
    jQuery中的 $.ajax的一些方法
    attr VS prop 区别
    Canvas---clearRect()清除圆形区域
    HTML5 FormData方法介绍
    MongoDB学习笔记——数据库的创建与初始
    es6学习---.babelrc文件
    【转载】基于webpack构建react项目
    node常用模块---path
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/10005310.html
Copyright © 2011-2022 走看看