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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZigBee协议栈点播

發(fā)布時(shí)間:2024/8/1 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZigBee协议栈点播 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??點(diǎn)播描述的就是網(wǎng)絡(luò)中2個(gè)節(jié)點(diǎn)相互通信的過程,確定通信對(duì)象的就是節(jié)點(diǎn)的16 bit短地址。
??打開AF.h(在Profile目錄下)文件,找到下面的代碼:

typedef enum {afAddrNotPresent = AddrNotPresent,afAddr16Bit = Addr16Bit,afAddr64Bit = Addr64Bit,afAddrGroup = AddrGroup,afAddrBroadcast = AddrBroadcast } afAddrMode_t;

該類型是一個(gè)枚舉類型:

  • 當(dāng)addrMode = Addr16Bit時(shí),對(duì)應(yīng)點(diǎn)播方式。
  • 當(dāng)addrMode = AddrGroup時(shí),對(duì)應(yīng)組播方式。
  • 當(dāng)addrMode = AddrBroadcast時(shí),對(duì)應(yīng)廣播方式。

??打開SampleApp.c文件,發(fā)現(xiàn)已經(jīng)存在如下代碼:

afAddrType_t SampleApp_Periodic_DstAddr; afAddrType_t SampleApp_Flash_DstAddr;

分別是組播和廣播。我們按照格式來添加自己的點(diǎn)播:

afAddrType_t Point_To_Point_DstAddr;

參考SampleApp_Periodic_DstAddr和SampleApp_Flash_DstAddr,對(duì)Point_To_Point_DstAddr的參數(shù)進(jìn)行配置。在SampleApp_Init函數(shù)中加入如下代碼:

Point_To_Point_DstAddr.addrMode = ( afAddrMode_t ) Addr16Bit; /* 點(diǎn)播 */ Point_To_Point_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; Point_To_Point_DstAddr.addr.shortAddr = 0x0000; /* 發(fā)給協(xié)調(diào)器 */

第3行的含義是點(diǎn)播的發(fā)送對(duì)象為0x0000,也就是協(xié)調(diào)器的地址,節(jié)點(diǎn)和協(xié)調(diào)器之間實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通訊。這段代碼在如下位置添加:

/* Setup for the flash command's destination address - Group 1 */ SampleApp_Flash_DstAddr.addrMode = ( afAddrMode_t ) afAddrGroup; SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;

繼續(xù)添加自己的點(diǎn)對(duì)點(diǎn)發(fā)送函數(shù),在SampleAPP.c最后加入下面的代碼:

void SampleApp_SendPointToPointMessage ( void ) {uint8 data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};if ( AF_DataRequest ( &Point_To_Point_DstAddr,&SampleApp_epDesc,SAMPLEAPP_POINT_TO_POINT_CLUSTERID,10,data,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) {} else {/* Error occurred in request to send. */} }

還需要在SampleAPP.c文件開頭添加頭函數(shù)聲明:

void SampleApp_SendPointToPointMessage ( void );

在SampleApp.h中加入SAMPLEAPP_POINT_TO_POINT_CLUSTERID的定義:

#define SAMPLEAPP_MAX_CLUSTERS 3 #define SAMPLEAPP_PERIODIC_CLUSTERID 1 #define SAMPLEAPP_FLASH_CLUSTERID 2 #define SAMPLEAPP_POINT_TO_POINT_CLUSTERID 3

接下來把數(shù)據(jù)傳輸實(shí)驗(yàn)的SampleApp.c文件中的SampleApp_SendPeriodicMessage函數(shù)替換成點(diǎn)對(duì)點(diǎn)發(fā)送函數(shù)SampleApp_SendPointToPointMessage,這樣的話就能實(shí)現(xiàn)周期性點(diǎn)播發(fā)送數(shù)據(jù)了。

if ( events &SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) {/* Send the periodic message *///SampleApp_SendPeriodicMessage(); /* 周期性發(fā)送函數(shù) */SampleApp_SendPointToPointMessage(); /* 此處替換成點(diǎn)播函數(shù) *//* Setup to send message again in normal period (+ a little jitter) */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 unprocessed events */ }

在接收方面,我們進(jìn)行如下修改:將接收ID在原來基礎(chǔ)上改成剛定義的SAMPLEAPP_POINT_TO_POINT_CLUSTERID:

void SampleApp_MessageMSGCB ( afIncomingMSGPacket_t *pkt ) {uint16 flashTime;switch ( pkt->clusterId ) {case SAMPLEAPP_POINT_TO_POINT_CLUSTERID:HalUARTWrite ( 0, "I get data\n", 11 ); /*用于提示有數(shù)據(jù) */HalUARTWrite ( 0, &pkt->cmd.Data[0], 10 ); /* 打印收到數(shù)據(jù) */HalUARTWrite ( 0, "\n", 1 ); /* 回車換行,便于觀察 */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;} }

由于協(xié)調(diào)器不允許給自己點(diǎn)播,故周期性點(diǎn)播初始化時(shí)協(xié)調(diào)器不能初始化:

/* Received whenever the device changes state in the network */ case ZDO_STATE_CHANGE:SampleApp_NwkState = ( devStates_t ) ( MSGpkt->hdr.status );if ( //(SampleApp_NwkState == DEV_ZB_COORD)|| /* 協(xié)調(diào)器不給自己點(diǎn)播 */( SampleApp_NwkState == DEV_ROUTER ) || ( SampleApp_NwkState == DEV_END_DEVICE ) ) {/* Start sending the periodic message in a regular interval */osal_start_timerEx ( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );} else {/* Device is no longer in the network */}break;

將修改后的程序分別以協(xié)調(diào)器、路由器、終端的方式下載到3個(gè)節(jié)點(diǎn)設(shè)備中,并連接串口。可以看到只有協(xié)調(diào)器在一個(gè)周期內(nèi)收到信息,也就是說路由器和終端均與地址為0x00(協(xié)調(diào)器)的設(shè)備通信,不與其他設(shè)備通信,實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)傳輸。

總結(jié)

以上是生活随笔為你收集整理的ZigBee协议栈点播的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。