⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nwk.c

📁 ATmega128L+CC2420的单片机源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************
* 网络层打包函数
************************************************************************/ 
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 + -