简单点对多点通信接口
注:函数库及例子见前文。
在许多应用场合,节点需要发送消息给另外一个节点。
在接收节点能够收到发送节点的信号的场合(不需要其它节点转发),可以使用modRf函数集进行通信。
简单通信接口采用回调机制,接口函数主要包括:
初始化接口:modRfInit();
消息发送接口:消息发送modRfSendPkt()、设置发送功率modRfSetTxPower;
消息接收接口:回调函数设置modRfSetRxCallback()、启动接收modRfStartRx();
基本概念
信道(channel)
CC2530使用2.4GHz的通信频段。它符合IEEE802.15.4规范,将频段划分为16个信道,信道序号从11到26。
两个节点需要工作在相同信道才能相互通信。
个域网ID(PanId)
PAN(Personal Area Network)表示若干节点组成的网络,PANID将工作在相同信道中的许多节点从逻辑上划分为多个集合,来自相同PANID的节点的消息才会交给应用层进行处理,来自不同PANID的消息将会被丢弃。
Panid这个概念来自IEEE802.15.4。
节点ID
zhMod库以节点ID为通信地址。本节点的ID作为源地址,目的节点的ID作为目的地址。
节点ID的长度为16比特,其中0xFFFF作为广播地址,因此一个PAN内最大的节点数目为65535个。
使用modRf函数集进行点对点通信需要预先知道对端节点的节点ID,节点ID由应用进行分配。
消息确认(ACK:Acknowledge)
消息确认机制是指消息发送方要求接收方在收到消息且消息无错误时需回送一条确认消息,发送方如果一段时间内没有收到确认消息,会重新发送原消息。
在使用了消息确认机制的情况下,接收方有可能收到多条相同的消息。
消息加密(Crypt/Encryption)
密钥:发送方和接收方都知道的一个字符串。
消息加密机制是指待发送的消息用密钥加密后再发送。
初始化
初始化过程包括射频通信接口初始化、接收回调函数初始化、可选的发送功率设置、启动接收。
射频通信接口初始化
射频通信接口初始化函数的定义为:
/**
* 射频初始化设置接口
* 输入参数:
* vNodeId: 本节点地址,取值范围:0-0xFFFE;0x0FFFF作为广播地址,不可以用;
* vPanId: 个域网网络ID,相同PanId的节点才可以相互通信;取值范围:0-0xFFFE;0x0FFFF暂不使用;
* vChannel: 射频信道ID,取值范围与物理层规范相关;
* vAckRequestFlag: 链路层消息确认标志,表示发送的分组是否需要对方发送确认消息,0为不需要,非0为需要;
* vSecurityFlag: 链路层加密标志,表示发送的分组是否需要加密,0为不需要,非0为需要,需要加密时vKey不能为0;
* vKey: 链路层加密密钥指针,指向密钥,密钥长度与实现机制相关,不需要加密时设为0;
*/
int8 modRfInit(uint16 vNodeId, uint16 vPanId, uint8 vChannel, uint8 vAckRequestFlag,
uint8 vSecurityFlag, uint8 *vKey);
注:
目前库函数实现未支持加密。
接收回调函数初始化
用户需要先声明和定义自己设计的收到消息后的处理函数:
int8 myRfRxCallback(uint16 vSourceId, uint16 vDestinationId, uint8 vSize, uint8* vPacket, int16 vRssi){
//应用特定的RF消息处理过程
}
该处理函数的函数名称可以自定,但输入参数类型、顺序和返回值类型都不能改变(参数名称可以改,但不建议改)。
然后调用modRfSetRxCallback()函数将自定的函数名称传给底层。
/**
* 设置接收分组回调函数接口
* 输入参数:
* vFunction: 用户设计的分组回调函数指针;
*/
int8 modRfSetRxCallback(modRfRxCallbackFunction* vFunction );
消息发送
modRfSendPkt()为阻塞式函数,即发送完成才返回。
/**
* 发送分组接口
* 输入参数:
* vDestinationId: 对端地址,取值范围:0-0xFFFF;0x0FFFF为广播;
* vSize: 发送的用户分组长度(字节数目),取值范围与物理层约束条件、链路层实现机制有关;
* vPacket: 用户分组指针,指向待发送的用户分组;
*/
int8 modRfSendPkt(uint16 vDestinationId, uint8 vSize, uint8* vPacket);
消息接收
用户通过回调函数处理收到的消息。
回调函数是在RF中断处理过程中调用的,因此需及时完成处理返回。
在接收回调函数中不可以调用RF发送函数。