日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Zigbee协议栈————广播组网

發布時間:2024/8/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Zigbee协议栈————广播组网 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1.基礎概念

2.Zigbee協議棧工作流程

3。代碼講解


1.基礎概念

在Zigbee網絡中存在3中邏輯設備:協調器、路由器、終端。

(這個實驗當中我們只用到協調器以及終端)。

協調器:協調器負責啟動網絡,當啟動和配置好網絡后,協調器就會像一個路由器一樣或者就消失了。

終端:網絡中的一個設備,一個節點。

?廣播:當應用程序需要將數據包發送給網絡的每一個設備時,使用這種模式。地址模式設置為
AddrBroadcast。目標地址可以設置為下面廣播地址的一種:
NWK BROADCAST SHORTADDR DEVALL(0xFFFF)--數據包將被傳送到網絡上的所有設備,包括睡眠中的設備。
NWK BROADCAST SHORTADDR DEVRXON(0xFFFD)-數據包將被傳送到網絡上除了睡眠中的所有設備。
NWK BROADCAST SHORTADDR DEVZCZR(0xFFFC)--數據包發送給所有的路由器,包括協調器。

2.Zigbee協議棧工作流程

main()函數中初始化操作系統osal_init_system(),初始化一些外設(協議棧已經將這些外設封裝好了,可以像32一樣調用函數使用。),最后進入osal_start_system()中執行操作系統,并且程序會一直處于這個函數當中,不會返回(函數中有死循環),在這個函數當中判斷是否有事件發生,然后會根據優先級來處理這些事件(任務)。我們以后主要需要修改在SampleApp_Init()當中.

?3.代碼講解

協議棧中很多東西已經幫我們寫好,我們以后使用僅僅需要修改增加一些內容。因此代碼不需要全部都懂。(初學者不要嘗試將所有的代碼都看懂,循序漸進。)

在目錄中找到SampleApp.c,打開它,并在該C文件的頂部包含#include"MT_UART.h"
#include "MT_APP.h"
#include "MT.h"
#include "string.h"

這四個頭文件。接下來找到void SampleApp_Init( uint8 task_id )這個函數

void SampleApp_Init( uint8 task_id ) { SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;//這一部分為新加進來的代碼//------------------------配置串口---------------------------------MT_UartInit(); //串口初始化MT_UartRegisterTaskID(task_id); //注冊串口任務HalUARTWrite(0,"UartInit OK\n", sizeof("UartInit OK\n"));//-----------------------------------------------------------------#if defined ( BUILD_ALL_DEVICES )if ( readCoordinatorJumper() )zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR;elsezgDeviceLogicalType = ZG_DEVICETYPE_ROUTER; #endif // BUILD_ALL_DEVICES#if defined ( HOLD_AUTO_START )ZDOInitDevice(0); #endifSampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//廣播模式SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;//廣播地址 /*//組播的代碼// Setup for the flash command's destination address - Group 1SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;*/SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_epDesc.task_id = &SampleApp_TaskID;SampleApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;SampleApp_epDesc.latencyReq = noLatencyReqs;afRegister( &SampleApp_epDesc );RegisterForKeys( SampleApp_TaskID ); /*//組播的代碼// By default, all devices start out in Group 1SampleApp_Group.ID = 0x0001;osal_memcpy( SampleApp_Group.name, "Group 1", 7 );aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group ); */#if defined ( LCD_SUPPORTED )HalLcdWriteString( "SampleApp", HAL_LCD_LINE_1 ); #endif }

?其中?MT_UartInit()在目錄中MT文件中的MT_UART.c的文件當中,為串口的初始化。



?

?這個初始化的函數當中,我們需要將波特率設置好,流控制關閉,其他的可以不用管。

? ? ? ? 然后我們就可以調用HalUARTWrite(0,"UartInit OK\n", sizeof("UartInit OK\n"))來發送初始化完成的提示。然后,如上面的代碼塊一樣,將組播的代碼注釋掉。

? ? ? ? 接下來,我們進入到uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )當中。

//在這個函數當中完成對事件的處理 uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) {afIncomingMSGPacket_t *MSGpkt;(void)task_id; if ( events & SYS_EVENT_MSG ){MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );while ( MSGpkt ){switch ( MSGpkt->hdr.event ){case KEY_CHANGE:SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );break;case AF_INCOMING_MSG_CMD://接收到數據包就進行處理SampleApp_MessageMSGCB( MSGpkt );break;case ZDO_STATE_CHANGE://協調器狀態改變就進入下面的函數,協調器剛建立網絡就會進去SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);if ( (SampleApp_NwkState == DEV_ZB_COORD)|| (SampleApp_NwkState == DEV_ROUTER)|| (SampleApp_NwkState == DEV_END_DEVICE) ){osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );}else{}break;default:break;}osal_msg_deallocate( (uint8 *)MSGpkt );MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );}return (events ^ SYS_EVENT_MSG);}if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )//上面有出現哦,協調器狀態改變{SampleApp_SendPeriodicMessage();//協調器發送數據 osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);}return 0; }

