【问题标题】:Why is UPnPy discover throwing AttributeError?为什么 UPnPy 发现抛出 AttributeError?
【发布时间】:2022-07-01 20:18:04
【问题描述】:

我正在使用 UPnPy,当我尝试发现本地网络上的设备时,我立即注意到了一个问题。这是我正在使用的基本代码:

import upnpy

upnp = upnpy.UPnP()

devices = upnp.discover()

这会引发以下异常:

Traceback (most recent call last):
  File "C:\Users\name\Projects\pythonProject\main.py", line 5, in <module>
    devices = upnp.discover()
  File "C:\Users\name\Projects\pythonProject\venv\lib\site-packages\upnpy\upnp\UPnP.py", line 33, in discover
    for device in self.ssdp.m_search(discover_delay=delay, st='upnp:rootdevice', **headers):
  File "C:\Users\name\Projects\pythonProject\venv\lib\site-packages\upnpy\ssdp\SSDPRequest.py", line 50, in m_search
    devices = self._send_request(self._get_raw_request())
  File "C:\Users\name\Projects\pythonProject\venv\lib\site-packages\upnpy\ssdp\SSDPRequest.py", line 100, in _send_request
    device = SSDPDevice(addr, response.decode())
  File "C:\Users\name\Projects\pythonProject\venv\lib\site-packages\upnpy\ssdp\SSDPDevice.py", line 87, in __init__
    self._get_services_request()
  File "C:\Users\name\Projects\pythonProject\venv\lib\site-packages\upnpy\ssdp\SSDPDevice.py", line 23, in wrapper
    return func(device, *args, **kwargs)
  File "C:\Users\name\Projects\pythonProject\venv\lib\site-packages\upnpy\ssdp\SSDPDevice.py", line 54, in wrapper
    return func(instance, *args, **kwargs)
  File "C:\Users\name\Projects\pythonProject\venv\lib\site-packages\upnpy\ssdp\SSDPDevice.py", line 171, in _get_services_request
    event_sub_url = service.getElementsByTagName('eventSubURL')[0].firstChild.nodeValue
AttributeError: 'NoneType' object has no attribute 'nodeValue'

我一直在研究造成这种情况的原因,但一无所获。我正在使用 UPnPy 版本 1.1.8。我使用 PyCharm 作为我的 IDE。我尝试过使用以前版本的 UPnPy,但似乎都没有工作。任何帮助,将不胜感激。谢谢!

【问题讨论】:

    标签: python runtime-error python-import upnp


    【解决方案1】:

    您的家庭网络中很可能有一个不兼容的 UPnP 设备,该设备在其描述位置提供非标准/损坏的 XML,并且upnpy 不够聪明,无法处理解析错误,可能会忽略该设备.

    这种情况比您想象的更常见:许多智能电视(肯定是 LG 的)都有一个嵌入式设备,宣传为 UPnP,但它们的描述端点回答的是 JSON 而不是 XML!

    一些建议:

    • 使用不同的库或应用程序(您可以尝试my own),至少可以找出罪魁祸首。检查打开详细程度并查找警告和解析错误日志
    • 使用诸如 tcpdump 之类的扫描器来嗅探网络数据包(UDP 端口 1900)以获取 SSDP NOTICE 广告,并在浏览器中手动打开每个 LOCATION URL 以查看它们是否是有效的 XML
    • 有选择地关闭/拔下您认为可能支持 UPnP 的设备,例如智能电视、家庭影院、视频游戏机、路由器等,以查看哪个设备在提供虚假 XML。
    • 编辑upnpy 的本地副本以处理该错误,例如用try/except 块将函数/行括起来,并打印一些有关它在错误之前尝试解析的内容的详细信息。

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 2020-06-22
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      相关资源
      最近更新 更多