RIME协议栈解读

news2024/7/6 19:17:48

// 新坑–contiki

rime简介

rime类似于TCP/IP协议栈,属于分层结构。图片来自Adam Dunkels本人的rime论文介绍。
rime

  • abc为anonymous broadcast,匿名广播。即将数据包通过无线射频驱动(radio driver)发出去,接收来自无线射频驱动所有的包并交给上层。

  • ibc为identified sender best-effort broadcast,将下层传来的数据包添加一个发送者身份头部——使用数组形式。

  • uc为unicast abstraction,将上层的数据包添加一个接收者头部。

  • suc为Stubborn transmission。可靠通信就由这两层实现:Stubborn transmission、Reliable transmission。
    Stubborn transmission层在给定的时间间隔、最大重发次数后不断地重发数据包。
    Reliable communication层主要实现确认和序列功能,确认来自Stubborn transmission层的数据。

  • Bulk transfer为块传输层。该层有实现了单跳单播、单跳广播、多跳的包。

两个节点之间的通信图:
nodes

数据包格式

数据包格式如下:
packetbuf

数据包头部header

rime协议为了解决不同网络协议头部不兼容的问题,设计出了无头部数据包。
见packetbuf.h,该文件定义了数据包头部的基本格式。

struct packetbuf_attrlist
{
  uint8_t type;
  uint8_t len;
};

数据包数据data

Rime缓冲区存放数据包属性(header)和应用数据(data)。大小是这两部分的和,Rime缓冲区由静态全局变量packetbuf定义。

static uint16_t packetbuf_aligned[(PACKETBUF_SIZE + PACKETBUF_HDR_SIZE)/2+1];  // PACKETBUF_SIZE默认大小是128字节
static uint8_t *packetbuf = (uint8_t*)packetbuf_aligned;      				   // 确保了即使在16位边界 (如MSP430) 也能对齐

数据包操作API

源自packetbuf.h,用于操作数据缓存

// Clear and reset the packetbuf
void packetbuf_clear(void);
// Get a pointer to the data in the packetbuf
void *packetbuf_dataptr(void);
// Get a pointer to the header in the packetbuf, for outbound packets
void *packetbuf_hdrptr(void);
// Get the length of the header in the packetbuf
uint8_t packetbuf_hdrlen(void);
// Get the length of the data in the packetbuf
uint16_t packetbuf_datalen(void);
// Get the total length of the header and data in the packetbuf
uint16_t packetbuf_totlen(void);
// Get the total length of the remaining space in the packetbuf
uint16_t packetbuf_remaininglen(void);
// Set the length of the data in the packetbuf
void packetbuf_set_datalen(uint16_t len);
// Compact the packetbuf
void packetbuf_compact(void);
// Copy from external data into the packetbuf
int packetbuf_copyfrom(const void *from, uint16_t len);
// Copy the entire packetbuf to an external buffer
int packetbuf_copyto(void *to);
// Extend the header of the packetbuf, for outbound packets
int packetbuf_hdralloc(int size);
// Reduce the header in the packetbuf, for incoming packets
int packetbuf_hdrreduce(int size);

rucb解析

此章仅单独研究rubc单跳单播协议。

建立连接

依次调用rucb_open() --> runicast_open() --> stunicast_open() --> unicast_open() --> broadcast_open() --> abc_open() --> channel_open()

发送数据包

struct rucb_conn {                     // rucb_conn为rubc协议的存储连接信息的结构体
  struct runicast_conn c;              // 链式结构
  const struct rucb_callbacks *u;      // 回调函数,每一层的连接信息结构体都有对应的callback
  linkaddr_t receiver, sender;         // 接收器、发送器
  uint16_t chunk;					   // 通道序号,只有0和1两个值。当前为0,next为1
  uint8_t last_seqno;
  int last_size;
};
int rucb_send(struct rucb_conn *c, const linkaddr_t *receiver)
{
  c->chunk = 0;  					                 // chunk置为0,表示当前正在运行
  read_data(c);										 // 调用read_chunk()
  linkaddr_copy(&c->receiver, receiver);             // 调用memcpy(dest, src),完善c属性
  linkaddr_copy(&c->sender, &linkaddr_node_addr);
  runicast_send(&c->c, receiver, MAX_TRANSMISSIONS);  // 调用runicast的send方法
  return 0;
}
int runicast_send(struct runicast_conn *c, const linkaddr_t *receiver, uint8_t max_retransmissions)
{
	...
	packetbuf_set_attr(PACKETBUF_ATTR_RELIABLE, 1);	// packetbuf_attrs[PACKETBUF_ATTR_RELIABLE].val = 1;					
  	packetbuf_set_attr(PACKETBUF_ATTR_PACKET_TYPE, PACKETBUF_ATTR_PACKET_TYPE_DATA);
  	packetbuf_set_attr(PACKETBUF_ATTR_PACKET_ID, c->sndnxt);
  	packetbuf_set_attr(PACKETBUF_ATTR_MAX_MAC_TRANSMISSIONS, 3);
  	...
  	stunicast_send_stubborn(&c->c, receiver, REXMIT_TIME);
  	...
}      

