TI Zigbee Light Link 參考設計
原文出處:
http://processors.wiki.ti.com/index.php/Category:ZigBee_Light_Link
有如下五個部分資料:
§ ZStack-Lighting-1.0.1 Host Interface C Examples
目錄
1.2.1. 第一次供電時,CC2531EMK ZLL遙控器遠程連接到ZLights. 5
1.3. 從ZStack-Lighitng-1.0.1版本生成ZStack照明套件固件... 10
1.4. 使用Windows的引導程序工具更新套件固件... 10
2. ZStack-Lighting-1.0.x FAQ.. 11
2.1. 如何去掉參考平台上Zlight2的按鈕... 11
2.1.1. 不按壓按鈕的情況下,使Zlight2允許其他設備加入網絡的方法... 12
2.1.2. 不按壓按鈕的情況下,Zlight2重置到出廠設置的方法... 12
2.1.3. 不按壓按鈕的情況下,使Zlight2以傳統方式加入Zigbee網絡的方法... 13
2.2. 市場中,ZStack-Lighting-1.0.x的設備能夠和ZLL設備互操作嗎... 13
2.3. ZStack-Lighitng-1.0.1飛利浦hue兼容嗎... 14
2.3.1. 為了正確的被Hue Hub識別,Zstack-Lighting-1.0.1燈需要做一些改變... 14
3. ZStack-Lighting-1.0.1_Host_Interface_C_Examples. 16
3.1. ZStack-Lighting-1.0.1 主機接口限制... 17
3.2. ZStack-Linghting-1.0.1 主機接口C語言例子... 17
3.2.2. 使用 Stack-Lighting-1.0.1 主機接口C語言例子... 18
3.2.3. 移植zllSocCmd 模塊到你的應用程序... 20
3.3. ZStack-Lighting-1.0.1 Host Interface. 21
3.3.1. Remote Procedure Call21
1.1.1.1. Frame Check Sequence(幀檢驗序列)... 21
3.3.3.2. 3.3.2 ZCL MT APP Message. 27
4. ZigBee Lighting Gateway. 31
4.1. Setting Up The ZigBee Lighting Gateway Demo. 31
4.1.3. 下載必備的BeagleBone Linux鏡像文件... 32
4.1.4. 為BeagleBone創建可引導的SD卡文件... 32
4.1.6. 准備ZigBee網關功能的CC2531EMK USB Dongle. 35
4.1.6.1. 使用ZLL套件的中CC2531EMK. 35
4.1.6.3. 將CC2531EMK連接到Beaglebone. 36
4.1.7. 在Ninja Blocks門戶網站上創建一個帳戶(只需要一次)... 37
4.1.8. 使BeagleBone/CC2531EMK Block與 Ninja Blocks Web Portal配對... 37
4.2.1.1. 客戶端應用listDevsCmdLine. 41
4.2.1.2. 客戶端應用lightFlashCmdLine. 41
5. ZigBee Lighting Gateway SW:... 45
5.2. ZigBee照明網關固件(ZigBee Lighting Gateway FW)... 46
5.2.1. ZigBee照明網關固件的開關和LED分配... 46
5.2.2. ZigBee Lighting Gateway Host Interface. 47
5.2.2.2. 傳入的(從主機發出)MT APP消息... 48
5.2.2.3. MT APP消息傳出(到主機)... 51
5.3. Linux Lighting Gateway SW:... 53
5.3.1. Linux照明網關的ZigBee驅動程序... 53
5.3.2. Linux照明網關的ZigBee抽象... 56
5.3.3.1. 設備數據文件( Device Data File )56
5.3.3.2. 組數據文件(Group Data File)57
5.3.3.3. 場景數據文件(Scene Data File)... 57
5.3.4. 照明網關插座API (Lighting Gateway Socket API)58
1. ZStack-Lighting Kit
ZStack-Lighting 1.0.1套件包括2個按照ZigBee Light Link 彩燈的標准編程的彩燈和一個按照ZLL color scene Remote標准[c1] 編程的CC2531EMK USB轉換器。 遠程(遙控器)的基本功能可以通過2個按鈕來實現,遠程只需要由USB連接器供電即可完成這些基本功能。Windows控制台應用程序可以通過USB接口完成更多高級的功能。
套件FW是基於ZStack-Lighting-1.0.1的示例應用程序而成的,只不過要對這些例程做一些修改。
§ ZLight ZLL彩燈:
§ Zlight硬件平台得到了ZStack-Lighting-1.0.1和認證的ZLL硬件平台的支持。
§ 由於安全因素,我們做了一個修改,添加了一個熱關斷。
§ RSSI濾波器非常嚴格,最初的測試是在SmartRF05 +的CC2530EM硬件平台進行的,這個平台有一個高性能的天線。
§ 添加一個引導程序,就不需要CC-Debugger來進行固件的更新。
§ CC2531EMK ZLL遠程USB轉換器:
§ 這並不是一個被ZStack-lighting-1.0.1支持的平台,所以這個硬件目標是作為一個新的配置加入到遠程項目中。
§ CC2531EMK ZLL遠程USB轉換器只有2個按鈕,改變按鈕的邏輯能讓它完成更多的功能。
§ 改變LED的行為表現,來提供更好的用戶反饋。
§ 改變RSSI濾波器,以適應該硬件的天線的性能。
§ 添加一個引導程序,就可以在不需要CC-Debugger情況下更新固件。
CC2531EMK ZLL遠程中公開了以下功能,通過按鍵S1和S2:
| ZStack-Lighting-1.0.1 CC2531EMK按鈕分配 |
||
| 鈕 |
按 |
功能 |
| S1 |
按下 |
TouchLink(通信連接) |
| S1 |
松開 |
TouchLink(通信連接)中止 |
| S2 |
短按(<1S) |
打開命令和關閉命令之間的切換 |
| S2 |
中按(>2S) |
選擇下一個設備(選擇組的最后一個設備) |
| S1 + S2 |
長按(> 10S) |
重新置為出廠設置 |
CC2531EMK ZLL遠程用戶反饋通過LED,具有以下含義:
| ZStack-Lighting-1.0.1LED分配 |
||
| LED |
狀態 |
功能 |
| 紅色LED |
啟動時閃爍 |
遠程廠新 |
| 綠色LED |
啟動時閃爍 |
遠程端不是廠新 |
| 紅色LED |
亮 |
按下按鈕 |
| 紅色LED |
滅 |
松開按鈕 |
| 綠色LED |
啟動后閃爍 |
通信連接成功 |
| 紅色和綠色LED |
啟動后閃爍 |
重置為出廠設置 |
開發包中的Zlight(也就是LED燈)的按鈕的功能:
| ZStack-Lighting-1.0.1 ZLight的按鈕分配 |
|
| 按 |
功能 |
| 短按(<2S) |
允許加入(高級功能) |
| 中按(> 2s和<5秒) |
重設出廠設置 |
| 長按(> 10秒) |
傳統加入(高級功能) |
收到包后,只要按照這些指示操作:
1. 接通電源CC2531EMK的的Zlights和USB轉換器。
2. 按住按鈕> 10將Zlight恢復出廠設置。
§ Zlight復位后,閃爍5秒。
3. 長按S1和S2超過10s后將CC2531EMK恢復出廠設置。
§ 5秒后,紅色LED應該閃爍4次,以表明它恢復為出廠設置。
4.把其中一個Zlight放在CC2530EMK USB 轉換器很近的地方,大約在0.3m的范圍內。與其他ZLight放在離CC2530EMK USB 轉換器很遠的地方,約0.6m.
5按住S1后, Zlight將會閃爍,然后CC2531EMK上的綠色指示燈會閃爍,然后釋放S1(而不是之前)。
6. 現在,您可以按S2開啟/關閉ZLight,確保它是一個快速的按壓(按的時候一定要快速)。
7. 將其他Zlights移近到離CC2530EMK USB 轉換器 0.3m的范圍內,其他的ZLight的距離依舊保持為0.6m。
8.按住S1 ,Zlight將會閃爍,然后CC2531EMK上的綠色指示燈會閃爍,現在你可以釋放S1(而不是之前)。
§ 如果不是自己所希望的那個Zlight燈在閃爍[c2] ,簡單地釋放的S1按鈕和重新定位所需的Zlight或CC2531EMK來讓ZLight離CC2531EMK更近。
9. 現在,您可以按S2開啟/關閉ZLight的,確保它是一個快速的按壓。
10. 按住S2(>2s)來選擇要控制的Zlights, 被選定的燈將會閃爍,表示被選擇。
§ 這樣按下一次會選擇第一ZLight。
§ 按下第二次會選擇兩個ZLights
§ 按下第三次會再次選擇第二Zlight。
§ 注:如果一個燈已經重置為出廠設置和重新和CC2531EMK建立了連接,但是沒有重置CC2531EMK,通信連接選擇列表中會出現冗余的設備,有可能會造成會選擇並沒有和CC2531EMK連接的設備。
電源接通,通信連接將會一直保持,而且這個過程並不需要重復一遍,除非該設備需要被重新編程或重置為出廠設置(稍后介紹)。
和Zlight建立連接以后,這個燈就可以被控制了,如果想要改變選擇,去控制另一個先前已經被控制過的燈,需要按住S2超過1S的時間。 松開S2時,被選的ZLight會閃爍,當依次在和剩下的燈建立連接,被選的對象也在依次變化,當選擇繞回到第一個燈之前,所有的燈都被選擇過了。
要使套件返回到默認狀態(假設你沒有重新編程),你需要重設為出廠設置。 要執行一個復位使之重置為出廠設置:
§ 關於ZLight:按下ZLight上較高位置的開關多於5S的時間(但小於10S)。 5秒后,它會閃爍,表明它已經重置了。
§ 關於CC2531EMK ZLL遙控器[c4] :按下S1和S2多余5S(但小於10S)。 遠程的紅色和綠色的LED均閃爍5秒鍾,然后短暫閃爍的紅色LED,表明它被復位了。
Zlight是一種彩燈, CC2531EMK一個有彩色屏幕的遠程,但到現在為止,你還只是控制燈的亮滅。 為了實現更多的功能,你需要使用ZStack-Lighting-1.0.1遠程的“主機接口”。 Linux和Windows命令行應用程序的完整源代碼可以在這里到: https://git.ti.com/zllhostinterfaceexample/zllhostinterfaceexample/archive-tarball/master
要使用ZStack-Lighting-1.0.1遠程主機接口和CC2531EMK ZLL遠程,需要做的是:
1.下載Windows ZLL命令行控制器。
https://git.ti.com/zllhostinterfaceexample/zllhostinterfaceexample/blobs/master/Win32/zllCmdLine/Release/zllCmdLine.exe
2.將usb_cdc_driver_cc2531.inf和zllCmdLine.exe提取到同一個目錄下。
3.將CC2531EMK遠程的USB轉換器插入你的電腦中。
4。 當系統提示需要驅動程序時:File:Usb cdc driver cc2531.zip 。
5。 查找Windows已經分配給它的COM端口號:
a .打開設備管理器:Windows“開始”菜單 - >右鍵單擊“我的電腦” - >管理 - >設備管理器
b. 在端口列表中找到CC2531:
6。 啟動Windows控制台應用程序zllCmdLine.exe:
a . 單擊Windows“開始”菜單后,在搜索框中輸入RUN,然后輸入你在第二個步驟中提取的zllCmdLine.exe的文件的路徑以及設備的COM端口號:
7.將其中一個Zlight移近到CC2530EMK USB 轉換器0.5米的范圍內。
8.在控制台中鍵入“TouchLink”。就算這個Zlight之前已經和CC2531EMK遠程建立了通信連接也沒有關系。(CC2531EMK ZLL遠程連接到ZLights他們第一次供電)
9.Zlight應閃爍,控制台應出現以下信息:
C:\Users\a0741319\Documents\temp\zllCmdLine.exe-- Mar 24201317:02:45
touchlink
touchlink command executed
processRpcSysApp: Command Received Successfully
tlIndicationCb:
Network Addr :0x0002
End Point :0x0b
Profile ID :0xc05e
Device ID :0x0200
Version :0x02
Status :0x57
記下“Network Addr :0x0002”和“End Point:0x0b”。
10.燈的類型的控制:
SETSTATE - n0x0002 - e0x0b - M2 - V1
你應該會看到控制台顯示下面的內容,而且Zlight亮起。
setstate -n0x0002 -e0x0b -m2 -v1
setstate command executed with params:
Network Addr :0x0002
End Point :0x0b
Addr Mode :0x02
Value :0x01
processRpcSysApp: Command Received Successfully
第一行是執行的命令,第二行顯示命令執行時的參數:
網絡地址:0x0002
終端節點:0x0b
尋址模式:0x02
值:0x01
最后一行返回命令執行的情況。
11. 現在把飽和度調到最大(你現在可以忽略其他參數,因為你控制的是還是之前那盞燈):
setsat -v0xfe
setsat command executed with params:
Network Addr :0x0002
End Point :0x0b
Addr Mode :0x02
Value :0xfe
Transition Time :0x0001
processRpcSysApp: Command Received Successfully
第一行是執行的命令,由於是同一盞燈,所以只用寫出命令值:0xfe,其他參數可以省略
第二行表示命令所攜帶的參數:
網絡地址:0x0002
終端節點:0X0b
尋址模式:0X02
值:0XFE
轉換時間:0X0001
最后一行是返回命令執行的狀態
12.現在把hue調成紅色(色調0):
sethue -v0
sethue command executed with params:
Network Addr :0x0002
End Point :0x0b
Addr Mode :0x02
Value :0x00
Transition Time :0x0001
processRpcSysApp: Command Received Successfully
執行的命令是:sethue - V0
命令執行時的參數:
網絡地址:0x0002
終端節點:0X0b
尋址模式:0X02
值:0x00
轉換時間:0X0001
返回命令執行情況:processRpcSysApp:命令成功接收
12.現在將hue的色調轉換到藍色(0xAA),持續時間大於3秒:
sethue -v0xAA -t30
sethue command executed with params:
Network Addr :0x0002
End Point :0x0b
Addr Mode :0x02
Value :0xaa
Transition Time :0x001e
processRpcSysApp: Command Received Successfully
§ 我們可以通過和其它燈建立通信連接並記錄它們的網絡地址和終端節點編號來控制它們。
§ 我們可以通過把所有的燈划分到一組中並對這個組定義一個地址,從而來控制所有的燈,使用-m1來選擇組模式,-n0x0001代表的是組1,所有的燈在建立通信連接之后會被默認添加到組1中。當你想控制的是ZLL Lights而不是TI ZStack-Lighting-1.0.1 Lights時,需要使用廣播終端節點(-e0xff)。
ZStack-Lighting-1.0.1版本可以在http://www.ti.com/tool/z-stack 下載到。 要更新此版本生成固件預編程套件需要一個補丁。 這個補丁可以在這里找到:
File-Z-Stack-Lighting-add-on-lighting-kit.zip 。
要更新Zlight或遠程FW,我們要做的是:
1. 下載Windows串行引導: Fil:SBDemo.zip
2. 將usb_cdc_driver_cc2531.inf和SBDemo.exe提取到一個目錄下。
3. 在按着按鍵不放的情況下將Zlight插入PC,或按着S1鍵不放將CC2531EMKZLL遙控器插入PC。
a .按住按鈕的同時給設備供電,設備會進入bootloader模式。 當它在等待一個新的固件的時候,綠色的LED會不停的閃爍。
4. 當系統提示的驅動程序使用File:Usb cdc drive cc2531.zip。
5. 查找Windows已分配給它的COM端口號:
a . 打開設備管理器:Windows“開始”菜單 - >右鍵單擊“我的電腦” - >管理 - >設備管理器
b. 查找CC2531COM端口號:
6。 啟動SBDemo.exe
a. 選擇要更新的文件。
b. 選擇的COM端口。
c. 點擊加載固件。
7.過程中,綠色LED會在一段很短的時間間隔里快速閃爍。
8.一旦更新完成,紅色和綠色的LED閃爍,將啟動的新固件。
2. ZStack-Lighting-1.0.x FAQ
ZLight2板有一個用於簡單開發的按鈕,它有三個功能,這些功能由於不再需要ZLL/Zigbee設備發送命令而使開發更為簡單,這些功能包括:
●按壓按鈕(<2S):允許加入60S.
●按壓按鈕(2S-10S):重置為出廠設置.
●按壓按鈕(>10S):嘗試以傳統方式加入一個zigbee網絡.
所有這些功能都可以通過其他方式來實現。
允許加入要求其他的ZigBee設備通過ZLight2和網絡關聯。在一個典型的用例中,一個網關上有一個按鈕,通過用戶按壓按鈕,新的設備會被添加到網絡中。其中包括在網關上按下此按鈕后,可以將消息發送到所有設備,並指示他們將被允許加入一個指定的時間長度,從而免除了此按鈕在ZLight2上的功能。借助TI ZStack,這可以用下面的代碼實現:
static void enablePermitJoin( byte duration )
{
zAddrType_t dstAddr;
//only needs to be done once, can be moved to init code只需要執行一次,可以移到初始化代碼中
ZDSecMgrPermitJoining( 0xFF );
//permit join on the device允許加入的設備
NLME_PermitJoiningRequest( duration );
//Permit join to network允許加入到網絡
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVZCZR;
dstAddr.addrMode = Addr16Bit;
ZDP_MgmtPermitJoinReq( &dstAddr, duration, 1, 0 );
}
這個問題可以通過一個編程有ZLL認證密鑰的ZLL初始化來實現,比如ZStack-Lighting-1.0.x 中提供的ZLL遠程例程。啟動一個TouchLink並確保燈和遠程是在鄰近的范圍內是TouchLink成功所需要做到的:
static void enablePermitJoin( byte duration )
zllInitiator_StartDevDisc();
當ZLight處於閃爍識別狀態時,發送重置為出廠設置的互聯個域網命令:
static void enablePermitJoin( byte duration )
zllInitiator_ResetToFNSelectedTarget();
當ZLight2通電同時處於出廠設置時,會自動盡可能的加入一個ZigBee網絡,這意味着當它第一次通電后,它會搜索並加入一個ZigBee網絡,如果沒有找到ZigBee網絡,它會等待TouchLink。在隨后的供電周期,它會一直重復這些工作,直到發現一個ZigBee網絡,或ZLight2已經建立了通信連接。如果ZLight2重置為出廠設置,那么它也會重復這些動作。這個功能可以通過在Projects\zstack\ZLL\SampleLight\Source\zll_samplelight.c添加下面的代碼來實現:
●在文件頂端的INCLUDE部分,#include "zll_target.h"的下方添加下面的代碼:
#include "zll_target.h"
#include "zll.h"
●在函數void zllSampleLight_Init( byte task_id )的末尾,加上下面的代碼:
if( zll_IsFactoryNew() )
{
zllTarget_ClassicalCommissioningStart();
}
可以,但是需要我們理解這些限制。
市場上的ZLL產品都經歷了相同的ZigBee Light Link認證過程(ZStack-Lighting-1.0.0),這個過程中使用了公開的ZLL認證密鑰。然而,產品制造商已采取其他的行動從Zigbee聯盟獲得秘密的ZLL主秘鑰[c5] ,而這個主秘鑰,由於ZLL主秘鑰的保密性,TI沒有將其公開,也沒有將它放入ZStack-Lighting版本中。
ZLL的TouchLink過程中采用密鑰的位掩碼的方式來讓設備知道其他設備支持什么秘鑰。一個隨機產生的網絡鑰密匙由Touchlink的發起者用ZLL秘鑰加密后,從秘鑰的位掩碼上看,遠程和燈的秘鑰是很相似的。然后ZLL target(ZLL Light)使用同樣的ZLL秘鑰將隨機產生的網絡密鑰解碼。
在認證過程,開發和運間事件中,ZLL設備的密鑰位掩碼被設定為ZLL認證密鑰,ZLL認證密鑰被存儲在設備中來對TouchLink過程中傳輸的隨機網絡秘鑰進行編碼/解碼。ZLL產品秘鑰的位掩碼中沒有設置ZLL認證密鑰位,而是設置ZLL主密鑰位,有ZLL的主密鑰存儲在設備。
這意味着,包含有ZLL認證秘鑰的ZStack-Lighting-1.0.x設備將無法與現有市場上的ZLL產品建立通信連接和加入同一個網絡。然而,在ZLL有一個“傳統配置”的概念,它被包括在HA 運行期間。一旦兩個設備建立通信連接並創建一個“ZLL網絡”,其他設備可以采用不需要建立連接的一般的ZigBee聯通的方式加入該網絡,但是,這個ZLL的網絡中沒有協調器,設備以傳統方式加入網絡,使用一個ZLL 秘鑰以一種類似的方式在HA作為trustcentre鏈路秘鑰。所以即使在這種情況下,ZStack-Lighting-1.0.x 設備還是不能以傳統方式和ZLL網絡聯通。
讓ZStack-Lighting-1.0.x 設備能和ZLL產品一起工作的方法是:讓ZLL產品以傳統方式與HA網絡聯通。現在,他們使用眾所周知的的HA trustcentre鏈路密鑰,ZStack-Lighting-1.0.x設備也可以采用傳統方式加入同一個網絡。既然ZLL產品和ZStack-Lighting-1.0.x的設備現在在同一網絡中,他們就可以使用的TouchLink,ZStack-Lighting-1.0.x遠程將會添加ZLL Light產品到目標列表中並且控制這些燈,同樣的,ZLL產品遠程也能夠進行Touchlink。完成以上過程之后,ZStack-Lighting-1.0.x遠程能夠發送ZLL lighting commands給ZLL light product,反之亦然。
如何讓市場上現有的ZLL設備加入HA網絡
ZLL規范強制規定ZLL設備必須加入HA網絡。但是具體以何種方式加入是由制造商決定的,如何做到這一點可從ZLL產品工廠得到詳細的信息。對於ZLL遙控器,這很可能是由一些按鈕組成,對於燈(由於燈一般沒有按鈕)按鈕,當他們通電且還沒有加入一個HA網絡時,它們將會搜索一個HA網絡,這是一種很常見的方式。
如何使用ZStack-Lighting-1.0.1遠程重置認證的ZLL產品,使它離開舊的網絡
現在市場上的ZLL產品可以被ZStack-Light-1.0.1設備重置為出廠設置,前提啟用主秘鑰,實際的秘鑰在復位過程中並不使用,只是在TouchLink初始階段你需要正確的秘鑰位掩碼。如何啟用主秘鑰,詳情請見“ZStack Lighting Developers Guide.pdf”的3.1節。為了從ZStack-Lighting 遠程發送一個reset命令,你需要使用zllInitiator_StartDevDisc()來啟動一個通信連接,然后當ZLL燈閃爍時,再發送zllInitiator_ResetToFNSelectedTarget()。
ZStack-Lighting-1.0.x經過ZigBee-Light-Link認證,但是默認設置時不能與飛利浦的Hue Hub進行互操作。ZigBee-Light-Link的主密鑰有一些難點,而偏偏主密鑰是保密的,所以不能包含在TI公開的版本中,這個問題在上面的常見問題解答有所討論,但是,還有一些其他的要點需要我們去理解。
注意:ZStack-Lighitng-1.0.1中有一個重要的參數需要被改變,這個參數是ZStack-Lighitng-1.0.1燈的默認值,只有改變這個參數后,才可以被Hue Hub識別。 ZStack-Lighitng-1.0.1中的簡單描述符的形成是通過使用HA文檔和當前定義的HA照明設備ID,這是為了讓它能夠被ZLL或HA網關識別,同時代價是ZLL網關將不會發送增強的ZLL命令(因為設備顯示為HA設備)。然而,Hue Hub並不會在當前檢查Profile ID並認為連接的設備就是ZLL設備(因為它形成的是一個ZLL網絡),基於這個原因,默認情況下,使用一個ZStack-Lighitng-1.0.1 的HA設備ID將不會被Hue Hub所識別。
對於一個ZStack-Lighitng-1.0.1的燈而言,要想被Hue Hub識別,你需要修改zll_samplelight.c,使HA設備ID變為ZLL設備ID。
#define ZLL_HUB_COMPATIBILITY
#ifndef ZLL_DEVICEID
#ifdef ZCL_COLOR_CTRL
#define ZLL_DEVICEID ZLL_DEVICEID_COLOR_LIGHT
#ifdef ZLL_HUB_COMPATIBILITY
#define HA_DEVICEID ZLL_DEVICEID
#else
#define HA_DEVICEID ZCL_HA_DEVICEID_COLORED_DIMMABLE_LIGHT
#endif
#else
#ifdef ZCL_LEVEL_CTRL
#define ZLL_DEVICEID ZLL_DEVICEID_DIMMABLE_LIGHT
#ifdef ZLL_HUB_COMPATIBILITY
#define HA_DEVICEID ZLL_DEVICEID
#else
#define HA_DEVICEID ZCL_HA_DEVICEID_DIMMABLE_LIGHT
#endif
#else
#define ZLL_DEVICEID ZLL_DEVICEID_ON_OFF_LIGHT
#ifdef ZLL_HUB_COMPATIBILITY
#define HA_DEVICEID ZLL_DEVICEID
#else
#define HA_DEVICEID ZCL_HA_DEVICEID_ON_OFF_LIGHT
#endif
#endif
#endif
#endif
ZLL開/關光燈,電平控制燈的設備ID與HA設備ID相互沖突,如上述的變化對一個試圖識別HA和ZLL的設備(僅適用於ZLL開/關燈與電平控制燈)造成麻煩。ZLL 1.1規范和HA 1.2規范將ZLL設備ID一致化,ZLL開/關燈和電平控制燈設備的ID號將會改變來避免今天所出現的沖突。
Changing the Profile ID for the Application end point to be the ZLL Profile ID is not trivial and should not be attempted.?
TouchLink端點設備ID也應改變,以避免ZLL控制器不檢查看到的TouchLink端點的可控裝置的簡單描述符(包括Hue Hub)。要做到這一點,改變zll_target.c中的AppDeviceId:
SimpleDescriptionFormat_t zllTarget_SimpleDesc =
{
ZLL_TARGET_ENDPOINT, // int Endpoint;
ZLL_PROFILE_ID, // uint16 AppProfId[2];
#ifdef ZLL_HUB_COMPATIBILITY
0x2BEE, // uint16 AppDeviceId[2] - set to an invalid device ID;
#else
ZLL_DEVICEID_COLOR_LIGHT, // uint16 AppDeviceId[2];
#endif //ZLL_HUB_COMPATIBILITY
ZLL_TARGET_DEVICE_VERSION, // int AppDevVer:4;
ZLL_TARGET_FLAGS, // int AppFlags:4;
ZLL_TARGET_MAX_INCLUSTERS, // byte AppNumInClusters;
(cId_t *)zllTarget_InClusterList, // byte *pAppInClusterList;
ZLL_TARGET_MAX_OUTCLUSTERS, // bytAppNumInClusters;
(cId_t *)zllTarget_OutClusterList // byte *pAppInClusterList;
3. ZStack-Lighting-1.0.1_Host_Interface_C_Examples
ZStack-Lighting-1.0.1遠程工程包括一個主機接口,通過UART允許主處理器通過UATR連接到一個CC253x和使用一個抽象的ZLL API 控制ZLL網絡。這個主機接口的說明,在第六節有關"Z-Stack Lighting API.pdf"中,可以在 "Z-Stack Lighting 1.0.1\Documents\API"文件夾里找到。Z-Stack-Lighting-1.0.1 的安裝程序可以在 http://www.ti.com/tool/z-stack 下載。
這個wiki詳細的描述了ZLL主機接口,提供了在一個linux主處理器上C語言的例子。可以很容易的被移植到其他的操作系統。當開發一個基於ZStacking-lighting-1.0.1的ZLL 遠程設備的主機應用程序時,這些代碼可以作為開發起點的參考代碼被共享。
下面是有人想創造一個zll主機的兩個原因:
·一個便捷式高端ZLL遠程。
·一個固定的ZLL控制器
ZStack-lighting-1.0.1主機接口用於一個ZLL遙控的實施,也就是一個高端的遙控. 需要強調的是實施一個使用 ZStack-Lighting- 1.0.1 遠程示例應用程序的ZLL主機控制器存在一定的局限性。
§ ZLL遠程示例應用程序僅僅作為終端設備被實施。因此它不能創建一個網絡鏈接或作為一個路由器
§ ZLL示例應用程序必需觸動連接燈,為了發現網絡地址和終端,這是需要控制燈。這個需要接近觸摸連接網絡上所有的燈。
對於不開發高端遙控器的用戶,而是開發固定ZLL控制設備,這些局限性是不可接受的,可以通過以下方式克服:
1) 使用HA協調器照明網關[c6] (ZLL 設備采用經典的配置模式能夠加入HA網關)。在這個wiki 頁面
http://processors.wiki.ti.com/index.php/ZigBee_Lighting_Gateway. 這個工作已經完成。這個wiki 提供:
§ CC2530 HA 協調器 FW 實現設備和 ZStack-lighting-1.0.1 主機接口。
§ Linux 主機ZigBee 網關服器SW
§ 雲服務鏈接控制燈
§ Android 應用程序控制燈,綁定一個HA燈控制設備(HA 開關和感應器)。
2) 在 ZStack-Lighting-1.0.1 里創建一個ZLL控制橋應用。在未來的版本中將會解決這個問題。
基於Linux 系統的C語言例子實現 ZStack-Linghting-1.0.1 主機接口C語言例子的例子已經被創造。ZStack-Linghting-1.0.1主機接口 C語言例子的完整源代碼在一個 git 上,可以在這兒下載壓縮文件。
例子中包含兩個模塊:
1) ·zllSocCmd.c/h 這個模塊包含ZStack-Linghting-1.0.1的主機接口的主函數功能。主機接口和公開的抽象的API發送命令和控制ZLL設備。
2) ·zll_controller.c 這個使用zllSocCmd 模塊的示例應程序。它通過命令行公開zllSocCmd函數。
(1) ZStack-Lighting Remote:
§ 1 x SmartRF05+CC2530EM for programming as a ZStack-Lighting Remote and Light, available as part of the CC2530DK from here.
(2) ZStack-Lighting Light(s):
§ SmartRF05+CC2530EM(s) for programming as a ZStack-Lighting Light(s) (2 available in above kit).
AND/OR
(1) ZLight(s) for programming as a ZStack-Lighting Light(s), HW available soon.
(2) Linux 機器或者 VM用於構建和運行主機接口 C語言例子。
(3) 一個串口USB轉換線如果 Linux 機器上沒有串行接口。
A SmartRF05-EB+CC2530EM must be programmed with the ZStack-Lighting-1.0.1 Remote FW and the SmartRF05-EB+CC2530EM(s)/Zlight(s) must be programmed with the ZStack-Lighting-1.0.1 Light FW.關於說明在第三節的the Z-Stack Lighting Sample Application Users Guide.pdf ,可以在 "Z-Stack Lighting 1.0.1\Documents" 文件中找到。
The SmartRF05-EB+CC2530EM 程序作為the ZStack-Lighting remote 必須通過一個USB 串口線連接到Linux機器(除非Linux機器有一個 UART 接口然后可以直接鏈接串行線)
ZLL 控制器應用程序提供命令行允許你控制ZLL設備在網絡上。
你首先創建Linux應用程序的例子,如果本機編譯器的Linux機器被使用,和運行Makefile 一樣簡單,在實例中提供:

如果本地編譯不能使用,你應該改寫 gcc 命令在生成文件中去調用交叉編譯器。

一旦應用程序創建,你應該啟動命令行和指定設備,the ZStack-Lighting Remote 出現在你的系統。如果你使用USB轉串口線這通常是/dev/ttyUSB0:

在控制燈之前,你必須線先配對ZLL燈控制器。這通過Touchlink[c8] 是可以做到的。

一旦經過連接的設備可以被控制了,多個設備可以進行連接,設備選擇使用通過the -n<network address paramter>,可利用的命令是:

參數是:

一個成功的觸摸連接會設置網絡地址和新配對的設備的端點。新配對的燈用下面的命令打開:
![]()
下面的例子將會發送一個 MoveToHue命令到網絡地址 0x003端點0xb,這將導致設備移動到紅色調超過3秒(飽和度設置為高,看到變化):
![]()
參數被記住,鍵入下面的命令后就會變為藍色調:
![]()
色調的值范圍0x0-0xFF代表the 360Deg color wheel,這里:

飽和度的值是 0x0-0xFE ,這里:
![]()
首先主機需要打開串口到CC253x,在zllSocOpen函數中被執行。
![]()
返回字符文件以便應用程序可以poll(輪詢) the CC253x device。這樣可以用來poll(輪詢)在串口上的輸入,當數據可用時,CC253x 處理函數必須調用讀取和解析的消息。
![]()
Messages from the CC253x are then transalted to call back functions. The host application can then register the following callback functions

