• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
自己构建一个设备自发现的应用

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\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、用途
 
当你可以通过实现了此协议的程序,获得其他设备的信息时,
 
你会发现可以让很多过去很麻烦的事情变得简单,
 
最简单的实例就是:不同设备间的资源共享(指不同操作系统间)。
posted on 2018-11-23 01:38  MKT-porter  阅读(355)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3