最近參與規劃的一個項目,需要大量的Zigbee(約5000個)進行資料采集。由于是大面積布點,采用的是Mesh網絡架構,是以很多節點都是所謂的路由節點,這就引發一個問題,路由節點一般情況下需要持續供電,由于現場條件隻能采用電池供電,這和電池使用1到2年的要求産生了很大的沖突,是以需要zigbee支援一種同步休眠的技術。
最初的方案考慮zigbee晶片+STM8l晶片,通過在單片中程式設計,用程式邏輯實作同步休眠,思路相對簡單,就是主節點廣播一個休眠指令,單片機收到後,控制zigbee進入休眠狀态,同時自己也進入休眠中,經過預設的一段時間後,由時鐘喚醒晶片,然後晶片再喚醒Zigbee,進行相關資料發送。由于STM8l是低功耗晶片,其采集傳感器資料比zigbee子產品直接采集傳感器資料功耗會低很多,并且隻是發送資料的時候才開啟zigbee,整體功耗會更低,但是電路的複雜性和成本會增加不少。
赫立訊公司的一個繼承者在赫立訊Zigbee晶片技術的架構上實作了一種所謂的同步休眠的技術,在Zigbee子產品中實作了上述的休眠邏輯,由于是在zigbee子產品中直接實作,執行效率會更一些,外圍電路也會更簡單,不過其實作的可靠性和穩定性,還有外部開發和配置的能力需要進一步考驗。
直接從周立功公司購買的Zigbee套件,預設部署的是點對點的固件,通過ZigbeeCfg工具可以更新該固件,或更換為對等網固件。如果需要部署支援SNAP的固件需要用Synapse公司公司的Portal軟體進行部署(如下圖)。
警告:做這一步需要慎重考慮,因為部署後,周立功公司提供的ZigbeeCfg的工具上的SNAP選項也無法通路該子產品,這個時候如果恢複為原先的固件需要返廠處理。
下面代碼是一個控制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編寫容易,且功能也強大的多。
<a href="http://weibo.com/1804832611?s=6uyXnP"></a>