摘要:組包解包和解析以開關燈的控制協議來看的組包過程包的首尾是開始和結束標志。前三個字段分別是之后就是具體的控制數據。由于要在包內容里避免使用開頭或者結尾的標志字段,所以需要對源包內容進行轉義,轉義示意如下。我們就可以接入上面展示的燈和開關了。
原理簡介
這個智能控制系統采用 ZigBee 作為無線通信協議。
在支持 OpenWRT 系統的路由器上刷入 Ruff,利用 ZigBee-USB dongle 模塊,和其他 ZigBee 終端設備通信,實現遙控功能。
極路由3 ,已刷入 Ruff。
ZigBee-USB dongle 模塊
ZigBee 燈
小米 ZigBee 開關
初始化 APP
$ rap init
添加 zigbee 驅動,id 為 zigbee ,型號選擇 jn5168a
$ rap device add zigbee (jn5168a)
編寫 src/index.js代碼
"use strict"; var zigbee; $.ready(function (error) { if (error) { console.log(error); return; } zigbee = $("#zigbee"); zigbee.startup(); zigbee.setTurnLightOn(); zigbee.setTurnLightOff(); zigbee.setToggleLight(); }); $.end(function () { });
改寫板卡描述 board.json
由于路由器上沒有 GPIO 之類的接口,所以我們要改寫板卡描述文件 ruff_modules/ruff-mbd-v1/board.json。
{ "version": "2.0", "id": "ruff-mbd-v1", "model": "ruff-mbd-v1", "preloads": { "uart-0": "uart-0/uart" }, "outputs": { "uart-0": "uart-0/uart", "gnd-0": "ground/gnd-0", "vdd-0": "power/vdd-0" }, "devices": [ { "id": "ground", "outputs": { "gnd-0": { "type": "ground" } } }, { "id": "power", "outputs": { "vdd-0": { "type": "power", "args": { "voltage": "3.3v" } } } }, { "id": "uart-0", "model": "ruff-sys-uart", "driver": "sys-uart", "inputs": { "device": { "type": "string", "args": { "path": "/dev/ttyUSB0" } } }, "outputs": { "uart" : { "type":"uart" } } } ] }
5.部署代碼
`$ rap deploy your-router-ip -s`ZigBee 驅動解析
以下三個部分分別從
ZigBee 網絡包的組成
ZigBee 網絡的組建
開關燈控制
三個方面,來介紹 ZigBee 驅動模塊。
ZigBee 組包、解包和解析以開關燈的控制協議來看 ZigBee 的組包過程:
start = 0x1 end = 0x3 data = [0x2, 0x44, 0xa6, 0x1, 0x1, 0x1] msgType = 146 = 0x92 (OnOff) msgLen = 0x6 crc = 0x92 ^ 0x6 ^ 0x2 ^ 0x44 ^ 0xa6 ^ 0x1 ^ 0x1 ^ 0x1 = 0x75 ----------------------------------------------------------------------------------- | 0x1 | 0x92 | 0x6 | 0x75 | 0x2, 0x44, 0xa6, 0x1, 0x1, 0x1 | 0x3 | ----------------------------------------------------------------------------------- | start | msgType | msgLen | crc | Data | stop | -----------------------------------------------------------------------------------
包的首尾是開始和結束標志。前三個字段分別是message type, message length, CRC checksum, 之后就是具體的控制數據。
由于要在包內容里避免使用開頭或者結尾的標志字段,所以需要對源包內容進行轉義,轉義示意如下。
0x00 0x92 -> 0x2 0x10^0x00 0x92 ------------------------------------------------------------------------------------------------------------ | 0x1 | 0x2 0x10 0x92 | 0x2 0x10 0x2 0x16 | 0x75 | 0x2 0x12 0x44 0xa6 0x2 0x11 0x2 0x11 0x2 0x11 | 0x3 | ------------------------------------------------------------------------------------------------------------ | start | msgType | msgLen | crc | Data | stop | ------------------------------------------------------------------------------------------------------------
解包是組包的逆過程。
解析而是依據ZigBee協議的數據手冊(JN-AN-1194-ZigBee-IoT-Gateway-Control-Bridge pdf),一一對照著解析包的內容。
根據數據手冊,ZigBee初始化組建網絡需要經過以下幾個步驟:
this.getVersion(); this.setExtendedPANID(); this.setChannelMask(); this.setSecurityStateAndKey(); this.setDeviceType(); this.startNetwork(); this.permitJoiningRequest();
在這之后,ZigBee 網絡處于開放狀態,可以接受連接請求。我們就可以接入上面展示的 ZigBee 燈和開關了。
ZigBee 開關燈代碼ZigBee 協議里有直接控制開關的通信類型,通過查找 ZigBee 數據手冊,可以找到如下信息:
利用這個通信類型,我們寫的開關燈的代碼是這樣的。
ZigBee.prototype.turnLightOn = function () { console.log("turn light on"); var devices = interpreter.getDeviceList(); var msg = new Buffer([0x2, 0xff, 0xff, 0x1, 0x1, 0x1]); if (devices.length !== 0) { msg.writeUInt16BE(devices[0].shortAddress, 1); } this._writeCmd(0x92, msg); } ZigBee.prototype.turnLightOff = function () { console.log("turn light off"); var devices = interpreter.getDeviceList(); var msg = new Buffer([0x2, 0xff, 0xff, 0x1, 0x1, 0x0]); if (devices.length !== 0) { msg.writeUInt16BE(devices[0].shortAddress, 1); } this._writeCmd(0x92, msg); } ZigBee.prototype.toggleLight = function () { console.log("toggle light"); var devices = interpreter.getDeviceList(); var msg = new Buffer([0x2, 0xff, 0xff, 0x1, 0x1, 0x2]); if (devices.length !== 0) { msg.writeUInt16BE(devices[0].shortAddress, 1); } this._writeCmd(0x92, msg); }演示視頻
演示(騰訊)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81155.html
摘要:定律在那篇最流行的編程語言能做什么里,我們列舉了在不同領域的使用情況,今天讓我們來詳解一下在物聯網中的應用。這個硬件層決定了物聯網應用比應用更加復雜。這時,我開始關注實現物聯網應用的可能性。 凡是能用JavaScript寫出來的,最終都會用JavaScript寫出來。 —— Atwood定律 在那篇《最流行的編程語言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:定律在那篇最流行的編程語言能做什么里,我們列舉了在不同領域的使用情況,今天讓我們來詳解一下在物聯網中的應用。這個硬件層決定了物聯網應用比應用更加復雜。這時,我開始關注實現物聯網應用的可能性。 凡是能用JavaScript寫出來的,最終都會用JavaScript寫出來。 —— Atwood定律 在那篇《最流行的編程語言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:前言最近聽到有小伙伴們對感興趣,我也跟著加入了大軍中,本篇文章展示了的開發套件,以及入手后的小,后續持續更新參考文獻官網思否首頁開箱如同官網展示的配件如下上手官方我開發時使用的是系統,所以下載安裝包創建項目文件,在當前目錄執行下面命令查看 前言 最近聽到有小伙伴們對ruff感興趣,我也跟著加入了大軍中,本篇文章展示了ruff的開發套件,以及入手后的小demo,后續持續更新參考文獻ruf...
摘要:物聯網操作系統落地工業物聯網定制化解決方案實施上線上天并不像一個正經的創業公司,更不像一個掙扎在生死邊緣的創業者,反而像一個時下流行叫法斜杠青年。所以,對于而言,區塊鏈只是份內的事。 showImg(https://segmentfault.com/img/bV9xuY?w=1182&h=591); 物聯網操作系統落地工業物聯網、定制化解決方案實施、Ruff Chain 上線、Ruff...
摘要:雖然表現層的數據占到,甚至可能更多,但價值網絡的數據在物聯網中則更能產生價值。因此,采取的是在末端使用無人化的方式運作,利用邊緣節點采取數據,然后把其他最有價值的需要保證絕對的一致性的可以用于價值流轉和價值流通的數據進行上鏈。 showImg(https://segmentfault.com/img/bV64yb?w=2160&h=1440); 2018年3月27日,人民網創投?區塊鏈...
閱讀 2231·2021-11-22 09:34
閱讀 1342·2021-10-11 10:59
閱讀 4442·2021-09-22 15:56
閱讀 3297·2021-09-22 15:08
閱讀 3411·2019-08-30 14:01
閱讀 782·2019-08-30 11:16
閱讀 1136·2019-08-26 13:51
閱讀 2915·2019-08-26 13:43