contiki rime分层中怎样提高无线发射功率,有没有这个文件函数

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Rime协议(Cooja仿真+CC2538实测)(16)
四.标识广播broadcast
  broadcast源码文件:contiki-3.0/core/net/rime/broadcast.[c/h]。
  根据broadcast.h中的官方注释理解如下:标识广播模块将数据包发送给所有的本地邻居节点,这些节点都含有一个识别发送者的头标(header)。该模块增加了单跳发送者的地址作为一个数据包属性到传出的数据包,所有的Rime原语使用broadcast原语根据收到的数据包来识别发送方的地址。
4.1 broadcast相关定义
broadcast相关结构体:
struct broadcast_conn {
struct abc_
const struct broadcast_callbacks *u;
struct broadcast_callbacks {
void (* recv)(struct broadcast_conn *ptr, const linkaddr_t *sender);
void (* sent)(struct broadcast_conn *ptr, int status, int num_tx);
broadcast数据包相关属性:
#define BROADCAST_ATTRIBUTES
{ PACKETBUF_ADDR_SENDER, PACKETBUF_ADDRSIZE },ABC_ATTRIBUTES
static const struct packetbuf_attrlist attributes[]=
{BROADCAST_ATTRIBUTES
PACKETBUF_ATTR_LAST};
4.2 主要操作
4.2.1 回调函数
   用户自定义回调函数:由用户在使用broadcast时自己定义并调用,调用时封装在broadcast_callbacks里,即broadcast的回调类型。(详见4.3broadcast实例中的使用方法)
  系统回调函数为:接收回调recv_from_abc和发送回调sent_by_abc。调用系统回调函数时封装在abc_callbacks里,即abc的回调类型。具体代码如下:
static const struct abc_callbacks broadcast = {recv_from_abc, sent_by_abc};
static void recv_from_abc(struct abc_conn *bc){
struct broadcast_conn *c = (struct broadcast_conn *)
linkaddr_copy(&sender, packetbuf_addr(PACKETBUF_ADDR_SENDER));
PRINTF("%d.%d: broadcast: from %d.%d\n",
linkaddr_node_addr.u8[0],linkaddr_node_addr.u8[1],
sender.u8[0], sender.u8[1]);
if(c-&u-&recv) {
c-&u-&recv(c, &sender);
static void sent_by_abc(struct abc_conn *bc, int status, int num_tx){
struct broadcast_conn *c = (struct broadcast_conn *)
PRINTF("%d.%d: sent to %d.%d status %d num_tx %d\n",
linkaddr_node_addr.u8[0],linkaddr_node_addr.u8[1],
packetbuf_addr(PACKETBUF_ADDR_SENDER)-&u8[0],
packetbuf_addr(PACKETBUF_ADDR_SENDER)-&u8[1],
status, num_tx);
if(c-&u-&sent) {
c-&u-&sent(c, status, num_tx);
4.2.2 broadcast_open
void broadcast_open(struct broadcast_conn *c, uint16_t channel, const struct broadcast_callbacks *u){
abc_open(&c-&c, channel, &broadcast);
channel_set_attributes(channel, attributes);
4.2.3 broadcast_close
void broadcast_close(struct broadcast_conn *c){
abc_close(&c-&c);
4.2.4 broadcast_send
int broadcast_send(struct broadcast_conn *c){
PRINTF("%d.%d: broadcast_send\n",
linkaddr_node_addr.u8[0],linkaddr_node_addr.u8[1]);
packetbuf_set_addr(PACKETBUF_ADDR_SENDER, &linkaddr_node_addr);
return abc_send(&c-&c);
4.3 broadcast广播实例
4.3.1 官方实例源码
  利用两个节点相互发送并接收对方的数据:
#include "contiki.h"
#include "net/rime.h"
#include "random.h"
#include "dev/button-sensor.h"
#include "dev/leds.h"
#include &stdio.h&
PROCESS(example_broadcast_process, "Broadcast example");
AUTOSTART_PROCESSES(&example_broadcast_process);
static void broadcast_recv(struct broadcast_conn *c, const rimeaddr_t *from){
printf("broadcast message received from %d.%d: '%s'\n",
from-&u8[0], from-&u8[1], (char *)packetbuf_dataptr());
static const struct broadcast_callbacks broadcast_call = {broadcast_recv};
static struct broadcast_
PROCESS_THREAD(example_broadcast_process, ev, data)
static struct
PROCESS_EXITHANDLER(broadcast_close(&broadcast);)
PROCESS_BEGIN();
broadcast_open(&broadcast,129,&broadcast_call);
while(1) {
etimer_set(&et, CLOCK_SECOND * 4 + random_rand() % (CLOCK_SECOND * 4));
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
packetbuf_copyfrom("Hello", 6);
broadcast_send(&broadcast);
printf("broadcast message sent\n");
PROCESS_END();
4.3.2 Cooja仿真测试
  (1)在unicast.c中将调试信息打开,如图,将图中的0改为1:
  (2)利用Cooja仿真器仿真broadcast的结果如下,可以观察到节点每次收到数据时会识别出发送者的地址。仿真实验中主要根据节点接收和发送数据包时的输出信息来追踪打印这些输出信息的函数,从而清晰地认识broadcast的通信过程。
4.3.3 CC2538实测
  (1)在unicast.c中将调试信息关闭
  (2)利用CC2538节点实测broadcast,此处主要观察两个节点收发数据包的结果,结果如下:他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Contiki网络协议栈uIP和rime
时间: 09:16:25
&&&& 阅读:1142
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&低功耗无线传感器网络协议栈
Contiki系统内部集成了两种类型的无线传感器网络协议栈:uIP和Rime。uIP 是一个小型的符合RFC 规范的 TCP/IP 协议栈,使得 contiki 可以直接和Internet通信。uIP包含了IPv4 和 IPv6 两种协议栈版本,支持 TCP、UDP、ICMP等协议,但是编译时只能二选一,不可以同时使用。Rime 是一个轻量级为低功耗无线传感器网络设计的协议栈,该协议栈提供了大量的通信原语,能够实现从简单的一跳广播通信,到复杂的可靠多跳数据传输等通信功能。
下面这张图有待验证
uIP TCP/IP stack
uIP的TCP/IP协议栈是为能够在对内存具有严格要求的智能体和其他网络嵌入式设备运行而设计的。uIP的第一版在2001年9月发布,只有IPv4的通信功能,但在2008年思科系统扩充了uIP的IPv6功能,该uIPv6栈是第一个符合所有IPv6要求的。uIP的代码大小是几千字节,内存占用小于2KB。IPv6比IPv4要求略高。
uIP是一个简单好用的嵌入式网络协议栈,易于移植且消耗的内存空间较少,非常适合学习和使用。可以肯定的说uIP是嵌入式以太网学习的好起点,但不一定是终点。uIP的功能远不如LwIP强大,但两者并没有孰优孰劣之分,uIP和LwIP的作者同为Adam Dunkels,LwIP发布比uIP早一年的时间,uIP经过这几年的发展从IPV4迁移到IPV6,最终可以适用于无线传感网络。总的来说,uIP是一个很好的起点,学好uIP可以迁移到LwIP,也可以迁移到uIPV6。
Contiki 提供完整的 uIP 网络和低功耗无线网络协议栈。对于uIP 协议栈,一个轻量级的TCP/IP协议栈,实现了RFC定义的IPv4,IPv6。uIP很高效,只实现了协议要求的特性。例如整个协议栈只有一个buffer,用于接收和发送数据报。支持 IPv4 和 IPv6 两个版本,其中,IPv6 还包括 6Lowpan 适配层、ROLL RPL无线网络组网路由协议、CoRE/CoAP 应用层协议、还包括一些简化的 Web 工具,包括 Telnet、http 和 web
服务等。Contiki 还实现了无线传感器网络领域知名的MAC和路由层协议,其中 MAC 层包括 X-MAC、CX-MAC、NullMac、ContikiMAC、CSMA/CA、LPP 等,路由层包括 AODV、RPL等。
Application API
这里有两种方法使用uIP协议栈写程序:
·raw API:uIPraw API很适合实现一个简单的应用,例如一个简单的’echo’ server可以监听一些TCP端口并且将它收到的每个数据发送回去。然而当实现一个全功能的程序时编码变得越来越复杂,或者当多个程序需要共同使用时。甚至TCP连接状态机都有些烦人。
·protosocket API:protosocketlibrary利用 protothread library,提供一个更灵活的方式编写TCP/IP程序。这个库提供了一个类似于标准BSD sockets的接口,并允许在一个进程中编写程序。
Lower Layers
拥有一个有效的TCP/IP协议栈并且某些程序可以运行在其上当然很好,但是还不够。uIP协议栈要求一个更低的层(根据OSI模型)为了和peers通讯。我们将讨论两种类型的peers。
·节点(nodes):节点间通信是由无线连接实现的。uIP协议栈需要能够发送和接受数据包。取决于uIP版本,Contiki遵循不同的方法:
·1、当使用IPv6,Contiki将遵循route-over配置(RPL:低功耗有损网络的IPv6路由协议)。因此,uIP6使用一个被称为sicslowmac的简单MAC层。除了头部压缩由6loWPAN模型提供,它仅通过射频转发数据包。
2、对于IPv4(并不是IPv4),Contiki选用mesh-under配置。这由Rime通讯协议栈完成。Rime提供mesh routing和路由发现,因此uIP使用它来转发网络上的数据包。从IP point的角度来看,所有的传感器网络节点组成了一个本地子网,虽然multiple radio hops可能被要求。(这里的说法有待验证)
Rime stack
Rime协议栈提供一种递阶型无线网络协议,从简单的匿名广播到mesh网络路由。一个复杂的协议(比如multihop mesh routing)实现会被分解成若干部分,复杂的模块利用相对简单的模块来组成。
以下是对Rime不同模块的简述:
·abc:匿名广播,它仅通过射频驱动发送数据包和接收所有的数据包,并将他们送至上层;
·broadcast:标识广播,它为发出的数据包添加了发送者地址,然后传递给abc模块;
·unicast:这个模块添加给数据包添加一个目标地址,再传递给broadcast模块。在接收端,如果数据包的目标地址和当前节点地址不符,该数据包将为丢弃。
·stunicast:当要求发送数据包至某个节点,它将在给定的时间周期内反复发送,直到要求停止。
·runicast:可信单播,它使用stunicast模块发送数据包,并等待确认报文,收到后停止持续重发数据包。为了防止无限次发送,必须指定一个最大重发次数。
·polite和ipolite:这两个模块几乎相同,当一个数据包必须在给定的时间帧内被发送,模块在到达时间的一半时,检查是否收到的数据包与它准备发送的相同。如果收到了,这个数据包将不被发送,否则发送。这是一个有效的泛洪技术,可以避免没必要的重发。
·multihop:这个模块要求一个路由表功能,当将要发送数据时它会请求路由表提供下一跳,并且使用unicast发送。当它收到一个数据包,如果本身即为目标节点就将数据包传至上层,否则再次请求路由表提供下一跳并转发。标签:&&&&&&&&&&&&原文地址:http://blog.csdn.net/frank_jb/article/details/
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 无线发射功率 的文章

 

随机推荐