ARM Linux下UPnP使用

  一、UPnP简介  

UPnP(Universal Plug and Play)技术是一种屏蔽各种数字设备的硬件和操作系统的通信协议。它是一种数字网络中间件技术,建立在TCP/IP、HTTP协议之上,采用XML来描述设备和控制信息。这种技术最开始是被微软,因特尔等公司使用在数字家庭中的,用来在家庭网络中完成多媒体资源共享,家电一体化等功能,例如在各种家电上实现IP数字化,加入网络传输和控制部分,从而让家电能组建UPnP网络,这种技术能让人们在上班或者外地出差时能查看家庭情况,如:是否有家电忘记关闭;监控家庭情况;或者在回家之前打开家里的热水器并设置水温;在天热时提前打开空调;打开电饭煲开始蒸饭……

这些应用由于家电厂商的不积极(目前能连接到网络的家电可能只有电视吧),或许是成本问题等,UPnP设计之初想要达到的数字家庭并未得到普及和广泛应用。但是UPnP的特有特性还是很吸引人的,它最大的特性是它的消息发送是通过HTTP协议发送,所有的消息内容都是通过XML包装的,这种消息传输模式使得我们能通过浏览器访问和控制支持UPnP协议的设备,再来让我们看看传统的嵌入式网络的通信吧,大多数设备之间网络通信直接使用TCP/IP上的socket编程,这种通信模式需要通信的双方制定好通信数据的格式包,在客户端和服务器端都需要进行编程,而且一旦项目需求发生变化,通信格式发生变化时,这时通信两端的程序都需要修改,如果客户还提出跨平台的问题,那需要修改的就更多了。UPnP协议本身是利用的现有的通用协议而来的,它占用资源少,特别适用于嵌入式网络领域,能通过浏览器访问和控制设备的特性使得UPnP的编程通常只涉及一方,即设备端。通信数据格式的修改和客户需求的变化也只涉及到设备端的修改,它便于设备的升级,UPnP设备在添加到网络中时,就可以立即被网络中拥有浏览器的客户端访问和控制。

二、UPnP的组成

UPnP网络是指通过采用UPnP协议的设备所组成的网络,它的基本组件是服务、设备和控制点:

服务是UPnP网络中最小逻辑功能单元,由状态表、事件和控制服务器组成。状态表描述服务的当前状态;事件服务器用来管理来自控制点的事件订阅请求,并在服务的状态改变时向订阅者发送状态更新事件;而控制服务器则负责处理来自控制点的动作请求。

UPnP设备由一组子设备或服务构成,同时多个设备下的子设备也通过逻辑组合构成新的设备。设备中的每个功能也可以当做一个逻辑子设备向外发布。

控制点的功能是发现和控制其它设备,在控制点发现一个网络设备后,它会发出请求先获取设备描述和服务列表,再获取感兴趣的服务描述,然后通过动作请求来控制服务。控制点订阅设备的服务事件时,服务会在状态变化时向控制点发送的状态更新事件。一个控制点可以控制多个UPnP设备,也可以作为一个设备被其它控制点控制。

三、UPnP的工作过程

UPnP的工作过程

UPnP协议栈

四、UPnP的描述文档

     在UPnP的工作是基于UPnP描述文件的。UPnP描述文件分为设备描述文件和服务描述文件。

设备描述文件包括设备属性和它所提供的服务,一个标准设备描述文档如下所示:

[plain] view plaincopy
  1. <span style="font-size:16px;"><?xml version="1.0"?>
  2. <root xmlns="urn:schemas-upnp-org:XXXXXX">
  3. ......
  4. <device>
  5. <deviceType>urn:schemas-upnp-org:device: XXXXXX: X </deviceType>
  6. ……
  7. <UDN>uuid:XXXXXX</UDN>
  8. <UPC>……</UPC>
  9. <serviceList>
  10. <service>…… </service>
  11. </serviceList>
  12. <presentationURL>/设备展示URL地址</presentationURL>
  13. </device>
  14. </root></span>

在设备描述文档中,<root>到</root>即描述的一个根设备,specVersion配置的是UPnP协议版本编号,<device>到</device>之间描述的是一个完整的UPnP设备,deviceType表示设备的类型,它的标准命名方式是urn:schemas-upnp-org:device:deviceType:ver,其中deviceType:ver是由用户来设定的。presentationURL参数表示设备展示所对应的请求页面地址。

设备描述中UDN(Unique Device Name)是必须设定的,这个参数用来在UPnP组建的网络中用来唯一标识一个设备,产品编号UPC(Universal Product Code)是可选的,然后<serviceList>到</serviceList>之间是来描述设备提供的服务,每个服务的参数说明在<service>到</service>之间,服务的主要参数如表1所示:

表1设备服务XML描述字段

