Contiki协议栈Rime:广播ibc

1 概述

广播的英文全称是identified broad cast,简称ibc。广播也是向本节点覆盖范围内的其它节点发送消息,但与匿名广播abc消息不同的是,ibc中携带了本发送节点的节点地址。
相关代码位于contiki/core/net/rime/broadcast.[ch]

2 相关定义

attributes

static const struct packetbuf_attrlist attributes[] =
  {
    BROADCAST_ATTRIBUTES PACKETBUF_ATTR_LAST
  };

其中,

#define BROADCAST_ATTRIBUTES  { PACKETBUF_ADDR_SENDER, PACKETBUF_ADDRSIZE }, \
                        ABC_ATTRIBUTES

与匿名广播的属性想比较,多了一个属性,其属性类型为PACKETBUF_ADDR_SENDER,即广播的发送节点的节点地址。其它节点接收到本广播消息后,通过解析包头,查看包属性,就可以知道是由哪个节点发送的消息。

struct broadcast_callbacks

struct broadcast_callbacks {
  /** Called when a packet has been received by the broadcast module. */
  void (* recv)(struct broadcast_conn *ptr, const linkaddr_t *sender);
  void (* sent)(struct broadcast_conn *ptr, int status, int num_tx);
};

与匿名广播的回调函数结构体完全类似。

struct broadcast_conn

struct broadcast_conn {
  struct abc_conn c;
  const struct broadcast_callbacks *u;
};

与匿名广播的连接定义完全类似,但是它的内部使用了一个匿名广播。我们一直在说,匿名广播是Rime协议栈中其它子协议的基础,从这里就可以看出来。

struct abc_callbacks broadcast

static const struct abc_callbacks broadcast = {recv_from_abc, sent_by_abc};

定义了一个匿名广播abc的回调函数结构体。在进行ibc广播时,将用这个结构体中的回调函数作为abc的回调函数。

3 相关函数

broadcast_open

void broadcast_open(struct broadcast_conn *c, uint16_t channel,
      const struct broadcast_callbacks *u)
{
  abc_open(&c->c, channel, &broadcast);
  c->u = u;
  channel_set_attributes(channel, attributes);
}

打开一个ibc广播。主要做了以下3件事儿:
第一,打开一个匿名广播abc,并设置abc的回调函数为broadcast中的回调函数
第二,设置ibc的回调函数
第三,设置通道属性

broadcast_close

void broadcast_close(struct broadcast_conn *c)
{
  abc_close(&c->c);
}

关闭一个ibc广播,其实就是关闭一个匿名广播abc。

broadcast_send

int broadcast_send(struct broadcast_conn *c)
{
  packetbuf_set_addr(PACKETBUF_ADDR_SENDER, &linkaddr_node_addr);
  return abc_send(&c->c);
}

发送一个广播消息,主要有两步:
第一,设置地址属性PACKETBUF_ADDR_SENDER,其中linkaddr_node_addr是本节点的节点地址
第二,调用abc的发送函数

sent_by_abc

static void
sent_by_abc(struct abc_conn *bc, int status, int num_tx)
{
  struct broadcast_conn *c = (struct broadcast_conn *)bc;

  if(c->u->sent) {
    c->u->sent(c, status, num_tx);
  }
}

recv_from_abc

static void recv_from_abc(struct abc_conn *bc)
{
  linkaddr_t sender;
  struct broadcast_conn *c = (struct broadcast_conn *)bc;

  linkaddr_copy(&sender, packetbuf_addr(PACKETBUF_ADDR_SENDER));

  if(c->u->recv) {
    c->u->recv(c, &sender);
  }
}

4 小结

ibc就是在abc的基础之上添加了一个发送地址的包属性,然后调用abc对应的接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值