Ruff 上的 ZigBee 應用
原理簡介
這個智能控制系統採用 ZigBee 作為無線通信協議。
在支持 OpenWRT 系統的路由器上刷入 Ruff,利用 ZigBee-USB dongle 模塊,和其他 ZigBee 終端設備通信,實現遙控功能。物件清單
n主控平台n
極路由3 ,已刷入 Ruff。
- ZigBee-USB dongle 模塊
- ZigBee 燈
- 小米 ZigBee 開關
開發步驟
初始化 APP
$ rap init添加 zigbee 驅動,id 為 zigbee ,型號選擇 jn5168a
$ rap device add zigbee (jn5168a)
編寫 src/index.js 代碼
use strict;nn var zigbee;nn $.ready(function (error) {n if (error) {n console.log(error);n return;n }n zigbee = $(#zigbee);n zigbee.startup();nn zigbee.setTurnLightOn();n zigbee.setTurnLightOff();n zigbee.setToggleLight();n });nn $.end(function () {n });n
改寫板卡描述 board.json
由於路由器上沒有 GPIO 之類的介面,所以我們要改寫板卡描述文件 ruff_modules/ruff-mbd-v1/board.json。{n "version": "2.0",n "id": "ruff-mbd-v1",n "model": "ruff-mbd-v1",n "preloads": {n "uart-0": "uart-0/uart"n },n "outputs": {n "uart-0": "uart-0/uart",n "gnd-0": "ground/gnd-0",n "vdd-0": "power/vdd-0"n },n "devices": [n {n "id": "ground",n "outputs": {n "gnd-0": {n "type": "ground"n }n }n },n {n "id": "power",n "outputs": {n "vdd-0": {n "type": "power",n "args": {n "voltage": "3.3v"n }n }n }n },n {n "id": "uart-0",n "model": "ruff-sys-uart",n "driver": "sys-uart",n "inputs": {n "device": {n "type": "string",n "args": {n "path": "/dev/ttyUSB0"n }n }n },n "outputs": {n "uart" : {n "type":"uart"n }n }n }n ]n }n
部署代碼
$ rap deploy your-router-ip -s
ZigBee 驅動解析
以下三個部分分別從
- ZigBee 網路包的組成
- ZigBee 網路的組建
- 開關燈控制
三個方面,來介紹 ZigBee 驅動模塊。
ZigBee 組包、解包和解析
以開關燈的控制協議來看 ZigBee 的組包過程:
start = 0x1n end = 0x3n data = [0x2, 0x44, 0xa6, 0x1, 0x1, 0x1]n msgType = 146 = 0x92 (OnOff)n msgLen = 0x6n crc = 0x92 ^ 0x6 ^ 0x2 ^ 0x44 ^ 0xa6 ^ 0x1 ^ 0x1 ^ 0x1 = 0x75nn -----------------------------------------------------------------------------------n | 0x1 | 0x92 | 0x6 | 0x75 | 0x2, 0x44, 0xa6, 0x1, 0x1, 0x1 | 0x3 |n -----------------------------------------------------------------------------------n | start | msgType | msgLen | crc | Data | stop |n -----------------------------------------------------------------------------------n
包的首尾是開始和結束標誌。前三個欄位分別是 message type, message length, CRC checksum, 之後就是具體的控制數據。
由於要在包內容里避免使用開頭或者結尾的標誌欄位,所以需要對源包內容進行轉義,轉義示意如下。0x00 0x92 -> 0x2 0x10^0x00 0x92nn ------------------------------------------------------------------------------------------------------------n | 0x1 | 0x2 0x10 0x92 | 0x2 0x10 0x2 0x16 | 0x75 | 0x2 0x12 0x44 0xa6 0x2 0x11 0x2 0x11 0x2 0x11 | 0x3 |n ------------------------------------------------------------------------------------------------------------n | start | msgType | msgLen | crc | Data | stop |n ------------------------------------------------------------------------------------------------------------n
解包是組包的逆過程。
解析而是依據 ZigBee協議的數據手冊(JN-AN-1194-ZigBee-IoT-Gateway-Control-Bridge pdf),一一對照著解析包的內容。ZigBee 網路組建代碼
根據數據手冊,ZigBee 初始化組建網路需要經過以下幾個步驟:
this.getVersion();n this.setExtendedPANID();n this.setChannelMask();n this.setSecurityStateAndKey();n this.setDeviceType();n this.startNetwork();n this.permitJoiningRequest();n
在這之後,ZigBee 網路處於開放狀態,可以接受連接請求。我們就可以接入上面展示的 ZigBee 燈和開關了。
ZigBee 開關燈代碼
ZigBee 協議里有直接控制開關的通信類型,通過查找 ZigBee 數據手冊,可以找到如下信息:
利用這個通信類型,我們寫的開關燈的代碼是這樣的。
ZigBee.prototype.turnLightOn = function () {n console.log(turn light on);n var devices = interpreter.getDeviceList();n var msg = new Buffer([0x2, 0xff, 0xff, 0x1, 0x1, 0x1]);n if (devices.length !== 0) {n msg.writeUInt16BE(devices[0].shortAddress, 1);n }n this._writeCmd(0x92, msg);n}nnZigBee.prototype.turnLightOff = function () {n console.log(turn light off);n var devices = interpreter.getDeviceList();n var msg = new Buffer([0x2, 0xff, 0xff, 0x1, 0x1, 0x0]);n if (devices.length !== 0) {n msg.writeUInt16BE(devices[0].shortAddress, 1);n }n this._writeCmd(0x92, msg);n}nnZigBee.prototype.toggleLight = function () {n console.log(toggle light);n var devices = interpreter.getDeviceList();n var msg = new Buffer([0x2, 0xff, 0xff, 0x1, 0x1, 0x2]);n if (devices.length !== 0) {n msg.writeUInt16BE(devices[0].shortAddress, 1);n }n this._writeCmd(0x92, msg);n}n
演示視頻
演示(騰訊)
推薦閱讀:
※大市場在硬體領域幾乎不存在,縮小目標市場才有機會——Terry 談智能家居
※【乾貨合集】不免俗,咱們談一談這場「順我者昌,逆我者亡的偉大技術革命」——區塊鏈
※MATLAB和物聯網連載4: Thingspeak Tutorial 3
※如何為技術博客設計一個推薦系統(中):基於 Google 搜索的半自動推薦
※IoT_reaper : 一個正在快速擴張的新 IoT殭屍網路