📄 nwk.c
字号:
/***********************************************************************
* 网络层打包函数
************************************************************************/
void nwk_PackData(unsigned char *pPayload, unsigned char length)
{
unsigned char i=0;
nwk_FCF = NWK_FCF_DATA;
pTxBuffer[0] = nwk_FCF;
for(i=0;i<length;i++)
{
pTxBuffer[i+1] = *pPayload++;
}
rfTxInfo.length = length+1; // 要发送消息内容的长度
rfTxInfo.ackRequest = FALSE; // 不要求返回确认
CC2420_SendPacket(&rfTxInfo,0x01);
}
/***********************************************************************
* 网络层解包函数
************************************************************************/
void nwk_UnPackData(unsigned char *pPayload, unsigned char length)
{
unsigned char temp0,temp1,temp2,temp3;
unsigned char addrlist_temp;
unsigned char neighborID_temp;
temp0 = *pPayload++;
switch (temp0)
{
case NWK_FCF_DATA:
{
app_UnPackData(pPayload,length-1); // 调用应用层解包
break;
}
case NWK_FCF_CMD: // 网络层命令
{
temp1 = *pPayload++;
switch (temp1)
{
case NWK_REQUEST: // 请求命令
{
temp2 = *pPayload++;
switch (temp2)
{
case NWK_CMD_REQUESTJIONIN: // 收到终端节点请求加入网络的请求 ( 协调器调用 )
{
temp3 = *pPayload++;
if(temp3 == JION_TO_NETWORK_PASSWORD ) // 加入网络密码正确
{
nwk_DeviceTypes = *pPayload; //请求加入网络的设备类型
if(flag_PermitJoinIn) //如果允许其他节点加入
{
neighborID_temp = nwk_IEEEIsInNeighborTable_Check(rfSettings.pRxInfo->srcIEEE);
if( neighborID_temp != 0xFF )
{
nwk_JoinInNetwork_ACK ( 0x01,0x00,neighborID_temp );
}
else
{
addrlist_temp = nwk_Addr_Assign_Check();
nwk_JoinInNetwork_ACK( 0x00,addrlist_temp,0x00 );
}
}
}
else // 加入网络密码错误
{
// 不做任何反应
}
break;
}
case NWK_CMD_REQUESTLEAVE: // 收到终端节点请求离开网络的请求 ( 协调器调用 )
{
nwk_LeaveNetwork_ACK();
break;
}
case NWK_CMD_JIONINSUCCESSFUL: // 收到终端节点成功加入网络的消息 ( 协调器调用 )
{
neighborID_temp = nwk_IEEEIsInNeighborTable_Check(pPayload);
if(neighborID_temp!=0xFF)
{
neighbor[neighborID_temp].ShortAddr = rfSettings.pRxInfo->srcAddr;
neighbor[neighborID_temp].DeviceType = nwk_DeviceTypes;
neighbor[neighborID_temp].Relationship = NWK_DEVICES_RELATIONSHIP_FATHER_SON;
neighbor[neighborID_temp].Avail = 0x01;
nwk_DeviceTypes = 0x00;
GLED_TOGGLE(); // 协调器如果有终端节点成功加入网络,则绿灯取反
nwk_Send_neighbortable_to_PC(neighborID_temp,0x01);
}
break;
}
case NWK_CMD_LEAVESUCCESSFUL: // 收到终端节点成功离开网络的消息 ( 协调器调用 )
{
//if(nwk_DeleteNeighborTable(rfSettings.pRxInfo->srcAddr)!=0xFF) // 在邻居表中成功
nwk_DeleteNeighborTable(rfSettings.pRxInfo->srcAddr);
//{
// WLED_TOGGLE(); // 协调器如果有终端节点成功离开网络,则白灯取反
//}
//else //在邻居表中删除失败
//{
// #asm("nop")
//}
break;
}
case NWK_CMD_PLEASELEAVE: // 收到协调器赶走所有终端节点的消息 ( 终端节点调用 )
{
rfSettings.myAddr = 0x0000;
CC2420_SetShortAddress(rfSettings.myAddr); // 设置节点短地址
rfSettings.JoinNetworkSuccess = 0x00;
GLED_DISABLE();
}
default:
break;
}
break;
}
case NWK_ACK: // 命令响应
{
temp2 = *pPayload++;
switch (temp2)
{
case NWK_CMD_REQUESTJIONIN: // 协调器对终端节点请求加入网络的响应 ( 终端节点调用 )
{
temp3 = *pPayload++;
switch (temp3)
{
case 0x01: // 请求加入网络失败
{
rfSettings.JoinNetworkSuccess = 0x00;
break;
}
case 0x02: // 请求加入网络成功
{
rfSettings.myAddr = (unsigned int)*pPayload++;
rfSettings.myAddr |= ((unsigned int)*pPayload << 8 );
CC2420_SetShortAddress(rfSettings.myAddr); // 设置节点短地址
GLED_EN(); //加入网络成功 ,绿灯亮
rfSettings.JoinNetworkSuccess = 0x01;
break;
}
default:
break;
}
break;
}
case NWK_CMD_REQUESTLEAVE: // 协调器节点对终端节点请求离开网络的响应 ( 终端节点调用 )
{
temp3 = *pPayload;
if( temp3==NWK_AGREE_LEAVE_NETWORK ) //协调器同意脱离
{
GLED_DISABLE(); //离开网络成功 ,绿灯灭
rfSettings.JoinNetworkSuccess = 0x00;
}
else //协调器不同意脱离
{
}
break;
}
default:
break;
}
break;
}
default:
break;
}
break;
}
default:
break;
}
rfSettings.pRxInfo->pPayload = pRxBuffer;
memset(rfSettings.pRxInfo->pPayload,'',CC2420_MAX_PAYLOAD_SIZE);
}
/***********************************************************************
* 清空网络层发送缓冲区
************************************************************************/
void nwk_TxBuffer_Clear(void)
{
memset(nwk_TxBuffer,'',NWK_MAX_PAYLOAD_SIZE);
}
/***********************************************************************
* 清空网络层接收缓冲区
************************************************************************/
void nwk_RxBuffer_Clear(void)
{
memset(nwk_RxBuffer,'',NWK_MAX_PAYLOAD_SIZE);
}
/***********************************************************************
* 把邻居表发送到电脑
* ID_temp : 邻居表下标
* flag : 是加入到邻居表还是从邻居表中删除
************************************************************************/
void nwk_Send_neighbortable_to_PC(unsigned char ID_temp,unsigned char flag)
{
unsigned char str_USART[32],str_USART1[24];
unsigned char *str_USART_temp="";
unsigned char length=0;
unsigned char i;
switch (flag)
{
case 0x01:
{
str_USART[0]='A';
for(i=0;i<8;i++)
{
sprintf(str_USART_temp, "%x",neighbor[ID_temp].IEEEAddr[i]);
length = strlen(str_USART_temp);
if(length==2)
{
str_USART[3*i+1] = *str_USART_temp++;
str_USART[3*i+2] = *str_USART_temp;
str_USART[3*i+3] = ' ';
}
else if(length==1)
{
str_USART[3*i+1] = '0';
str_USART[3*i+2] = *str_USART_temp;
str_USART[3*i+3] = ' ';
}
else if(length==0)
{
str_USART[3*i+1] = '0';
str_USART[3*i+2] = '0';
str_USART[3*i+3] = ' ';
}
}
sprintf(str_USART_temp, "%x",neighbor[ID_temp].ShortAddr);
length = strlen(str_USART_temp);
if(length==4)
{
str_USART[24] = *str_USART_temp++;
str_USART[25] = *str_USART_temp++;
str_USART[26] = *str_USART_temp++;
str_USART[27] = *str_USART_temp;
}
else if(length==3)
{
str_USART[24] = '0';
str_USART[25] = *str_USART_temp++;
str_USART[26] = *str_USART_temp++;
str_USART[27] = *str_USART_temp;
}
else if(length==2)
{
str_USART[24] = '0';
str_USART[25] = '0';
str_USART[26] = *str_USART_temp++;
str_USART[27] = *str_USART_temp;
}
else if(length==1)
{
str_USART[24] = '0';
str_USART[25] = '0';
str_USART[26] = '0';
str_USART[27] = *str_USART_temp;
}
else if(length==0)
{
str_USART[24] = '0';
str_USART[25] = '0';
str_USART[26] = '0';
str_USART[27] = '0';
}
sprintf(str_USART_temp, "%x",neighbor[ID_temp].DeviceType);
length = strlen(str_USART_temp);
if(length==2)
{
str_USART[28] = *str_USART_temp++;
str_USART[29] = *str_USART_temp;
}
else if(length==1)
{
str_USART[28] = '0';
str_USART[29] = *str_USART_temp;
}
else if(length==0)
{
str_USART[28] = '0';
str_USART[29] = '0';
}
sprintf(str_USART_temp, "%x",neighbor[ID_temp].Relationship);
length = strlen(str_USART_temp);
if(length==2)
{
str_USART[30] = *str_USART_temp++;
str_USART[31] = *str_USART_temp;
}
else if(length==1)
{
str_USART[30] = '0';
str_USART[31] = *str_USART_temp;
}
else if(length==0)
{
str_USART[30] = '0';
str_USART[31] = '0';
}
USART0_Send_Str(str_USART);
}break;
case 0x02:
{
str_USART1[0]='B';
for(i=0;i<8;i++)
{
sprintf(str_USART_temp, "%x",neighbor[ID_temp].IEEEAddr[i]);
length = strlen(str_USART_temp);
if(length==2)
{
str_USART1[3*i+1] = *str_USART_temp++;
str_USART1[3*i+2] = *str_USART_temp;
str_USART1[3*i+3] = ' ';
}
else if(length==1)
{
str_USART1[3*i+1] = '0';
str_USART1[3*i+2] = *str_USART_temp;
str_USART1[3*i+3] = ' ';
}
else if(length==0)
{
str_USART1[3*i+1] = '0';
str_USART1[3*i+2] = '0';
str_USART1[3*i+3] = ' ';
}
}
USART0_Send_Str(str_USART1);
}break;
default:
break;
}
}
/***********************************************************************
* 命令某节点离开网络(仅对协调器节点有效)
************************************************************************/
void nwk_DriveNoteOut(unsigned int noteId)
{
nwk_FCF = NWK_FCF_CMD;
nwk_RequestOrAck = NWK_REQUEST;
nwk_CmdTypes = NWK_CMD_PLEASELEAVE;
rfTxInfo.destAddr = noteId; // 发送的目的地址
rfTxInfo.length = 0x03; // 求取要发送消息内容的长度
rfTxInfo.ackRequest = FALSE; // 不要求返回确认
pTxBuffer[0] = nwk_FCF;
pTxBuffer[1] = nwk_RequestOrAck;
pTxBuffer[2] = nwk_CmdTypes;
CC2420_SendPacket(&rfTxInfo,0x01);
// 等待一段时间
delay_ms(50);
nwk_DeleteNeighborTable(noteId);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -