0

我正在尝试基于 Leshan-server 代码设置自定义服务器。我想将从设备接收到的一些数据存储到数据库中。目前我使用提供的 leshan-client-demo 作为唯一的客户端,用于测试目的。

我的计划是使用 ObservationListener.onResponse 处理程序收听观察响应。

对于这些事件中的每一个,我还需要检索每个资源的名称以将它们相应地写入我的数据库中。为此,我使用 server.getModelProvider 相关的方法。

这是我的处理程序的代码片段:

private LeshanServer server;
private ObservationListener obsListener = new ObservationListener() {
    public void onResponse(Observation obs, Registration reg, ObserveResponse res) {
        LwM2mObjectInstance content = (LwM2mObjectInstance) res.getContent();
        int objectId = content.getId(); // Here I retrieve the object ID, but it's always 0
        LwM2mModel objectModel = server.getModelProvider().getObjectModel(reg);

        for (Map.Entry<Integer, LwM2mResource> r : content.getResources().entrySet()) {
            int resId = r.getValue().getId(); // This one is okay
            ResourceModel model = objectModel.getResourceModel(objectId, resId); // and here I'm trying to use it
            if (model != null) {
                System.out.println(model.name);
            }
        }
    }
    // Other handlers next...
}

问题是正确检索对象ID。在这里,我的 objectId 始终为 0。因此,除了第一个对象之外,资源模型为 null(因为我认为它不匹配任何内容)。我在 ObserveResponse 中看不到任何其他相关数据。

当我手动将 objectId 设置为其他值(1、2、3、...8)时,它就像对应对象的魅力一样。

我认为这不正常。这个错误的起源可能是什么?

4

1 回答 1

1

我认为 res().getContent().getId() 将返回 resourceId,而不是 ObjectId。在我的情况下,我尝试为 id 为 2 的资源设置观察,我从 getId() 得到 2。还有另一种获取 ObjectId 的方法是 obs.getPath(),这样您将获得包含 ObjectId、InstanceId 和 ResourceId 的 LwM2mPath。

于 2017-05-24T11:47:33.787 回答