Chinaunix首页 | 论坛 | 博客
  • 博客访问: 141154
  • 博文数量: 36
  • 博客积分: 465
  • 博客等级: 下士
  • 技术积分: 399
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-27 15:55
文章分类

全部博文(36)

文章存档

2014年(2)

2013年(16)

2012年(18)

分类: IT业界

2012-12-21 21:31:55

    最近一个月吧,都在编写一个很简单的TinyOS采集节点的RSSI值的程序。最初也只是要得到节点的RSSI值,然后根据值的变化来做一个简单的有没有人穿过的探测。这么简单的问题之所以折腾了这么久是因为不熟悉TinyOS编程。
    探测主要是一个发送节点,一个接收节点。理论上是有人穿过这两个节点之间的时候,接收节点收到的RSSI值是发生变化的,一次作为有没有人的判断依据。
TinyOS 1.x的版本没有RSSI的Demo,貌似2.x的版本有个可以直接用的例程。
    这个程序之所以编的如此让人想吐是因为不知道使用何指令从硬件获得rssi,是我自己想不开啊,一直纠结这个问题,中间走了弯路,好多RSSI的获得都是使用getRssi()这条指令,我个人理解,这条指令是从一个数据包获得RSSI值,这就需要得到数据包,比如:发射节点发过来的数据包,但它里面携带的RSSI值是发射时候的RSSI值还是在接收节点进行完CRC校验后加上去的。这是问题的关键。解决这个疑惑的要点在于MAC层数据包的形成。理论上讲,MAC层数据帧最后两个字节在发送状态下是携带CRC校验码,在接收状态下是携带一字节的RSSI值,一位的CRC校验结果和7位的链路质量值。其实吧,超级简单,就一句pongmsg->dest_rssi = msg->strength;
    后来参考了网上的例程,结合TinyOS 1.x中Pong这个例程,编写了自己的程序。
    定义了两个节点发送的数据,其实也就是TOS_Msg 的data, 将自己想发送的数据作为payload写入AM的标准数据包。头文件定义为PongMsg.h

点击(此处)折叠或打开

  1. enum
  2. {
  3.   AM_PONGMSG = 8,
  4. };

  5. typedef struct PongMsg
  6. {
  7.   uint16_t src;
  8.   uint8_t src_rssi;
  9.   uint8_t src_lqi;
  10.   uint16_t dest;
  11.   uint8_t dest_rssi;
  12.   uint8_t dest_lqi;
  13. } PongMsg_t;

  14. typedef struct PingMsg
  15. {
  16.   uint16_t src;
  17. } PingMsg_t;
然后编写发送节点的程序,主要是定时器到后,发送数据。

点击(此处)折叠或打开

  1. includes PongMsg;
  2. //includes Timer;

  3. module SndPongM
  4. {
  5.   provides interface StdControl;
  6.   //uses interface StdControl;
  7.   uses interface Timer;
  8.   uses interface SendMsg;
  9.   //uses interface ReceiveMsg;
  10.  // uses interface ReceiveMsg as PingMsg;
  11.   uses interface Leds;
  12. }
  13. implementation
  14. {
  15.   TOS_Msg m_msg;
  16.   TOS_MsgPtr p_msg;
  17.   PongMsg_t* pongmsg;
  18.   //int m_int;
  19.   //bool m_sending;

  20.   command result_t StdControl.init()
  21.   {
  22.     //m_int = 0;
  23.     //m_sending = FALSE;
  24.     pongmsg = (PongMsg_t*)m_msg.data;
  25.     p_msg = &m_msg;
  26.     call Leds.init();
  27.     return SUCCESS;
  28.   }

  29.   command result_t StdControl.start()
  30.   {
  31.     //if (TOS_LOCAL_ADDRESS == 1) {
  32.     call Timer.start(TIMER_REPEAT, 2000);//注释掉
  33.     //}
  34.    
  35.     return SUCCESS;
  36.   }

  37.   command result_t StdControl.stop()
  38.   {
  39.     return SUCCESS;
  40.   }

  41.   event result_t Timer.fired()
  42.   {
  43.       call Leds.redToggle();
  44.       //call ReceiveMsg.receive( TOS_MsgPtr msg );
  45.         pongmsg->src = TOS_LOCAL_ADDRESS;
  46.         pongmsg->src_rssi =127;
  47.         pongmsg->src_lqi = 0;
  48.         pongmsg->dest =TOS_BCAST_ADDR;
  49.         pongmsg->dest_rssi = 0;
  50.         pongmsg->dest_lqi = 0;
  51.       call SendMsg.send(TOS_BCAST_ADDR, sizeof(PongMsg_t), p_msg);
  52.       call Leds.yellowToggle();
  53.     return SUCCESS;
  54.   }

  55.   event result_t SendMsg.sendDone( TOS_MsgPtr msg, result_t success )
  56.   {
  57.     return SUCCESS;
  58.   }
  59.   }

