尝试使用 python 库连接到 coap 资源
Trying to connect to coap resource with python library
所以我正在尝试使用此 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 3.4 的 Windows 机器,但在我看来这可能成为异步中的错误。它的 UDP 套接字创建可能根本无法在 Windows 上工作。在较低级别上做一些实验,看看 aiocoap
正在做什么,并尝试证明我是错的。
应该可以,documentation 只提到 ProactorEventLoop
不支持 UDP。
Socket.error: Invalid Argument supplied 中描述了错误情况。
根据 asyncio
文档,aiocoap.protocol.Context.create_client_context()
似乎在做正确的事情,但是 _SelectorTransport.__init__()
总是会在发送任何数据包之前调用 sock.getsockname()
,此时套接字将不会绑定到地址(根据链接的 SO 问题)并且 getsockname()
将在 Windows.
上失败
您可能想使用当前版本的 Python 和 aiocoap(当前开发版本,0.4a1 之后)重试。 Windows 以前在 aiocoap 中不受支持,并且仍然不支持所有 CoAP,但现在使用的套接字实现知道 Windows 套接字 API 中的一些限制。
所以我正在尝试使用此 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 3.4 的 Windows 机器,但在我看来这可能成为异步中的错误。它的 UDP 套接字创建可能根本无法在 Windows 上工作。在较低级别上做一些实验,看看 aiocoap
正在做什么,并尝试证明我是错的。
应该可以,documentation 只提到 ProactorEventLoop
不支持 UDP。
Socket.error: Invalid Argument supplied 中描述了错误情况。
根据asyncio
文档,aiocoap.protocol.Context.create_client_context()
似乎在做正确的事情,但是 _SelectorTransport.__init__()
总是会在发送任何数据包之前调用 sock.getsockname()
,此时套接字将不会绑定到地址(根据链接的 SO 问题)并且 getsockname()
将在 Windows.
您可能想使用当前版本的 Python 和 aiocoap(当前开发版本,0.4a1 之后)重试。 Windows 以前在 aiocoap 中不受支持,并且仍然不支持所有 CoAP,但现在使用的套接字实现知道 Windows 套接字 API 中的一些限制。