后面同理,一边向下层传递,一边设置头数组。最后由链路层调用send()方法发送
stunicast_send_stubborn() --> unicast_send() --> broadcast_send() --> abc_send() --> rime_output() --> NETSTACK_LLSEC.send()

最后完整的数据包头数组格式如下:
在这里插入图片描述
头数组type类型为enum:

enum
{
  PACKETBUF_ATTR_NONE,
  /* Scope 0 attributes: used only on the local node. */
  PACKETBUF_ATTR_CHANNEL,
  PACKETBUF_ATTR_NETWORK_ID,
  PACKETBUF_ATTR_LINK_QUALITY,
  PACKETBUF_ATTR_RSSI,
  PACKETBUF_ATTR_TIMESTAMP,
  PACKETBUF_ATTR_RADIO_TXPOWER,
  PACKETBUF_ATTR_LISTEN_TIME,
  PACKETBUF_ATTR_TRANSMIT_TIME,
  PACKETBUF_ATTR_MAX_MAC_TRANSMISSIONS,
  PACKETBUF_ATTR_MAC_SEQNO,
  PACKETBUF_ATTR_MAC_ACK,
  /* Scope 1 attributes: used between two neighbors only. */
  PACKETBUF_ATTR_RELIABLE,
  PACKETBUF_ATTR_PACKET_ID,
  PACKETBUF_ATTR_PACKET_TYPE,
  PACKETBUF_ATTR_REXMIT,
  PACKETBUF_ATTR_MAX_REXMIT,
  PACKETBUF_ATTR_NUM_REXMIT,
  PACKETBUF_ATTR_PENDING,
  /* Scope 2 attributes: used between end-to-end nodes. */
  PACKETBUF_ATTR_HOPS,
  PACKETBUF_ATTR_TTL,
  PACKETBUF_ATTR_EPACKET_ID,
  PACKETBUF_ATTR_EPACKET_TYPE,
  PACKETBUF_ATTR_ERELIABLE,
  /* These must be last */
  PACKETBUF_ADDR_SENDER,
  PACKETBUF_ADDR_RECEIVER,
  PACKETBUF_ADDR_ESENDER,
  PACKETBUF_ADDR_ERECEIVER,

  PACKETBUF_ATTR_MAX
};

接收数据包

相同方法,不做分析

callback

就像在发送数据中说的,callback作为每层连接结构体conn必有的成员变量回调结构体指向上一层的回调结构体,即接收到数据总是提交给上一层处理。
例如,在runicast_callbacks结构体中,分别映射到接收recv、确认acked、超时timedout函数(位于rubc.c)

