【问题标题】:Trying to connect to coap resource with python library尝试使用 python 库连接到 coap 资源
【发布时间】:2026-01-07 06:15:02
【问题描述】:

所以我尝试使用这个 python 库 https://github.com/chrysn/aiocoap 连接到 CoaP 资源。该库使用 python 3.4,我安装了 3.4 并将其设置为与此一起使用的解释器(我在 Windows 7 上使用)。执行 clientGET.py 文件时,我仍然收到此错误消息。服务器文件也一样。

C:\Python34\python.exe C:/Learning/PyCoap/aiocoap/clientGET.py
Traceback (most recent call last):
  File "C:/Learning/PyCoap/aiocoap/clientGET.py", line 34, in <module>
    asyncio.get_event_loop().run_until_complete(main())
  File "C:\Python34\lib\asyncio\base_events.py", line 268, in run_until_complete
    return future.result()
  File "C:\Python34\lib\asyncio\futures.py", line 277, in result
    raise self._exception
  File "C:\Python34\lib\asyncio\tasks.py", line 236, in _step
    result = next(coro)
  File "C:/Learning/PyCoap/aiocoap/clientGET.py", line 20, in main
    protocol = yield from Context.create_client_context()
  File "C:\Learning\PyCoap\aiocoap\aiocoap\protocol.py", line 510, in create_client_context
    transport, protocol = yield from loop.create_datagram_endpoint(protofact, family=socket.AF_INET6)
  File "C:\Python34\lib\asyncio\base_events.py", line 675, in create_datagram_endpoint
    waiter)
  File "C:\Python34\lib\asyncio\selector_events.py", line 68, in _make_datagram_transport
    address, waiter, extra)
  File "C:\Python34\lib\asyncio\selector_events.py", line 911, in __init__
    super().__init__(loop, sock, protocol, extra)
  File "C:\Python34\lib\asyncio\selector_events.py", line 452, in __init__
    self._extra['sockname'] = sock.getsockname()
OSError: [WinError 10022] Ein ungultiges Argument wurde angegeben

Process finished with exit code 1

【问题讨论】:

    标签: python python-asyncio coap


    【解决方案1】:

    我没有在真正的 Python 中探索这一点,因为我没有使用 Python 3.4 的 Windows 机器,但在我看来这可能是 asyncio 中的一个错误。它的 UDP 套接字创建可能根本无法在 Windows 上运行。在底层做一些实验,看看aiocoap在做什么,并尝试证明我错了。

    它应该可以工作,documentation 只提到ProactorEventLoop 不支持 UDP。

    Socket.error: Invalid Argument supplied 中描述了错误情况。

    aiocoap.protocol.Context.create_client_context() 似乎根据asyncio 文档在做正确的事情,但是_SelectorTransport.__init__() 将始终在发送任何数据包之前调用sock.getsockname(),此时套接字将不会绑定到地址(根据到链接的 SO 问题)和getsockname() 在 Windows 上将失败。

    【讨论】:

    • 感谢您抽出宝贵时间回答问题。太糟糕了,我需要这个的项目已经结束了。 Python 是跨平台的 :)
    • 我的回答有几个原因,差不多同样强烈;在阅读了一个有趣的问题后满足我自己的好奇心,帮助可能有同样问题的其他人,并帮助提出问题的人。 :-)
    • 是的,Python 在某种程度上是跨平台的。某些事情在不同平台上的工作方式不同,不能轻易桥接或抽象掉。而当这种情况发生时,Windows 通常是最不受关注的平台。
    【解决方案2】:

    您可能希望使用当前版本的 Python 和 aiocoap(当前开发版本,0.4a1 之后)重试。 aiocoap 过去不支持 Windows,并且仍然不支持所有 CoAP,但现在使用的套接字实现意识到 Windows 套接字 API 中的一些限制。

    【讨论】: