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