struct runicast_callbacks
{
  void(*recv)(struct runicast_conn *c, const rimeaddr_t *from, uint8_t seqno);
  void(*sent)(struct runicast_conn *c, const rimeaddr_t *to, uint8_t retransmissions);
  void(*timedout)(struct runicast_conn *c, const rimeaddr_t *to, uint8_t retransmissions);
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四月成功上岸阿里,年后准备了两个月,要个21k应该不过分吧~

先说下我基本情况,本科不是计算机专业,现在是学通信,然后做图像处理,可能面试官看我不是科班出身没有问太多计算机相关的问题,因为第一次找工作,阿里的游戏专场又是最早开始的,就投递了&#xf…

[JAVA数据结构]希尔排序/缩小增量法

前置内容:[JAVA]直接插入排序_HY_PIGIE的博客-CSDN博客 希尔排序,是将一个数组分成多组,在每一个组内进行排序。每进行一次排序,组中的元素都会增多,组数减少。 在组内进行直接插入排序 组数以/2的形式减少 例入&#…

离散Markov Chain序列及可视化

离散Markov Chain序列及可视化 文章目录 离散Markov Chain序列及可视化[toc]1 天气预测2 赌徒问题 1 天气预测 假设仅存在三种天气:晴天、阴天和雨天,每种天气状态构成的系统满足(齐次)马氏链过程,即下一期的天气状态仅取决于当前的天气状态…

网络安全是什么?如何成为一位优秀的网络安全工程师?

网络安全是什么? 首先说一下什么是网络安全? 网络安全工程师工作内容具体有哪些? 网络安全是确保网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而受到破坏、更改、泄露,系统连续可靠正常地…

idea部署tomcat(偏小白向)

目录 一、环境部署 1.安装idea ultimate任意版本 2.java稳定的版本如: 3.apache-tomcat任意版本,需要考虑兼容性,大家可以百度一下 二、部署简单的javaweb环境 总结 1.第一个问题 2.第二个问题 一、环境部署 1.安装idea ultimate任意版本…

Debian 11安装mysql 5.7.41

Debian 11安装mysql 5.7.41 1、下载mysql安装包2、安装文档2.1、安装依赖包2.2、安装MySQL包2.2.1、预设值数据库参数2.2.2、安装MySQL包 2.3、文件安装位置 3、使用mysql 5.7.41 数据库3.1、命令行登录MySQL 5.7.41 数据库3.2、navicat连接mysql 5.7.41 数据库3.2.1、修改mysq…

UWB技术开发的定位系统源码,高精度人员定位系统源码,室内定位系统源码人员定位/车辆定位/物品定位/材料定位

UWB技术定位系统源码,高精度人员定位系统源码,智慧工厂人员定位系统源码,室内定位系统源码 技术架构:单体服务 硬件(UWB定位基站、卡牌) 开发语言:java 开发工具:idea 、VS Code…

操作系统:12 线程竞争与线程池

1 基本概念 ① 竞争与同步 同一个进程中的线程能够共享进程中的绝大多数资源,当他们随意竞争时可能会导致共享资源被破坏、脏数据、不完整、不一致等问题 通过一些方法让进程中的线程在竞争资源时相互协调,避免出现以上问题,这种手段就称为线…

5月11日作业

思维导图 作业: 作业1: 作业2: 作业3: 作业4: 作业5:

算法设计与分析:枚举和递推的运用

目录 第1关:双关系递推数列 任务描述 相关知识 枚举算法的两种框架 递推算法的实施步骤 问题求解思路 编程要求 测试说明 第1关:双关系递推数列 任务描述 本关任务:运用枚举和递推的基本思想,通过编程计算出双关系递推数…

grafana + influxdb + telegraf构建linux性能监控平台

为了更好的做性能测试过程中监控服务器资源,提供可视化效果,下面介绍一种监控方案: grafana influxdb telegraf , 构建linux性能监控平台 安装3个软件 1.Grafana安装 grafana , 访问各类数据源 , 自定义报表、显示图表等等 , 用于提供界…

微星 B360M MORTAR电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔) 硬件型号驱动情况 主板微星 B360M MORTAR 处理器英特尔 Core i5-9400 2.90GHz 六核已驱动 内存8 GB ( 金士顿 DDR4 2666MHz 8GB )已驱动 硬盘西数 WDS250G3X0C-00SJG0…

mysql高级语句(2)

and or 最左原则 create view视图表:虚拟表或存储查询 没有表结构存储查询语句的结果表 临时表在用户退出或同数据库连接断开就会小时,而视图表不会(就像定义个全局变量)保存的是定义 格式:create view “视图表名…

内测开始了!0penAI GGPT 图片功能、联网功能、音频功能、多模型功能、微调功能

联合两位大佬一起对gpt官方的接口做了整合。 有感兴趣的可以一起开发交流,下文有部分代码讲解。感兴趣的可以加入一起测试玩耍(文末有加入方式)~ 模型介绍 内测内容包括文字生成图片、图片生成图片、联网模式、模型定制、多角色设定等。 1…

mongodb用户权限配置

1.副本集 1.1在主节点创建管理员账号 /etc/mongodb/mongosh-1.8.1-linux-x64/bin/mongosh --port 27017 use admin db.createUser({user:"用户名",pwd:"密码",roles:["root"]}) 只要在主节点创建用户即可,从节点会自动同步数据 …

Verilog语法之generate (for、 if、 case)用法

文章目录 前言一、宏定义二、generate 方法1. generate-if 方法1. generate-case方法 三、小知识(语法模板) 前言 对于同一功能多种不同实现方法的模块代码如何整合到一起呢?当然每种方法作为一个单独的模块使用一个.v 文件保存肯定是没有问…

MySQL 高级(进阶) SQL 语句二

一、表连接查询 MYSQL数据库中的三种连接: inner join(内连接):只返回两个表中联结字段相等的行(有交集的值)left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录right join(右连接):…

区间合并(算法)

目录 题目代码实现注意点 题目 给定 n n n 个区间 [ l i , r i ] [l_i, r_i] [li​,ri​],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如: [ 1 , 3 ] [1,3] [1,3] 和 [ 2 , 6 ] [2,…

【利用AI让知识体系化】深入浅出HTTP(近2w字)

思维导图 文章目录 思维导图1. HTTP基础知识HTTP简介URI和URLHTTP的请求和响应 2. HTTP请求请求方法请求头请求体 3. HTTP响应响应状态码响应头响应体 4. Cookies和SessionCookies的原理和应用Session机制使用Cookies和Session进行用户认证 5. HTTP缓存缓存概述浏览器缓存服务器…

Tomcat源码:连接器与Executor、Connector

前文: 《Tomcat源码:启动类Bootstrap与Catalina的加载》 《Tomcat源码:容器的生命周期管理与事件监听》 《Tomcat源码:StandardServer与StandardService》 《Tomcat源码:Container接口》 《Tomcat源码&#xff1a…