路由器之UPnP协议

前言

通用即插即用(英语:Universal Plug and Play,简称UPnP)是由“通用即插即用论坛”(UPnP™ Forum)推广的一套网络协议。该协议的目标是使家庭网络(数据共享、通信和娱乐)和公司网络中的各种设备能够相互无缝连接,并简化相关网络的实现。UPnP通过定义和发布基于开放、因特网通讯网协议标准的UPnP设备控制协议来实现这一目标。
————百度百科

实例

目前市面上大部分路由器都支持UPnP协议,那么我们在开发关于路由器的项目时,都会去获取路由器的一些相关信息,这时候UPnP协议就派上用场了。

关于UPnP的原理解析和介绍,网络上的文章太多了,这里就不再赘述。
直接上干货

  • 1.使用udp多播向239.255.255.250:1900发送一条ssdp搜索报文
    M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN:"ssdp:discover"\r\nMX:5\r\nST: upnp:rootdevice\r\n
  • 2.监听239.255.255.250:1900,如果网络存在一个UPnP设备的话,设备必须发送响应信息

  • 3.解析响应消息,获得LOCATION的值,会得到一个xml的地址,即根设备(路由器)的描述信息地址

代码示例

node

    const socket = dgram.createSocket('udp4');socket.on('error', (err) => {socket.close();});socket.bind(1900, () => {socket.setMulticastTTL(128);socket.addMembership('239.255.255.250');socket.setMulticastLoopback(true);const msg = toByteArray('M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN:"ssdp:discover"\r\nMX:5\r\nST: upnp:rootdevice\r\n');socket.send(msg, 0, msg.length, 1900, '239.255.255.250', function (error, bytes) {});});socket.on('message', function(data, rinfo) {socket.close();var str = String.fromCharCode.apply(null, new Uint8Array(data));const ClearBr = (key) => { key = key.replace(/<\/?.+?>/g,""); key = key.replace(/[\r\n]/g, ""); return key; } const xmlAddress = ClearBr(str).match(/LOCATION: (\S*).xml/)[1] + ".xml";fetch(xmlAddress).then(res => {return res.text();}).then(res => {console.log(res);const modelName = res.match(/(\S*)<\/modelName>/);   //路由器型号});});function toByteArray (obj){var uint = new Uint8Array(obj.length);for (var i = 0, l = obj.length; i < l; i++){uint[i] = obj.charCodeAt(i);}return new Uint8Array(uint);}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部