Contiki协议栈Rime:广播ibc
来源:互联网 发布:买烟用什么软件 编辑:程序博客网 时间:2024/05/20 19:37
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 voidsent_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对应的接口。
0 0
- Contiki协议栈Rime:广播ibc
- Contiki协议栈Rime:实验ibc和abc相互通信
- Contiki协议栈Rime:匿名广播abc
- Contiki网络协议栈uIP和rime
- Contiki协议栈Rime:引子introduction
- Contiki协议栈Rime:包属性packetbuf_attr
- Contiki协议栈Rime:通道channel
- Contiki协议栈Rime:变色龙接口chameleon
- Contiki协议栈Rime: 节点链接地址linkaddr
- Contiki协议栈Rime:缓冲区管理packetbuf management
- Contiki协议栈Rime:原始变色龙chameleon-raw
- Contiki协议栈Rime:头部转换模块chameleon-bitopt
- contiki的rime协议分析-abc
- contiki的rime协议分析-channel
- rime协议栈简介
- Rime&Contiki Chameleon
- Rime 协议栈缓冲区 packetbuf
- Rime 协议栈地址 rimeaddr_t
- 几编有关证书、数据加密解密和签名的好文章
- JAVA设计模式(01_1):创建型-工厂模式【工厂方法模式】(Factory Method)
- bzoj1853【SCOI2010】幸运数字
- 1011. A+B和C (15)
- eclipse安装Genymotion插件
- Contiki协议栈Rime:广播ibc
- 容器就像骑摩托
- linux 下解压及创建 tar.xz
- Java byte数组与十六进制字符串互转
- 出现bug?同一段代码在不同项目中,一个执行成功,一个失败
- iOS中openURL用法
- ubuntu下文件压缩/解压缩命令总结
- Mysql 密码忘记了,呃呃呃
- Statement、PreparedStatement和CallableStatement区别