Как обрабатывать нестандартные параметры Coap (нестандартные)

Я работаю над привязкой openHAB2 для серии устройств Shelly. Интерфейс http работает нормально, но я не могу зарегистрироваться, чтобы получать события COAP.

У кого-то есть опыт работы со структурой Californium? Шелли использует нестандартные параметры Coap (в зависимости от их спецификации CoIoT: https://shelly-api-docs.shelly.cloud/images/CoIoT%20for%20Shelly%20devices%20(rev%201.0)%20.pdf).

Я использую фреймворк Java Californium.

Когда я регистрирую наблюдателя, обратный вызов не выполняется. Если я посылаю команду, я вижу ACK в журнале, но они сообщают о неизвестном параметре 3332, который Шелли описывает в своем документе. Я не нашел способа зарегистрировать / внедрить пользовательские параметры в платформу Californium, чтобы наблюдатель мог их прочитать. Любая помощь приветствуется.

    CoapClient           client;
    CoapObserveRelation  relation;

    public void start() {
        client = new CoapClient("coap://192.168.1.1:5683/cit/d");
        client.get(new CoapHandler() {
            @Override
            public void onLoad(CoapResponse response) {
                String content = response.getResponseText();
                logger.debug("RESPONSE 3: " + content);
            }

            @Override
            public void onError() {
                logger.warn("FAILED");
            }
        });

        relation = client.observe(
                new CoapHandler() {
                    @Override
                    public void onLoad(CoapResponse response) {
                        String content = response.getResponseText();
                        logger.debug("NOTIFICATION: " + content);
                    }

                    @Override
                    public void onError() {
                        logger.warn("OBSERVING FAILED (press enter to exit)");
                    }
                });

Что я вижу в журнале отладки:

Aug 19, 2019 4:15:39 PM org.eclipse.californium.core.network.Matcher receiveResponse
INFORMATION: Ignoring unmatchable piggy-backed response from /192.168.6.81:5683: ACK-2.05   MID= 5718, Token=, OptionSet={"Unknown (3332)":0x534853572d3231233535394635352331}, "{"blk":[{"I":0,"D":"Rela".. 420 bytes
  • очевидно, устройство отвечает (ip: порт, URI)
  • пакет декодируется
  • в целом данные выглядят нормально (как описано в спецификации)
  • но он показывает "OptionSet={"Unknown (3332)"..."

Я понятия не имею, как зарегистрировать пользовательские параметры в Калифорнии. Кажется, что эти пакеты игнорируются, поэтому приложение не получает никаких данных.

Любая идея?

2 ответа

Было бы здорово, если бы вы предоставляли журналы для клиента и сервера, для запросов и ответов. Тем не менее, я вижу, что ответ ACK не включает токен (который должен быть таким же, как в запросе), по-видимому, поэтому Калифорния не может сопоставить его с соответствующим запросом.

Калифорния должна хорошо сочетаться с пользовательскими настройками.

Попробуйте связаться с ними после того, как исправите ответную проблему. Вот как это должно быть:

response.getOptions().getOthers()

Это сообщение "Неизвестно..." только потому, что средство форматирования сообщений в Калифорнии не знает, как правильно его регистрировать. Вы должны быть в состоянии получить его из вариантов в любом случае.

Добавить MessageInterceptor к CoapEndpoint, Что позову interceptor.receiveResponse(response); перед Matcher игнорирует это Response, Вы можете выбросить исключение, чтобы остановить стандартную обработку. Если вы хотите реализовать собственное сопоставление запросов / ответов, вы также можете записать исходящие запросы в interceptor.sendRequest(Request request);

Но с остальной обработкой, самостоятельно.

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