参数

说明

<serviceType>

服务类型,UPnP论坛规定为urn:schemas-upnp-org:service:serviceType: ver,serviceType:ver由用户自己设定

<serviceId>

服务ID,它在一个设备描述里命名需要唯一

<SCPDURL>

服务描述的URL

<controlURL>

服务控制的URL

<eventSubURL>

服务事件的URL

它们描述了设备支持的服务类型和数量,以及所有服务支持的动作和变量。

UPnP服务描述文件定义了动作、动作参数、变量、变量类型和及其范围、事件特性,每个服务提供的动作有参数选择(分为输入参数和输出参数),每个参数必须对应服务描述文件中的服务状态变量表(serviceStateTable)中的一个状态变量(stateVariable),UPnP服务描述文件的基本格式如下:

[plain] view plaincopy
  1. <span style="font-size:16px;"><?xml version="1.0"?>
  2. <scpd xmlns="urn:schemas-upnp-org:service-1-0">
  3. <actionList>
  4. <action>
  5. <name>XXX<name>
  6. <argumentList>
  7. <argument>……</argument>
  8. ……
  9. </argumentList>
  10. </action>
  11. ……
  12. </actionList>
  13. <serviceStateTable>
  14. <stateVariable>…… </stateVariable>
  15. </serviceStateTable>
  16. </scpd>
  17. </span>

每个动作在一个设备服务中由动作名称name唯一标识,动作的参数是在<argumentList>中由<argument>描述的,argument的参数如表2:

表2  设备服务XML描述文档中动作字段

参数

说明

<name>

参数名,以字母开头,可以以数字、字母和下划线组成

<direction>

“in”或“out”,表示输入和输出参数

<retval>

可选,最多指定一个参数为动作返回值

<relatedStateVariable>

必须为一个状态变量名

再来看状态变量< stateVariable >的参数,如表3:

表3设备服务XML描述文档中状态变量字段

参数

说明

<name>

状态变量名,以字母开头,可以以数字、字母和下划线组成

<dataType>

数据类型,详细见注

<defaultValue>

默认值

<allowedValueList>

有效的字符值列表,每个有效字符值在<allowedValue>中定义

<allowedValueRange>

包括最小值在<minimum>中定义,最大值在<maximum>中定义,<step>步进值

上面叙述的设备描述和服务描述是通过XML文件完成的,在程序中就是对应不同的XML文件,首先设备在XML文档中描述设备名称和它所包含的服务信息(服务信息中包括服务名称和ID,最重要的是指定服务描述对应XML文件地址)。这样程序才能在解析设备文档后能根据它提供的信息去解析对应的服务XML文档。服务XML文档指定了服务的状态表和动作。状态表可以理解为服务的测量数据,动作则可理解为服务向用户提供的控制点。

五、UPnP在ARM Linux上的使用

UPnP应用在arm平台有它的特点和优势,这些我都在前文简单介绍了,但实际开发时可以现在PC机上测试,测试成功后再通过交叉编译工具编译放在ARM平台运行即可,开发UPnP应用程序先要下载UPnP开发套件,下载后在Linux虚拟机中解压执行./configure;然后make 即可测试SDK中提供的sample程序了(目录为:libupnp-1.6.14/upnp/sample),下面有三个测试程序tv_ctrlpt ,tv_combo, tv_device。这三个程序只是程序的启动脚本,本文只分析tv_device程序,这个脚本文件最终实际上执行了libupnp-1.6.14/upnp/sample/.libs/tv_device 程序,程序代码在sample目录下的common和linux中,它所使用的XML描述文件在web目录下。

执行tv_device脚本:./tv_device,效果如下:

将图中的网址http://192.168.128.128:49152/tvdevicedesc.xml输入到另一台计算机的浏览器上,最后的关键部分显示如下:

tvdevicedesc.xml是一个设备描述文档,我们可以清楚的看到,它的设备描述文档中指明了设备拥有两个服务和服务的描述文档地址(tvcontrolSCPD.xmltvpictureSCPD.xml),设备文档中还指定了设备展示文档的地址<presentationURL>/tvdevicepres.html</presentationURL> ,这个地址是提供给用户在浏览器中访问和操作设备,将之前的网址改为http://192.168.128.128:49152/tvdevicepres.html ,(注意:这里由于例子中的设备展示文档中使用了VBscript脚本,故暂时只能通过IE内核的浏览器正常访问):

当你操作这些按钮时,虚拟机中的Linux程序中会输入对应的操作信息,在局域网中的任何用户都能通过浏览器访问和控制设备。如果你想要在arm平台中测试这些,首先需要在程序配置时执行: ./configure --host=arm-linux

