Cooja中有关collect-view插件

来源:互联网 发布:ubuntu 开启ssh服务 编辑:程序博客网 时间:2024/05/01 13:30

最近一周折腾了cooja和collect-view,本来寄予厚望可以用其进行数据收集和绘图,结果令人失望。

Collect-View像timeline等一样,都是cooja的插件,这也是cooja保持扩展性的特点。

Collect-view是既可以单独使用,也可以在cooja仿真中被调用。单独使用的话好像只能在硬件实体测试的时候使用,可以参见Collect View那篇文章。本文主要就是介绍在cooja 中调用的情况。

在cooja中使用collectview,一开始好像是要进行配置的,但现在2.6版本以后就不用了

Collect-view插件可以查看网络拓扑,丢包情况,ETX值,路径度量、节点等信息,还集成了一个串口控制台,可以与程序进行交互。但首先一点不是所有的应用在进行仿真时可以使用collectview插件查看网络信息,只有调用了collectview插件接口的应用才能使用该插件提供的功能,否则只有串口控制台可以使用。

具体该如何在应用中调用collectview插件,一直没有找到资料,这方面的资料可以说是没有。只能是通过例子摸索,目前找到两个相关例程,一个是examples/collect文件夹下面;另一个是在examples/ipv6/rpl-collect文件夹下的例子。

除了这两个例程外,还有两个有关该插件的地方:

  • apps/collect-view:对两种硬件平台的支持,z1和sky,获取传感器温湿度值和电量信息;collect-view.c是collectview的客户端代码,进行数据收集,接口函数可供例程调用以收集节点的有关信息
  • Tools/collect-view:collectview GUI的 Java代码文件

虽然这里面有数据收集函数,但这些数据如何传送到collectview,进而显示在GUI,还是没有找到相关线索。

1、第一个例程examples/ipv6/rpl-collect

该例程使用了collectview插件的基于udp的收集例程,包括了四个源文件,sink.c sender.c collect-common.c和collect-common.h。虽然看了很久这四个文件,但仍然是没有看到如何才能在程序中调用collectview插件,只是看上去这和collect-common.c文件中的六个函数有关,但仔细分析又完全找不到痕迹。

该例程的功能,sender.c定时收集节点信息并发送给sink节点;sink.c节点接收数据并打印。

经过我对几个文件夹的分析,我认为:

  • apps/collect-view只提供了特定节点信息收集API(若要收集其它节点,就要自己仿照着定义),该API主要是收集硬件相关的信息(温湿度等),并对信息进行整理,填充结构体msg;
  • sender.c填充一部分数据,然后调用上述API完成对特定硬件信息的收集和数据整理,然后通过udp发送给sink节点;
  • Sink.c中接收数据包,把数据打印出来。框架见下图:

分析完毕后,似乎这里并不涉及数据如何传递到collect-viewGUI的内容。猜测似乎只要与collect-common.h中声明的六个函数相关的就可以传递给GUI,而collect-common.c中有这样的注释:Example of how the collect primitive works,收集原语,如果这六个函数接口是收集原语的话,那也可以验证这一猜测,collect-view会通过这些原语进行数据的传递,最终显示在GUI。

在做仿真时最新发现:对于collect-common.c中的collect_common_recv()函数(由sink.c调用,主要用于显示接收到的数据),对于数据打印语句具有严格的限制,一旦我们更改了打印语句,就会影响collect-view插件,甚至使其无法收集数据。(猜测:collect view插件就是根据打印的数据进行统计显示的) 

voidcollect_common_recv(const rimeaddr_t *originator, uint8_t seqno, uint8_t hops,                    uint8_t *payload, uint16_t payload_len){  unsigned long time;  uint16_t data;  int i;  <strong>printf("%u", 8 + payload_len / 2);</strong>  /* Timestamp. Ignore time synch for now. */  time = get_time();  <strong>printf(" %lu %lu 0", ((time >> 16) & 0xffff), time & 0xffff);</strong>  /* Ignore latency for now */  <strong>printf(" %u %u %u %u",         originator->u8[0] + (originator->u8[1] << 8), seqno, hops, 0);</strong>  for(i = 0; i < payload_len / 2; i++) {    memcpy(&data, payload, sizeof(data));    payload += sizeof(data);    <strong>printf(" %u", data);</strong>  }


2、第二个例子examples/collect

源文件collect-view-shell.c,除了引用app/Collect-view中的头文件外,还引入了apps目录下shell.h和serial-shell.h,应该是和shell有关的一个例程,但具体功能没有分析。

看到一篇博文在cooja上使用collectview(二),讲述了基于该例程的调用collectview插件的步骤。有待于进一步分析学习。


总结:由于对于如何在应用程序中使用collectview插件还没有彻底弄明白,即数据是如何传递到插件进而在GUI显示,所以若要使用该插件提供的功能,最好还是基于example/ipv6/rpl-collect例程进行改写,只要读懂该例程,保持其框架不变,加入自己的需求,应该还是可以得

1 0
原创粉丝点击