雖然這種改裝違背了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;
}