<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                >[success] 導師視頻講解:[**去聽課**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=39) >[success] **技術支持說明:** >**1**.一般以自主學習為主 > **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/zigbee) > **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> ## **實驗簡介** 在學習完AF層通信API后,本章將以實驗的方式講解如何使用這些API,實驗設備包含一個協調器和一個路由器(或終端),內容是: 1. 路由器(或終端)定時地通過點對點的方式向協調器發送數據。 2. 讓路由器(或終端)加入到一個組中。 3. 協調器定時地發送廣播數據和組播數據。 <br/> ## **設備初始化** 打開配套的SampleSwitch工程代碼,在zcl\_samplesw.c文件中的應用層初始化函數zclSampleSw\_Init()的末尾,添加以下代碼: ``` #ifdef ZDO_COORDINATOR bdb_StartCommissioning( BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_FINDING_BINDING ); NLME_PermitJoiningRequest(255); // Broadcast osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_BROADCAST_EVT, SAMPLEAPP_BROADCAST_PERIOD); // groupcast osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_GROUPCAST_EVT, SAMPLEAPP_GROUPCAST_PERIOD); #else bdb_StartCommissioning( BDB_COMMISSIONING_MODE_NWK_STEERING | BDB_COMMISSIONING_MODE_FINDING_BINDING ); // Add group aps_Group_t group = { .ID = GROUP_ID, .name = "", }; aps_AddGroup(SAMPLESW_ENDPOINT, &group); // P2P osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_P2P_EVT, SAMPLEAPP_P2P_PERIOD); #endif ``` 添加后如圖所示。 ![](https://img.kancloud.cn/5f/5e/5f5e5e8219fcae38fe0f7f1af59ab4c2_1680x1007.png =500x) ### **協調器角色初始化** 在協調器角色下,首先調用了bdb\_StartCommissioning()創建一個ZigBee網絡,然后調用NLME\_PermitJoiningRequest(255)允許其他設備加入到這個網絡中。接著調用osal_start_timerEx()產生了一個廣播事件和組播事件。其中的事件和對應的事件周期的定義在zcl_samplesw.h文件中,代碼如下: ``` //廣播事件 #define SAMPLEAPP_BROADCAST_EVT 0x0080 #define SAMPLEAPP_BROADCAST_PERIOD 5000 //組播事件 #define SAMPLEAPP_GROUPCAST_EVT 0x0100 #define SAMPLEAPP_GROUPCAST_PERIOD 3000 ``` <br/> **終端(或路由器角色)初始化** 在終端(或路由器)角色下,首先調用了bdb\_StartCommissioning()加入ZigBee網絡,然后創建一個組,創建一個組的代碼如下: ``` // Add group aps_Group_t group = { .ID = GROUP_ID, .name = "", }; ``` 其中的GROUP\_ID的定義同樣在zcl\_samplesw.c文件中,代碼如下: ``` // GroupId #define GROUP_ID 21 ``` ### 接著調用aps\_AddGroup()加入到這個組中,代碼如下: ``` aps_AddGroup( SAMPLESW_ENDPOINT,//端點號 &group);//待加入的組 ``` 最后,調用osal\_start\_timerEx()啟動一個點對點通信事件,這個事件和事件周期的定義在zcl_samplesw.h文件中,代碼如下: ``` // P2P #define SAMPLEAPP_P2P_EVT 0x0100 #define SAMPLEAPP_P2P_PERIOD 3000 ``` <br/> ## **協調器的事件處理** 應用層初始化函數zclSampleSw\_Init()中,協調器角色設備產生了一個廣播事件SAMPLEAPP_BROADCAST_EVT 和一個組播事件SAMPLEAPP_GROUPCAST_EVT,因此需要編寫對應的事件處理代碼。 ### 在zcl\_samplesw.c文件中的應用層事件處理函數zclSampleSw\_event\_loop()添加對應的事件處理代碼: ``` // Broadcast event if ( events & SAMPLEAPP_BROADCAST_EVT ) { zclSampleSw_AF_Broadcast(CLUSTER_BROADCAST, 10, "Broadcast"); osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_BROADCAST_EVT, SAMPLEAPP_BROADCAST_PERIOD); return ( events ^ SAMPLEAPP_BROADCAST_EVT ); } // Groupcast event if ( events & SAMPLEAPP_GROUPCAST_EVT ) { zclSampleSw_AF_Groupcast(GROUP_ID, CLUSTER_GROUPCAST, 10, "Groupcast"); osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_GROUPCAST_EVT, SAMPLEAPP_GROUPCAST_PERIOD); return ( events ^ SAMPLEAPP_GROUPCAST_EVT ); } ``` 添加后如圖所示。 ![](https://img.kancloud.cn/4a/6a/4a6ab3eff6861cc75fbe298419edddc2_1680x1008.png =500x) ### 在廣播事件處理中,首先調用了zclSampleSw\_AF\_Broadcast()發送一個廣播信息,代碼如下: ``` zclSampleSw_AF_Broadcast( CLUSTER_BROADCAST,//Cluster ID 10,//待發送數據的長度 "Broadcast");//待發送數據的內容 ``` ### 接著再次調用osal\_start\_timerEx()重新產生一個廣播事件。 ### 組播事件的處理也是類似的,同樣是調用zclSampleSw\_AF\_Broadcast()發送一個組播,然后調用osal\_start\_timerEx()重新產生一個組播事件。 ### 其中的CLUSTER\_BROADCAST和CLUSTER\_GROUPCAST,再加上在下文將會講到的CLUSTER_P2P都是Cluster ID,是由筆者自定義的,代碼如下: ``` #define CLUSTER_P2P 0 #define CLUSTER_BROADCAST 1 #define CLUSTER_GROUPCAST 2 ``` 可以看到這3個Cluster ID本質上就是一個宏定義,并且它的值就是0、1和2。 <br/> ## **終端(或路由器)的事件處理** 應用層初始化函數zclSampleSw\_Init()中,終端(或路由器)角色設備產生了一個點對點通信事件,因此需要編寫對應的事件處理代碼。 ### 在zcl\_samplesw.c文件中的應用層事件處理函數zclSampleSw\_event\_loop()添加對應的事件處理代碼。 ``` // P2P Event if ( events & SAMPLEAPP_P2P_EVT ) { zclSampleSw_AF_P2P(0x0000, CLUSTER_P2P, 4, "P2P"); osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_P2P_EVT, SAMPLEAPP_P2P_PERIOD); return ( events ^ SAMPLEAPP_P2P_EVT ); } ``` 添加后如圖所示。 ![](https://img.kancloud.cn/97/ab/97ab920e284d450a804c18ebb5ccc0f2_1680x990.png =500x) ### 在點對點通信事件處理中,首先調用了zclSampleSw\_AF\_Broadcast()發送一個點對點信息,代碼如下: ``` zclSampleSw_AF_P2P( 0x0000,//目標設備的網絡地址 CLUSTER_P2P,//Cluster ID 4,//待發送數據的長度 "P2P");//待發送數據的內容 ``` 其中的網絡地址0x0000是協調器的網絡地址。跟廣播和組播事件處理類似,在發送數據之后,調用osal_start_timerEx()重新產生一個點對點通信事件。 <br/> ## **接收和處理數據** 前面講解了如何發送數據,接下來講解如何接收數據。ZigBee設備在組網成功之后,接收到數據時會產生一個系統事件AF\_INCOMING\_MSG\_CMD表示現在接收到數據了。 ### 打開zcl\_samplesw.c文件,可以找到一個應用層事件處理函數zclSampleSw\_event\_loop(),如圖所示。 ![](https://img.kancloud.cn/f9/66/f96646ddaa894e451e82a0ba6259d53b_1680x1010.png =500x) ### 可以看到,系統事件處理代碼中已經包含了對系統事件AF\_INCOMING\_MSG\_CMD的識別了,開發者只需要在接收到這個事件后進行相應的處理就可以了。 ### 筆者已經定義一個數據處理函數zclSampleSw\_AF\_RxProc()來處理接收到的數據了,代碼如下: ``` /* * @param MSGpkt 接收到數據 */ static?void?zclSampleSw_AF_RxProc(afIncomingMSGPacket_t?*MSGpkt) { /*計數器,記錄接收到的點對點通信數據包個數*/ static?uint8?p2pCnt?=?0; /*計數器,記錄接收到的廣播通信數據包個數*/ static?uint8?bcCnt?=?0; /*計數器,記錄接收到的組播通信數據包個數*/ static?uint8?gcCnt?=?0;?? switch(?MSGpkt->clusterId?)??// 判斷接收到的數據包的Cluster ID,后續章節將會詳細講解Cluster ID {?? case?CLUSTER_P2P: p2pCnt++;??// 接收到P2P數據包,進行計數 // 把接收到的數據和計數器的值顯示在屏幕上 HalLcdWriteStringValue((char?*)MSGpkt->cmd.Data,p2pCnt,10,3); break;?? ? case?CLUSTER_BROADCAST:?? bcCnt++;??// 接收到廣播數據包,進行計數 HalLcdWriteStringValue((char?*)MSGpkt->cmd.Data,bcCnt,10,3);?? break;?? ? case?CLUSTER_GROUPCAST:?? gcCnt++;??// 接收到組播數據包,進行計數 HalLcdWriteStringValue((char?*)MSGpkt->cmd.Data,gcCnt,10,4);?? break;?? default:?? break;?? }?? } ``` ### 代碼中用到了之前定義的3個Cluster ID,它們可以用來標識利用不同的通信方式發送過來的數據包,含義如下: ### * CLUSTER_P2P:在P2P通信方式時發送 * CLUSTER_BROADCAST:在廣播通信方式時發送 * CLUSTER_GROUPCAST:在組播方式時發送 <br/> ## **仿真調試** 1.選擇RouterEB(或者EndDeviceEB)角色編譯工程,并把固件下載到標準板中。 ### 2.選擇CoordinatorEB角色編譯工程,并把固件下載到Mini板中。 ### 3.給Mini板上電后,Mini板即會自動創建網絡。 ### 3.給標準板上電后,即會自動加入到由Mini板創建網絡中。 ### 4.Mini板和標準板均會接收到數據包,如圖所示。 * Mini板 ![](https://img.kancloud.cn/d4/a6/d4a6b4447f5207b1ac8970462bf2adaa_286x276.png =150x) ### * 標準板 ![](https://img.kancloud.cn/47/b2/47b20a1728ae36b4340aa7e41414fef1_734x294.png =300x) <br/> <br/> ## **項目定制** * 如需項目定制開發,可掃碼添加項目經理好友(注明“**項目定制**”) * 定制范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技術方案 * 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非項目定制**勿擾**,此處**非**技術支持
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看