1.1 網絡建立與(yu)加入
(1)首先在(zai)Main函數中,會有這樣的語句:
for(;;)
{
SYS_RunTask();
}
通過SYS_RunTask函數,系統會調用BitCloud協議棧中的用戶(hu)應用程(cheng)序,即APL_TaskHandler()。
(2)
void APL_TaskHandler(void)
{
if (appStatePosted)
{
appStatePosted = false;
appTaskHandler();
}
if (appSubStatePosted)
{
appSubStatePosted = false;
appSubtaskHandler();
}
}
(3)按照流程程序(xu)調用appTaskHandler();該函數中對各種(zhong)狀(zhuang)態進行(xing)判斷執行(xing)相應(ying)操作。
static void appTaskHandler(void)
{
switch (appState)
{
case APP_INITIAL_STATE:
initHardware();
initNetwork();
break;
case APP_JOINING_STATE:
startNetwork();
break;
case APP_JOINED_STATE:
break;
case APP_LEAVE_STATE:
leaveNetwork();
break;
}
}
(3.9)硬(ying)件(jian)初(chu)始化函數
static void initHardware(void)
{
#ifdef BOARD_SAM3S_PIRRD
// Register interrupts
HAL_InstallInterruptVector(SysTick_IRQn, SysTick_Handler);
// Configure LEDS
LED_Configure(APP_LED_0);
// Configure SRAM
BOARD_ConfigureSram();
// Configure system tick timer
TimeTick_Configure(BOARD_MCK);
// Configure LCD
appLCD_Init();
#else
// Configure LEDS
BSP_OpenLeds();
// Configure communication medium
appMediumInit();
#endif // BOARD_SAM3S_PIRRD
}
(4)網絡初始化
static void initNetwork(void)
{
CS_WriteParameter(CS_DEVICE_TYPE_ID, &deviceType);//將設備在網絡中的角色配置為終端設備。
if (DEV_TYPE_ENDDEVICE == deviceType)
{
bool rxOnWhenIdleFlag = false;
CS_WriteParameter(CS_RX_ON_WHEN_IDLE_ID, &rxOnWhenIdleFlag);
}
}
// 命令請求參數(shu)的(de)配(pei)置(zhi)
apsCommandReq.dstAddrMode = APS_SHORT_ADDRESS;
apsCommandReq.dstAddress.shortAddress = 0;
apsCommandReq.profileId = APP_PROFILE_ID;
apsCommandReq.dstEndpoint = APP_CONTROL_ENDPOINT;
apsCommandReq.clusterId = APP_CLUSTER_ID;
apsCommandReq.srcEndpoint = APP_CONTROL_ENDPOINT;
apsCommandReq.asdu = (uint8_t *)&appCommandFrame.command;
apsCommandReq.asduLength = 0;
apsCommandReq.txOptions.acknowledgedTransmission = 1;
apsCommandReq.radius = 0;
apsCommandReq.APS_DataConf = apsCommandReqConf;
// 數據塊(kuai)請(qing)求(qiu)的配(pei)置


然后(hou)調用startNerwork()啟動搜尋網絡。
static void startNetwork(void)
{
blinkTimer.interval = BLINK_TIMER_INTERVAL;
blinkTimer.mode = TIMER_REPEAT_MODE;
blinkTimer.callback = blinkTimerFired;
HAL_StartAppTimer(&blinkTimer);
startNetworkReq.ZDO_StartNetworkConf = ZDO_StartNetworkConf;
ZDO_StartNetworkReq(&startNetworkReq);
}
定時(shi)器(qi)由static HAL_AppTimer_t blinkTimer;進行聲(sheng)明,當(dang)時(shi)間到達時(shi),blinkTimerFired函數中(zhong)(zhong)對LED燈(deng)的(de)狀態進行改變。這(zhe)樣(yang)就達到在(zai)搜尋網(wang)絡(luo)的(de)過程中(zhong)(zhong)LED燈(deng)閃爍的(de)效果,直到網(wang)絡(luo)加入成(cheng)功。
下層關于加入網絡的回應通過(guo)ZDO_StartNetworkConf回調函數(shu)完成。
static void ZDO_StartNetworkConf(ZDO_StartNetworkConf_t* conf)
{
HAL_StopAppTimer(&blinkTimer); //首先關掉定時器
if (ZDO_SUCCESS_STATUS == conf->status)//如果加入網絡成功
{
restartStateMachines(APP_JOINED_STATE);//設置網絡狀態為已加入
LED_Clear(APP_LED_0); //關閉LED網絡指示燈
&nbsnbsp; //注冊終端節點
registerControlEndpointReq.simpleDescriptor = &controlEndpoint;
registerControlEndpointReq.APS_DataInd = APS_DataIndControl;
APS_RegisterEndpointReq(®isterControlEndpointReq);
registerDataEndpointReq.simpleDescriptor = &dataEndpoint;
registerDataEndpointReq.APS_DataInd = APS_DataIndData;
APS_RegisterEndpointReq(®isterDataEndpointReq);
HAL_StartAppTimer(&nwkInfoTimer);
}
else
setState(APP_JOINING_STATE);
}
2.2 數據(ju)傳輸中(zhong)網絡體現
2.2.1 網絡角色(se)的設置
在所有(you)ZigBee網(wang)絡中(zhong),共(gong)有(you)三種(zhong)網(wang)絡角(jiao)色:協(xie)調器、路由設備、終(zhong)端設備。
要想讓節點(dian)能夠加(jia)入到(dao)ZigBee網(wang)絡之中,在初始化(hua)網(wang)絡的(de)時(shi)候需要給節點(dian)分(fen)配網(wang)絡角(jiao)色。例如:
static void initNetwork(void)
{
DeviceType_t deviceType = DEVICE_TYPE_COORDINATOR;//設置為協調器
// DeviceType_t deviceType = APP_SENDER_DEVICE_TYPE ;
CS_WriteParameter(CS_DEVICE_TYPE_ID, &deviceType);
...
}
需要(yao)注(zhu)意(yi)的是,在整個(ge)ZigBee網絡(luo)之中,有(you)(you)且只能有(you)(you)一(yi)個(ge)協調器用于創建一(yi)個(ge)ZigBee網絡(luo)。然(ran)后通過CS_WriteParameter(CS_DEVICE_TYPE_ID, &deviceType);將參(can)數寫入文件。
2.2.2 網絡參數的使用
在進(jin)(jin)行(xing)(xing)數據(ju)發(fa)送(song)之前(qian),首先要(yao)弄(nong)清楚的是被發(fa)送(song)數據(ju)的目的網絡地址。在程序中通過(guo)
apsCommandReq.dstAddress.shortAddress = imageReceiving.currentRequest->address;進(jin)(jin)行(xing)(xing)設置。然后通信(xin)雙方通過(guo)相(xiang)同的endpoint進(jin)(jin)行(xing)(xing)操(cao)作(zuo)。