SSE с демонстрационным сервером Leshan LWM2M

Я пытаюсь создать http api, который взаимодействует с демонстрационным сервером Leshan. Я пытался обработать OBSERVE в LWM2M, но мне нужно обработать уведомление с помощью http. Я обнаружил, что leshan notify использует SSE. Итак, я пытался реализовать клиент sse на Python, используя запросы и sseclient.

Это мой код:

    response= requests.post(url_request , "format=TLV" , stream= True)    
    client = sseclient.SSEClient(response)
    for event in client.events():
        print(json.loads(event.data))

Я попытался запустить свой скрипт, но похоже, что поток не открывается и сразу закрывается, не дожидаясь ответа сервера, даже если запросы по умолчанию реализуют keep_alive для TCP-соединения по HTTP и поток имеет значение True.

Кто-нибудь знает почему?

1 ответ

Читая документацию sseclient, правильный способ использования SSEClient выглядит следующим образом:

from sseclient import SSEClient
messages = SSEClient('http://example.com/sse_stream/')
for msg in messages:
    do_something_useful(msg)

Читая ответ на Leshan Github, URL-адрес потока для Leshan Server Demo кажетсяhttp://your.leshan.server.org/event?ep=your_device_endpoint_name

Итак, я попробовал это:

from sseclient import SSEClient
messages = SSEClient('http://localhost:8080/event?ep=my_device')
for msg in messages:
    print (msg.event, msg.data)

И у меня это работает! Получение таких результатов, когда я наблюдаю температурный экземпляр Leshan Client Demo:

(u'NOTIFICATION', u'{"ep":"my_device","res":"/3303/0","val":{"id":0,"resources":[{"id":5601,"value":-18.9},{"id":5602,"value":31.2},{"id":5700,"value":-18.4},{"id":5701,"value":"cel"}]}}')
(u'COAPLOG', u'{"timestamp":1592296453808,"incoming":true,"type":"CON","code":"POST","mId":29886,"token":"889372029F81C124","options":"Uri-Path: \\"rd\\", \\"reWfKIgPYD\\"","ep":"my_device"}')
(u'COAPLOG', u'{"timestamp":1592296453809,"incoming":false,"type":"ACK","code":"2.04","mId":29886,"token":"889372029F81C124","ep":"my_device"}')
(u'UPDATED', u'{"registration":{"endpoint":"my_device","registrationId":"reWfKIgPYD","registrationDate":"2020-06-16T10:02:25+02:00","lastUpdate":"2020-06-16T10:34:13+02:00","address":"127.0.0.1:44400","lwM2mVersion":"1.0","lifetime":300,"bindingMode":"U","rootPath":"/","objectLinks":[{"url":"/","attributes":{"rt":"\\"oma.lwm2m\\""}},{"url":"/1/0","attributes":{}},{"url":"/3/0","attributes":{}},{"url":"/6/0","attributes":{}},{"url":"/3303/0","attributes":{}}],"secure":false,"additionalRegistrationAttributes":{}},"update":{"registrationId":"reWfKIgPYD","identity":{"peerAddress":{}},"additionalAttributes":{}}}')
(u'COAPLOG', u'{"timestamp":1592296455150,"incoming":true,"type":"NON","code":"2.05","mId":29887,"token":"3998C5DE2588F835","options":"Content-Format: \\"application/vnd.oma.lwm2m+tlv\\" - Observe: 2979","payload":"Hex:e3164563656ce8164408c03199999999999ae815e108c032e66666666666e815e208403f333333333333","ep":"my_device"}')

Если вас интересуют только уведомления, просто добавьте if msg.event == 'NOTIFICATION': блок.

Другие вопросы по тегам