Ruff 上的 ZigBee 應用

原理簡介

這個智能控制系統採用 ZigBee 作為無線通信協議。

在支持 OpenWRT 系統的路由器上刷入 Ruff,利用 ZigBee-USB dongle 模塊,和其他 ZigBee 終端設備通信,實現遙控功能。

物件清單

n主控平台n

極路由3 ,已刷入 Ruff。

n感測器和執行元件n

  • ZigBee-USB dongle 模塊

  • ZigBee 燈

  • 小米 ZigBee 開關

開發步驟

  1. 初始化 APP

    $ rap init

  2. 添加 zigbee 驅動,id 為 zigbee ,型號選擇 jn5168a

    $ rap device add zigbee (jn5168a)

  3. 編寫 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

  4. 改寫板卡描述 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

  5. 部署代碼

    $ 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殭屍網路

TAG:Ruff | Zigbee | 物联网 |