接下來進入SampleApp_SendPeriodicMessage()函數當中。

void SampleApp_SendPeriodicMessage( void ) {//聯網后進入這個函數uint8 *buff=NULL;if(zgDeviceLogicalType == ZG_DEVICETYPE_COORDINATOR)//判斷Zigbee的邏輯類型,如果是協調器{buff="I am coordinator device\r\n";}else if(zgDeviceLogicalType == ZG_DEVICETYPE_ENDDEVICE)//如果是終端{buff="I am endpoint device\r\n";}// AF_DataRequest()這個函數是真正發送數據的函數,我們需要將第三第四個參數該為數組的大小,以及數組的內容,然后就可以發送了。if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,SAMPLEAPP_PERIODIC_CLUSTERID,strlen(buff),//傳輸數據的字節大小buff,//傳輸數據&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ){}else{} }

?數據發送完了,當接受到數據包后,MSGpkt->hdr.event=AF_INCOMING_MSG_CMD,接下來,我們就要進入SampleApp_MessageMSGCB( MSGpkt )當中。

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//無線數據包接收到之后 {uint16 flashTime;switch ( pkt->clusterId ){case SAMPLEAPP_PERIODIC_CLUSTERID://接收到該命令后執行的代碼HalUARTWrite(0,(pkt->cmd).Data,(pkt->cmd).DataLength);//將接受到的數據打印到串口中break;case SAMPLEAPP_FLASH_CLUSTERID:flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );break;} }

至此,代碼就完成了。接下來就可以燒錄,看現象了。

4.可能遇到的問題

?1.注意協調器與終端的燒錄,需要分開燒錄??捎缮蠄D所示更改。

2.以下問題為版本不兼容

以及一堆 Undefined external "?V1" referred in AF類似的,都是由于版本不兼容的原因。解決方法:

?

?將16改為8

??ZStack-CC2530-2.5.1a\Projects\zstack\ZMain\TI2530DB下的chipcon_cstartup.s51文件中刪除END,并添加以下代碼:

;----------------------------------------------------------------; ; Virtual registers ; ; ================= ; ; Below is some segment needed for the IAR ICC C/EC++ compiler ; ; ; ; BREG : A segment for 8 bit registers for use by the compiler. ; ; ?B0 is the first register. ; ; VREG : Segment that holds up to 32 virtual registers for ; ; use by the compiler. ?V0 is the first register. ; ; PSP : Segment containing the PDATA stack pointer (?PSP) ; ; XSP : Segment containing the XDATA stack pointer (?XSP) ; ; ; ;----------------------------------------------------------------; ;----------------------------------------------------------------;PROGRAM VIRTUAL_REGISTERSPUBLIC ?B0PUBLIC ?V0PUBLIC ?V1PUBLIC ?V2PUBLIC ?V3PUBLIC ?V4PUBLIC ?V5PUBLIC ?V6PUBLIC ?V7PUBLIC ?V8PUBLIC ?V9PUBLIC ?V10PUBLIC ?V11PUBLIC ?V12PUBLIC ?V13PUBLIC ?V14PUBLIC ?V15PUBLIC ?V16PUBLIC ?V17PUBLIC ?V18PUBLIC ?V19PUBLIC ?V20PUBLIC ?V21PUBLIC ?V22PUBLIC ?V23PUBLIC ?V24PUBLIC ?V25PUBLIC ?V26PUBLIC ?V27PUBLIC ?V28PUBLIC ?V29PUBLIC ?V30PUBLIC ?V31PUBLIC ?PSPPUBLIC ?XSPRSEG BREG:BIT:NOROOT ?B0:DS 8RSEG VREG:DATA:NOROOT ?V0:DS 1 ?V1:DS 1 ?V2:DS 1 ?V3:DS 1 ?V4:DS 1 ?V5:DS 1 ?V6:DS 1 ?V7:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V7 ?V8:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V8 ?V9:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V9 ?V10:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V10 ?V11:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V11 ?V12:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V12 ?V13:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V13 ?V14:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V14 ?V15:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V15 ?V16:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V16 ?V17:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V17 ?V18:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V18 ?V19:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V19 ?V20:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V20 ?V21:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V21 ?V22:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V22 ?V23:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V23 ?V24:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V24 ?V25:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V25 ?V26:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V26 ?V27:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V27 ?V28:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V28 ?V29:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V29 ?V30:DS 1RSEG VREG:DATA:NOROOTREQUIRE ?V30 ?V31:DS 1RSEG PSP:DATA:NOROOTEXTERN ?RESET_PSPREQUIRE ?RESET_PSP ?PSP:DS 1RSEG XSP:DATA:NOROOTEXTERN ?RESET_XSPREQUIRE ?RESET_XSP ?XSP:DS 2ENDMOD ; VIRTUAL_REGISTERSEND

3.注意在燒錄前需要預編譯

?

只有ZTOOL_P1前沒有x,其它的都需要在前面加一個x。

4.注意協議棧里的串口0,使用的是P0_2(RX),P0_3(TX)。

總結

以上是生活随笔為你收集整理的Zigbee协议栈————广播组网的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。