python - 如何使用aiocoap库观察CoAP资源?

标签 python python-3.x python-asyncio

我正在使用aiocoap向嵌入式设备发出 CoAP 请求的库。通信和基本功能似乎工作正常,但文档没有说明如何启用观察。观察功能确实似乎存在于源代码中,无论是服务器端还是客户端 - 我需要客户端。

这就是我到目前为止所拥有的:一个在服务器上创建观察状态的 GET 请求:

import asyncio, aiocoap

@asyncio.coroutine
def coap_get_with_observe():
    protocol = yield from aiocoap.Context.create_client_context()

    request = aiocoap.Message(code = aiocoap.GET)
    request.set_request_uri('coap://[aaaa::212:4b00:a49:e903]/sensors/temp')
    # set observe bit from None to 0
    request.opt.observe = 0

    try:
        response = yield from protocol.request(request).response
    except Exception as e:
        print("request failed: %s" % str(e))
    else:
        print("request ok: %r" % response.payload)

event_loop = asyncio.new_event_loop()
asyncio.set_event_loop(event_loop)
event_loop.create_task(coap_get_with_observe())
asyncio.get_event_loop().run_forever()

输出:

request ok: b'{"HDC_TEMP":2426}'

这仅打印客户端收到的第一个值;我也想打印后续值。

最佳答案

它有助于替换这一行:

    response = yield from protocol.request(request).response

这样:

    protocol_request = protocol.request(request)
    protocol_request.observation.register_callback(observation_callback)
    response = yield from protocol_request.response

其中 observation_callback 是定义为的函数:

def observation_callback(response):
    print("callback: %r" % response.payload)

现在,只要从服务器收到新的通知消息,就会打印消息负载。

关于python - 如何使用aiocoap库观察CoAP资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779470/

相关文章:

python - 如何让python识别出没有输入

python - 使用 xarray 从 netcdf 中提取最近的经纬度和时间值

python-3.x - 如何提高elasticsearch性能

python - 在 Python 中读取包含英语和阿拉伯语文本的文本文件

python - 如何在 asyncio 上异步运行 `loop.run_until_complete()` 本身?

python - 用pip安装属性错误

python - Spotipy(Spotify 的 Web API Python 包装器)示例失败

Python 3 不适用于 Sublime Text 2

python - FastAPI 异步类依赖项

python - 使用 asyncio.gather 不会引发内部异常