# RadioStarNetwork **Repository Path**: aric_chen/RadioStarNetwork ## Basic Information - **Project Name**: RadioStarNetwork - **Description**: 2.4G 私有协议星型组网 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-12 - **Last Updated**: 2023-11-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RadioStarNetwork #### 介绍 2.4G 私有协议星型组网,借助BLE通信的一些基本概念(连接,应答机制,跳频等),针对星型网络进行优化。 #### 软件架构 软件架构说明: 软件主要分两种设备角色: 主机和从节点。 #### 交互时序 ![交互时序图](./doc/sequential.png) 不管从机还是主机,按照划分的时间片进行收发数据操作,时间片的大小由宏定义RADIO_TIME_UNIT的数值决定。默认为409,则每个时间片的大小约为:409 x 2.44140625 us = 998.53515625 us Master会周期地执行如下操作。 1. 发送广播 2. 发送命令包 从节点在没有同步上Master时,会周期地扫描空中的广播包。 当从节点扫描到匹配的广播包时,发发起连接。 ##### 一个典型的连接建立过程如下: 1. Master发送广播包, 在此时,从节点扫描到这个广播包,检测符合建立连接的条件。 2. 从节点在Back-To-Back时间后,发送发起连接的数据包,在同时,Master打开它的接收窗口,收到从节点的这个发起连接的数据包。 3. Master在收到发起连接数据包后,分配一个连接的Handle(也是节点的编号)和会携带自身数据包的序号(cur_event_num),然后回复确认连接数据包发送给从机。到此时,连接过程建立,如果上述过程有任意一个包丢失,则连接失败,需要重新发起连接流程。 通信发送命令的流程如下: 在数据信道上发送命令的前提是已经建立了连接(即:从节点已经同步上了主机的时序,并且获得了主机分配的节点编号。) 1. 主机在广播包刚开始发送时刻的3个时间片后的时刻发送。由于从节点在连接连接的时候,获得了主机的cur_event_num以及分发的连接的Handle,则从节点可以计算出主机发送命令包时的信道。 2. 从机可以在接收完主机的命令后的Handle个时间片后,发送自己的数据给主机。主机默认每次扫描所有的从节点时间片发送的数据。 ##### 应答机制: 发送数据时看: NESN是否等于自身SN, 是,发送旧数据, 否,发送新数据 接收数据时看: SN是否等于自身下一个期待的数据 是,接收新数据 否,忽略旧数据 #### 为什么需要内存管理: 站在CPU的视角来看,收发数据的第一现场是在中断中。当Radio处理完数据(接收完或者发送完),通过中断(BLE_TX_RX_IRQHandler)告知CPU。 为了方便用户开发操作,SDK中将CPU与Radio的交互抽象为一个一个ActionPacket来进行。中断的处理有着严格的时序要求。主要分为两部分,一部分为ConditionRoutine,另一部分为DataRoutine. CondictionRoutine主要处理决定运行下一个ActionPacket和进行一些RF相关的设置。 而DataRoutine中需要将收到的数据准备处理,如果下一个数据包是发送数据包,还需要准备发送的数据。 在这个DataRoutine中,需要在70us内完成, 如果Back-To-Back时间设置为150us,则CondictionRoutine大概运行执行的时间有80us. 一个memcpy() 100个字节大概会占用40us,如果收到数据后每次memcpy到新的内存中, 将很可能导致数据处理不过来。 因此而来,需要一个高效申请内存和释放内存的的内存管理机制。 详细实现见 mem_mng.c #### 特性 1. 支持多节点星型组网。默认设置为60个节点,支持更改节点数.理论支持200个节点,默认设置为60个节点。 2. 高效的通信,连接间隔与节点数目相关,默认60个节点连接间隔为64ms, 仍然存在很大的优化空间。 3. 高实时性的内存管理 #### 软件分层 1. Radio控制底层 (master_ctl.c 或 slave_ctl.c) 2. Radio控制和应用交互中间层 (app_master_ctl.c 或 app_slave_ctl.c) 3. 应用层(未实现) Radio控制底层 主要实现Radio底层的控制,特别是Radio交互完的CPU需要执行的中断处理。 中断与Radio控制和应用交互中间层主要通过下面这三个消息队列进行交互通信。 ```c++ queue_msg_t *pctl; // Radio控制和应用交互中间层----->Radio控制底层 queue_msg_t *pctlrsp; // Radio控制底层(中断) -------> Radio控制和应用交互中间层 queue_msg_t *preport; // Radio控制底层(中断) -------> Radio控制和应用交互中间层 ``` module.c : 实现软件模块管理 cassert.c: 实现串口异步打印 qmsg.c: 实现消息队列 mac_mng: 实现MAC地址的管理