|
作者:梓 元節(jié)能
第一章 系統(tǒng)構(gòu)架概述
對于這個構(gòu)架,我們已經(jīng)開發(fā)了3年,從最初的《校園節(jié)能》到《無線組網(wǎng)》再到《smart school》再到《smart OS》我們已經(jīng)經(jīng)歷了4個版本的變化了。在這4個版本里面,我們在不斷變換著自己的工作重心,試圖讓各種不同的設(shè)備相互通信。但是每一次都是在10個 設(shè)備左右就出現(xiàn)了各種奇葩的問題,導(dǎo)致我們的協(xié)議系統(tǒng)崩潰。無法讓各個設(shè)備之間進(jìn)行兼容或者因為兼容的問題導(dǎo)致我們需要做大量的重發(fā)開發(fā)工作。這些看似簡 單的工作卻要消耗我們大量的時間來進(jìn)行驗證作業(yè)。我們已經(jīng)累了,真的不想為每一個設(shè)備因為要調(diào)用其他設(shè)備而獨立的進(jìn)行開發(fā)了,所以我們開始了自己的內(nèi)部的 標(biāo)準(zhǔn)化之路。
我們希望使用類似微軟的RDP(遠(yuǎn)程桌面協(xié)議)來對各個設(shè)備進(jìn)行訪問。當(dāng)一個設(shè)備需要解讀其他的設(shè)備時,只需要你將需要接入的設(shè)備的RDP協(xié) 議加載到你的通信協(xié)議系統(tǒng)中,就可以完成對于該設(shè)備的加入操作。相關(guān)的調(diào)用過程你可以按照自己的思路來進(jìn)行開發(fā)。我們希望讓自己的開發(fā)作業(yè)變得標(biāo)準(zhǔn)化,不 想為每一個設(shè)備都進(jìn)行獨立的作業(yè)!這樣的效率實在太低下并且因為通用性的原因,讓我們?yōu)榱俗屢粋系統(tǒng)可以穩(wěn)定的動作而不等不做出各種各樣的讓步。導(dǎo)致系統(tǒng) 的設(shè)計遠(yuǎn)離了我們的初衷。
為什么要有這樣的ML_network?
因為我們發(fā)現(xiàn)對于單品設(shè)備在這個地球上基本很難賣出了,你不可能要去用戶每購買一個智能設(shè)備就安裝一個APP!我們需要有集成方案,用戶可以使用一個APP就可以管理所有的設(shè)備。但是用戶不是流水線上的產(chǎn)品,有統(tǒng)一的需求。所有對于每一個用戶其使用基本都是定制開發(fā)。如果沒有一定規(guī)模的智能硬件可以相互通信,做定制開發(fā)玩搭積木的有效簡直就是胡扯!為了實現(xiàn)基本的類似IFTTT(if this than that 如果**就**),我們就需要在一個最基本的系統(tǒng)里面有一個傳感器 、執(zhí)行器和控制器。這三者需要互聯(lián)!相互通信并且為了配置的方便我們希望有更多的設(shè)備可以相互接入。
如果只是單純的10個設(shè)備互聯(lián),我們可以使用輪詢的方式實現(xiàn),但是我們需要考慮未來的接入能力,我們希望我們的網(wǎng)絡(luò)是復(fù)雜的結(jié)構(gòu),我們想到了螞蟻算法,我們找到了一種高效而有簡單的方式來實現(xiàn)對整個網(wǎng)絡(luò)節(jié)點的管理,當(dāng)然這個算法需要泡在32位的單片機上才不會顯得吃力。
如果有這樣一個ML_network 我們可以做什么?
我 們現(xiàn)在是一家關(guān)注與校園能源管理的公司,我們希望在公共能源管理上面有所為!為學(xué)校師生提供基于時間、人員密度、日照、溫度、課程計劃等多維度的能源管理 方案。當(dāng)我們?nèi)プ鲞@些時,我們發(fā)現(xiàn)學(xué)校用戶并不是每一個都需要所有的設(shè)備的,他們可能需要裁剪,只是提取其中的某一部分來進(jìn)行應(yīng)用。實現(xiàn)比如:1、天黑有人開燈,人來燈亮;2、當(dāng)人員數(shù)量超過X數(shù)值時,開啟全部照明,否則僅開啟一部分;3、當(dāng)22點以后,請及時熄燈。如果教室內(nèi)有人則提示請及時離開。
通過在教室內(nèi)布置不同的傳感器和執(zhí)行器,我們有理由實現(xiàn)用戶的各種需求并為他們提供長久的能源管理服務(wù)。我們需要對我們的設(shè)備能源管理邏輯的本身進(jìn)行監(jiān)管,以提高我們的利用效率,并試圖在合同能源管理中有一份屬于自己的地盤。
如果我們有照度傳感器,當(dāng)你設(shè)備開燈后,而照度值沒有改變,你可以判斷出照明設(shè)備損壞,可以向用戶推送相關(guān)的維護(hù)服務(wù)。這也許就是互聯(lián)網(wǎng)下的020的變種。
如果我們有人員運動傳感器,在夜間我們起夜是使用柔和的光線來為你照亮前方的道路。
如果我們離家在外,家里的老人超過12小時無運動跡象,我們可以及時向你推送相關(guān)消息,可能我們來晚了,但我們還是來了。
我們有很的想法,但是當(dāng)我們止步不前時,很多東西都會變成別人的成果!
我們這么做的目的是什么?
我們希望像我們這樣一類只會寫C代碼的人,能夠在智能家居或者居家養(yǎng)老這類相對比較定制化的市場里面有一席之地,我們通過購買已經(jīng)開源的硬件產(chǎn)品。自己修改代碼實現(xiàn)自己想要的功能,或者通過RDP來調(diào)用相關(guān)接口實現(xiàn)對于設(shè)備的遠(yuǎn)程讀取或控制,為客戶實現(xiàn)定制開發(fā),施展自己的才華從而獲得利潤!
未來的智能硬件,一定會向著個性化定制的方向移動!對于智能硬件的制造將會是巨頭們的游戲,我們平民就學(xué)會使用并創(chuàng)造價值即可。如果不理解我們可以想一下電腦。做電腦的就那么幾家公司,但是靠電腦吃飯的就有很多!
對于智能硬件,開源并協(xié)助開發(fā)者快速投入市場將會是智能家居或者居家養(yǎng)老、安防等定制領(lǐng)域的風(fēng)口!
為了建立起ML_Network,我們需要哪些設(shè)備?
我們需要開關(guān)量執(zhí)行器,使用AC switch 或者繼電器來進(jìn)行控制;我們需要有PWM的調(diào)速控制,實現(xiàn)對風(fēng)扇或者電機的調(diào)速控制。我們需要人員運動傳感器、時間、日照、溫度傳感器;我們需要一個總控設(shè)備來建立起屬于用戶自己的控制邏輯。
如果你認(rèn)為這個ML_Network對于你有作用,我們希望與你合作!我們尋求知識產(chǎn)權(quán)、軟硬件開發(fā)、物料與方案供應(yīng)、生產(chǎn)等相關(guān)流程的協(xié)助。
如果您認(rèn)為您可以幫助到我們,歡迎關(guān)注我們的微信公眾號:我們將在微信公眾號里面推送更多相關(guān)ML_Network 相關(guān)的開發(fā)進(jìn)度及我們需要的實際需求。
第二章 通信協(xié)議構(gòu)架說明
關(guān)于通信協(xié)議,我們做了很多的嘗試!因為通信協(xié)議的問題讓我們的設(shè)備開發(fā)在經(jīng)歷了一段時間的積累后因為協(xié)議設(shè)計的局限性導(dǎo)致后期的設(shè)備屬性變得異常復(fù)雜。一個設(shè)備要想和另一個設(shè)備通信,需要對其中的一個設(shè)備通信協(xié)議進(jìn)行修改以便匹配對應(yīng)的邏輯關(guān)系。
我們不想每次都要重復(fù)以前的勞動,也因為這個原因,我們在不斷進(jìn)行著改版的測試。
這一次,我們想到了RDP的方式,每一個功能模塊都以同樣的接口形式出現(xiàn)。方便使用同一的標(biāo)準(zhǔn)來進(jìn)行規(guī)范。方便后期的多設(shè)備互聯(lián)通信。
協(xié)議的基礎(chǔ)構(gòu)架如下:
項目名稱
空間大小
備注
發(fā)送類別
1byte
用于指示發(fā)送端的類別碼,在協(xié)議中相當(dāng)于關(guān)鍵字用來識別使用什么樣的協(xié)議模式來進(jìn)行解析
發(fā)送序列
1byte
用于區(qū)別同一類別碼中不同的設(shè)備ID,防止因為系統(tǒng)中的設(shè)備過多發(fā)生沖突
發(fā)送序列號
1byte
用于指示發(fā)送包的序列號,防止在雙向通行時重復(fù)接收
發(fā)送數(shù)據(jù)包長度
1byte
一個數(shù)據(jù)包的最大長度為32byte,可以進(jìn)行組包發(fā)送。數(shù)據(jù)從發(fā)送類別到LRC前的數(shù)據(jù)長度
接收類別
1byte
用于指示接收端的類別碼
接收序列
1byte
用于指示接收的設(shè)備ID號
RDP1 keyword
1byte
用于指示本指令的具體命令
RDP1內(nèi)容
N byte
該出為協(xié)議的具體內(nèi)容部分
RDP2 keyword
1byte
用于指示本指令2的具體命令
RDP2內(nèi)容
N byte
RDP2 協(xié)議具體內(nèi)容
RDPN keyword
1byte
用于指示本指令N的具體命令
RDP N內(nèi)容
N byte
RDPN 協(xié)議具體內(nèi)容
LRC校驗
1byte
用于確認(rèn)協(xié)議是否完整,從協(xié)議頭到RDPN的所有數(shù)據(jù)異或和
為什么ML_Network 需要有**類別、**序列?
對于一個網(wǎng)絡(luò)而言,我們需要對網(wǎng)絡(luò)里面的每一個成員分配一個唯一ID,使用類別+序列的方式可以實現(xiàn)分類管理,比如我們將ML_Network的成員分為主控、路由、執(zhí)行、傳感器這幾大類。設(shè)備里的成員需要知道使用什么樣的協(xié)議格式來繼續(xù)處理,而類別正好回答了我們的問題。使用序列的目的是為了區(qū)分同一系統(tǒng)里面因為有多個同類別的設(shè)備,防止設(shè)備控制沖突產(chǎn)生。
之所以使用收發(fā)雙向,是為了在通信協(xié)議中建立起收發(fā)應(yīng)答機制,同時加入序列號的目的是為了防止重復(fù)執(zhí)行的問題出現(xiàn)。
ML_Network中RDP的內(nèi)容長度是怎么進(jìn)行區(qū)分的?
我們使用sizeof()來測量一個結(jié)構(gòu)體的長度,在解析完一個RDP后,返回一個長度,計算偏移量后確定是否還要繼續(xù)或者退出解析。在早期的版本中,我們有一個內(nèi)容長度的指令來進(jìn)行偏移,這一版本中我們?nèi)サ袅,主要是用時間來換空間。提高數(shù)據(jù)包的利用率。
ML_Network中的RDP的結(jié)構(gòu)內(nèi)容是怎么劃分的?
Typedef struct
{
U8 ioSwitch :1;
U8 ioRelay :1;
}is_xxxio_rdp;
Typedef struct
{
U8 key;
U8 (*fun)(u8 *inBuf);
}is_xxxFun;
Typedef struct
{
U8 classID;
U8 indexID;
//U8 index ;
//U8 *struct;
}gs_Rdp;
按照上面的結(jié)構(gòu),我們將每一個RDP里面的放置一個KEY,以便程序快速的查找相關(guān)的RDP協(xié)議指令。
在ML_Network中我們將如何讓設(shè)備進(jìn)行相關(guān)的注冊和通信控制?
關(guān)于注冊:
在ML_Network中,如果一個設(shè)備想要控制另一個設(shè)備,必須將自己的類別和序列加入到gs_Rdp中,以便獲得相關(guān)的許可。
關(guān)于控制:
接收方對比了許可buf后,會判斷是否可以進(jìn)行相關(guān)的操作,如果可以則會根據(jù)接收類別碼跳轉(zhuǎn)到指定的協(xié)議構(gòu)架函數(shù)中,通過調(diào)用is_xxxFun結(jié)構(gòu)體的函數(shù)和key來找到合適的解析函數(shù)。
在完成解析函數(shù)的查找后,會進(jìn)行相關(guān)的控制指令操作,并隨后對該數(shù)據(jù)包進(jìn)行應(yīng)答操作。
我該如何獲取ML_Network 協(xié)議解析源碼?
關(guān)注我司微信公眾號(揚州梓元節(jié)能:yzzyjn)并在公眾號中回復(fù)自己的收件人郵箱號后我們將在第一時間內(nèi)將相關(guān)的源碼發(fā)送到您指定的郵箱中,我們期望與您合作,共同將ML_Network生態(tài)系統(tǒng)建立起來,實現(xiàn)對設(shè)備的互聯(lián)互通!
第三章 設(shè)備注冊
對于一個系統(tǒng)級別的產(chǎn)品,因為其數(shù)量相對龐大。我們需要使用一個統(tǒng)一的編碼規(guī)則來進(jìn)行相關(guān)類別設(shè)備的管理工作。
在本協(xié)議中,允許存在的類別數(shù)量為256種。下面按照一定的規(guī)則來進(jìn)行相關(guān)設(shè)備編碼的說明。
項目名稱
空間大小
備注
廠標(biāo)
2byte
用于識別是哪一家企業(yè)生產(chǎn)的
代理區(qū)域
3byte
廠家對于設(shè)備進(jìn)行區(qū)域控貨管理使用
物料類別碼
1byte
用于確認(rèn)設(shè)備所屬的類別,建立起基礎(chǔ)的產(chǎn)品分類
物料細(xì)分碼
2byte
各廠家自定義區(qū)域,用于對軟硬件版本號的識別或做它用
產(chǎn)品流水
4byte
各廠家生產(chǎn)流水號
防偽碼
8byte
該區(qū)域可以和315網(wǎng)站聯(lián)動或廠家自建防偽編碼規(guī)則
建立起這樣的注冊編碼原因是為了實現(xiàn)對廠家產(chǎn)品的精確管理。實現(xiàn)對生產(chǎn)廠家和代理商的管理工作。
為什么要建立廠標(biāo)?
對于ML_Network 我們最終會將其聯(lián)網(wǎng)管理,我們的主機在未來將具備遠(yuǎn)程升級的能力!我們可以根據(jù)廠家的編碼去尋找對應(yīng)的新版本驅(qū)動文件進(jìn)而實現(xiàn)對ML_Network中的設(shè)備精確控制與管理。
建立該標(biāo)識也是為了后面的驗證與防偽工作。我們希望在這個系統(tǒng)里的每一個成員都能夠和睦的相處。并且通過大數(shù)據(jù)清楚的知道什么類別的設(shè)備用戶使用頻次最高,用戶的使用習(xí)慣行為是怎么樣的,進(jìn)而有針對性的進(jìn)行研發(fā)工作。
為什么有代理區(qū)域碼?
建立這個代理區(qū)域碼的目的是為了實現(xiàn)對代理商的控貨管理。同時可以根據(jù)平臺反饋回來的數(shù)據(jù)進(jìn)行區(qū)別實現(xiàn)對各個區(qū)域間的差別化分析,以便有目的性的進(jìn)行研發(fā)與推廣作業(yè)。
為什么有物料類別碼?
建立該物料類別碼的目的是為了實現(xiàn)設(shè)備在聯(lián)網(wǎng)注冊時可以快速的找到對應(yīng)的解析程序。同時也用于規(guī)范各個廠家間的基礎(chǔ)功能版本。
為什么有物料細(xì)分碼?
建立物料細(xì)分碼的目的是為了方便各個廠家對于自身產(chǎn)品的軟硬件版本管理,維護(hù)人員快速找到問題的原因及提供及時的維護(hù)建議。
為什么有產(chǎn)品流水?
建立該流水號的目的是為了廠家實現(xiàn)對產(chǎn)品的溯源管理,通過流水可以查找產(chǎn)品的是什么時候由誰生產(chǎn)或質(zhì)檢出來的。進(jìn)而有針對性的進(jìn)行產(chǎn)品品質(zhì)的管理工作。
為什么有防偽碼?
我們不想自己的系統(tǒng)被別人無情的山寨,我們希望通過聯(lián)網(wǎng)的方式,當(dāng)設(shè)備注冊的時候通過互聯(lián)網(wǎng)將防偽碼發(fā)送到各個廠家的平臺上,有各個廠家來授權(quán)是否通過驗證。使用這樣的方式是為了實現(xiàn)ML_Network 的健康發(fā)展,我們從內(nèi)部建立起屬于自己的產(chǎn)品品控體系。為自己的生態(tài)系統(tǒng)建立一個有效的保障與管理機制。MicrosoftInternetExplorer402DocumentNotSpecified7.8 磅Normal0
第三章 設(shè)備注冊
對于一個系統(tǒng)級別的產(chǎn)品,因為其數(shù)量相對龐大。我們需要使用一個統(tǒng)一的編碼規(guī)則來進(jìn)行相關(guān)類別設(shè)備的管理工作。
在本協(xié)議中,允許存在的類別數(shù)量為256種。下面按照一定的規(guī)則來進(jìn)行相關(guān)設(shè)備編碼的說明。
項目名稱
空間大小
備注
廠標(biāo)
2byte
用于識別是哪一家企業(yè)生產(chǎn)的
代理區(qū)域
3byte
廠家對于設(shè)備進(jìn)行區(qū)域控貨管理使用
物料類別碼
1byte
用于確認(rèn)設(shè)備所屬的類別,建立起基礎(chǔ)的產(chǎn)品分類
物料細(xì)分碼
2byte
各廠家自定義區(qū)域,用于對軟硬件版本號的識別或做它用
產(chǎn)品流水
4byte
各廠家生產(chǎn)流水號
防偽碼
8byte
該區(qū)域可以和315網(wǎng)站聯(lián)動或廠家自建防偽編碼規(guī)則
建立起這樣的注冊編碼原因是為了實現(xiàn)對廠家產(chǎn)品的精確管理。實現(xiàn)對生產(chǎn)廠家和代理商的管理工作。
為什么要建立廠標(biāo)?
對于ML_Network 我們最終會將其聯(lián)網(wǎng)管理,我們的主機在未來將具備遠(yuǎn)程升級的能力!我們可以根據(jù)廠家的編碼去尋找對應(yīng)的新版本驅(qū)動文件進(jìn)而實現(xiàn)對ML_Network中的設(shè)備精確控制與管理。
建立該標(biāo)識也是為了后面的驗證與防偽工作。我們希望在這個系統(tǒng)里的每一個成員都能夠和睦的相處。并且通過大數(shù)據(jù)清楚的知道什么類別的設(shè)備用戶使用頻次最高,用戶的使用習(xí)慣行為是怎么樣的,進(jìn)而有針對性的進(jìn)行研發(fā)工作。
為什么有代理區(qū)域碼?
建立這個代理區(qū)域碼的目的是為了實現(xiàn)對代理商的控貨管理。同時可以根據(jù)平臺反饋回來的數(shù)據(jù)進(jìn)行區(qū)別實現(xiàn)對各個區(qū)域間的差別化分析,以便有目的性的進(jìn)行研發(fā)與推廣作業(yè)。
為什么有物料類別碼?
建立該物料類別碼的目的是為了實現(xiàn)設(shè)備在聯(lián)網(wǎng)注冊時可以快速的找到對應(yīng)的解析程序。同時也用于規(guī)范各個廠家間的基礎(chǔ)功能版本。
為什么有物料細(xì)分碼?
建立物料細(xì)分碼的目的是為了方便各個廠家對于自身產(chǎn)品的軟硬件版本管理,維護(hù)人員快速找到問題的原因及提供及時的維護(hù)建議。
為什么有產(chǎn)品流水?
建立該流水號的目的是為了廠家實現(xiàn)對產(chǎn)品的溯源管理,通過流水可以查找產(chǎn)品的是什么時候由誰生產(chǎn)或質(zhì)檢出來的。進(jìn)而有針對性的進(jìn)行產(chǎn)品品質(zhì)的管理工作。
為什么有防偽碼?
我們不想自己的系統(tǒng)被別人無情的山寨,我們希望通過聯(lián)網(wǎng)的方式,當(dāng)設(shè)備注冊的時候通過互聯(lián)網(wǎng)將防偽碼發(fā)送到各個廠家的平臺上,有各個廠家來授權(quán)是否通過驗證。使用這樣的方式是為了實現(xiàn)ML_Network 的健康發(fā)展,我們從內(nèi)部建立起屬于自己的產(chǎn)品品控體系。為自己的生態(tài)系統(tǒng)建立一個有效的保障與管理機制。
第三章 設(shè)備注冊實現(xiàn)方法
為了實現(xiàn)對從設(shè)備的注冊管理,我們需要建立起類似FAT文件系統(tǒng)來實現(xiàn)對文件的讀取與寫入操作。系統(tǒng)注冊文件按照固定的格式來進(jìn)行劃分,在先階段一個數(shù)據(jù)塊劃分出14個設(shè)備ID,第一個字節(jié)用于表示所屬類別,第二字節(jié)用于表示本系統(tǒng)中該類設(shè)備總量,第三個字節(jié)為相關(guān)詳細(xì)的ID,其中00表示無意義,一個塊的最后一個字節(jié)用來表示下一個鏈表的偏移地址。
為了實現(xiàn)對設(shè)備的管理,我們需要在本機里面做好記錄,以便主機可以快速的查找到對應(yīng)的設(shè)備ID號,在通信的階段我們將使用本機的設(shè)備ID來設(shè)置通信地址,從設(shè)備使用主機加從設(shè)備分配ID來構(gòu)建一個通信ID,主機通過這個ID來和從設(shè)備通信,從設(shè)備使用主機+0xff來和主設(shè)備通信。
設(shè)備間的通信采用雙向應(yīng)答的方式來進(jìn)行。
在ML_Network的初始階段,我們采用的最基本的方案來實現(xiàn),在本模塊中僅實現(xiàn)了對設(shè)備的注冊和注銷管理,并不對設(shè)備的合法性進(jìn)行檢驗并對設(shè)備的原始數(shù)據(jù)進(jìn)行讀取。
為什么ML_Network 使用兩個不同的設(shè)備ID來進(jìn)行通信?
我們使用RFID來進(jìn)行通信,為了降低各個聯(lián)網(wǎng)設(shè)備的通信壓力,并保證數(shù)據(jù)傳輸?shù)目煽啃,固我們對每一個設(shè)備都分配了一個獨立的ID號,本機在默認(rèn)情況下僅監(jiān)聽該ID號的數(shù)據(jù)。如果一方需要對另一方通信,則需要找到對方的ID號來進(jìn)行通信,在完成發(fā)送后需要切換到本機的ID號進(jìn)行監(jiān)聽。
ML_Network 如何實現(xiàn)數(shù)據(jù)交互?
1、發(fā)起方主動發(fā)起數(shù)據(jù),確認(rèn)發(fā)送成功;
2、發(fā)起方切換模式進(jìn)入接收狀態(tài);
3、接收方解析數(shù)據(jù)包并生成相關(guān)的應(yīng)答數(shù)據(jù)包;
4、接收方切換為發(fā)送模式,將數(shù)據(jù)包發(fā)送成功。接收放并不會使用自動重發(fā)機制,有發(fā)起方通過軟件協(xié)議自行確定。
ML_Network 中的ID號是該如何進(jìn)行解析?
我們使用16位的設(shè)備ID號來進(jìn)行數(shù)據(jù)傳輸,分為4個區(qū)位,15-8位地址碼,用于在組網(wǎng)中來使用螞蟻算法快速的找到通信的設(shè)備位置坐標(biāo),7-4位主設(shè)備ID號,3-1為從設(shè)備ID號。在這種配置模式下,一個主設(shè)備可以管理15個執(zhí)行和或傳感器。一個路由設(shè)備可以管理同時管理6個主設(shè)備。在一個系統(tǒng)里面最大允許存在254個路由設(shè)備。00xx為空地址。Ffxx為系統(tǒng)主控設(shè)備。
在這樣的體系構(gòu)架下面,如果僅使用多個主控設(shè)備可以彼此相互通信來實現(xiàn)傳感器的互聯(lián),實現(xiàn)對運動傳感器的誤動作排除和或通過主控設(shè)備來橋接,對非本主控設(shè)備的管理。
我該如何獲得ML_Network 的注冊和注銷源碼?
關(guān)注我司微信公眾號(揚州梓元節(jié)能:yzzyjn)并在公眾號中回復(fù)自己的收件人郵箱號后我們將在第一時間內(nèi)將相關(guān)的源碼發(fā)送到您指定的郵箱中,我們期望與您合作,共同將ML_Network生態(tài)系統(tǒng)建立起來,實現(xiàn)對設(shè)備的互聯(lián)互通!
ML_Network 事件處理機制
對于常規(guī)的控制邏輯而言,在我的映像中應(yīng)該有兩種情況,一種是基于時間的事件,比如什么時間做什么事情,我們可以當(dāng)做鬧鐘來處理。另一個是標(biāo)志事件,比如:天冷了請注意保暖。拆分來看,天冷是標(biāo)志,請注意保暖是一個通知事件。對于鬧鐘事件,百度百科給出的定義是:既能指示時間,又能按人們預(yù)定的時刻發(fā)出音響信號或其他信號。我們可以簡單的認(rèn)為在什么時候做什么事情。
對于一個鬧鐘事件狀態(tài)機而言,我們需要定義的內(nèi)容如下:
1、告訴設(shè)備我需要安排一個事情:什么時間、什么周期
2、告訴設(shè)備如果運行到這個時間點了,我們該處理什么事情。
3、如果我不想這個時間按照計劃發(fā)生了,如何取消。
對于一個周期性的事件而言,我們首先需要思考的是這樣一個事件的大體描述是怎么樣的?比如在我們的應(yīng)用中會有提示音事件,我們需要提示音在運行到我們設(shè)定的時間后就自動的取消掉。又或者是按鍵掃描事件,我們需要以固定的頻率來進(jìn)行輪詢,不間斷來進(jìn)行進(jìn)行操作。對于這類OPM 單觸發(fā)模式的事件而言,我們需要設(shè)定的內(nèi)容很少:
1、給我安排了一個什么樣的事情
2、這個事件大約需要執(zhí)行多久才可以取消
對于一個時間范圍事件,我們需要設(shè)定的在什么樣的時間尺度下進(jìn)行觀察和在什么樣的時間周期中進(jìn)行觀察。其次是如果這個時間范圍合適,我們該做什么事情。對于這樣的一個事件我們需要設(shè)定的內(nèi)容如下:
1、事件開始的時間:
2、事件結(jié)束的時間:
3、時間的參考標(biāo)準(zhǔn)是:1、系統(tǒng)時鐘;2、RTC時鐘;
4、什么事件。
5、取消該事件的辦法。
標(biāo)志事件的處理辦法。
抽 象的描述這個事件其實很簡單,比如:天黑開燈。對于我們而言,我們從沒有必要考慮事件的反面該如何處理,不是不考慮,只是我們沒有必要把任何一個事情都認(rèn) 為只有兩面,不是正就是反。其實在事件的處理過程中我們可能需要面對的事情要比這個復(fù)雜很多。對于一個標(biāo)志事件我們需要考慮的的內(nèi)容可以分為如下幾個部 分:如上所述,如果天黑我們是否要一直都保存燈亮,還是我們只是在天黑的那一刻開燈即可。這本身就是一個很復(fù)雜的邏輯。
對于標(biāo)志事件,我們在很多情況下處理的是OPM(單脈沖)模式,只是在事件發(fā)生的那一刻執(zhí)行一次即可。但也有可能需要連續(xù)的保持,比如處理報警類事件時,如果事件沒有正確的處理,我們將需要將事件長時間的保持。
對于OPM模式的事件:
我們需要處理的內(nèi)容如下:
1、對事件標(biāo)志位使用情況進(jìn)行初始化并在將該事件綁定在對應(yīng)的標(biāo)志位上;
2、做出一個合適的接口來使外界來觸發(fā)該事件發(fā)生;
3、做出一個接口來使外界取消該事件的發(fā)生。
對于長時間維持事件,我們需要在標(biāo)志位沒有清除前始終保證該事件的可靠運行。相對于OPM的模式,我們在執(zhí)行完一次該事件后我們不會立即清楚掉標(biāo)志而是繼續(xù)保持該標(biāo)志,直到其他事件將該標(biāo)志位清除為止。
對 于采用事件標(biāo)志位的方式來進(jìn)行控制,在沒有跑系統(tǒng)的程序中可能是一種浪費,因為如事件的執(zhí)行本身沒有長時間過程的話,完全可以直接調(diào)用而不用進(jìn)行復(fù)雜的關(guān) 聯(lián)操作。使用信號的方式來進(jìn)行處理的目的主要是為了方便控制邏輯層的編寫。將執(zhí)行成與業(yè)務(wù)成分離有助于后期的擴展和或方便快速的對指令的本身做出應(yīng)答。Make devices running at right ,make your life better!
|
|