<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                >[success] 導師視頻講解:[去聽課](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技術支持說明:** >**1**.一般以自主學習為主 > **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/zigbee) > **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> 本節課將以實驗的方式講解如何使用ZCL讀寫命令API,實驗設備包含一個協調器和一個終端,內容是協調器向終端發送寫命令,然后在再發送讀命令,最后比較一下寫入的信息和讀取到的信息是否一致。 <br/> ## **定義讀寫事件** 在zcl\_samplesw.h文件中分別定義一個讀命令事件和寫命令事件,代碼如下: ![](https://img.kancloud.cn/ce/a1/cea12db058c27a1edc2566b25ca88fa4_444x266.png =300x) ### 協調器接收到終端設備廣播(Annce)的信息后,啟動一個讀命令事件,代碼如下: ![](https://img.kancloud.cn/fb/a0/fba09952b2d08500d45569eaf85fcb9f_832x660.png =600x) ### 在zcl\_samplews.c文件的zclSample\_event\_loop事件處理函數中,可以找到讀命令事件的處理代碼,如下: ~~~ // if ( events & SAMPLEAPP_READ_EVT )//如是讀命令事件 { zclSampleSw_ReadTest();//讀命令事件處理函數 //啟動一個寫命令事件 osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_WRITE_EVT, SAMPLEAPP_WRITE_PERIOD); return ( events ^ SAMPLEAPP_READ_EVT ); } ~~~ ### 讀命令事件處理函數zclSampleSw\_ReadTest的代碼定義如下: ### ``` 1.static?void?zclSampleSw_ReadTest(void)?? 2.{?? 3.????afAddrType_t?destAddr;?? 4.????zclReadCmd_t?*readCmd;?? 5.????static?uint8?txID?=?0;?? 6.?????? 7.????destAddr.endPoint?=?SAMPLESW_ENDPOINT;?? 8.????destAddr.addrMode?=?afAddr16Bit;?? 9.????destAddr.addr.shortAddr?=?zclSampleSw_TestAddr;?? 10.? //申請一個動態內存 11.? readCmd?=?(zclReadCmd_t?*)osal_mem_alloc(sizeof(zclReadCmd_t)?+??? sizeof(uint16)); 12. 13.???if(readCmd?==?NULL)//判斷是否成功申請到內存 14.??????return;?? 15.????readCmd->numAttr?=?1;//待讀取的屬性數量為1 16.????readCmd->attrID[0]?=?ATTRID_ON_OFF_SWITCH_ACTIONS;//待讀取的屬性ID 17.?????? 18.????zcl_SendRead(SAMPLESW_ENDPOINT,?? 19.?????????????????&destAddr,?? 20.?????????????????ZCL_CLUSTER_ID_GEN_ON_OFF_SWITCH_CONFIG,//Cluster ID?? 21.?????????????????readCmd,?? 22.?????????????????ZCL_FRAME_CLIENT_SERVER_DIR,//通信方向是由客戶端到服務器端 23.?????????????????TRUE, 24.?????????????????txID++);?? 25. osal_mem_free(readCmd);//釋放內存 26.} ``` ### 在讀命令處理中代碼中還啟動一個寫命令事件,在讀命令事件處理代碼的下方可以找到寫命令事件的處理代碼,如下: ~~~ if ( events & SAMPLEAPP_WRITE_EVT )//如果是寫命令事件 { zclSampleSw_WriteTest();//寫命令處理函數 osal_start_timerEx(zclSampleSw_TaskID,//啟動一個讀命令事件 SAMPLEAPP_READ_EVT, SAMPLEAPP_READ_PERIOD); return ( events ^ SAMPLEAPP_WRITE_EVT ); } ~~~ ### 寫命令事件處理函數zclSampleSw\_WriteTest的代碼定義如下: ### ``` static?void?zclSampleSw_WriteTest(void)?? {?? ????afAddrType_t?destAddr;?? ????zclWriteCmd_t?*writeCmd;?? ????static?uint8?txID?=?0;?? ?????? ????destAddr.endPoint?=?SAMPLESW_ENDPOINT;?? ????destAddr.addrMode?=?afAddr16Bit;?? ????destAddr.addr.shortAddr?=?zclSampleSw_TestAddr;?? ?????? ? writeCmd=(zclWriteCmd_t?*)osal_mem_alloc(sizeof(zclWriteCmd_t)?+??? sizeof(zclWriteRec_t));//申請一個動態內存 ??? if(writeCmd?==?NULL)//判斷動態內存是否申請成功 ???? return;?? ?????? writeCmd->attrList[0].attrData=(uint8*)osal_mem_alloc(sizeof(uint8));//申請一個動態內存???? if(writeCmd->attrList[0].attrData?==?NULL)//判斷動態內存是否申請成功?? ???? return;?? ?????? ????writeCmd->numAttr?=?1;//待寫入的屬性數量 ????writeCmd->attrList[0].attrID?=ATTRID_ON_OFF_SWITCH_ACTIONS;待寫入的屬性的ID ????writeCmd->attrList[0].dataType?=?ZCL_DATATYPE_ENUM8;//屬性值的類型 ????*(writeCmd->attrList[0].attrData)?=?txID;//屬性值 ????HalLcdWriteStringValue("Write:",?txID,?10,?4);?? ???? ????zcl_SendWrite(SAMPLESW_ENDPOINT,?? &destAddr,?? ZCL_CLUSTER_ID_GEN_ON_OFF_SWITCH_CONFIG,//Cluster ID? writeCmd,?? ZCL_FRAME_CLIENT_SERVER_DIR,//通信方向是由客戶端到服務器端 TRUE, txID++);?? osal_mem_free(writeCmd->attrList[0].attrData); // 釋放內存 osal_mem_free(writeCmd); // 釋放內存 } ``` <br/> ## **讀響應處理** 在客戶端中處理從服務器端中讀取到的信息,即編寫讀命令響應信息處理函數,代碼如下: ~~~ #ifdef ZCL_READ /********************************************************************* * @fn zclSampleSw_ProcessInReadRspCmd * * @brief 讀響應處理函數 * * @param pInMsg - 待處理的消息 * * @return */ static uint8 zclSampleSw_ProcessInReadRspCmd( zclIncomingMsg_t *pInMsg ) { zclReadRspCmd_t *readRspCmd; uint8 i; readRspCmd = (zclReadRspCmd_t *)pInMsg->attrCmd; for (i = 0; i < readRspCmd->numAttr; i++)//readRspCmd->numAttr為屬性的數量 { if( pInMsg->clusterId == ZCL_CLUSTER_ID_GEN_ON_OFF_SWITCH_CONFIG &&//如果該消息是關于指定的Cluster readRspCmd->attrList[i].attrID == ATTRID_ON_OFF_SWITCH_ACTIONS )//如果該屬性的ID是指定的屬性ID { uint8 val; val = *(readRspCmd->attrList[i].data);//讀取屬性值 HalLcdWriteStringValue("Read:", val, 10, 4);//顯示信息到屏幕中 } } return TRUE; } #endif // ZCL_READ ~~~ <br/> ## **仿真調試** * 分別編譯協調器和終端(路由器)工程,然后分別下載到兩個開發板中。 * 終端(路由器)設備加入到ZigBee網絡中后,可以看到協調器屏幕顯示如下提示信息。 ![](https://img.kancloud.cn/ce/b3/ceb377d8d26438ac846ff8c4f8142007_246x216.png =200x) ![](https://img.kancloud.cn/3e/78/3e7827774bb3d26a3395aef27994d785_264x242.png =200x) 可以觀察到讀和寫的數據是一樣的。 <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>

                              哎呀哎呀视频在线观看