最近參與規劃的一個項目,需要大量的Zigbee(約5000個)進行資料采集。由于是大面積布點,采用的是Mesh網絡架構,是以很多節點都是所謂的路由節點,這就引發一個問題,路由節點一般情況下需要持續供電,由于現場條件隻能采用電池供電,這和電池使用1到2年的要求産生了很大的沖突,是以需要zigbee支援一種同步休眠的技術。
最初的方案考慮zigbee晶片+STM8l晶片,通過在單片中程式設計,用程式邏輯實作同步休眠,思路相對簡單,就是主節點廣播一個休眠指令,單片機收到後,控制zigbee進入休眠狀态,同時自己也進入休眠中,經過預設的一段時間後,由時鐘喚醒晶片,然後晶片再喚醒Zigbee,進行相關資料發送。由于STM8l是低功耗晶片,其采集傳感器資料比zigbee子產品直接采集傳感器資料功耗會低很多,并且隻是發送資料的時候才開啟zigbee,整體功耗會更低,但是電路的複雜性和成本會增加不少。
赫立訊公司的一個繼承者在赫立訊Zigbee晶片技術的架構上實作了一種所謂的同步休眠的技術,在Zigbee子產品中實作了上述的休眠邏輯,由于是在zigbee子產品中直接實作,執行效率會更一些,外圍電路也會更簡單,不過其實作的可靠性和穩定性,還有外部開發和配置的能力需要進一步考驗。
在研究周立功zigbee晶片的時候,發現周立功的zigbee晶片支援一種SNAP的技術,其最大的特色就是支援使用者二次開發,這也是我第一次發現支援使用者二次開發的Zigbee子產品。該技術在Zigbee子產品中實作了一個Python虛拟機,使用者通過編寫Python腳本程式進行二次開發(這算是第二次研究Python相關語言了,第一次是多年前實作LED大屏顯示特效的時候用過Python腳本,請參見相關博文《IronPython腳本應用之LED影像系統》)。
SNAP是Synapse公司開發的無線mesh網絡協定,提供腳本開發工具和相關固件,其使用是需要授權費用的(可以免費使用6個,一個授權大概30元左右)。SNAP網絡簡介如下:

警告:做這一步需要慎重考慮,因為部署後,周立功公司提供的ZigbeeCfg的工具上的SNAP選項也無法通路該子產品,這個時候如果恢複為原先的固件需要返廠處理。
SNAP目前最新版本的Python腳本支援72個系統函數,可以操作AD、GPIO、序列槽、SPI、I2C等相關接口,也可以執行休眠,重新開機等相關指令。
下面代碼是一個控制LED燈閃爍的腳本示例,内容如下:
"""Cycle the LEDs on the ZIC2410 evalboard"""
led = 0
def start():
# Initialize LED pins asoutputs
setPinDir(0, True)
writePin(0, False)
setPinDir(1, True)
writePin(1, False)
setPinDir(2, True)
writePin(2, False)
setPinDir(3, True)
writePin(3, False)
def timer100msEvent(currentMs):
"""On the100ms tick, increment led count and pulse next LED"""
global led
led = (led + 1) % 4
pulsePin(led, 75, True)
def remoteLQ():
"""As anadded bonus, respond to Link Quality Ranger requests too"""
rpc(rpcSourceAddr(),'remoteLQ')
# Here's where we specify any "Event Handlers" we need.
snappyGen.setHook(SnapConstants.HOOK_STARTUP, start)
snappyGen.setHook(SnapConstants.HOOK_100MS, timer100msEvent)
部署運作後,你會發現RXD/TXD和ERR燈會依次閃爍。
不過由于該固件為國外公司所開發,如要求底層進行定制開發,比如支援單總線的溫濕度采集,就很難實作了。想到這裡,倒是有一個建議,國内如用STM32W Zigbee晶片做zigbee子產品的公司,可以考慮內建一個簡單的.NET MF架構,這樣使用者就可以用C#或VB.net進行Zigbee二次開發了,感覺要比Python編寫容易,且功能也強大的多。