Rime协议学习笔记:(二)主要数据结构(2)
来源:互联网 发布:linux 查看系统空间 编辑:程序博客网 时间:2024/05/29 09:14
上接博文《Rime协议学习笔记:(二)主要数据结构(1)》:http://blog.csdn.net/u012325020/article/details/53267535
3. 通道channel
表示通道的库:channel;位置:\core\net\rime channel.h channel.c
3.1 channel定义
struct channel { struct channel *next;//指向下一个channel,即会构成一个channel链表 uint16_t channelno;//标识channel的channel号(16位int) const struct packetbuf_attrlist *attrlist;// struct packetbuf_attrlist { uint8_t type; uint8_t len;};结构体数组??? uint8_t hdrsize;//数据报报头大小};
3.2 主要操作
/*①channel_init:初始化channel_list*/void channel_init(void){ list_init(channel_list); //void list_init(list_t list){ *list = NULL;} 初始化channel_list链表}
/*②channel_open:打开一个通道c*/void channel_open(struct channel *c, uint16_t channelno){ c->channelno = channelno;//设置一个通道号 list_add(channel_list, c);//将通道c添加到channel_list的末尾}
/*③channel_close:关闭一个通道c,将其从channel_list中删除*/void channel_close(struct channel *c){ list_remove(channel_list, c);}
/*④channel_lookup:通过一个通道号channelno 查找对应的通道,获得该通道的指针*/struct channel *channel_lookup(uint16_t channelno){ struct channel *c; for(c = list_head(channel_list); c != NULL; c = list_item_next(c)) { if(c->channelno == channelno) { return c; } } return NULL;}
/*⑤channel_set_attributes:先利用channel_lookup查找到对应通道,再设置通道的属性*/void channel_set_attributes(uint16_t channelno,const struct packetbuf_attrlist attrlist[]){ struct channel *c; c = channel_lookup(channelno); if(c != NULL) { c->attrlist = attrlist;//设置attrlist成员变量 c->hdrsize = chameleon_hdrsize(attrlist);//设置hdrsize成员变量 }}
4. Chameleon
库:Chameleon;位置:\core\net\rime chameleon.h chameleon.c
Chameleon的直译意思为“变色龙”,Chameleon是Rime协议的包头处理模块,在论文AnAdaptive Communication Architecture for Wireless Sensor中对Chameleon的解释如下图,各应用程序和网络协议运行在Rime协议栈的上层,而Rime的输出被Chameleon模块转换成不同的底层协议。(个人认为这便是Chameleon名字的含义)
4.1 channel定义
struct chameleon_module { struct channel *(* input)(void);//解析协议头 int (* output)(struct channel *);//包装协议头 int (* hdrsize)(const struct packetbuf_attrlist *);//计算协议头尺寸};
4.1 主要操作
/*①chameleon_init:初始化Chameleon*/void chameleon_init(void){ channel_init();//实际上初始化信道链表}
/*②chameleon_parse:*/struct channel * chameleon_parse(void){ struct channel *c = NULL; c = CHAMELEON_MODULE.input(); if(c != NULL) { packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c->channelno); } return c;}
/*③chameleon_create:*/int chameleon_create(struct channel *c){ int ret; ret = CHAMELEON_MODULE.output(c); packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c->channelno); if(ret) { return 1; } return 0;}
/*④chameleon_hdrsize:计算包头的大小*/int chameleon_hdrsize(const struct packetbuf_attrlist attrlist[]){ return CHAMELEON_MODULE.hdrsize(attrlist);}
0 0
- Rime协议学习笔记:(二)主要数据结构(2)
- Rime协议学习笔记:(一)Rime协议概述
- Rime协议学习笔记:(三)匿名广播abc
- Rime协议学习笔记:(四)标识广播broadcast
- Rime协议学习笔记:(五)单播unicast
- Rime协议学习笔记:(六)顽固单播stunicast
- Rime协议学习笔记:(七)可靠单播runicast
- Rime协议学习笔记:(八)可靠单播块传输rucb
- Rime协议学习笔记:(九)单跳单播小结
- Rime协议学习笔记:(十)polite广播
- Rime协议学习笔记:(十一)ipolite广播
- Rime协议学习笔记:(十二)netflood洪泛技术
- Rime协议学习笔记:(十三)route discovery路由发现
- Rime协议学习笔记:(十五)mesh网络
- 学习笔记-Python主要数据结构
- Rime协议栈概述及学习资料
- 数据结构学习笔记(二)
- 数据结构学习笔记(二)
- Socket通信介绍
- linux下Samba服务器搭建
- 从tflearn Example中学习CNN(1)
- 802.16的Mesh模式调度架构特点
- linux 开源规范软件开发入门
- Rime协议学习笔记:(二)主要数据结构(2)
- 《精通正则表达式》--开篇笔记
- Java图形界面事件处理与MFC的对比
- 微信公众号开发---获取用户地理位置
- oracle11.g安装未找到文件问题
- WinEdt 使用指南
- 笔记
- 7 步精简 Docker 镜像几百MB(上)
- Linear Algebra - Lesson 18. 行列式及其性质