传感器网络中传感器节点广播物理环境信息(由ping.cc改造),可用cbr等application进行发包控制:
#include "environRoutingAgent.h"
int hdr_environRouting::offset_;
static class environRoutingHeaderClass : public PacketHeaderClass {
public:
environRoutingHeaderClass() : PacketHeaderClass("PacketHeader/EnvironRouting",
sizeof(hdr_environRouting)) {
bind_offset(&hdr_environRouting::offset_);
}
} class_environRoutinghdr;
static class environRoutingClass : public TclClass {
public:
environRoutingClass() : TclClass("Agent/EnvironRouting") {}
TclObject* create(int, const char*const*) {
return (new environRoutingAgent());
}
} class_environRouting;
environRoutingAgent::environRoutingAgent() : Agent(PT_Environment), seq(0), oneway(0)
{
bind("packetSize_", &size_);
}
void
environRoutingAgent::sendmsg(int nbytes, AppData * data, const char * flags)
{
Packet *p;
int n;
assert(size_>0);
n=nbytes/size_;
if(nbytes==-1) {
printf("Error: sendmsg() for EnvironRoutingAgent should not be -1\n");
return;
}
if(data&&nbytes>size_){
printf("Error: data greater tahn maximum EnvironRouting packet size\n");
return;
}
while(n-->0) {
p=allocpkt();
hdr_ip* iph = HDR_IP(p);
hdr_environRouting* ph = hdr_environRouting::access(p);
iph->daddr() = IP_BROADCAST; //设置目的节点为广播目的地址255
iph->dport() = iph->sport();
iph->ttl_ = 1; //设置跳数为1
ph->ret = 0;
send(p, (Handler*) 0);
}
n = nbytes % size_;
if (n > 0) {
p = allocpkt();
hdr_ip* iph = HDR_IP(p);
hdr_environRouting* ph = hdr_environRouting::access(p);
iph->daddr() = IP_BROADCAST;
iph->dport() = iph->sport();
iph->ttl_ = 1;
ph->ret = 0;
send(p, (Handler*) 0);
}
idle();
}
int environRoutingAgent::command(int argc, const char*const* argv)
{
if (argc == 4) {
if (strcmp(argv[1], "send") == 0) {
PacketData* data = new PacketData(1 + strlen(argv[3]));
strcpy((char*)data->data(), argv[3]);
sendmsg(atoi(argv[2]), data);
return (TCL_OK);
}
} else if (argc == 5) {
if (strcmp(argv[1], "sendmsg") == 0) {
PacketData* data = new PacketData(1 + strlen(argv[3]));
strcpy((char*)data->data(), argv[3]);
sendmsg(atoi(argv[2]), data, argv[4]);
return (TCL_OK);
}
}
// If the command hasn't been processed by PingAgent()::command,
// call the command() function for the base class
return (Agent::command(argc, argv));
}