虽然这种改装违背了zigbee这个协议本身的初衷,但是依然可以满足某种特定的通信需求,我的项目中用到了,贴出来给大家看看,是一师兄整理的资料,在此分享给大家
间接panId通信的优点:同一信道下面的所有节点在其通信范围内都可以进行通信。
设置节点进行间接panid通信的方法:
1、 首先在预编译里面添加:INTER_PAN
2、 OSAL_GenericApp.c文件中,先添加#include "stub_aps.h"头文件,然后分别在tasksArr数组里面的最后添加StubAPS_ProcessEvent,在osalInitTasks方法中最后添加StubAPS_Init(taskID);具体如下面代码块:(红色部分为添加部分)
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop,
nwk_event_loop,
Hal_ProcessEvent,
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop,
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_ProcessEvent,
#endif
ZDApp_event_loop,
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_event_loop,
#endif
GenericApp_ProcessEvent,
StubAPS_ProcessEvent
};
void osalInitTasks( void )
{
uint8 taskID = 0;
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
macTaskInit( taskID++ );
nwk_init( taskID++ );
Hal_Init( taskID++ );
#if defined( MT_TASK )
MT_TaskInit( taskID++ );//初始化串口
#endif
APS_Init( taskID++ );
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_Init( taskID++ );
#endif
ZDApp_Init( taskID++ );
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_Init( taskID++ );
#endif
GenericApp_Init( taskID++);
StubAPS_Init(taskID);
}
3、 在GenericApp.c文件中的GenericApp_Init( uint8 task_id )方法中分别添加如下部分:GenericApp_DstAddr.endPoint = STUBAPS_INTER_PAN_EP; //间接panid端点描述符
GenericApp_epDesc.endPoint = STUBAPS_INTER_PAN_EP;//间接panid端点描述符
StubAPS_SetInterPanChannel(0x0B);//设置间接通信的信道为11信道
StubAPS_RegisterApp( &GenericApp_epDesc );//注册端点描述符
4、 无线通信时需要添加的内容:
在GenericApp.c文件中的GenericApp_SendTheMessage方法中需要设置目的地址的panid,(例如GenericApp_DstAddr.panId=0x0003; //目的panid,0XFFFF表示同一信道中的所有panid)。
如果将GenericApp_DstAddr.panId=0xFFFF,那么表示该节点将广播信息;
如果将GenericApp_DstAddr.panId设置为固定的值即在0X0000~0X3FFF任意一个,表示该节点与指定的panid进行通信,可以认为是单播通信。
设置固定panid的步骤如下:
1、 首先在f8wConfig.cfg中找到-DZDAPP_CONFIG_PAN_ID,将这个值设置为固定的panid值(例如-DZDAPP_CONFIG_PAN_ID=0x0001,表示该节点的panid是0x0001)。
2、 在ZDOApp.c中的ZDApp_NwkDescListProcessing方法中,需要修改这段代码:修改此处红色部分,这个值就是在第一步中设置的panid的值
if ( zgConfigPANID != 0x0001)
{
// PAN Id is preconfigured. check if it matches
if ( pNwkDesc->panId != zgConfigPANID )
continue;
}