Observe.onResponse

时间:2017-04-13 10:44:01

标签: java m2m leshan

我正在尝试根据乐山服务器代码设置自定义服务器。 我想将从设备收到的一些数据存储到数据库中。 目前我正在使用提供的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)时,它就像对应对象的魅力一样。

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

1 个答案:

答案 0 :(得分:1)

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