📄 nwk.i
字号:
{
temp2 = *pPayload++;
switch (temp2)
{
case 0x01 : // 收到终端节点请求加入网络的请求 ( 协调器调用 )
{
temp3 = *pPayload++;
if(temp3 == 0x11 ) // 加入网络密码正确
{
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 0x02 : // 收到终端节点请求离开网络的请求 ( 协调器调用 )
{
nwk_LeaveNetwork_ACK();
break;
}
case 0x03 : // 收到终端节点成功加入网络的消息 ( 协调器调用 )
{
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 = 0x01;
neighbor[neighborID_temp].Avail = 0x01;
nwk_DeviceTypes = 0x00;
PORTB ^= (1<<7 ); // 协调器如果有终端节点成功加入网络,则绿灯取反
nwk_Send_neighbortable_to_PC(neighborID_temp,0x01);
}
break;
}
case 0x04 : // 收到终端节点成功离开网络的消息 ( 协调器调用 )
{
//if(nwk_DeleteNeighborTable(rfSettings.pRxInfo->srcAddr)!=0xFF) // 在邻居表中成功
nwk_DeleteNeighborTable(rfSettings.pRxInfo->srcAddr);
//{
// WLED_TOGGLE(); // 协调器如果有终端节点成功离开网络,则白灯取反
//}
//else //在邻居表中删除失败
//{
// #asm("nop")
//}
break;
}
case 0x05 : // 收到协调器赶走所有终端节点的消息 ( 终端节点调用 )
{
rfSettings.myAddr = 0x0000;
CC2420_SetShortAddress(rfSettings.myAddr); // 设置节点短地址
rfSettings.JoinNetworkSuccess = 0x00;
PORTB &= ~(1<<7 );
}
default:
break;
}
break;
}
case 0x02: // 命令响应
{
temp2 = *pPayload++;
switch (temp2)
{
case 0x01 : // 协调器对终端节点请求加入网络的响应 ( 终端节点调用 )
{
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); // 设置节点短地址
PORTB |= (1<<7 ); //加入网络成功 ,绿灯亮
rfSettings.JoinNetworkSuccess = 0x01;
break;
}
default:
break;
}
break;
}
case 0x02 : // 协调器节点对终端节点请求离开网络的响应 ( 终端节点调用 )
{
temp3 = *pPayload;
if( temp3==0x01 ) //协调器同意脱离
{
PORTB &= ~(1<<7 ); //离开网络成功 ,绿灯灭
rfSettings.JoinNetworkSuccess = 0x00;
}
else //协调器不同意脱离
{
}
break;
}
default:
break;
}
break;
}
default:
break;
}
break;
}
default:
break;
}
rfSettings.pRxInfo->pPayload = pRxBuffer;
memset(rfSettings.pRxInfo->pPayload,'',(127 - ((2 + 1 + 2 + 2 + 2) + (2))));
}
/***********************************************************************
* 清空网络层发送缓冲区
************************************************************************/
void nwk_TxBuffer_Clear(void)
{
memset(nwk_TxBuffer,'',70);
}
/***********************************************************************
* 清空网络层接收缓冲区
************************************************************************/
void nwk_RxBuffer_Clear(void)
{
memset(nwk_RxBuffer,'',70);
}
/***********************************************************************
* 把邻居表发送到电脑
* 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 = 0x02;
nwk_RequestOrAck = 0x01;
nwk_CmdTypes = 0x05 ;
rfTxInfo.destAddr = noteId; // 发送的目的地址
rfTxInfo.length = 0x03; // 求取要发送消息内容的长度
rfTxInfo.ackRequest = 0; // 不要求返回确认
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 + -