⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sensor-query.cc

📁 柯老师网站上找到的
💻 CC
字号:
extern "C" {#include <stdarg.h>#include <float.h>};#include "sensor-query.h"#include "landmark.h"#include <random.h>#define CONST_INTERVAL 30static class SensorQueryClass:public TclClass{  public:  SensorQueryClass ():TclClass ("Agent/SensorQuery")  {  }  TclObject *create (int, const char *const *)  {    return (new SensorQueryAgent ());  }} class_sensor_query;void SensorQueryAgent::trace (char *fmt,...){  va_list ap; // Define a variable ap that will refer to each argument in turn  if (!tracetarget_)    return;  // Initializes ap to first argument  va_start (ap, fmt);   // Prints the elements in turn  vsprintf (tracetarget_->buffer (), fmt, ap);   tracetarget_->dump ();  // Does the necessary clean-up before returning  va_end (ap); }voidSensorQueryAgent::stop(){  trace("Node %d: SensorQueryAgent going down at time %f",myaddr_,NOW);  // Event id > 0 implies presence on the event queue  if(gen_query_event_->uid_) {    Scheduler &s = Scheduler::instance();    s.cancel(gen_query_event_);  }  node_dead_ = 1;}int SensorQueryAgent::command (int argc, const char *const *argv){  if (argc == 2)    {      if (strcmp (argv[1], "start") == 0)        {          startUp();          return (TCL_OK);        }      if (strcmp (argv[1], "stop") == 0)	{	  stop();	  return (TCL_OK);	}      if (strcmp (argv[1], "generate-query") == 0)        {          generate_query(-1,-1,-1);          return (TCL_OK);        }    }  else if (argc == 3)    {      if (strcasecmp (argv[1], "tracetarget") == 0)        {          TclObject *obj;	  if ((obj = TclObject::lookup (argv[2])) == 0)            {              fprintf (stderr, "%s: %s lookup of %s failed\n", __FILE__, argv[1],                       argv[2]);              return TCL_ERROR;            }          tracetarget_ = (Trace *) obj;          return TCL_OK;        }      else if (strcasecmp (argv[1], "addr") == 0) {        int temp;        temp = Address::instance().str2addr(argv[2]);        myaddr_ = temp;        return TCL_OK;      }      else if (strcasecmp (argv[1], "attach-tag-dbase") == 0)        {          TclObject *obj;          if ((obj = TclObject::lookup (argv[2])) == 0)            {              fprintf (stderr, "%s: %s lookup of %s failed\n", __FILE__, argv[1],                       argv[2]);              return TCL_ERROR;            }          tag_dbase_ = (tags_database *) obj;          return TCL_OK;        }    }  else if (argc == 5) {    if (strcmp (argv[1], "generate-query") == 0)      {	int p1 = atoi(argv[2]);	int p2 = atoi(argv[3]);	int p3 = atoi(argv[4]);	generate_query(p1,p2,p3);	return (TCL_OK);      }  }    return (Agent::command (argc, argv));}voidSensorQueryAgent::startUp(){  //  Scheduler &s = Scheduler::instance();  //  double sched_time = CONST_INTERVAL + Random::uniform(query_interval_);  //  trace("Node %d: Scheduling query gen at %f from now %f",myaddr_,sched_time,s.clock());  //  s.schedule(query_handler_, gen_query_event_, Random::uniform(query_interval_));  trace("Node %d: SensorQueryAgent starting up at time %f",myaddr_,NOW);  node_dead_ = 0;}//void//SensorQueryAgent::handle(Event *) {//  Scheduler &s = Scheduler::instance();//  generate_query();//  double sched_time = Random::uniform(query_interval_);//  trace("Node %d: Scheduling query gen at %f from now %f",myaddr_,sched_time,s.clock());//  s.schedule(this, gen_query_event_, Random::uniform(query_interval_));//}voidSensorQueryAgent::generate_query(int p1, int p2, int p3){  Packet *p = allocpkt();  hdr_ip *iph = (hdr_ip *) p->access(off_ip_);  hdr_cmn *hdrc = HDR_CMN(p);  unsigned char *walk;  Scheduler &s = Scheduler::instance();  int obj_name;  int next_hop_level = 0, num_src_hops = 0;  int X = 65000, Y = 65000;  int action = QUERY_PKT;  if(node_dead_) {    trace("Node %d: node failed, cannot generate query");    return;  }  // Need to ask our routing module to direct the packet  hdrc->next_hop_ = myaddr_;  hdrc->addr_type_ = NS_AF_INET;  iph->daddr() = myaddr_;  iph->dport() = ROUTER_PORT;  iph->ttl_ = 300;   // since only 300 ids in source route in packet  iph->saddr() = myaddr_;  iph->sport() = 0;  // LM agent checks if the source port is 0 to identify a query packet    // 2 bytes each for X and Y co-ords  // 1 byte for level - used in next hop lookup  // 4 bytes for object name; 2 byte for number of hops in src route  // 4 bytes for origin_time  // 90 bytes to store 30 source route ids and their levels (1 byte each)  // (assuming max_levels = 15)   p->allocdata(105);  walk = p->accessdata();  (*walk++) = action & 0xFF;  // X coord = 65000 initially  (*walk++) = (X >> 8) & 0xFF;  (*walk++) = X & 0xFF;  // Y coord = 65000 initially  (*walk++) = (Y >> 8) & 0xFF;  (*walk++) = Y & 0xFF;  // Indicates next hop level  (*walk++) = next_hop_level & 0xFF;  if(p1 != -1 && p2 != -1 && p3 != -1)    obj_name = (int) ((p1 * pow(2,24)) + (p2 * pow(2,16)) + p3) ;  else    obj_name = tag_dbase_->get_random_tag();  //  p1 = Random::integer(10);  //  p2 = Random::integer(10);  //  p3 = Random::integer(50);  (*walk++) = (obj_name >> 24) & 0xFF;  (*walk++) = (obj_name >> 16) & 0xFF;  (*walk++) = (obj_name >> 8) & 0xFF;  (*walk++) = (obj_name) & 0xFF;  double now = Scheduler::instance().clock();  trace("Node %d: Generating query for object %d.%d.%d at time %f",myaddr_,(obj_name >> 24) & 0xFF,(obj_name >> 16) & 0xFF, obj_name & 0xFFFF,now);    int origin_time = (int) now;  (*walk++) = (origin_time >> 24) & 0xFF;  (*walk++) = (origin_time >> 16) & 0xFF;  (*walk++) = (origin_time >> 8) & 0xFF;  (*walk++) = (origin_time) & 0xFF;  // Number of source route hops in packet (= 0); 2 bytes  (*walk++) = (num_src_hops >> 8) & 0xFF;  (*walk++) = (num_src_hops) & 0xFF;  // Above fields will be 4 bytes each. 20 bytes for the IP header will be  // added in LM agent. No source route hops on query creation.  hdrc->size_ = 24;   hdrc->direction() = hdr_cmn::DOWN;  s.schedule(target_,p,0);  //  double sched_time = CONST_INTERVAL + Random::uniform(query_interval_);  //  trace("Node %d: Scheduling query gen at %f from now %f",myaddr_,sched_time,s.clock());  //  s.schedule(query_handler_, gen_query_event_, sched_time);  //  s.schedule(this, gen_query_event_, Random::uniform(query_interval_));}voidSensorQueryAgent::recv(Packet *p, Handler *){  unsigned char *walk = p->accessdata();  int X = 0, Y = 0, obj_name = -1;  if(node_dead_) {    Packet::free(p);    return;  }  ++walk;  X = *walk++;  X = (X << 8) | *walk++;  Y = *walk++;  Y = (Y << 8) | *walk++;    ++walk;  obj_name = *walk++;  obj_name = (obj_name << 8) | *walk++;  obj_name = (obj_name << 8) | *walk++;  obj_name = (obj_name << 8) | *walk++;  double now = Scheduler::instance().clock();  trace("Node %d: SensorQueryAgent Found object %d.%d.%d at (%d,%d) at time %f", myaddr_, (obj_name >> 24) & 0xFF, (obj_name >> 16) & 0xFF, obj_name & 0xFFFF,X,Y,now);  Packet::free(p);}SensorQueryAgent::SensorQueryAgent() : Agent(PT_MESSAGE) {     query_interval_ = 120;    gen_query_event_ = new Event;    query_handler_ = new SensorQueryHandler(this);    node_dead_ = 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -