摘要:組包解包和解析以開關(guān)燈的控制協(xié)議來看的組包過程包的首尾是開始和結(jié)束標(biāo)志。前三個(gè)字段分別是之后就是具體的控制數(shù)據(jù)。由于要在包內(nèi)容里避免使用開頭或者結(jié)尾的標(biāo)志字段,所以需要對源包內(nèi)容進(jìn)行轉(zhuǎn)義,轉(zhuǎn)義示意如下。我們就可以接入上面展示的燈和開關(guān)了。
原理簡介
這個(gè)智能控制系統(tǒng)采用 ZigBee 作為無線通信協(xié)議。
在支持 OpenWRT 系統(tǒng)的路由器上刷入 Ruff,利用 ZigBee-USB dongle 模塊,和其他 ZigBee 終端設(shè)備通信,實(shí)現(xiàn)遙控功能。
極路由3 ,已刷入 Ruff。
ZigBee-USB dongle 模塊
ZigBee 燈
小米 ZigBee 開關(guān)
初始化 APP
$ rap init
添加 zigbee 驅(qū)動,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 驅(qū)動解析
以下三個(gè)部分分別從
ZigBee 網(wǎng)絡(luò)包的組成
ZigBee 網(wǎng)絡(luò)的組建
開關(guān)燈控制
三個(gè)方面,來介紹 ZigBee 驅(qū)動模塊。
ZigBee 組包、解包和解析以開關(guān)燈的控制協(xié)議來看 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 | -----------------------------------------------------------------------------------
包的首尾是開始和結(jié)束標(biāo)志。前三個(gè)字段分別是message type, message length, CRC checksum, 之后就是具體的控制數(shù)據(jù)。
由于要在包內(nèi)容里避免使用開頭或者結(jié)尾的標(biāo)志字段,所以需要對源包內(nèi)容進(jìn)行轉(zhuǎn)義,轉(zhuǎn)義示意如下。
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 | ------------------------------------------------------------------------------------------------------------
解包是組包的逆過程。
解析而是依據(jù)ZigBee協(xié)議的數(shù)據(jù)手冊(JN-AN-1194-ZigBee-IoT-Gateway-Control-Bridge pdf),一一對照著解析包的內(nèi)容。
根據(jù)數(shù)據(jù)手冊,ZigBee初始化組建網(wǎng)絡(luò)需要經(jīng)過以下幾個(gè)步驟:
this.getVersion(); this.setExtendedPANID(); this.setChannelMask(); this.setSecurityStateAndKey(); this.setDeviceType(); this.startNetwork(); this.permitJoiningRequest();
在這之后,ZigBee 網(wǎng)絡(luò)處于開放狀態(tài),可以接受連接請求。我們就可以接入上面展示的 ZigBee 燈和開關(guān)了。
ZigBee 開關(guān)燈代碼ZigBee 協(xié)議里有直接控制開關(guān)的通信類型,通過查找 ZigBee 數(shù)據(jù)手冊,可以找到如下信息:
利用這個(gè)通信類型,我們寫的開關(guān)燈的代碼是這樣的。
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); }演示視頻
演示(騰訊)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/81155.html
摘要:定律在那篇最流行的編程語言能做什么里,我們列舉了在不同領(lǐng)域的使用情況,今天讓我們來詳解一下在物聯(lián)網(wǎng)中的應(yīng)用。這個(gè)硬件層決定了物聯(lián)網(wǎng)應(yīng)用比應(yīng)用更加復(fù)雜。這時(shí),我開始關(guān)注實(shí)現(xiàn)物聯(lián)網(wǎng)應(yīng)用的可能性。 凡是能用JavaScript寫出來的,最終都會用JavaScript寫出來。 —— Atwood定律 在那篇《最流行的編程語言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:定律在那篇最流行的編程語言能做什么里,我們列舉了在不同領(lǐng)域的使用情況,今天讓我們來詳解一下在物聯(lián)網(wǎng)中的應(yīng)用。這個(gè)硬件層決定了物聯(lián)網(wǎng)應(yīng)用比應(yīng)用更加復(fù)雜。這時(shí),我開始關(guān)注實(shí)現(xiàn)物聯(lián)網(wǎng)應(yīng)用的可能性。 凡是能用JavaScript寫出來的,最終都會用JavaScript寫出來。 —— Atwood定律 在那篇《最流行的編程語言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:前言最近聽到有小伙伴們對感興趣,我也跟著加入了大軍中,本篇文章展示了的開發(fā)套件,以及入手后的小,后續(xù)持續(xù)更新參考文獻(xiàn)官網(wǎng)思否首頁開箱如同官網(wǎng)展示的配件如下上手官方我開發(fā)時(shí)使用的是系統(tǒng),所以下載安裝包創(chuàng)建項(xiàng)目文件,在當(dāng)前目錄執(zhí)行下面命令查看 前言 最近聽到有小伙伴們對ruff感興趣,我也跟著加入了大軍中,本篇文章展示了ruff的開發(fā)套件,以及入手后的小demo,后續(xù)持續(xù)更新參考文獻(xiàn)ruf...
摘要:物聯(lián)網(wǎng)操作系統(tǒng)落地工業(yè)物聯(lián)網(wǎng)定制化解決方案實(shí)施上線上天并不像一個(gè)正經(jīng)的創(chuàng)業(yè)公司,更不像一個(gè)掙扎在生死邊緣的創(chuàng)業(yè)者,反而像一個(gè)時(shí)下流行叫法斜杠青年。所以,對于而言,區(qū)塊鏈只是份內(nèi)的事。 showImg(https://segmentfault.com/img/bV9xuY?w=1182&h=591); 物聯(lián)網(wǎng)操作系統(tǒng)落地工業(yè)物聯(lián)網(wǎng)、定制化解決方案實(shí)施、Ruff Chain 上線、Ruff...
摘要:雖然表現(xiàn)層的數(shù)據(jù)占到,甚至可能更多,但價(jià)值網(wǎng)絡(luò)的數(shù)據(jù)在物聯(lián)網(wǎng)中則更能產(chǎn)生價(jià)值。因此,采取的是在末端使用無人化的方式運(yùn)作,利用邊緣節(jié)點(diǎn)采取數(shù)據(jù),然后把其他最有價(jià)值的需要保證絕對的一致性的可以用于價(jià)值流轉(zhuǎn)和價(jià)值流通的數(shù)據(jù)進(jìn)行上鏈。 showImg(https://segmentfault.com/img/bV64yb?w=2160&h=1440); 2018年3月27日,人民網(wǎng)創(chuàng)投?區(qū)塊鏈...
閱讀 2224·2021-11-22 09:34
閱讀 1334·2021-10-11 10:59
閱讀 4427·2021-09-22 15:56
閱讀 3270·2021-09-22 15:08
閱讀 3401·2019-08-30 14:01
閱讀 773·2019-08-30 11:16
閱讀 1129·2019-08-26 13:51
閱讀 2906·2019-08-26 13:43