接收节点,定时器到后,接收数据,继而将本节点的rssi写入数据负载,转发给串口,这样就可以从串口读到所需数据了
点击(此处)折叠或打开
  1. includes PongMsg;
  2. //includes Timer;

  3. module RcvPongM
  4. {
  5.   provides interface StdControl;
  6.   //uses interface StdControl;
  7.   uses
  8.   {
  9.    interface Timer;
  10.    interface SendMsg;
  11.    interface ReceiveMsg;
  12.  // uses interface ReceiveMsg as PingMsg;
  13.    interface Leds;
  14.    }
  15. }
  16. implementation
  17. {
  18.   TOS_Msg m_msg;
  19.   TOS_MsgPtr p_msg;
  20.   PongMsg_t* pongmsg;
  21.   //int m_int;
  22.   //bool m_sending;

  23.   command result_t StdControl.init()
  24.   {
  25.     //m_int = 0;
  26.     //m_sending = FALSE;
  27.     pongmsg = (PongMsg_t*)m_msg.data;
  28.     p_msg = &m_msg;
  29.     call Leds.init();
  30.     return SUCCESS;
  31.   }

  32.   command result_t StdControl.start()
  33.   {
  34.     //if (TOS_LOCAL_ADDRESS == 1) {
  35.     call Timer.start(TIMER_REPEAT, 2000);//注释掉
  36.     //}
  37.    
  38.     return SUCCESS;
  39.   }

  40.   command result_t StdControl.stop()
  41.   {
  42.     call Timer.stop();
  43.     return SUCCESS;
  44.   }

  45.   event result_t Timer.fired()
  46.   {
  47.       call Leds.redToggle();
  48.       //post task receive;// ReceiveMsg.receive( TOS_MsgPtr msg ); //需要修改 event事件不能call
  49.       pongmsg-> src=TOS_LOCAL_ADDRESS;
  50.      if( call SendMsg.send(TOS_UART_ADDR, sizeof(PongMsg_t), p_msg))
  51.      {
  52.       call Leds.yellowToggle();
  53.       }
  54.     return SUCCESS;
  55.   }

  56.   event result_t SendMsg.sendDone( TOS_MsgPtr msg, result_t success )
  57.   {
  58.     return SUCCESS;
  59.   }

  60.   event TOS_MsgPtr ReceiveMsg.receive( TOS_MsgPtr msg )
  61.   {
  62.     PongMsg_t* _pongmsg;
  63.     call Leds.greenToggle();
  64.     _pongmsg = (PongMsg_t*)msg->data;
  65.     
  66.         pongmsg->src = _pongmsg->src;
  67.         pongmsg->src_rssi = _pongmsg->src_rssi;
  68.         pongmsg->src_lqi = _pongmsg->src_lqi;
  69.         pongmsg->dest = _pongmsg->dest;
  70.         pongmsg->dest_rssi = msg->strength;
  71.         pongmsg->dest_lqi = msg->lqi;
  72.    
  73.     return msg;
  74.   }
  75.  }


阅读(1195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~