最近一周折腾了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文件夹下的例子。
除了这两个例程外,还有两个有关该插件的地方:
虽然这里面有数据收集函数,但这些数据如何传送到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节点接收数据并打印。
经过我对几个文件夹的分析,我认为:
分析完毕后,似乎这里并不涉及数据如何传递到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插件就是根据打印的数据进行统计显示的)
void collect_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例程进行改写,只要读懂该例程,保持其框架不变,加入自己的需求,应该还是可以得