手把手帶你使用ZigBee——通過愛智控制EFR32,以及 Simplicity Studio 使用過程中注意事項

靈感桌面發表於2022-03-24

前言

兄弟們,我發現一個有意思的東西,我在愛智官網翻資料的時候,發現他們終於終於把官網文件的索引優化了!有一說一,真是方便不少,終於不再是一堆文件糊在一坨了。

另外我還發現他們居然做了一個EFR32的教程 我去年就很想搞一個來玩的,但是網上資料太少了,難搞的一逼,於是簡單弄了一下後就丟一遍吃灰去了。現在終於可以回過頭把EFR32撿起來了。

配置 Simplicity Studio 可能遇到的問題

關於 Simplicity Studio 介紹和簡單教程可以看看我去年寫的《基於EFR32的Zigbee開發-自定義Cluster》 ,接下來就是跟著官方的EFR32的教程 配置一下,我跟著做了一遍,完全可以,但是有很多細節一定要注意,很容易忽略。

首先是編譯過程中出現出現各種找不到檔案,搜尋這些檔案的時候發現都是IDE目錄下的檔案,最後檢視Makefile列印的時候發現,報錯的編譯資訊的路徑都是“./xxx/xxx”開頭,看了一下這個./實際上是 workspace 資料夾所在的地址,也就是說編譯的時候它是以workspace所在的地址為根目錄去IDE裡面的檔案,也就是說必須把 workspace 和 IDE 塞一個資料夾裡面。沒見過這麼奇怪的做法。
在這裡插入圖片描述
編譯提示各種巨集缺少的時候,看看缺少的巨集是什麼巨集,看上去像各種功能相關的,那大概率是 ZCL Clusters 那邊勾選出了問題,如果看上去是各種硬體的巨集報錯,那就檢查一下硬體配置。
在這裡插入圖片描述
ZCL Clusters 這裡是配置一些命令和通道之類的東西,在下一個章節我在細說。
在這裡插入圖片描述
在這配置硬體相關的東西,注意右側紅框內的東西,比較容易被忽略,需要根據你板子實際情況選擇。

配置 ZCL Clusters

官方教程中使用了基於 ZigBee HA 修改出了自己的一個規範,也給了一個XML檔案給大家做一個參考,而這個 XLM 檔案其實就是 ZDDC 裝置端的關鍵。這裡需要我們去官方教程中複製文件最下面的 XML 程式碼 :