--prefix=/home/yanghao/Desktop/libupnp --enable-shared  然后执行make,make install,先把程序运行所需要的lib库编译生成出来,然后将sample下的编译好的程序复制到开发板,将/home/yanghao/Desktop/libupnp中的lib库复制到开发板的lib目录下,或者是在其中脚本中设置LD_LIBRARY_PATH变量也行,这样程序就可以在arm开发板中执行了。

通过之前的演示,我们可以看到UPnP的模式有些像一个网页服务器,的确如此,UPnP协议通过网页来完成用户数据的操作和访问,但它又和网页服务器有着重大的区别,网页的操作模式只是它众多特性中的一种,UPnP架构中消息的发布和传输是基于HTTP和XML,UPnP占用资源小,协议架构简单,我们可以看到它编译出的支持库大小1.5M,这还是动态链接库和静态链接库的总大小,网页是它数据显示的一种方式,它的数据更多的是应用程序间的交互。控制点可以通过订阅一个UPnP设备服务,当UPnP设备服务中的状态变量发生变化时会主动向订阅该服务的控制点发送状态变化信息,同时控制点可以在程序中利用远程调用完成对设备的控制。这种简单灵活的方式非常适合于嵌入式领域,通常嵌入式领域中网络通信无非就是传感器测量数据的传输和远程用户对设备的控制,UPnP的状态变量和动作刚好可以完成这两方面的功能,状态变量可以等同于测量数据的实时显示,动作等同于控制,动作提供远程接口供用户调用。

六、UPnP程序的编写

UPnP开发包中使用很简单,可以参考sample例子中的源代码,大部分API函数的调用是固定的,需要我们做的工作主要集中在XML文档的编写上,我这里以一例子中的TvDevice Control State Table中的Power选项为例。首先查看它的定义,在sample下的web目录下的tvdevicepres.html中:

[html] view plaincopy
  1. <TR>
  2. <TD  BGCOLOR="#FFFFFF" VALIGN=center ALIGN=center><span style="color:#000000;">Power</span></TD>
  3. <TD  BGCOLOR="#FFFFFF" valign="top"><P ID=Power></P></TD>
  4. <TD  BGCOLOR="#FFFFFF" valign="top">
  5. <INPUT type="button" onclick="SetPowerOn()"      value=" On   ">
  6. <INPUT type="button" onclick="SetPowerOff()"     value=" Off  ">
  7. </TD>
  8. </TR>
  9. ……
  10. If (callbackType = "VARIABLE_UPDATE") Then
  11. select case svcObj.Id      case "urn:upnp-org:serviceId:tvcontrol1"
  12. select case varName          Case "Power"      Power.innerText = value
  13. ……
  14. function SetPowerOn()
  15. Dim inArgs(0)
  16. Dim outArgs(0)
  17. TvControlService.InvokeAction "PowerOn", inArgs, outArgs
  18. end function
  19. function SetPowerOff()
  20. Dim inArgs(0)
  21. Dim outArgs(0)
  22. TvControlService.InvokeAction "PowerOff", inArgs, outArgs
  23. end function

Power旁边的编辑框ID为Power,后面紧跟的两个按钮On和Off触发的函数依次为SetPowerOn()和SetPowerOff()。由VBscript中的判断语句中可以看到当服务ID为"urn:upnp-org:serviceId:tvcontrol1"的变量"Power"值发生变化时,编辑框ID为Power的内容为服务的"Power"变量值。这里将网页中的编辑框内容与服务中的变量值绑定起来了。再来看按钮On的触发函数SetPowerOn(),函数定义中说明函数最终执行TvControlService中的PowerOn动作。再来看tvcontrol服务的描述文件对状态变量和动作的说明(在web目录下tvcontrolSCPD.xml文件中):

[html] view plaincopy
  1. <actionList>
  2. <action>
  3. <name>PowerOn</name>
  4. <argumentList>
  5. <argument>
  6. <retval />
  7. <name>Power</name>
  8. <relatedStateVariable>Power</relatedStateVariable>
  9. <direction>out</direction>
  10. </argument>
  11. </argumentList>
  12. </action>
  13. ……
  14. </actionList>
  15. <serviceStateTable>
  16. <stateVariable sendEvents="yes">
  17. <name>Power</name>
  18. <dataType>Boolean</dataType>
  19. <defaultValue>0</defaultValue>
  20. </stateVariable>
  21. ……

tvcontrol服务的状态变量Power是一个bool类型的变量,PowerOn动作与状态变量Power绑定,这样我们在执行PowerOn时会影响状态变量Power,而这个具体的影响是在程序代码中完成的,这里只是完成一个关系建立的工作。在UPnP代码中也是根据这里设定好的动作名称和状态变量名称去执行不同动作所对应的函数和改变对应变量的值。

