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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                >[success] 導師視頻講解:[去聽課](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技術支持說明:** >**1**.一般以自主學習為主 > **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/zigbee) > **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> 本節課將以實驗的方式講解如何使用ZCL通信API發送On/Off命令,實驗設備包含一個網關(協調器)和一個智能插座(終端或路由器),內容是當智能插座加入到網絡后,網關自動定期地向這個智能插座發送On和Off指令來控制智能插座的開關。 <br/> ## **智能插座開發** 打開zcl\_samplesw.c文件在應用初始化函數zdSampleSw\_Init中可以找到如下代碼: ![](https://img.kancloud.cn/3d/e9/3de92a4a7324ed5a0faf38d4e7c46264_832x454.png =600x) ### \#else與#endif中的代碼是當設備處于終端(或路由器)角色時執行,其中的bdb\_StartCommissioning函數是用于組建網絡的的,在BDB章節中已經講解過。 ### zclSampleSw\_DeviceAnnce函數是由筆者自定義的,用于向整個網絡廣播一個數據包,該數據包中包含本設備的地址。當協調器收到這個數據包時,就知道這個設備的地址信息了。其定義代碼如下: ### ``` static?void?zclSampleSw_DeviceAnnce(?void?) {???? ZDP_DeviceAnnce( NLME_GetShortAddr(),//獲取本設備的網絡地址(短地址) NLME_GetExtAddr(),//獲取本設備的物理地址(通常就是MAC地址) ????????ZDO_Config_Node_Descriptor.CapabilityFlags,//暫不展開簡介,可忽略 0//暫不展開講解,可忽略 );???? } ``` ### 該函數調用了ZDP\_DeviceAnnce函數,這是一個協議棧的API。可以套用上述代碼來實現向網絡中廣播本設備的地址信息。 <br/> #### **處理指令** 在處理On/Off命令前,需要先在ZCL命令回調函數列表中注冊一個回調函數,即在zcl\_samplesw.c文件中添加zclSampleSw\_OnOffCB函數,如下圖所示。 ![](https://img.kancloud.cn/81/54/81541c0f618c103351b285e912ceee37_810x416.png =600x) ### zclSampleSw\_OnOffCB函數的定義代碼如下: ``` 1.static?void?zclSampleSw_OnOffCB(?uint8?cmd?)???? 2.{???? 3.????if(cmd?==?COMMAND_ON)?//?命令為ON時?? 4.????{???? 5.??????HalLcdWriteString("Set?ON",?4);??//?打印信息到屏幕?? 6.?????????? 7.??????HalLedSet(HAL_LED_ALL,?HAL_LED_MODE_ON);??//?開啟所有LED?? 8.????}???? 9.????else?if(cmd?==?COMMAND_OFF)?//?命令為OFF時?? 10.????{???? 11.??????HalLcdWriteString("Set?OFF",?4);??//?打印信息到屏幕?? 12.?????????? 13.??????HalLedSet(HAL_LED_ALL,?HAL_LED_MODE_OFF);??//?關閉所有LED?? 14.????}???? 15.} ``` <br/> ## **網關開發** 網關主要完成這兩件事情: * 接收并處理智能插座廣播的地址信息 * 啟動一個周期性事件來周期地向智能插座發送On/Off指令 #### **接收地址信息** 當協調器接收到由智能插座廣播(Annce)的地址消息時,會產生系統事件ZDO\_CB\_MSG,可以在應用層事件處理函數中處理事件,代碼如下圖所示。 ![](https://img.kancloud.cn/36/c5/36c56f632fd8a5fd0d8a69bcde4519c1_832x202.png =600x) ### 事件處理函數zclSampleSw\_ProcessZDOMgs的代碼定義如下: ### ``` 1.static?void?zclSampleSw_processZDOMgs(zdoIncomingMsg_t?*pMsg)?? 2.{?? 3. switch?(?pMsg->clusterID?)//判斷消息中的Cluster ID 4. {?? 5. case?Device_annce://如果是Device_annce 6. {?? 7. // 把目標設備的網絡地址保存到全局變量中 8. zclSampleSw_OnOffTestAddr?=?pMsg->srcAddr.addr.shortAddr; 9. // 在屏幕上顯示目標設備網絡地址和提示信息 10. HalLcdWriteStringValue("Node:",?pMsg->srcAddr.addr.shortAddr,?16,?3);?? 11. HalLcdWriteString("On/Off?Test...",?4);?? 12.???????? 13. //周期地產生SAMPLEAPP_ONOFF_TEST_EVT事件,即發送On/Off指令 14. osal_start_timerEx(zclSampleSw_TaskID,??? 15.?????????????????????????SAMPLEAPP_ONOFF_TEST_EVT,//事件類型,在zcl\_samplesw.h文件中定義 16.?????????????????????????SAMPLEAPP_ONOFF_TEST_PERIOD);//時間間隔,在zcl\_samplesw.h文件中定義? 17. }?? 18.???? break;?? 19.???? default:?? 20.???? break;?? 21. }?? 22.} ``` <br/> #### **處理SAMPLEAPP_ONOFF_TEST_EVT事件** 在zcl\_samplesw.c文件中找到zclSampelSw\_eventloop函數,添加事件處理代碼,如下圖所示。 ![](https://img.kancloud.cn/4a/e9/4ae9b73c64d1ffcc4e127e720e8beaf9_752x392.png =600x) <br/> #### **發送On/Off指令** 在SAMPLEAPP\_ONOFF\_TEST\_EVT事件處理代碼中調用了zclSampleSw\_OnOffTest來發送指令,該函數定義如下: ### ``` static?void?zclSampleSw_OnOffTest(void)? {?? afAddrType_t?destAddr;//用于保存目標設備的地址信息 static?uint8?txID?=?0;?? static?bool??on???=?true;//靜態變量,指示智能插座的開關狀態 destAddr.endPoint?=?SAMPLESW_ENDPOINT;//端點號 destAddr.addrMode?=?Addr16Bit;//地址模式(類型)為16為的地址,使用P2P的通信方式 destAddr.addr.shortAddr?=?zclSampleSw_OnOffTestAddr;//網絡地址? if(on)??{//如果智能插座正在開啟 HalLcdWriteString("Command:?ON",?4);??// 屏幕打印提示信息 zclGeneral_SendOnOff_CmdOn(//發送打開命令 SAMPLESW_ENDPOINT,//端點號 &destAddr,//地址信息 TRUE,//TRUE表示屬性關聯命令 txID++); }?? else//如果智能插座已關閉 {?? HalLcdWriteString("Command:?OFF",?4);??// 屏幕打印提示信息 zclGeneral_SendOnOff_CmdOff(//發送關閉命令 SAMPLESW_ENDPOINT,//端點號 &destAddr,//地址信息 TRUE,//TRUE表示屬性關聯命令 txID++); }?? on?=?!on;//反轉開關狀態 } ``` <br/> ## **仿真調試** * 編譯協調器工程,然后把固件燒錄到其中一塊開發板中,該開發板充當網關; * 編譯終端(或路由器)工程,然后燒錄到另外一塊開發板中,該開發板充當智能插座; * 先后分別給網關和智能插座供電; * 智能插座會自動加入到網關創建的網絡中,接著可以在智能插座的顯示器中看到有網關發送過來的命令,如圖所示。 ![](https://img.kancloud.cn/51/16/511634fc10916994e2c39996d081610a_276x244.png =150x) ![](https://img.kancloud.cn/cb/2b/cb2b554f3e7b6bc0ebdb3d509cdce53f_288x240.png =150x) <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>

                              哎呀哎呀视频在线观看