最近一直在学习TinyRPL,RPL结合BLIP可以实现TinyOS的IPv6。看了几天的文档及部分源码后再回头看TestRPL例程,明白了不少内容,但还是有很多不懂的地方,比如:
1.SplitControl中最后的那些xxx.start()在哪实现的?到底干了些什么??
components IPStackC;
App.SplitControl -> IPStackC;
configuration IPStackC {
provides {
interface SplitControl;
...
SplitControl = IPStackControlP.SplitControl;
command error_t SplitControl.start() {
if (blip_started) return EALREADY;
return call SubSplitControl.start();
}
event void SubSplitControl.startDone(error_t error) {
if (error == SUCCESS) {
blip_started = TRUE;
call StdControl.start();
}
call NeighborDiscoveryControl.start();
#if RPL_ADDR_AUTOCONF
// If we are using the routing layer to get our full address, then
// we must start the routing layer immediately.
call RoutingControl.start();
#else
// Otherwise, check to see if we have a global address before starting
// the routing layer.
{
struct in6_addr addr;
// if we have a global address, we can start any routing protocols now.
if (call IPAddress.getGlobalAddr(&addr)) {
call RoutingControl.start();
}
}
#endif
signal SplitControl.startDone(error);
}
这些xxx.start()在哪实现的?到底干了些什么??追踪到最后发现到了一个接口StdControl里面。
2.RPL路由在哪里启动的?是Boot.booted()中的call RoutingControl.start();么?在哪里做创建网络及更新路由等工作的?
event void Boot.booted() {
memset(MULTICAST_ADDR.s6_addr, 0, 16);
MULTICAST_ADDR.s6_addr[0] = 0xFF;
MULTICAST_ADDR.s6_addr[1] = 0x2;
MULTICAST_ADDR.s6_addr[15] = 0x1A;
//call Lcd.initialize();
if(TOS_NODE_ID == RPL_ROOT_ADDR){
call RootControl.setRoot();
}
call RoutingControl.start();
//call RoutingControl.start();
call SplitControl.start();
call RPLUDP.bind(UDP_PORT);
}
3.可以在上位机编写一个基于UDP的程序接收节点传输的数据吧?
components new UdpSocketC() as RPLUDP;
App.RPLUDP -> RPLUDP;
好多问题呀,师父们看了能解答的帮忙解答一下咯。在此谢过。
联系qq:154292501
By:霜月孤鸟
2016.1.18