ARM Linux下UPnP使用相关推荐

  1. linux pfn,ARM Linux下的page和pfn之间转换的宏。

    ARM Linux下的page和pfn之间转换的宏如下: 1)page_to_pfn 2)pfn_to_page 这两个宏依赖于内核编译时,选择的内存模型.在include/asm-generic/m ...

  2. linux-arm下如何开启tftp传输,arm linux 下移植busybox 的tftp

    (1)进入busybox目录,make menuconfig ,然后在networking中勾选tftp项跟tftpd项. (2)配置/etc/inetd.conf 中关于tftp的选项(此部未验证, ...

  3. arm linux下交叉编译valgrind工具进行内存泄露检测和性能分析

    C/C++等底层语言在提供强大功能及性能的同时,其灵活的内存访问也带来了各种纠结的问题.如果crash的地方正是内存使用错误的地方,说明你人品好.如果crash的地方内存明显不是consistent的 ...

  4. PL2303在ARM Linux下驱动的问题及解决方法

    问题描述:项目需要用ARM板驱动金笛wavecom GSM模块发短信,该GSM模块为USB接口,内部采用PL2303HX芯片转为RS232接口实现AT指令协议. 将GSM模块插入ARM板的USB口,发 ...

  5. easypr arm linux,arm linux下交叉編譯EasyPR中文車牌識別系統開發(一)

    EasyPR中文車牌識別系統開發(一),我主要介紹如何使用開源的EasyPR中文車牌識別系統,當然后面我會介紹訓練機器學習 SVM 支持向量機和 ANN 人工神經網絡模型在車牌識別的應用. 目錄: 一 ...

  6. 你知道不同U盘在ARM+Linux下的读写速率吗?

    优秀的产品离不开完善的测试,即使一个简单的USB接口也要确保稳定性及兼容性.不同的U盘在ARM+Linux板卡下的兼容性.速率怎么样呢?本文将为大家提供测试参考数据及详细测试步骤! 1. 测试准备 主 ...

  7. arm linux下看门狗应用,arm linux watchdog 看门狗

    目前手上有个项目需要设计看门狗,是arm+CPLD 方式.由于对看门狗要求很高,打算做一个双看门狗,arm CPLD互相为 对方的看门狗.理论上CPLD是不需要看门狗的,还是这么去设计了.接下来对看门 ...

  8. 4G通信模块在嵌入式ARM Linux下的应用

        4G通信模块是连接物与物的重要载体,是终端设备接入物联网的核心部件之一.4G通信模块把频率接收器和信号增幅器等部件全都整合在一起,实现了一体化.随着工业发展,嵌入式设备接入网络的需求日益增多, ...

  9. gdb arm linux 下载,月光软件站 - 编程文档 - 其他语言 - 关于ARM Linux下的GDBServer

    在一块ARM Linux 开发板上,我想用GDBServer进行Debug. 首先尝试PC机(安装Fedora Core 1)上自带的gdbserver, 启动gdbserver:gdbserver ...

最新文章

  1. windows中安装Node.js-安装angular-cli
  2. 什么是C ++中的“-gt;”运算符?
  3. morphia(1)-基础
  4. 网站维护:利用iptables和ipset屏蔽恶意IP的访问
  5. 93号涨0.86元售6.2元/升 20日油价正式上调
  6. Android之获取指定目录下的所有特殊文件名字
  7. 下载丨 MySQL运维管理+编程开发大全
  8. CSS3 3D切割轮播图
  9. mysql的int11是指什么_MYSQL中的int(11)到底代表什么意思?
  10. 友声电子秤设置软件_友声电子秤说明书精编版
  11. 哈理工oj 1006 River Hopscotch
  12. 研究生研一学习机器学习ML、深度学习DL的规划
  13. 扩展RBAC用户角色权限设计方案(转载)
  14. 数据库基本原理==嵌套查询
  15. 写给情人,写给情人节,写给即将开始的新一年
  16. ftp上传工具 绿色,4个好用的绿色 ftp上传工具
  17. 切换windows系统版本
  18. pyecharts源码解读(10)渲染包render之templates目录:渲染模板
  19. c++ 工具库 (zz)
  20. 双指针之两数之和,三数之和,N数之和系列

热门文章

  1. ELO用户忠诚度评分建模
  2. 接口的 p99 p99.9 是什么意思
  3. Notion的安装与使用
  4. C#控制电脑注销、关机、重启
  5. 2023跨年代码(烟花+自定义文字+背景音乐+雪花+倒计时)
  6. 汉字 Unicode编码范围及 计算文本的中文英文字数
  7. 【转载】关于 .Net 逆向的那些工具:反编译篇
  8. python代码覆盖率工具——coverage
  9. 爬虫煎蛋网的mm图片
  10. [Python] openpyxl读存大数据 Exception: String longer than 32767 characters