尝试使用python库连接到coap资源

时间:2015-07-12 18:19:45

标签: python python-asyncio coap

所以我试图使用这个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

2 个答案:

答案 0 :(得分:1)

我没有在真正的Python中探索这个,因为我没有使用Python 3.4的Windows机器,但在我看来,这可能是asyncio中的一个错误。它的UDP套接字创建可能根本不适用于Windows。在较低级别进行一些实验,查看aiocoap正在做什么,并试图证明我错了。

它应该有效,documentation只提到ProactorEventLoop不支持UDP。

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

根据{{​​1}}文档,

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

答案 1 :(得分:1)

您可能想使用Python和aiocoap的当前版本(0.4a1之后的当前开发版本)重试。 Windows曾经在aiocoap中不受支持,并且仍然不支持所有CoAP,但是现在使用了一个套接字实现,该实现知道Windows套接字API中的一些限制。