這是通過填充回調表中的回調,應用程序有興趣接受,那些不需要設置為空,把它傳遞到下面的回調注銷函數:

一旦串行口打開,主機可以發送命令,使用下面的函數:

ZStack-Lighting-1.0.1主機接口公開使用的是MT(管理和測試)接口,此接口允許UART的數據包(be routed to)發送到運行在ZStack上的應用程序上。包含MT報文的UART數據包按照2.1節中“Z-Stack Monitor and Test API.pdf”說明的RPC(Remote Procedure Call,遠程過程調用)協議(are formatted)來規范;在RPC數據包里有一個MT(header)標頭指定這個報文在ZStack內(be routed)連接的位置,在這種情況下,MT(header)標頭需要以報文發送給運行在CC253x ZStack FW上的應用程序的方式(are formatted)來規范。
數據包的結構,如下所示:
| RPC Message Format RPC報文格式 |
||||
| RPC標頭 |
MT標頭 |
MT_APP標頭 |
ZLL_MT_APP / ZCL_MT_APP命令 |
RPC幀校驗序列 |
RPC數據包包含一個SOF(幀開始)字節幫助實現UART發送的數據包同步,接着是RPC的有效載荷(在這種情況下是MT報文)最后以FCS(幀校驗序列)結束。
| RPC Packet Format |
||
| SOF |
Payload |
FCS |
| 1 Byte |
3 - 256 Bytes |
1 Byte |
· SOF:必須設置為0xFE
· 有效載荷:在這種情況下,它是MT報文,請參閱第XXX \ N
· FCS:請參閱XXX節
1.1.1.1. Frame Check Sequence(幀檢驗序列)
The FCS can be calculated by the below C code:(FCS由下面的C代碼,可以計算:)
/*********************************************************************
* @fn calcFcs
*
* @brief populates the Frame Check Sequence of the RPC payload.
*
* @param msg - pointer to the RPC message
*
* @return none
*/
void calcFcs(unsignedchar*msg,int size)
{
unsignedchar result =0;
int idx =1; //skip SOF
int len =(size - 1); // skip FCS
while((len--)!= 0){
result ^= msg[idx++];
}
msg[(size-1)]= result;
}
MT報文組成了RPC數據包的有效載荷。MT報文的格式在下面的表中所示:
| MT報文格式 |
|||
| 長度 |
CMD0 |
CMD1 |
數據 |
| 1字節 |
1字節 |
1字節 |
0 - 251字節 |
· 長度:MT數據的長度(0 - 251)
· CMD0:7-5位是指令類型,4-0位是子系統ID
o 對於MT_APP指令,指令方式:SREQ是將報文發送給CC253x,AREQ是報文從CC253x送出。
o 對於MT_APP報文,子系統ID應設置為0x09
| 指令類型 |
|
| Type類型 |
Value值 |
| POLL |
0X00 |
| SREQ |
0X20 |
| AREQ |
0X40 |
| SRSP |
0X60 |
· CMD1:這是MT_APP的指令ID,應該被設置為0。
MT的APP照明ZStack-1.0.1主機接口中使用的消息有2種類型:
· ZLL_MT_APP報文
· ZCL_MT_APP報文
3.3.3.1. ZLL MT APP報文
ZLL_MT_APP報文公開一個接口發送命令,指定ZLL的(profile)配置文件。這些消息可以被認為是(control plane)控制層面消息,他們在網絡上控制設備的(behavior)狀態(例如加入或離開網絡)。
ZLL_MT_APP報文的結構如下所示:
| ZLL_MT_APP報文格式 |
|||||||
| 應用程序端點 |
保留的 |
集群ID |
日期長度 |
保留的 |
ZLL_MT_APP命令ID |
保留的 |
ZLL_MT_APP命令有效載荷 |
| 1字節 |
3個字節 |
2個字節 |
1字節 |
3個字節 |
1字節 |
2個字節 |
X字節(定義命令) |
· 應用程序端點: ZLL的應用程序端點,應設置為0x0B
· (Reserved)保留字:所有保留的字節應設置為0x00
· ZLL_MT_APP集群ID:應設置為0xFFFF
· 日期長度:這應該是6(+)加上 ZLL_MT_APP命令參數的數量
· 命令ID:見下文支持的命令
ZLL MT APP報文目前支持ZLL控制器應用程序是:
| ZLL MT APP發送給CC253x的命令 |
||
| ZLL_MT_APP命令 |
值 |
參數(1個字節) |
| ZLL_MT_APP_RPC_CMD_TOUCHLINK |
0X01 |
N / A |
| ZLL_MT_APP_RPC_CMD_RESET_TO_FN |
0X02 |
N / A |
| ZLL_MT_APP_RPC_CMD_CH_CHANNEL |
0X03 |
目標通道 |
| ZLL_MT_APP_RPC_CMD_JOIN_HA |
0x04 |
N / A |
| ZLL_MT_APP_RPC_CMD_SEND_RESET_TO_FN |
0X06 |
N / A |
| 從CC253x 發送的ZLL MT APP命令 |
||
| 命令 |
值 |
參數 |
| MT_APP_ZLL_TL_IND |
0X81 |
EpInfo結構,EEE在下面。 |
ZLL_MT_APP_RPC_CMD_TOUCHLINK
此命令將(cause)觸發CC253x ZLL控制器開始Touch Link事務。 (TouchLink is proximity based, so for a succulence TouchLink the traget light must be close the the controller.) TouchLink是接近為基礎的,所以對於一個TouchLink,目標燈必須靠近控制器。一個典型的距離為小於2米,但是這依賴於天線的質量和環境。
這是“限制”一節中詳細討論。
ZLL_MT_APP_RPC_CMD_RESET_TO_FN
此命令將觸發CC253x ZLL控制器恢復出廠設置。控制器將發出一個網絡離開報文告知其他設備,它將離開網絡。然后,它會在5秒后重置。
ZLL_MT_APP_RPC_CMD_CH_CHANNEL
This command will cause the CC253x ZLL controller to initiate a channel change procedure the move the network to a new channel defined by the "Target Channel" parameter.
此命令將導致列出CC253x ZLL控制器來啟動一個通道來改變程序-移動網絡為一個定義為“Target Channel”參數的新通道。
ZLL_MT_APP_RPC_CMD_JOIN_HA
This command will cause the CC253x ZLL controller to initiate a "Classical Join" procedure. The CC253x ZLL controller will scan for a ZigBee network and attempt to association in the classical ZigBee way.
此命令將導致列出CC253x的ZLL控制器啟動“Classical Join”程序。ZLL控制器將掃描一個ZigBee網絡,並嘗試以傳統的ZigBee方式連接。
ZLL_MT_APP_RPC_CMD_SEND_RESET_TO_FN
此命令將觸發的CC253x ZLL控制器發送一個“Reset To Factory New”命令。當前的實現需要發送上下文中的TouchLink事務,所以首先,用戶必須啟動TouchLink,那么當目標指示燈標識別“Reset To Factory New”,命令必須發送。一旦“Reset To Factory New”命令被一個ZLL燈接收,將停留在TouchLink事務,燈將恢復出廠設置。TI的一個ZLL燈的實現,這意味着燈將發送網絡離開命令,然后5s后復位。其他實現可能稍有不同的時間,但最終的結果將是相同的。
ZLL_MT_APP_CMD示例
一個規范和發送的ZLL_MT_APP_CMD例子如下所示。在這個例子中它是一個ZLL_MT_APP_RPC_CMD_TOUCHLINK的命令:
/*********************************************************************
* MACROS
*/
#define APPCMDHEADER(len) \
0xFE, \
len, /*RPC payload Len */ \
0x29, /*MT_RPC_CMD_AREQ + MT_RPC_SYS_APP */ \
0x00, /*MT_APP_MSG */ \
0x0B, /*Application Endpoint */ \
0x02, /*short Addr 0x0002 */ \
0x00, /*short Addr 0x0002 */ \
0x0B, /*Dst EP */ \
0xFF, /*Cluster ID 0xFFFF invalid, used for key */ \
0xFF, /*Cluster ID 0xFFFF invalid, used for key */ \
#define BUILD_UINT16(loByte, hiByte) \
((uint16_t)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8)))
/*********************************************************************
* CONSTANTS
*/
#define ZLL_MT_APP_RPC_CMD_TOUCHLINK 0x01
...
/*********************************************************************
* @fn zllSocTouchLink
*
* @brief Send the touchLink command to the CC253x.
*
* @param none
*
* @return none
*/
void zllSocTouchLink(void)
{
uint8_t tlCmd[]={
APPCMDHEADER(13)
0x06, //Data Len
0x02, //Address Mode
0x00, //2dummy bytes
0x00,
ZLL_MT_APP_RPC_CMD_TOUCHLINK,
0x00, //
0x00, //
0x00 //FCS - fill in later
};
calcFcs(tlCmd,sizeof(tlCmd));
write(serialPortFd,tlCmd,sizeof(tlCmd));
tcflush(serialPortFd, TCOFLUSH);
}
MT_APP_ZLL_TL_IND
該命令將被CC253x ZLL控制器發送在(a successful TouchLink)配置好的TouchLink。該報文將包含目標設備的端點信息。
| MT報文格式 |
||||
| 網絡地址 |
端點 |
配置 ID |
ID設備ID |
版本 |
| 2個字節 |
1字節 |
2個字節 |
1字節 |
1字節 |
· 網絡地址:16位目標設備的網絡地址
· 端點:端點目標設備
· 配置編號:資料編號的目標設備
· 設備ID:目標設備的設備ID
· 版本:目標設備的版本:
ZLL控制器應用程序必須存儲端點信息來發送ZCL_MT_APP的報文在網絡上控制燈光。
3.3.3.2. 3.3.2 ZCL MT APP Message
ZCL_MT_APP報文公開一個接口發送ZCL部分的命令。這些消息可以被認為是數據平台消息,它們控制在網絡中的燈(例如,開/關,水平等)。該接口可用於任何ZCL命令,開發人員應該查閱ZCL規格來決定哪些命令應該被產品支持。
如下所示的ZCL_MT_APP消息的結構:
| MT Message Format MT消息格式 |
|||||||||
| Application End Point應用程序端點 |
Network Address網絡地址 |
Destination End Point目的地端點 |
ZCL Cluster ID ZCL集群ID |
Date Len日期長度 |
Address Mode地址模式 |
ZCL Frame Control Field ZCL幀控制字段 |
ZCL Transaction Sequence Number ZCL事務序列號 |
ZCL Command ID ZCL命令ID |
ZCL Command Payload ZCL命令有效載荷 |
| 1字節 |
2字節 |
1字節 |
2字節 |
1字節 |
1字節 |
1字節 |
1字節 |
1字節 |
X字節(定義命令) |
· 應用程序端點:這是應用的端點ZLL的應用程序,應設置到0x0B
· 保留字:所有保留的字節應設置為0x00。
· 網絡地址:發送ZCL報文的設備的網絡地址(或groupId取決於地址mmode),設備的TouchLink的網絡地址發送在MT_APP_ZLL_TL_IND報文。
· 目標端點:發送ZCL報文的設備的端點,端點設備的TouchLink在MT_APP_ZLL_TL_IND報文中發送。
· ZCL集群ID:集群ID ZCL命令的發送。請參閱ZCL規范。
· 日期長度:這應該是6(+)加上ZCL命令參數的數量
· 地址模式:ZCL報文地址模式
| Address Mode地址模式 |
|
| AddrNotPresent |
0 |
| AddrGroup |
1 |
| Addr16Bit |
2 |
| Addr64Bit |
3 |
| AddrBroadcast |
15 |
對大多數的應用程序,僅僅單點傳播報文有一個16位的地址模式,其他的(groupcast)多點傳播報文需要一個AddrGroup地址模式。
· ZCL幀控制字段:定義ZCL框架的特點:
| ZCL幀控制字節 |
||||
| 位7 .. 5 |
第4位 |
第3位 |
第2位 |
位1 .. 0 |
| Disable Default Response禁用默認響應 |
Direction (Client/Server) 方向(客戶端/服務器) |
Manufacturer Specific 制造商專用 |
ZCL Command Type ZCL命令類型 |
|
· ZCL幀控制字段:
o 保留字:應該是0x0
o 禁用默認響應:定義是否接收器收到ZCL消息應該發送一個默認的響應。
o 方向(客戶端/服務器):定義是否將消息發往客戶端或服務器的集群。
o 制造商專用:定義它是一個ZCL消息ZCL規格,或者它是一個制造商特定的擴展。
o ZCL命令類型:定義特定於一個集群命令。例如,一個開/關的消息是特定的“開/關”群集,但一個ZCL讀的開/關屬性不是。
· ZCL事務序列號:事務ID應該為每個ZCL報文增加。
· ZCL指令ID:ZCL的指令ID要發送的指令。請參閱ZCL規范。
· ZCL命令有效載荷:有效載荷的ZCL命令發送。請參閱ZCL規范。
ZCL_MT_APP_CMD示例
下面的例子顯示,格式化並發送ZCL_MT_APP_CMD消息。在這種情況下,它是一個MoveToLevel命令:
#define COMMAND_LEVEL_MOVE_TO_LEVEL 0x00
#define ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL 0x0008
...
/*********************************************************************
* @fn zllSocSetLevel
*
* @brief Send the level command to a ZLL light.
*
* @param level - 0-128 = 0-100%
* @param dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.
* @param endpoint - endpoint of the Light.
* @param addrMode - Unicast or Group cast.
*
* @return none
*/
void zllSocSetLevel(uint8_t level, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode)
{
uint8_t cmd[]={
0xFE,
14, //RPC payload Len
0x29, //MT_RPC_CMD_AREQ + MT_RPC_SYS_APP
0x00, //MT_APP_MSG
0x0B, //Application Endpoint
(dstAddr & 0x00ff),
(dstAddr & 0xff00)>>8,
endpoint,//Dst EP
(ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL & 0x00ff),
(ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL & 0xff00)>>8,
0x07, //Data Len
addrMode,
0x01, //0x01 ZCL frame control field. (send to the light cluster only)
transSeqNumber++,
COMMAND_LEVEL_MOVE_TO_LEVEL,
(level & 0xff),
(time & 0xff),
(time & 0xff00)>>8,
0x00 //FCS - fill in later
};
calcFcs(cmd,sizeof(cmd));
write(serialPortFd,cmd,sizeof(cmd));
tcflush(serialPortFd, TCOFLUSH);
}
4. ZigBee Lighting Gateway
此過程將包含TI ZigBee照明網關演示所需的所有步驟。大多數步驟只需要完成一次。設置完成后,示例可以很容易多次運行。
該演示允許雲服務器上的一個web應用程序或連接到同一個局域網網關的Android設備上的Android應用程序來控制ZigBee照明設備。
除了可以在BEAGLEBONE上進行完整的演示,ZigBee服務器可以運行在任何支持Android應用程序來控制燈的Linux機器上。點擊這里有更多細節。
(1) 從http://www.beagleboard.org訂購BEAGLEBONE 。
(2) 獲取一個4GB的Micro-SD卡。
(3) 從TI訂購ZLL HW參考套件
(https://estore.ti.com/CC2530ZDK-ZLL-CC2530-ZigBee-Light-Link-Development-Kit-P4539.aspx)的。這里有如何使用這個工具包的更多信息。然而CC2531EMK將被重新編程作為HA(home automation)協調器使用而不是作為ZLL遙控器使用。
(4) (可選),建議您還要為BEAGLEBONE購買一個5V電源。
(5) (可選)獲得ZLL 認證的設備。重要注意事項:確保它們為出廠新品或者你知道如何恢復出廠設置。在這里可以找到更多將ZLL認證設備恢復出廠設置的信息
(6) (可選)從TI或TI分銷商訂購一個CC調試器:http://www.ti.com/tool/CC-Debugger
(7) 注意:如果你想嘗試ZigBee服務器和Android應用程序,你可以僅使用LinuxPC / VM。請參閱這里的指示。
在Windows PC上開始安裝步驟之前,下面的軟件需要下載並安裝:
1. 下載並安裝7-Zip。這是一個可以支持很大文件的文件解壓工具。 http://www.7-zip.org/download.html。
2. 下載並安裝寫鏡像軟件。這將用於創建SD卡文件用於引導BeagleBone。 https://sourceforge.net/projects/win32diskimager/files/latest/download
3. 下載並安裝TeraTerm。這將被用來建立一個控制台終端到BeagleBone的連接。 http://en.sourceforge.jp/projects/ttssh2/releases/
4. 下載並安裝BeagleBone驅動http://beagleboard.org/static/beaglebone/latest/README.htm 。
1. 從這個頁面下載最新的BeagleBone原始鏡像,This is just a safety net for getting back to ground zero。http://beagleboard.org/latest-images/。
2. 從http://wiki.ninjablocks.com/images#BEAGLEBONE下載BeagleBone 的Ninja Blocks SD卡鏡像,該鏡像已經經過測試,但可能有更新的鏡像可以使用。
1. 使用7-ZIP從剛剛下載的palladium.img.zip文件解壓縮出img文件。(解壓后大約4GB)
2. 使用寫鏡像工具,將img文件寫入到一個4GB的micro-SD卡。
3. 標記這個SD卡“Ninja”,使它可以與原始工廠SD卡區分開來。
1. 將一根以太網電纜連接到BeagleBone以太網插孔
2. 將新創建的SD卡插入到BeagleBone的插槽。
3. 重要注意事項: 應從5V電源或“帶電”USB端口為BeagleBone供電。如果直接使用您的PC的USB插頭供電它可能無法正常運行。
4. 將BeagleBone 板子自帶的USB線插入PC,另一端插到BeagleBone上的Mini-USB接口。
5. 現在使用TeraTerm連接到BeagleBone的控制台端口
§ 檢查“設備管理器”中“端口(COM和LPT)”,現在應該有一個新的USB串行端口。記下端口號(如COM12)。如果它沒有出現在設備管理器中,那么需要安裝beaglebone USB驅動程序,按照這里的提示.。
§ 啟動TeraTerm,執行 文件 - >新建連接,File->New連接到上面的串行端口。
§ 在TeraTerm上執行設置 - >串行端口,Setup->Serial Port...設置通信設置為115200波特,8位,無奇偶校驗位,1個停止位,無流量控制。
6. 登錄到BeagleBone控制台端口
§ 在TeraTerm窗口,按下回車鍵,你應該看到:
Ubuntu 12.04 LTS ninjablock ttyO0
ninjablock login:
1.
§ 輸入“ubuntu”的用戶名(不帶引號)
§ 密碼輸入'temppwd'(不帶引號)
§ 您應該看到:
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.18-psp14 armv7l)
* Documentation: https://help.ubuntu.com/
* Ninja Block Help: http://help.ninjablocks.com/
MMMMMMMMMMMMMMMMMM -----------------------------------------
MMMMMMMMMMMMMMMMMMMMMM | |
MM MM | |
MM MMMM MMMM MM | Serial:xxxxxxxxxxxx |
MM MMMM MMMM MM | | MM MMMM MMMM MM | HACK ME
MM MMMM MMMM MM -----------------------------------------
MM MM
MMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMM
MMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMM
MMMMMMMMMMMM
MMMMMMMMMMMM
MMMMMMMMMMMMMM
MMMMM MMMMM
MMMMM MMMMM
MMMMM MMMMM
ubuntu@ninjablock:~$
1. 注意框內HACK ME.上面的序列號Serial number,稍后您將需要用到。它也應該與BeagleBone上的以太網插孔標簽上的序列號相匹配。
2. 查看NinjaBlocks日志文件,在控制台中鍵入:
tail -f /var/log/ninjablock.log
1. f NinjaBlock第一次啟動並連接到互聯網的NinjaBlock鏡像將被更新。一旦更新,它會自動重新啟動。
2. 一旦beaglebone NinjaBlock已更新,你會看到下面的日志:
3. ubuntu@ninjablock:~$ tail -f /var/log/ninjablock.log
4. [Thu, 06 Jun 2013 10:00:54 GMT] (info) Express server listening on port 8000
5. [Thu, 06 Jun 2013 10:00:54 GMT] (info) platform: Device connection established (/dev/ttyO1)
6. [Thu, 06 Jun 2013 10:00:54 GMT] (info) loadModule: ninja-limitlessLED
7. [Thu, 06 Jun 2013 10:00:54 GMT] (info) loadModule: ninja-usbcam
8. [Thu, 06 Jun 2013 10:00:55 GMT] (info) loadModule: network
9. [Thu, 06 Jun 2013 10:00:55 GMT] (info) loadModule: ninja-zwave
10.[Thu, 06 Jun 2013 10:00:55 GMT] (info) loadModule: ninja-ipcam
11.[Thu, 06 Jun 2013 10:00:56 GMT] (info) loadModule: ninja-philips-hue
12.[Thu, 06 Jun 2013 10:00:56 GMT] (info) usbcam: No camera detected
13.[Thu, 06 Jun 2013 10:01:01 GMT] (info) Attempting to activate...
1. 現在,你需要更新ninja-zigbee的驅動程序。在這個階段你需要確保beaglebone與外部Internet連接。在BeagleBone控制台窗口類型:
git clone -b zigbee-lighting https://github.com/ninjablocks/ninja-zigbee /opt/ninja/drivers/ninja-zigbee
輸出應該是這個樣子:
ubuntu@ninjablock:~$ sudo git clone -b zigbee-lighting https://github.com/ninjablocks/ninja-zigbee /opt/ninja/drivers/ninja-zigbee
Cloning into 'ninja-zigbee'...
remote: Counting objects: 201, done.
remote: Compressing objects: 100% (142/142), done.
remote: Total 201 (delta 120), reused 123 (delta 51)
Receiving objects: 100% (201/201), 138.66 KiB | 250 KiB/s, done.
Resolving deltas: 100% (120/120), done.
4.1.6.1. 使用ZLL套件的中CC2531EMK
這個步驟將重新對ZLL套件提供的CC2531EMK進行編程,實現遠程遙控,得到擁有一個主機接口HA協調器。如果需要,可以將其重新編程成一個ZLL遙控器。
1. 將ZLL參考硬件(HW)套件中的CC2531EMK插到您的PC上的USB插槽中。
2. 重要注意事項:串行引導裝載程序不會刪除存儲在閃存中的網絡參數。這樣一個固件更新時就不需要對ZigBee網絡上的任何設備進行重新調試。但是當CC2531EMK已被編程為一個ZLL遙控器(終端設備)時,我們現在要將其編程為HA協調器,我們就需要重新設置存儲在閃存中的網絡參數。要做到這一點,保持CC2531EMK上的S1 + S2按鈕按下大於10s。紅色和綠色LED會閃爍5秒鍾,CC2531EMK將重新啟動。CC2531EMK按鈕功能的更多信息,可在這里查看。重要的是,CC2531EMK保持在出廠狀態,在編程為HA協調器之前,未曾touchlinked ..
3. 下載文件:LightingGateway USB.zip提取SampleGateway-USB-SBL.bin
4. 使用SampleGateway-USB-SBL.bin更新CC2531EMK的固件(FW),參考下面的指導http://processors.wiki.ti.com/index.php/ZStack-Lighting_Kit#Updating_the_Kit_FW_images_using_the_Windows_bootloader_tool.
4.1.6.2. 使用未編程的CC2531EMK
另外,如果你有一個CC調試器和一塊未編程的CC2531EMK,你可以按照下面的說明操作:
- 將CC調試線連接到CC2531EMK 請特別注意距離CC2531EMK上連接器引腳1最近的紅線(即距離USB接口最遠的)。. Pay careful attention to have the red line on the cable nearest pin 1 of the connector on the CC2531EMK (i.e. furthest away from the USB connector).
2. 將CC2531EMK插入到PC上的一個USB接口用來供電。
3. 用CC調試器的USB調試線將PC和CC調試器連接起來。CC調試器上應該有一個綠燈是亮的。如果沒有,請檢查CC2531EMK的電源供電和引腳1電纜的走線。並嘗試推CC調試器上的按鈕。
4. 使用SmartRF閃存編程器對CC2531EMK進行編程。
§ 下載文件:LightingGateway USB.zip,提取SampleGateway-USB-ProdSBL..hex 。
§ 在“What do you want to program?” 窗口中,選擇CCxxxx SoC或MSP430。
§ 在閃存鏡像窗口,使用“...” 按鈕來選擇SampleGateway-USB-ProdSBL.hex文件。
§ 在動作部分選擇擦除,編程和驗證。
§ 單擊“執行操作”按鈕。
§ 經過30秒左右的時間,底部的狀態窗口會提示成功。
4.1.6.3. 將CC2531EMK連接到Beaglebone
1. 從PC中移除CC2531EMK。
2. 從CC2531 EMK上移除CC調試線(如果使用了)。
3.將CC2531EMK插入到BeagleBone上的USB-A插座。
4.推動BeagleBone上的S1 (以太網插孔旁的微小按鈕開關)重新啟動Linux。
BeagleBone和CC2531EMK ZigBee照明網關現在應該可以運作了。在Ninja Blocks 協議中現在被稱為一個NinjaBlock。In Ninja Blocks terms this is now called a NinjaBlock.
要創建一個NinjaBlocks帳戶:
2. 使用beaglebone序列號的前5位(數字)作為邀請碼。
1. 瀏覽http://a.ninja.is/home。
2. 登錄到一個帳戶。
3. 進入到儀表板,點擊配對塊。然后就應該詢問塊的序列號。輸入BeagleBone以太網插孔上的號碼(在之前的步驟中已經指出)。
現在,BeagleBone Block應該成功與Ninja Blocks portal.配對了。
The BeagleBone Block should now be successfully paired with the Ninja Blocks portal
1. 按下CC2531EMK dongle上的S1按鈕,紅色LED將閃爍60秒,在這期間,設備將連接到網絡。
2. 其它ZigBee設備按照設備的具體說明,讓它們加入ZigBee網絡。
§ 對於Zlights您需要:
§ 按住按鈕3秒,重設恢復出廠設置,並等待5秒,直至LED閃爍(這一步可以跳過,如果ZLight已經恢復出廠設置)。
§ 按住按鈕大於10s,使其加入網絡。
3. 一旦加入,燈設備將出現在Ninja儀表板。
4. 設備測試以及正常工作過程是:
§ TI的ZigBee光鏈路Zlight:https://estore.ti.com/CC2530ZDK-ZLL-CC2530-ZigBee-Light-Link-Development-Kit-P4539.aspx
§ 飛利浦色調燈泡:Bulbs:http://store.apple.com/uk/product/HA780ZM/A/philips-hue-connected-bulb-single-pack?fnode=6f
§ Cleode SmartPlug:http://www.cleode.fr/en/produits.php?page=zplug
§ Cleode ZRC(開關):http://www.cleode.fr/en/produits.php?page=zrc
§ Cleode ZMOVE(動作感應器):http://www.cleode.fr/en/produits.php?page=zmove
一旦加入,該設備在NinjaBlocks儀表板上應該有相關的部件。
一旦加入,該設備在NinjaBlocks儀表板上應該有相關的部件。
示例一旦搭建好,BeagleBone 和燈的電源可以關閉,重新供電時,無需重復上述步驟就可以重新運行。但是目前也發現到一些錯誤,為避免出現問題,先斷開ZLights的電源和再斷開網關的電源。當系統加電時,先給beaglebone加電再給ZLights供電。在添加新設備之前,確保beaglebone上的軟件正在運行,在a.ninja.isWeb應用程序執行設置 - >塊。to do the got to settings->blocks on the a.ninja.is web application.
ZigBee服務器可以運行在任何Linux機器上,在Linux PC上運行演示,下從這里下載zip源文件或在服務器/目錄克隆這個git。您使用的是:您將需要改變你使用的Linux機器的server/i486-linux-gnu中makefile中的GCC線目標為GCC編譯器: SBU_REV =“0.1”
You will need to change the GCC line in makefile in server/i486-linux-gnu to target the gcc compiler for the Linux Machine you are using: SBU_REV= "0.1"
GCC=/usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-gcc
CFLAGS = -Wall -DVERSION_NUMBER=${SBU_REV} ....
然后可以從命令行創建ZigBee服務器。
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/server/i486-linux-gnu# make clean
rm -rf *.o zllGateway.bin
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/server/i486-linux-gnu# make
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o zll_controller.o ../Source/zll_controller.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o zllSocCmd.o ../Source/zllSocCmd.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o interface_devicelist.o ../Source/interface_devicelist.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o interface_grouplist.o ../Source/interface_grouplist.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o interface_scenelist.o ../Source/interface_scenelist.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o interface_srpcserver.o ../Source/interface_srpcserver.c
gcc -Wall -DVERSION_NUMBER="0.1" -D_GNU_SOURCE -c -o socket_server.o ../Source/socket_server.c
一旦建成,應用程序可能需要改變權限才能夠執行:
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/server/i486-linux-gnu# chmod +x zllGateway.bin
然后服務器可以從命令行起動,它會等待客戶端連的接:
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/server/i486-linux-gnu# ./zllGateway.bin
./zllGateway.bin -- Jun 7 2013 08:27:24
Usage: ././zllGateway.bin <port>
Eample: ././zllGateway.bin /dev/ttyACM0
attempting to use /dev/ttyACM0
zllMain: waiting for poll()
除了Java腳本的NinjaBlocks驅動NinjaBlocks drivers,還有一些由TI開發的C和JAVA(安卓)客戶端應用程序示例。
C客戶端應用程序壓縮文件在這里,或克隆這個 git,在client/CClients/ directory。已提供了2個例子。它們應該使用client\CClients\<app>CmdLine\i486-linux-gnu提供的制作文件在Linux機器上搭建。當打開本地套接字(127.0.0.1)時可以在作為服務器的Linux機器上運行C客戶端的例程,要構建示例,您將需要改變你使用的Linux機器的server/i486-linux-gnu中makefile中的GCC線目標為GCC編譯器: SBU_REV =“0.1”
You will need to change the GCC line in makefile in server/i486-linux-gnu to target the gcc compiler for the Linux Machine you are using: SBU_REV= "0.1"
GCC=/usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-gcc
CFLAGS = -Wall -DVERSION_NUMBER=${SBU_REV} ....
然后就可以搭建客戶端的例子:
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/client/CClients/lightFlashCmdLine/i486-linux-gnu# make clean
/bin/rm -f flashled.bin *.o
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/client/CClients/lightFlashCmdLine/i486-linux-gnu# make
gcc -c -Wall -g -std=gnu99 -I../../../../server/Source -I../../Source -I../Source ../Source/flashled.c
gcc -c -Wall -g -std=gnu99 -I../../../../server/Source -I../../Source -I../Source ../../Source/socket_client.c
gcc flashled.o socket_client.o -lpthread -o flashled.bin
root@tony-VirtualBox:/media/sf_VM-Ubuntu-11.04-Share/Linux_ZLLGateway/client/CClients/lightFlashCmdLine/i486-linux-gnu#
一旦建成,應用程序將需要被復制到服務器正在運行的機器上並修改運行的權限:
ubuntu@ninjablock:~$ chmod +x flashled.bin
4.2.1.1. 客戶端應用listDevsCmdLine
當運行示例時,打印出目前在服務器設備列表中的設備:
IP addresses for 127.0.0.1:
IPv4: 127.0.0.1
Trying to connect...
Connected.
RPSC_ZLL_NewDevice[0]: 2b4f:b
該示例將繼續運行並報告新的設備加入網絡,直到有按鍵按下。
4.2.1.2. 客戶端應用lightFlashCmdLine
這個例子允許你點亮一個燈。其用法如下:
./flashled.bin <device/group addr> <addr mode> <ep> <periodms> <loops>
下面的操作將使由listDevsCmdLine報告的燈以每秒一次開關的速度閃爍10次:
./flashled.bin 0x2b4f 2 0xb 1000 10
Port: 11235
IP addresses for 127.0.0.1:
IPv4: 127.0.0.1
Trying to connect...
Toggling Light 2b4f:b - 0
Toggling Light 2b4f:b - 1
Toggling Light 2b4f:b - 2
Toggling Light 2b4f:b - 3
Toggling Light 2b4f:b - 4
Toggling Light 2b4f:b - 5
Toggling Light 2b4f:b - 6
Toggling Light 2b4f:b - 7
Toggling Light 2b4f:b - 8
Toggling Light 2b4f:b - 9
要安裝一個Android設備上的應用程序,從這里獲取apk文件,將其復制到手機內存卡,並在文件瀏覽器打開,,或選擇發送到手機上的一個帳戶,並打開附件。
應用程序需要你在beagleBone所在的同一網絡上,輸入beagleBone的IP地址[c9] 。這可以從雲服務的Web界面 設置 - >塊中(settings->block)獲得,或在BeagleBone的控制台窗口中鍵入'ifconfig<enter>',,應該輸出下面的信息:
ubuntu@ninjablock:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 78:c5:e5:d9:ba:f7
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::7ac5:e5ff:fed9:baf7/64 Scope:Link
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1
RX packets:12241 errors:0 dropped:0 overruns:0 frame:0
TX packets:3827 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2024982 (2.0 MB) TX bytes:627017 (627.0 KB)
上面的例子獲得的IP地址是192.168.1.12
照明控制器應用程序允許您選擇一盞燈,並使用APP控制它。您還可以綁定開關(如:Cleode ZRC with 5 switches)或運動傳感器(如Cleode ZMOVE),以便開關/或運動傳感器可以直接控制燈。
該應用程序還支持其他功能,如:
§ 顯示網絡上的設備列表
§ 捆綁
§ 創建組
§ 存儲和調用場景。
Android應用程序完整的源代碼和Eclipse項目可以在這里的下載或克隆thisgit。
4.2.2.1. Android應用程序菜單
這些功能都可以通過菜單進入,可以通過按下硬鍵盤軟鍵盤菜單鍵,具體取決於Android設備的型號和版本:
AndroidAppMenu
我們試圖使這項工作對所有品牌的Android設備和所有版本的Android都能使用,但如果你發現一個不允許你選擇菜單的設備或Android版本,請報告E2E - http://e2e.ti.com/support/的的low_power_rf/f/158.aspx,使用“ZigBee網關”作為標記。
4.2.2.2. Android應用設備列表
下面的菜單選項被選中時,會顯示一個設備列表。
AndroidAppMenuList
4.2.2.3. Android應用綁定
選擇“綁定”菜單項:
AndroidAppMenuBind
4.2.2.4. Android應用組
選擇“組”菜單項:
AndroidAppMenuGroups
4.2.2.5. Android應用場景
選擇“場景”菜單項:
AndroidAppMenuScenes
接口和源更詳細的信息可以在這里找到。
5. ZigBee Lighting Gateway SW:
本wiki描述了zigbee 點燈網關的軟件層及其接口
軟件系統結構框圖如下所示:
主要有一下幾層:
l 提供了許多的客戶端例程:
n 基於javaScript的Ninja zigbee 用戶驅動,用於與NinjaBlock提供的雲端服務進行連接。
n 基於java的Zigbee 用戶驅動,用於android應用程序中
n 基於C的zigbee用戶驅動,用於Linux命令行例程
l Linux下的點燈網關軟件提供:
Socket API:高度抽象的socket接口,用於通知zigbee網絡上的更高層設備和通過TCP/IP實現與zigbee設備間信息的收發
ZigBee 抽象層:為了讓網絡上設備相關的信息在系統重啟后依然存在,該層以文件的形式維護和存儲了設備列表、分組、情景模式。
Zigbee驅動:定義網關與連接的Zigbee芯片間的USB/UART接口,實現了一系列的函數:
n 實現物理層傳輸協議
n 實現到高層軟件模塊的ZCL信息抽象。實現了像“發送顏色命令”這樣的高層Zigbee API,以及解析接收到的ZCL幀數據和收到諸如“報警指示”等消息時去調用回調函數。
l Zigbee 點燈網關固件:
實現了Zigbee協議棧-Home Automation Profile。通過為主機提供一個簡單的Zigbee點燈網關主機接口,固件庫使上層主機有效避免了直接實現復雜Zigbee協議的問題。
ZStack-Lighting-1.0.1 Host Interface C Examples
現在提供的ZigBee照明網關是基於ZStack CCC2530-2.5.1a家庭自動化示例應用程序。 主機接口是從實施的ZStack-Lighting-1.0.1遠程移植過來的。
ZigBee照明網關固件的特點是:
- 建立一個ZigBee網絡作為協調器。
- HA網關主機接口是通過USB / UART來實現的。
- 發現設備加入網絡和傳遞信息到主機。
- 新設備加入時,使用開關S1打開網絡。
- 從主機的串行引導更新固件。
ZigBee網關固件的源代碼是以一個ZStack-CC2530-2.5.1a版本補丁來提供的。
- 這里 可以得到ZStack-CC2530-2.5.1a版本
- 這個補丁可以在這里找到File:Z-Stack-Lighting-gateway.zip
§ 目前只使用了S1按鈕, 有2個功能:
§
§ 簡單照明網關的開關分配
| 開關 |
按壓 |
功能 |
| S1 |
上電時按下按鈕。 |
將設備設置成bootloader模式。 具體描述在這里。 |
| S1 |
運行的ZigBee照明網關時的任何按壓 |
打開網絡為60s。 在這期間,新設備可以連接。 |
§
§ CC2531評估包中有兩個LED燈,分別為紅色和綠色,這些燈的狀態的意思是:
§
§ 簡單照明網關的LED分配
| LED |
狀態 |
功能 |
| 綠色 |
啟動時閃爍 |
正在進行初始化 |
| 綠色 |
常亮 |
已完成初始化 |
| 紅色 |
閃爍(每隔1s短閃) |
網絡對新的設備的加入開放。 |
| 綠色 |
閃爍(在2秒的時間內8次快速閃爍) |
發現了新的設備。 |
ZigBee照明網關主機接口暴露使用的MT(管理和測試)接口。 MT子系統常常給這些消息是規定路線的是MT_APP,這個通常被測試團隊所使用,並且MT包允許在ZStack應用和UART之間傳遞。 這種機制第一次被使用在ZStack-Lighting-1.0.1主機接口上,並已經被移植到了ZigBee照明網關中。
5.2.2.1. MT APP頭
MT APP頭由2個命令字節和有效載荷組成:
| MT_APP頭 |
|||
| LEN |
CMD0 |
CMD1 |
有效載荷 |
| 1字節 |
1字節 |
1字節 |
LEN字節 |
CMD0 總是被設置為0X49(MT_RPC_CMD_AREQ | MT_RPC_SYS_APP),代表MT_APP。
CMD1總是被設置為0x0,代表主機接口消息。
5.2.2.2. 傳入的(從主機發出)MT APP消息
有2種類型的傳入MT_APP的消息,控制平面和數據平面。 消息類型是數據平面型或者控制平面型是由MT_APP消息中的集群 ID來決定的,如果cluster ID是0xFFFF,那么它是一個控制平面的消息。 如果cluster ID不是OxFFFF,那么它是一個數據平面消息,這將永遠是一個的ZCL幀,並有有效的(非0xFFFF)cluster ID。
傳入的(從主機發出)MT APP控制平面消息
的MT_APP控制平面消息的結構如下所示:
| MT消息格式 |
|||||||
| 應用的終端節點 |
保留的 |
ZLL_MT_APP集群ID |
Date長度 |
保留的 |
ZLL_MT_APP 命令ID |
保留的 |
ZLL_MT_APP命令 有效載荷 |
| 1字節 |
3個字節 |
2個字節 |
1字節 |
3個字節 |
1字節 |
2個字節 |
X字節(命令定義) |
- 應用程序終端節點:這是應用程序的應用程序的終端節點,它應該被設置為0x0B
- 保留的:所有保留的字節應設置為0x00
- MT_APP集群ID:應設置為0xFFFF
- Date長度:這應該是6 +MT_APP命令中參數的個數
- MT_APP命令ID:見下文支持的命令
ZigBee照明網關目前支持的MT APP消息是:
| 發送給CC253x的MT APP命令 |
||
| ZLL_MT_APP命令ID |
值 |
參數(1個字節) |
| 保留(用於ZLL_MT_APP_RPC_CMD_TOUCHLINK) |
0X01 |
N / A |
| MT_APP_RPC_CMD_RESET_TO_FN |
0X02 |
N / A |
| 保留(ZLL_MT_APP_RPC_CMD_CH_CHANNEL) |
0X03 |
目標通道 |
| 保留(用於ZLL_MT_APP_RPC_CMD_JOIN_HA) |
0x04 |
N / A |
| MT_APP_RPC_CMD_PERMIT_JOIN |
0X05 |
持續時間,發送允許連接 |
| 保留(用於ZLL_MT_APP_RPC_CMD_SEND_RESET_TO_FN) |
0X06 |
N / A |
MT_APP_RPC_CMD_RESET_TO_FN
這個命令被發送到照明網關。 這將導致CC253x的ZigBee照明網關復位到出廠新,它會清除NV(非易失性存儲器)並在5s后復位。
MT_APP_RPC_CMD_PERMIT_JOIN
這個命令被發送到照明網關。 這個命令將導致的CC253x ZigBee照明網關為新設備的加入打開網絡。 這個命令有2個參數:
| MT_APP_RPC_CMD_PERMIT_JOIN參數 |
|
| 1字節 |
1字節 |
| 持續時間 |
發送允許加入 |
- 持續時間(可選):打開網絡的時間(以秒為單位)。 默認為60秒。
- 發送允許加入(可選):如果為真,ZigBee照明網關將允許設備與之連接,同時廣播一個允許加入信息,連接設備可通過網絡與其他設備關聯。 因此,連接並不僅僅局限於ZigBee照明網關設備的范圍。如果為假,只有ZigBee照明網關被允許加入網絡而且也不會有消息被廣播到其它設備。 默認為真。
傳入(從主機發出)MT APP數據平面消息
ZCL_MT_APP消息產生一個接口發送ZCL命令。 這些消息控制網絡中設備的屬性(如:開/關,電平等),ZCL消息並不能告知一個設備離開網絡。 該接口可用於支持任何ZCL命令,開發人員應研讀ZCL 規范來決定主機應該支持何種命令。
如果Cluster ID是有效的,那么CMD1字節就可以被忽略。 由於集群ID是可以改變的,所以CMD1是用來區分數據平面和控制平面。對於傳入的消息,一個單一CMD1值可以以同樣的方式來指定數據平面。來自ZStack-Lighting-1.0.1的 執行情況並在審查過程中被錯過了。
如下所示的是ZCL_MT_APP消息的結構:
| MT APP ZCL消息格式 |
|||||||||
| 應用終端節點 |
網絡地址 |
目的終端節點 |
ZCL 集群ID |
Date 長度 |
地址模式 |
ZCL 幀控制域 |
ZCL業務序列號 |
ZCL 命令ID |
ZCL命令 有效載荷 |
| 1字節 |
2個字節 |
1字節 |
2個字節 |
1字節 |
1字節 |
1字節 |
1字節 |
1字節 |
X字節(由命令定義) |
- 應用程序終端節點:這是應用的終端節點ZLL的應用程序,應設置為0x0B
- 保留的:所有保留的字節應設置為0x00。
- 網絡地址:ZCL消息發送到該設備的網絡地址(或GROUP ID取決於地址模式),TouchLink時發送MT_APP_ZLL_TL_IND消息到設備的網絡地址。
- 目標終端節點:ZCL消息發送到該設備的終端節點, TouchLink時發送T_APP_ZLL_TL_IND消息到設備的終端節點。
- ZCL集群ID:命令所要發送的集群的ID。 請參閱ZCL規范 。
- Date長度:這應該是6 +ZCL命令中參數的個數。
- 地址模式:ZCL消息尋址模式:
| 地址模式 |
|
| AddrNotPresent |
0 |
| AddrGroup |
1 |
| Addr16Bit |
2 |
| Addr64Bit |
3 |
| AddrBroadcast |
15 |
對於大多數應用程序而言,一個16位的單播地址或者一個地址模式為AddrGroup模式的組播地址是必需的。
- ZCL幀控制域:定義ZCL幀的特點:
| 幀控制字節 |
||||
| 位7 - 5 |
第4位 |
第3位 |
第2位 |
位1 .. 0 |
| 保留的 |
禁用默認響應 |
方向(客戶端/服務器) |
制造商專用 |
ZCL命令類型 |
- ZCL幀控制域的位:
- 保留的:應該為0x0
- 禁用默認響應:定義接收器收到ZCL消息是否應該發送一個默認的響應。
- 方向(客戶端/服務器):定義消息被發往客戶端或服務器的集群。
- 制造商專用:定義一個ZCL消息是由ZCL規格定義,或者它是一個制造商的特定的擴展。
- ZCL命令類型:定義的是具體到群集的命令。 例如,一個開/關的消息是特定的“開/關”群集,但不讀出的開/關的屬性是一個ZCL。
- ZCL事務序列號:每個ZCL消息的業務序列號應該是遞增的。
- ZCL命令ID:要發送的的ZCL命令的命令ID。 請參閱ZCL規范 。
- ZCL命令有效載荷:被發送的的ZCL命令的有效載荷。 請參閱ZCL規范 。
5.2.2.3. MT APP消息傳出(到主機)
同樣的,傳出的MT_APP消息也分為兩種,控制平面和數據平面。 然而,不再使用的集群ID來識別消息類型,所有的消息都是相同的格式並使用CMD1的MT_APP的標頭來區分消息類型。
數據平面消息都使用命令ID的MT_APP_RSP(0X80),其他所有的命令ID為控制平面消息。
| MT APP命令發送的CC253x |
|||
| 命令 |
值 |
參數 |
控制(c)或數據(d)平面 |
| MT_APP_RSP |
0X80 |
ZCL有效載荷,見下文。 |
d |
| 保留(MT_APP_ZLL_TL_IND) |
0X81 |
N / A |
|
| MT_APP_ZLL_NEW_DEV_IND |
0X81 |
見下文。 |
c |
MT_APP_RSP
有效載荷MT_APP_RSP 和傳入(從主機發出)MT APP數據平面消息一樣。
MT_APP_ZLL_NEW_DEV_IND
當一個設備加入該網絡時,CC253x ZigBee家庭自動化網關發送該命令。
| MT消息格式 |
|||||
| 網絡地址 |
終端節點 |
文檔編號 |
設備ID |
版本 |
IEEE地址 |
| 2個字節 |
1字節 |
2個字節 |
1字節 |
1字節 |
8個字節 |
- 網絡地址:16b目標設備的網絡地址
- 終端節點:目標設備的終端節點
- 文檔編號:目標設備的文檔編號
- 設備ID:目標設備的設備ID
- 版本:目標設備的版本
- IEEE地址:64b目標設備的IEEE地址
ZigBee照明網關主機的應用程序必須存儲網絡地址和端點的信息,以便於發送ZCL_MT_APP消息來控制網絡上的設備。IEEE地址也要被 存儲來綁定請求消息。
物理傳送
UART數據包中含有的MT消息,消息是按照2.1節中的“Z-Stack Monitor and Test API.pdf”解釋的RPC(Remote Procedure Call,遠程過程調用)協議格式形成的,RPC數據包中有一個指定路由的MT頭消息,在這種情況下,MT header需要改變其格式,改變格式是依據消息傳到運行在CC253x ZStack FW的ZLL應用程序的路由決定 。
數據包的結構如下所示:
| RPC報文格式 |
||||
| RPC頭 |
MT頭 |
MT_APP頭 |
ZLL_MT_APP / ZCL_MT_APP的命令 |
RPC幀校驗序列 |
遠程過程調用
RPC數據包包含一個SOF(幀開始)字節來同步UART發送的數據包,然后由RPC有效載荷(這個情況下是MT消息)和最后的FCS(幀校驗序列)。
| RPC數據包格式 |
||
| SOF |
有效載荷 |
FCS |
| 1字節 |
3 - 256字節 |
1字節 |
- SOF:必須設置為0xFE
- 有效載荷:在這種情況下,它是MT消息,請參閱第XXX \ N
- FCS:參閱第XXX節
幀檢驗序列
FCS可以由下面的C代碼計算:
/*********************************************************************
* @fn calcFcs
*
* @brief populates the Frame Check Sequence of the RPC payload.
*
* @param msg - pointer to the RPC message
*
* @return none
*/
void calcFcs(unsignedchar*msg,int size)
{
unsignedchar result =0;
int idx =1;//skip SOF
int len =(size - 1); // skip FCS
while((len--)!= 0){
result ^= msg[idx++];
}
msg[(size-1)]= result;
}
Linux網關源代碼在這里,在下面的章節中將更詳細的描述。
ZigBee的驅動程序連接到CC2531EMK的主機接口並將主機接口的消息翻譯成功能活動。
主機首先需要打開到CC253x的串口,這個功能在zllSocOpen中實現。
zllSoc_fd = zllSocOpen( argv[1]);
函數返回一個文件描述符,以便應用程序可以測試CC253x設備。這可以用來監測串行端口上的輸入,當有來自於CC253x的數據時,必須調用消息處理函數進行來數據讀取和解析。
zllSocProcessRpc ();
從CC253x傳送來消息,接下來被轉化為回調函數。主機應用程序注冊的回調函數如下:
§ zllSocTlIndicationCb -TouchLink觸摸指示回調(用於ZLL控制的橋梁,而不是關於HA照明網關)
§ newDevIndicationCb -新設備指示回調
§ zllSocZclGetStateCb –ZCL狀態響應回調
§ zllSocZclGetLevelCb –ZCL等級響應回調
§ zllSocZclGetHueCb –ZCL色調響應回調
§ zllSocZclGetSatCb –ZCL飽和度響應回調 // saturation
這是通過填充有興趣接收消息的回調函數表中的回調函數來完成的,設置那些不為空的回調函數,並把它傳遞給下面的回調注冊函數:
static zllSocCallbacks_t zllSocCbs =
{
null, // pfnTlIndicationCb - TouchLink Indication callback (used for ZLL control bridge, not relevant for HA Lighting Gateway)
newDevIndicationCb, // pfnNewDevIndicationCb - New Device Indication callback
zclGetStateCb, // pfnZclGetHueCb - ZCL response callback for get Hue
zclGetLevelCb, // pfnZclGetSatCb - ZCL response callback for get Sat
zclGetHueCb, // pfnZclGetLevelCb_t - ZCL response callback for get Level
zclGetSatCb // pfnZclGetStateCb - ZCL response callback for get State
};
...zllSocRegisterCallbacks( zllSocCbs );
一旦打開串行端口,主機可以使用以下函數發送命令:
/ ///Control API's
void zllSocResetToFn(void); //Resets the Gateway to its Factory New state.
void zllSocSendResetToFn(void);//Reserved for use with ZLL Controller
void zllSocOpenNwk(void); //Opens the network for 60s for new devices to join.
//ZCL Set API's
void zllSocSetState(uint8_t state, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocSetLevel(uint8_t level, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocSetHue(uint8_t hue, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocSetSat(uint8_t sat, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocSetHueSat(uint8_t hue, uint8_t sat, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
//ZCL Get API's
void zllSocGetState(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocGetLevel(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocGetHue(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
void zllSocGetSat(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);
“ZigBee抽象層用來存儲設備,組和ZigBee網絡上存在的場景列表。
Linux照明網關創建和維護.dat文件來存儲信息,這些信息需要持續一個電源周期。此信息是:
§ 已經加入ZigBee網絡的設備。
§ 已創建的群組。
§ 已創建的場景。
5.3.3.1. 設備數據文件( Device Data File )
Linux照明網關在同一目錄下創建一個設備列表的可執行文件,文件被稱為interface_devicelist.dat,是一個二進制文件。當zllSocCmd模塊接收到一個MT_APP_ZLL_NEW_DEV_IND,它增加了一個設備到列表中。列表中的設備用';'分隔;設備信息存儲的格式是:
| Linux照明網關的設備清單格式 |
|
| 字節Bytes |
描述Description |
| 8 |
IEEE地址 IEEE Address |
| 2 |
網絡地址 Network Address |
| 1 |
端點 Endpoint |
| 2 |
配置文件ID profile ID |
| 2 |
設備ID Device ID |
| 1 |
版本 Version |
| 1 |
設備名稱長度 n。Device name length n. |
| n |
設備名稱 Device name |
| 1 |
狀態(以供將來使用) status (for future use) |
5.3.3.2. 組數據文件(Group Data File)
Linux照明網關在同一目錄下創建一個組列表的可執行文件,文件被稱為interface_grouplist.dat,是一個二進制文件。當Linux照明網關模塊接收到一個創建組的TCP / IP命令時,它發送相關的ZigBee消息來創建組,並將組添加到列表中。此ZigBee消息會引起ZigBee網絡中設備將它們自己添加到列表中,該列表中的成員不存儲在interface_grouplist.dat文件中,在文件中僅組被創建。列表中的每個組用';'分隔。組信息存儲的格式是:
| Linux的照明網關設備清單格式 |
|
| 字節 |
描述 |
| 2 |
組ID Group ID |
| 1 |
組名稱長度 n。 Group name length n. |
| n |
組名稱 Group name |
5.3.3.3. 場景數據文件(Scene Data File)
Linux照明網關在同一目錄下創建一個場景列表的可執行文件,文件被稱為interface_scenelist.dat,是一個二進制文件。當Linux照明網關模塊接收到創建一個場景TCP / IP命令時,它會發送相關的ZigBee消息來創建場景,並將其添加到列表中。ZigBee消息會導致ZigBee網絡上的設備創建和存儲一個場景,場景的設置存儲在ZigBee設備中而不是用interface_scenelist.dat文件存儲的。列表中的每一個場景用';'分隔;。場景信息存儲的格式是:
| Linux的照明網關設備清單格式 |
|
| 字節 |
描述 |
| 2 |
組ID Group ID |
| 1 |
場景ID Scene ID |
| 1 |
場景名稱長度 Scene name length n |
| n |
場景名稱 |
經過TCP / IP套接字發送的命令是二進制命令,消息的結構引用了一個Socket遠程過程調用,其格式如下表所示:
| SRPC消息格式 |
||
| CMD字節 |
命令長度(N) |
數據 |
| 1字節 |
1字節 |
n個字節 |
5.3.4.1. 發送到照明網關的命令
可以發送到照明網關的命令是:
| SRPC發送的命令 |
|
| 描述 |
CMD ID |
| 0X80 |
|
| 0X81 |
|
| 0X82 |
|
| 0X83 |
|
| 0X84 |
|
| 0X85 |
|
| 0x86 |
|
| 0x87 |
|
| 0x88 |
|
| 0x89 |
|
| 0x8a |
Reserved |
| 0x8b |
Reserved |
| 0x8c |
Reserved |
| 0x8d |
Reserved |
| 0x8E |
|
| 0x8f |
|
| 0x90 |
|
| 0x91 |
|
| 0x92 |
|
| 0x93 |
RPCS_IDENTIFY_DEVICE(TBD) |
| 0x94 |
RPCS_CHANGE_DEVICE_NAME(TBD) |
| 0x95 |
RPCS_REMOVE_DEVICE(TBD) |
| 0x96 |
Reserved |
RPCS_CLOSE
此命令將關閉ZigBee HA Gateway SW Linux應用。為了避免錯誤地關閉應用程序,這個命令的有效負載是一個2字節的幻數。
(在c語言中,把直接使用的常數叫做幻數。在編程時,應盡量避免使用幻數,因為當常數需要改變時,要修改所有使用它的代碼,工作量巨大,還可能有遺漏。因此通常把幻數定義為宏或枚舉。建議使用枚舉,因為它是編譯階段存在的符號,編譯器的提示會更清晰、更准確。
#define ARRAY_SIZE 10
enum{ARRY_SIZE = 10}
)
| RPCS_CLOSE消息格式 |
||
| 字節Bytes |
描述Description |
值 Value |
| 1 |
命令ID Command ID |
0X80 |
| 1 |
長度 Length |
0X2 |
| 2 |
幻數值 Magic Value |
0x2536 |
RPCS_GET_DEVICES
該命令將被用來請求設備列表。這將導致的ZigBee HA網關為列表中每個設備發送RPCS_NEW_ZLL_DEVICE消息。
| RPCS_GET_DEVICES消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X81 |
| 1 |
長度 Length |
0 |
RPCS_SET_DEV_STATE
此命令是用來改變一個設備或一組設備的狀態。它有兩個模式,單播,針對一個特定的設備;組播,針對先前已通過RPCS_ADD_GROUP命令創建的一組設備。
| RPCS_SET_DEV_STATE消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X82 |
| 1 |
長度 Length |
13 |
| 1 |
地址模式 Address Mode |
1 = 組播或2 =單播 1=groupcast OR 2=unicast |
| 2 |
網絡地址 Network Address |
NwkAddr或組ID NwkAddr OR Group ID |
| 6 |
保留的 Reserved |
0 |
| 1 |
端點 Endpoint |
設備端點或為0xFF Devices Endpoint OR 0xFF |
| 2 |
保留的 Reserved |
0 |
| 1 |
狀態 State |
0或1(開啟或關閉) 0 or 1 (on or off) |
RPCS_SET_DEV_LEVEL
此命令是用來改變一個設備或一組設備的光的水平。它有2個模式,單播,針對一個特定的設備;組播,針對先前已通過RPCS_ADD_GROUP命令創建的一組設備。
| RPCS_SET_DEV_LEVEL消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X83 |
| 1 |
長度 Length |
15 |
| 2 |
地址模式 Address Mode |
1 = 組播或2 =單播 1=groupcast OR 2=unicast |
| 2 |
網絡地址 Network Address |
NwkAddr或組ID NwkAddr OR Group ID |
| 6 |
保留的 Reserved |
0 |
| 2 |
端點 Endpoint |
端點或為0xFF Endpoint OR 0xFF |
| 2 |
Reserved |
0 |
| 2 |
轉換時間 Transition time |
0-0xFFFF的(100ms單位) |
| 1 |
水平 Level |
0-0xFF |
RPCS_SET_DEV_COLOR
此命令是用來改變一個設備或一組設備的光的顏色。它有兩個模式,單播,針對一個特定的設備;組播,針對先前已通過RPCS_ADD_GROUP命令創建的一組設備。
| RPCS_SET_DEV_COLOR消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X84 |
| 1 |
長度 Length |
16 |
| 2 |
地址模式 Address Mode |
1 = 組播或2 =單播 1=groupcast OR 2=unicast |
| 2 |
網絡地址 Network Address |
NwkAddr或組ID NwkAddr OR Group ID |
| 6 |
保留的 Reserved |
0 |
| 1 |
端點 Endpoint |
端點或為0xFF Endpoint OR 0xFF |
| 2 |
保留的 Reserved |
0 |
| 1 |
色調 Hue |
0-255 |
| 1 |
飽和度 Saturation |
0-255 |
RPCS_GET_DEV_STATE
此命令用於請求設備的開/關狀態。當命令發送到支持開/關狀態讀取的設備時,響應將導致ZigBee HA Gateway SW發送RPCS_GET_DEV_STATE_RSP消息。
| RPCS_GET_DEV_STATE消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X85 |
| 1 |
長度 Length |
0 |
RPCS_GET_DEV_LEVEL
此命令用於請求設備的光照水平。當命令發送到支持光照水平讀取的設備時,響應將導致ZigBee HA Gateway SW發送RPCS_GET_DEV_LEVEL_RSP消息。
| RPCS_GET_DEV_LEVEL消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x86 |
| 1 |
長度 Length |
0 |
RPCS_GET_DEV_HUE
此命令用來請求設備色調。當發送到支持色調讀取的設備時,響應將導致ZigBee HA Gateway SW發送RPCS_GET_DEV_HUE_RSP消息。
| RPCS_GET_DEV_HUE消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
87H |
| 1 |
長度 Length |
0 |
RPCS_GET_DEV_SAT
此命令用來請求設備的色飽和度。當發送到支持色飽和度讀取的設備時,響應將導致ZigBee HA Gateway SW發送RPCS_GET_DEV_SAT_RSP消息。
| RPCS_GET_DEV_SAT消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x88 |
| 1 |
長度 Length |
0 |
RPCS_BIND_DEVICES
This command is used to request a devices add another device to its binding table. When sent to the source device supports the output cluster of the ClusterID specified the source device will add the desitnation device to its binding table. The will result in the source device sending cluster specific messages to the distination device. an example use case would be a PIR sensor as the source device binding its on/off cluster to a Light to turn the light on/off based on motion detect or not detected.
此命令是用來請求一個設備添加其他設備到其綁定列表。當該命令發送到支持集群ID為“ClusterID”輸出簇的源設備時,指定的的源設備將添加目的設備到其綁定表。這將導致源設備發送集群特定消息給目的設備。一個示例如:將一個紅外傳感器作為源設備將其開/關集群綁定到一個燈,是否有運動偵測到決定燈的亮/滅。
| RPCS_BIND_DEVICES消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x88 |
| 1 |
長度 Length |
0 |
RPCS_GET_GROUPS
此命令將用於請求組列表。這將導致ZigBee HA Gateway SW為組列表中每個組(由RPCS_ADD_GROUP創建)發送RPCS_GET_GROUPS_RSP消息。
| RPCS_GET_GROUPS消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x8e |
| 1 |
長度 Length |
0 |
| 2 |
源網絡地址 Source Network Address |
NWK地址 Nwk Addr |
| 1 |
源端點 Source Endpoint |
端點 Endpoint |
| 8 |
源IEEE地址 Source IEEE Addr |
IEEE地址 IEEE Addr |
| 1 |
目標端點 Destination Endpoint |
端點 Endpoint |
| 8 |
目的地IEEE地址 Destination IEEE Addr |
IEEE地址 IEEE Addr |
| 2 |
集群ID Cluster ID |
集群ID ClusterID |
RPCS_ADD_GROUP
此命令用來發送一個ZigBee消息將一個設備添加到一個組,如果該組不存在,則在組列表中創建該組。它有兩個模式,單播,針對一個特定的設備;組播,針對先前已通過RPCS_ADD_GROUP命令創建的一組設備。此命令將得到一個含有該組的組ID的RPCS_ADD_GROUP_RSP。
| RPCS_ADD_GROUP消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x8f |
| 1 |
長度 Length |
13 + n |
| 1 |
地址模式 Address Mode |
1 = 組播或2 =單播 1=groupcast OR 2=unicast |
| 2 |
網絡地址 Network Address |
NwkAddr或組ID NwkAddr OR Group ID |
| 6 |
保留的 Reserved |
0 |
| 1 |
端點 Endpoint |
設備端點或為0xFF Devices Endpoint OR 0xFF |
| 2 |
保留的 Reserved |
0 |
| 1 |
組名稱長度 Group name length |
n |
| Ñ |
組名稱字符串 |
例如:“飯廳” "Dinning Room" |
RPCS_GET_SCENES
該命令將被用來請求一個場景列表。它會導致ZigBee HA Gateway SW為場景列表中的每個場景(由RPCS_STORE_SCENE創建)發送RPCS_GET_SCENE_RSP消息。
| RPCS_GET_SCENES消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
為0x90 |
| 1 |
長度 Length |
0 |
RPCS_STORE_SCENE
This command is used to send a ZigBee message to store a scene to a group and to create the scene in the scene list if it does not yet exist. It has 2 modes, unicast to target a particular device or groupcast to target a group of devices that has previously been created a previous RPCS_ADD_GROUP command. It is highly recommended that this is only used in groupcast mode to store a scene to the entire group that it applies to rather than individual devices. This command will result in a RPCS_ADD_SCENE_RSP containing the Group ID and Scene ID of the scene.
此命令是用來發送一個ZigBee消息將一個場景儲存到一個組,如果該場景不存在,則新建該場景。它有兩個模式,單播,針對一個特定的設備;組播,針對先前已通過RPCS_ADD_GROUP命令創建的一組設備。強烈建議,這個命令僅使用組播模式來存儲整個組的一個場景而不是單個設備。此命令將產生包含該場景的組ID和場景ID 的RPCS_ADD_SCENE_RSP命令。
| RPCS_STORE_SCENE消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x8f |
| 1 |
長度 Length |
13 + n |
| 1 |
地址模式 Address Mode |
1 = 組播或2 =單播 1=groupcast OR 2=unicast |
| 2 |
網絡地址 Network Address |
NwkAddr或組ID NwkAddr OR Group ID |
| 6 |
保留的 Reserved |
0 |
| 1 |
端點 Endpoint |
設備端點或為0xFF Devices Endpoint OR 0xFF |
| 2 |
保留的 Reserved |
0 |
| 2 |
組ID(該組RPCS_ADD_GROUP_RSP返回) Group ID(returned in the RPCS_ADD_GROUP_RSP for that group) |
0 |
| 1 |
場景名稱長度 Scene name length |
n |
| n |
場景名稱字符串 |
例如:“放松” "Relax" |
RPCS_RECALL_SCENE
此命令用來發送一個ZigBee消息來回憶一個組的場景This command is used to send a ZigBee message to recall a scene to a group。它有兩個模式,單播,針對一個特定的設備;組播,針對先前已通過RPCS_ADD_GROUP命令創建的一組設備。強烈建議此命令僅用在組播模式下來重新調用整個組一個場景,它適用於整個組,而不是單個設備。
| RPCS_RECALL_SCENE消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x8f |
| 1 |
長度 Length |
13 + n |
| 1 |
地址模式 Address Mode |
1 = 組播或2 =單播 1=groupcast OR 2=unicast |
| 2 |
網絡地址 Network Address |
NwkAddr或組ID NwkAddr OR Group ID |
| 6 |
保留的 Reserved |
0 |
| 1 |
端點 Endpoint |
設備端點或為0xFF Devices Endpoint OR 0xFF |
| 2 |
保留的 Reserved |
0 |
| 2 |
組ID(該組RPCS_ADD_GROUP_RSP返回) Group ID (returned in the RPCS_ADD_GROUP_RSP for that group) |
0 |
| 1 |
組名稱長度 Group name length |
n |
| n |
組名稱字符串 Group name string |
“組名” |
5.3.4.2. 從照明網關發送的命令
從照明網關發送的命令如下表:
| SRPC commands sent |
|
| Description |
CMD ID |
| 0x01 |
|
| 0x02 |
reserved (was for RPCS_DEV_ANNCE in Linux ZAP) |
| 0x03 |
reserved (was for RPCS_SIMPLE_DESC in Linux ZAP) |
| 0x04 |
|
| 0x05 |
|
| 0x06 |
resevered |
| 0x07 |
|
| 0x08 |
|
| 0x09 |
|
| 0x0a |
|
| 0x0b |
|
| 0x0c |
|
| 0x0d |
|
| 0x0e |
|
| 0x0f |
Reserved |
| 0x10 |
Reserved |
RPCS_NEW_ZLL_DEVICE
該命令跟隨RPCS_GET_DEVICES將被發送到ZigBee網絡中的每個設備的客戶端。This command will be sent to the client for each device in the ZigBee network following a RPCS_GET_DEVICES.當一個新的設備加入網絡時,消息也將被發送。
| RPCS_NEW_ZLL_DEVICE消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X01 |
| 1 |
長度 Length |
0x7 |
| 2 |
網絡地址 Network Address |
0x1234 |
| 1 |
端點 End Point |
0X56 |
| 2 |
資料編號 Profile ID |
0x0104 |
| 2 |
設備ID Device ID |
0x0102 |
RPCS_TEMP_READING
當照明網關接收到一個溫度讀數時,該命令將被發送到所有客戶端。溫度是在DEGC * 100 The temperature is in DegC * 100(-273.15°C <=溫度<= 327.67ºC,相應的測量值在0x954d到0x7FFF之間。這種格式允許的最高分辨率為0.01°C。
| RPCS_TEMP_READING消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x04 |
| 1 |
長度 Length |
0X5 |
| 2 |
網絡地址 Network Address |
0x1234 |
| 1 |
端點 End Point |
0X56 |
| 2 |
溫度 Temperature |
0x89ab |
RPCS_POWER_READING
當照明網關接收到功率讀數時,該命令將被發送到所有客戶端。該電源是在W * 100,The power is in W * 100用一個24b的數字表示(在這個消息的數據包中打包成32b的數字)。
| RPCS_POWER_READING消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X05 |
| 1 |
長度 Length |
0x7 |
| 2 |
網絡地址 Network Address |
0x1234 |
| 1 |
端點 End Point |
0X56 |
| 4 |
功率 Power |
0x0089abcd |
RPCS_GET_DEV_STATE_RSP
當照明網關接收到一個狀態讀數時,該命令將被發送到所有客戶端。該狀態是0或0xFF,反映設備的開/關狀態。
| RPCS_GET_DEV_STATE_RSP消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X07 |
| 1 |
長度 Length |
0x4 |
| 2 |
網絡地址 Network Address |
0x1234 |
| 1 |
端點 End Point |
0X56 |
| 2 |
狀態 state |
0X0 |
RPCS_GET_DEV_LEVEL_RSP
當照明網關接收到一個水平讀數時,該命令將被發送到所有客戶端。該狀態為0-0xFF時,反映設備的光的暗淡級別。
| RPCS_GET_DEV_LEVEL_RSP消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X08 |
| 1 |
長度 Length |
0x4 |
| 2 |
網絡地址 Network Address |
0x1234 |
| 1 |
端點 End Point |
0X56 |
| 2 |
水平 level |
0x78 |
RPCS_GET_DEV_HUE_RSP
當家庭自動化網關接收到一個色調讀數時,該命令將被發送到所有客戶端。狀態為0-0xFF,反映該設備的色調。
| RPCS_GET_DEV_HUE_RSP消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X09 |
| 1 |
長度 Length |
0x4 |
| 2 |
網絡地址 Network Address |
0x1234 |
| 1 |
端點 End Point |
0X56 |
| 2 |
色調 Hue |
0x78 |
RPCS_GET_DEV_SAT_RSP
當照明網關接收到飽和度讀數時,該命令將被發送到所有客戶端。狀態為0-0xFF的,反映了設備的飽和度。
| RPCS_GET_DEV_SAT_RSP消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X0A |
| 1 |
長度 Length |
0x4 |
| 2 |
網絡地址 Network Address |
0x1234 |
| 1 |
端點 End Point |
0X56 |
| 2 |
飽和度 Saturation |
0x78 |
RPCS_ADD_GROUP_RSP
當照明網關建立一個群組時,該命令將被發送到一個客戶端。客戶端可以使用這個消息將一個組字符串連接到一個組ID。當網關收到一個RPCS_ADD_GROUP命令時將創建一個組。
| RPCS_ADD_GROUP_RSP消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X0B |
| 1 |
長度 Length |
0X3 +組名稱字符串長度 |
| 2 |
組ID Group ID |
為0x1234 |
| 1 |
組名稱字符串長度 Group Name String Length |
x |
| x |
組名稱 Group Name |
“第1組” |
RPCS_GET_GROUP_RSP
當照明網關響應一個RPCS_GET_GROUPS命令時,該命令將被發送到客戶端。此消息將被發送到已在照明網關上創建的每個組。
| RPCS_GET_GROUP_RSP消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0X0C |
| 1 |
長度 Length |
0X3 +組名稱字符串長度 |
| 2 |
組ID Group ID |
0x1234 |
| 1 |
組名稱字符串長度 Group Name String Length |
x |
| x |
組名稱 Group Name |
“第1組” |
RPCS_ADD_SCENE_RSP
當照明的網關創建了一個場景時,該命令將被發送到客戶端,客戶端可以使用這個消息將一個場景字符串連接到一個場景ID和一個組ID。網關收到一個RPCS_ADD_SCENE命令將創建一個場景。
| RPCS_ADD_SCENE_RSP消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x0d |
| 1 |
長度 Length |
0x3+場景名稱字符串長度 0x3 + Scene Name String Length |
| 2 |
組ID Group ID |
0x1234 |
| 1 |
場景ID Scene ID |
0X56 |
| 1 |
場景名稱字符串長度 Scene Name String Length |
x |
| x |
場景名稱 Scene Name |
“場景1” |
RPCS_GET_SCENE_RSP
照明的網關創建了一個場景時,該命令將被發送到客戶端,客戶端可以使用這個消息將一個場景字符串連接到一個場景ID和一個組ID。此消息將被發送到已在照明網關上創建的每個場景。
| RPCS_GET_SCENE_RSP消息格式 |
||
| 字節 |
描述 |
值 |
| 1 |
命令ID Command ID |
0x0d |
| 1 |
長度 Length |
0x3+場景名稱字符串長度 0x3 + Scene Name String Length |
| 2 |
組ID Group ID |
0x1234 |
| 1 |
場景ID Scene ID |
0X56 |
| 1 |
場景名稱字符串長度 Scene Name String Length |
x |
| x |
場景名稱 Scene Name |
“場景1” |
[c2]之前的翻譯有錯誤。這里的light是指的的燈泡,而不是板子上的指示燈。
[c3]這里應該是原文中拼寫錯誤,though應該原為through,cycle through,重復循環或遍歷的意思。
[c4]ZLL Remote,直接翻譯為ZLL遙控器即可。這個CC2531的板子此時就是一個遙控器。
[c5]之前的翻譯有點問題,這個主密鑰是不公開的。
[c6]實際上相當於是一種臨時的解決方案。
[c7]問題:為什么是使用SmartRF05+CC2530EM,而不是直接使用CC2531 dongle? 且代碼是使用ZStack-Lighting-1.0.1 Remote FW 而不是使用網關的代碼?
[c8]Touchlink是ZLL定義的一組特定操作,不必翻譯為韓語。
[c9]從用戶體驗的角度,這個過程會顯得麻煩。
附件列表