<configurator>
  <domain name="acoinfo" />
  <cluster>
    <name>acoinfo_aio</name>
    <domain>acoinfo</domain>
    <description>Acoinfo custom cluster</description>
    <code>0x000C</code> 
    <define>ACOINFO_ZB_AIO_CLUSTER</define>
    <client init="false" tick="false">true</client>
    <server init="false" tick="false">true</server>
    <attribute side="server" code="0x2000" define="ACOINFO_ZB_AIO_ATTR_1" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_1</attribute>
    <attribute side="server" code="0x2001" define="ACOINFO_ZB_AIO_ATTR_2" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_2</attribute>
    <attribute side="server" code="0x2002" define="ACOINFO_ZB_AIO_ATTR_3" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_3</attribute>
    <attribute side="server" code="0x2003" define="ACOINFO_ZB_AIO_ATTR_4" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_4</attribute>
    <attribute side="server" code="0x2004" define="ACOINFO_ZB_AIO_ATTR_5" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_5</attribute>
    <attribute side="server" code="0x2005" define="ACOINFO_ZB_AIO_ATTR_6" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_6</attribute>
    <attribute side="server" code="0x2006" define="ACOINFO_ZB_AIO_ATTR_7" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_7</attribute>
    <attribute side="server" code="0x2007" define="ACOINFO_ZB_AIO_ATTR_8" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_8</attribute>
  </cluster>

  <clusterExtension code="0x0006"> 
    <attribute side="server" code="0x2000" 
      define="ACOINFO_ZB_DIO_ATTR_1" 
      type="BOOLEAN" min="0x00" max="0x01" writable="true" 
      default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_1</attribute>
    <attribute side="server" code="0x2001" 
      define="ACOINFO_ZB_DIO_ATTR_2" 
      type="BOOLEAN" min="0x00" max="0x01" writable="true" 
      default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_2</attribute>
    <attribute side="server" code="0x2002" 
      define="ACOINFO_ZB_DIO_ATTR_3" 
      type="BOOLEAN" min="0x00" max="0x01" writable="true" 
      default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_3</attribute>
    <attribute side="server" code="0x2003" 
      define="ACOINFO_ZB_DIO_ATTR_4" 
      type="BOOLEAN" min="0x00" max="0x01" writable="true" 
      default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_4</attribute>
    <attribute side="server" code="0x2004" 
      define="ACOINFO_ZB_DIO_ATTR_5" 
      type="BOOLEAN" min="0x00" max="0x01" writable="true" 
      default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_5</attribute>
    <attribute side="server" code="0x2005" 
      define="ACOINFO_ZB_DIO_ATTR_6" 
      type="BOOLEAN" min="0x00" max="0x01" writable="true" 
      default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_6</attribute>
    <attribute side="server" code="0x2006" 
      define="ACOINFO_ZB_DIO_ATTR_7" 
      type="BOOLEAN" min="0x00" max="0x01" writable="true" 
      default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_7</attribute>
    <attribute side="server" code="0x2007" 
      define="ACOINFO_ZB_DIO_ATTR_8" 
      type="BOOLEAN" min="0x00" max="0x01" writable="true" 
      default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_8</attribute>
  </clusterExtension>
  
  <clusterExtension code="0x0300"> 
    <attribute side="server" code="0x2000" define="ACOINFO_ZB_DIO_ACTIVE_T_ATTR" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_DIO_ACTIVE_ATTR</attribute>
    <attribute side="server" code="0x2001" define="ACOINFO_ZB_DIO_WRITE_T_ATTR" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_DIO_WRITE_ATTR</attribute>
    <attribute side="server" code="0x2002" define="ACOINFO_ZB_AIO_ACTIVE_T_ATTR" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_ACTIVE_ATTR</attribute>
    <attribute side="server" code="0x2003" define="ACOINFO_ZB_AIO_WRITE_T_ATTR" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_AIO_WRITE_ATTR</attribute>
    <attribute side="server" code="0x2004" define="ACOINFO_ZB_MEM_ACTIVE_T_ATTR" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_ACTIVE_ATTR</attribute>
    <attribute side="server" code="0x2005" define="ACOINFO_ZB_MEM_WRITE_T_ATTR" 
      type="INT32U"  min="0x00000000"   max="0xFFFFFFFF"   writable="true"  
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_WRITE_ATTR</attribute>
  </clusterExtension>
  
  <clusterExtension code="0x0500"> 
    <attribute side="server" code="0x2000" 
      define="ACOINFO_ZB_MEM_ATTR_1" 
      type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true" 
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_1</attribute>
    <attribute side="server" code="0x2001" 
      define="ACOINFO_ZB_MEM_ATTR_2" 
      type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true" 
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_2</attribute>
    <attribute side="server" code="0x2002" 
      define="ACOINFO_ZB_MEM_ATTR_3" 
      type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true" 
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_3</attribute>
    <attribute side="server" code="0x2003" 
      define="ACOINFO_ZB_MEM_ATTR_4" 
      type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true" 
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_4</attribute>
    <attribute side="server" code="0x2004" 
      define="ACOINFO_ZB_MEM_ATTR_5" 
      type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true" 
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_5</attribute>
    <attribute side="server" code="0x2005" 
      define="ACOINFO_ZB_MEM_ATTR_6" 
      type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true" 
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_6</attribute>
    <attribute side="server" code="0x2006" 
      define="ACOINFO_ZB_MEM_ATTR_7" 
      type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true" 
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_7</attribute>
    <attribute side="server" code="0x2007" 
      define="ACOINFO_ZB_MEM_ATTR_8" 
      type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true" 
      default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_8</attribute>
  </clusterExtension>
</configurator>

然後儲存到一個空的文件中並另存為 XML 格式,然後將這個這個XML檔案放入:

\v4\developer\sdks\gecko_sdk_suite\v2.7\app\zcl

資料夾下,在 ZigBee Stack 中新增 XML 檔案後就能發現 ZCL Clusters 中多了一些東西。
在這裡插入圖片描述
這裡是設定模型 ID 和製造商名字什麼的。
在這裡插入圖片描述
這裡設定了對應的通道是什麼功能,截圖中的的意思就是,DIO通道1和DIO通道2分配為燈的開關。
在這裡插入圖片描述
這是最蛋疼也是最有欺騙性的地方 官方設定 :

Cluster ID :0x0300 為本規範定義的通用屬性,Attribute ID 0x2000-0x2005 為 6 個屬性,型別為
uint32,只讀

而原本的 0x0300 是被佔用了的,官方這麼玩的話,這個通用屬性就會跑到顏色那一欄去,而這個通用屬性,實際上是管理通道有效性的,上圖代表:通道 1 和通道 2 有效並且可讀可寫。

這次的程式碼我用的就是官方的程式碼,他們說得很詳細了,我就不重複一遍了。

總結

配置完成將程式碼燒入 EFR32 開發板 ,通過我們新的嗅探器傳送 dio0/1 :true/false 就可以控制我們的LED:PC0/PC1了。
在這裡插入圖片描述

相關文章