0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

機(jī)智云Gokit3.0源代碼分析之協(xié)議結(jié)構(gòu)體的定義

9GxC_IoTMaker ? 來(lái)源:未知 ? 作者:李倩 ? 2018-07-13 14:53 ? 次閱讀

今天重點(diǎn)給大家分析下機(jī)智云整個(gè)程序的數(shù)據(jù)格式,機(jī)智云運(yùn)行這么穩(wěn)定得益于整個(gè)數(shù)據(jù)格式合理規(guī)范命名,我們直接進(jìn)入主題

首先定義了一個(gè)數(shù)據(jù)類型為gizwitsProtocol_t 的全局變量,如下

/** 協(xié)議全局變量 **/

gizwitsProtocol_t gizwitsProtocol;

我們追蹤下結(jié)構(gòu)體的定義

__packed typedef struct

{

uint8_t issuedFlag;

uint8_t protocolBuf[MAX_PACKAGE_LEN];

uint8_t transparentBuff[MAX_PACKAGE_LEN];

uint32_t transparentLen;

uint32_t sn;

uint32_t timerMsCount;

uint32_t lastReportTime;

protocolWaitAck_t waitAck;

eventInfo_t issuedProcessEvent; //控制事件

eventInfo_t wifiStatusEvent; //WIFI狀態(tài) 事件

volatile gizwitsReport_t lastReportData;

gizwitsIssued_t issuedData; //云端下發(fā)控制報(bào)文數(shù)據(jù)

moduleStatusInfo_t wifiStatusData; //WIFI 狀態(tài)信息信號(hào)強(qiáng)度)

}gizwitsProtocol_t;

之前一直沒見過(guò)__packed,百度下才知道__packed是字節(jié)對(duì)齊的意思, 比如說(shuō)int float double char它的總大小是4 + 4 + 8 + 1 = 17

但如果不用__packed的話,系統(tǒng)將以默認(rèn)的方式對(duì)齊(假設(shè)是4字節(jié)),那么它占4 + 4 + 8 + 4 = 20;(不足4字節(jié)以4字節(jié)補(bǔ)齊)。

這里主要定義了一些gizwits協(xié)議的下發(fā)報(bào)文標(biāo)志、緩沖區(qū)、數(shù)據(jù)長(zhǎng)度、sn、系統(tǒng)時(shí)間、上次上報(bào)數(shù)據(jù)的時(shí)間、重發(fā)機(jī)制定義、控制事件、WiFi狀態(tài)事件、上次上報(bào)的數(shù)據(jù)、云端下發(fā)的控制報(bào)文以及WiFi狀態(tài)信息這些數(shù)據(jù)的定義,這里我們重點(diǎn)關(guān)注幾個(gè)就行了。

首先是 gizwitsIssued_t ,這個(gè)結(jié)構(gòu)體里面定義了2個(gè)結(jié)構(gòu)體,一個(gè)是控制功能Flag,一個(gè)是對(duì)應(yīng)的Value,如下所示

__packed typedef struct {

attrFlags_t attrFlags;

attrVals_t attrVals;

}gizwitsIssued_t;

__packed typedef struct {

uint8_t LED_OnOff:1;

uint8_t LED_Color:1;

uint8_t LED_R:1;

uint8_t LED_G:1;

uint8_t LED_B:1;

uint8_t Motor_Speed:1;

}attrFlags_t;

__packed typedef struct {

uint8_t LED_OnOff:1;

uint8_t LED_Color:2;

uint8_t reserve:5;

uint8_t LED_R;

uint8_t LED_G;

uint8_t LED_B;

uint16_t Motor_Speed;

}attrVals_t;

我們看到,有LED_OnOff、LED_Color、LED的RGB值,以及電機(jī)轉(zhuǎn)速這6個(gè)功能可以被控制,那么這個(gè)結(jié)構(gòu)體是在哪里被賦值的呢?我們這主函數(shù)的while循環(huán)中找到gizwitsHandle這個(gè)函數(shù),進(jìn)去之后追蹤到protocolGetOnePacket這個(gè)函數(shù),這個(gè)函數(shù)就是從gizwits的接收緩沖中拿一個(gè)完整的數(shù)據(jù)包出來(lái),不懂的可以結(jié)合我們第二講的串口環(huán)形buff,進(jìn)去一看就明白了。好,到這里我們就接到一幀從WiFi模塊發(fā)送到MCU的信號(hào)幀了,協(xié)議是將接收的數(shù)據(jù)放gizwitsProtocol的protocolBuf這個(gè)數(shù)組的,我們接著往下看,

recvHead = (protocolHead_t*)gizwitsProtocol.protocolBuf;

我們往上看recvHead的定義,是一個(gè)protocolHead_t的指針,顧名思義,這個(gè)應(yīng)該是協(xié)議頭,我們進(jìn)去看看

/******************************************************

* 協(xié)議標(biāo)準(zhǔn)頭

********************************************************/

__packed typedef struct

{

uint8_t head[2];

uint16_t len;

uint8_t cmd;

uint8_t sn;

uint8_t flags[2];

} protocolHead_t;

協(xié)議頭包括5部分,包頭header固定為0xFFFF,len指從cmd開始到整個(gè)數(shù)據(jù)包結(jié)束所占用的字節(jié),命令字節(jié)cmd表示具體的命令定義,sn由發(fā)送方給出,原路返回就是,標(biāo)志位flag默認(rèn)0,之后便是數(shù)據(jù)區(qū)與校驗(yàn)和了,這里將gizwitsProtocol.protocolBuf強(qiáng)制轉(zhuǎn)換成protocolHead_t格式 賦給recvHead ,之后就可以通過(guò)recvHead 調(diào)用協(xié)議頭的各項(xiàng)成員數(shù)據(jù)了,然后通過(guò)recvHead-》cmd判斷相應(yīng)的命令進(jìn)去相應(yīng)的語(yǔ)句中去執(zhí)行不同的命令,這里我們看下CMD_ISSUED_P0,這個(gè)的意思是命令為WiFi向MCU發(fā)送數(shù)據(jù)的命令,我們繼續(xù)執(zhí)行,來(lái)到protocolIssuedProcess這個(gè)函數(shù),進(jìn)去之后,我們看看數(shù)據(jù)是怎么定義的

protocolReport_t *protocolIssuedData = (protocolReport_t *)inData;

首先,將gizwitsProtocol.protocolBuf強(qiáng)制轉(zhuǎn)換成protocolReport_t這個(gè)類型的指針,我們看看protocolReport_t的定義,看表面,應(yīng)該是協(xié)議上報(bào)數(shù)據(jù)格式的定義

__packed typedef struct

{

protocolHead_t head;

actionType_t action;

gizwitsReport_t reportData;

uint8_t sum;

} protocolReport_t;

這里包括協(xié)議頭、動(dòng)作、上報(bào)數(shù)據(jù)與校驗(yàn)和四部分,我們重點(diǎn)看看gizwitsReport_t,其定義為

__packed typedef struct {

devStatus_t devStatus;

}gizwitsReport_t;

__packed typedef struct {

uint8_t LED_OnOff:1;

uint8_t LED_Color:2;

uint8_t reserve_0:5;

uint8_t LED_R;

uint8_t LED_G;

uint8_t LED_B;

uint16_t Motor_Speed;

uint8_t Infrared:1;

uint8_t reserve_1:7;

uint8_t Temperature;

uint8_t Humidity;

uint8_t Alert_1:1;

uint8_t Alert_2:1;

uint8_t reserve_2:6;

uint8_t Fault_LED:1;

uint8_t Fault_Motor:1;

uint8_t Fault_TemHum:1;

uint8_t Fault_IR:1;

uint8_t reserve_3:4;

}devStatus_t;

這個(gè)結(jié)構(gòu)體的定義符合了MCU 主動(dòng)發(fā)送狀態(tài)時(shí)或者回復(fù) wifi 模塊的狀態(tài)查詢時(shí)攜帶 p0 命令和完整數(shù)據(jù)區(qū) 之后,issuedAction = protocolIssuedData-》action;通過(guò)issuedAction 判斷 P0 command 命令碼,這里我們進(jìn)入ACTION_CONTROL_DEVICE,將P0區(qū)的數(shù)據(jù)轉(zhuǎn)換成事件格式,由下面這行代碼實(shí)現(xiàn)

dataPoint2Event((gizwitsIssued_t *)(inData+sizeof(protocolP0Head_t)), &gizwitsProtocol.issuedProcessEvent);

這個(gè)函數(shù)將P0數(shù)據(jù)區(qū)的數(shù)據(jù)強(qiáng)制轉(zhuǎn)換成gizwitsIssued_t格式的數(shù)據(jù),也就是我們上面介紹的事件Flag和事件Value。 我們還看到有一個(gè)gizwitsProtocol.issuedProcessEvent作為實(shí)參傳到函數(shù)中,這個(gè)也是在gizwitsProtocol_t結(jié)構(gòu)體中定義的,我們看下其結(jié)構(gòu)體定義

__packed typedef struct {

uint8_t num;

uint8_t event[EVENT_MAX];

}eventInfo_t;

這個(gè)結(jié)構(gòu)體將上面?zhèn)魅氲臄?shù)據(jù)轉(zhuǎn)換成相應(yīng)的時(shí)間格式,每個(gè)num對(duì)應(yīng)一個(gè)事件,處理完之后直接進(jìn)入對(duì)應(yīng)num處理對(duì)應(yīng)時(shí)間就OK了。

處理完這些之后,將gizwitsProtocol.issuedFlag置1, 然后判斷gizwitsProtocol.issuedFlag,進(jìn)入下面函數(shù)

if(1 == gizwitsProtocol.issuedFlag)

{

gizwitsProtocol.issuedFlag = 0;

eventProcess(&gizwitsProtocol.issuedProcessEvent, (uint8_t *)&gizwitsProtocol.issuedData, sizeof(gizwitsIssued_t));

memset((uint8_t *)&gizwitsProtocol.issuedProcessEvent,0x0,sizeof(gizwitsProtocol.issuedProcessEvent));//WORK_DONE

}

接下來(lái)就看到控制LED的實(shí)際出處了

case SetLED_OnOff:

if(LED_OnOn == issuedData-》attrVals.LED_OnOff)

{

reportData.devStatus.LED_OnOff = LED_OnOn;

ledRgbControl(254,0,0);

}

else

{

reportData.devStatus.LED_OnOff = LED_OnOff;

ledRgbControl(0,0,0);

}

下面的處理函數(shù)大家就都可以看懂了,可能講的有點(diǎn)亂,但是如果跟著代碼看的話還是很容易理解的,我們看下面這幅圖就一目了然了,我將協(xié)議中所有的結(jié)構(gòu)體定義以及連接關(guān)系都詳細(xì)的標(biāo)注出來(lái)不了,參考這個(gè)理解會(huì)事半功倍!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2943

    瀏覽量

    66618
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    129

    瀏覽量

    10823
  • 機(jī)智云
    +關(guān)注

    關(guān)注

    2

    文章

    573

    瀏覽量

    26361

原文標(biāo)題:Gokit3.0 STM32源代碼分析之三

文章出處:【微信號(hào):IoTMaker,微信公眾號(hào):機(jī)智云開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GoKit試用體驗(yàn)】+機(jī)智GoKit開發(fā)套件學(xué)習(xí)分享1開箱圖

    本帖最后由 孤雨冰狐 于 2015-6-9 10:34 編輯 機(jī)智GoKit開發(fā)套件學(xué)習(xí)分享1開箱圖今天我申請(qǐng)的機(jī)智
    發(fā)表于 06-08 17:13

    GoKit試用體驗(yàn)】利用機(jī)智提供的免費(fèi)服務(wù)自定義遠(yuǎn)程控制

    。其他的很多函數(shù)和結(jié)構(gòu)都是可以通用的部分。最后,如果細(xì)心去理解好了MCU的模板程序,配合官網(wǎng)后臺(tái)自動(dòng)生成的數(shù)據(jù)協(xié)議,確實(shí)如機(jī)智官網(wǎng)所說(shuō),
    發(fā)表于 07-27 14:10

    【科技亦能傳承】轉(zhuǎn)贈(zèng) Gokit2.0,免費(fèi)換加強(qiáng)版Gokit3.0

    閑置開發(fā)板已落滿灰塵?舍不得扔,又不適合送友人?為何不將它贈(zèng)送給需要的人呢?只要你在此帖留言,并成功贈(zèng)送出去,機(jī)智將免費(fèi)贈(zèng)送 10 塊首批限量加強(qiáng)版 Gokit3.0 開發(fā)板,包郵哦~活動(dòng)時(shí)間
    發(fā)表于 06-21 15:25

    【萬(wàn)元大獎(jiǎng)】機(jī)智智能硬件創(chuàng)新大賽

    。//幸運(yùn)觀眾獎(jiǎng)的禮物設(shè)置:機(jī)智大禮包、Gokit3.0Gokit2.0 、T恤 、GoDay入場(chǎng)券、數(shù)據(jù)線(其他項(xiàng)目)2016.08.29~2016.08.30專家評(píng)審專家評(píng)審
    發(fā)表于 07-06 13:42

    機(jī)智想說(shuō)愛你不容易 - 如何開發(fā)接入機(jī)智的物聯(lián)網(wǎng)設(shè)備

    機(jī)智平臺(tái)標(biāo)準(zhǔn)接入協(xié)議App與設(shè)備通訊v4.0.1,機(jī)智平臺(tái)標(biāo)準(zhǔn)接入
    發(fā)表于 09-27 13:26

    Gokit 3試用體驗(yàn)】(8)微信控制Gokit體驗(yàn)機(jī)智寵物屋

    ,而實(shí)現(xiàn)微信控制Gokit的二維碼只有在紙字版的說(shuō)明書上有,如下圖所示。于是悲劇了……  經(jīng)過(guò)機(jī)智網(wǎng)官網(wǎng)論壇查詢資料、機(jī)智網(wǎng)QQ群咨詢問(wèn)題,最后拿到了相應(yīng)的控制二維碼,在Gokit S
    發(fā)表于 10-02 12:19

    重磅| Gokit1.0用戶真情回饋-Gokit3.0免費(fèi)兌換

    表達(dá)機(jī)智由衷的謝意,特在金秋十月送上真誠(chéng)回饋:Gokit1.0用戶憑Gokit1.0開發(fā)板,免費(fèi)兌換Gokit3.0
    發(fā)表于 10-16 19:16

    如何使用機(jī)智開發(fā)一款智能硬件產(chǎn)品

    應(yīng)用,圖形化編程!STM32L432 Nucleo-32案例-3分鐘打造手機(jī)APP遠(yuǎn)程空氣質(zhì)量監(jiān)測(cè)應(yīng)用機(jī)智4.0自動(dòng)協(xié)議代碼、MCU工程生成工具體驗(yàn)李~的筆記
    發(fā)表于 12-26 15:56

    機(jī)智在Amazon Alexa平臺(tái)發(fā)布Smarthome和Custom Skill,實(shí)現(xiàn)亞馬遜Echo直接控制Gokit

    控制機(jī)智開源套件Gokit(包括Gokit2.0和Gokit3.0)!這也將意味著:隨著機(jī)智
    發(fā)表于 03-31 11:54

    機(jī)智2016~2017優(yōu)秀項(xiàng)目盤點(diǎn)

    】之無(wú)線工業(yè)粉塵監(jiān)測(cè)儀【Gokit 3】倉(cāng)鼠管家和OpenHamtaro開源項(xiàng)目【Gokit智慧宿舍【Gokit 3】
    發(fā)表于 09-22 13:03

    機(jī)友分享 | 基于Gokit+機(jī)智的低成本MCU紅外遙控器

    Gokit,通過(guò)機(jī)智的物聯(lián)網(wǎng)平臺(tái),能夠滿足我的需求,那么怎么來(lái)做呢?根據(jù)經(jīng)驗(yàn)所得,需要對(duì)這個(gè)工作拆分為幾部分:機(jī)智平臺(tái)數(shù)據(jù)點(diǎn)
    發(fā)表于 07-07 12:19

    機(jī)智Gokit3.X源代碼分析之一

    將每個(gè)按鍵的物理GPIO以及長(zhǎng)短按回調(diào)函數(shù)都賦值到相應(yīng)數(shù)組,這里一共初始化了2個(gè)按鍵,之后將數(shù)組地址傳到keys這個(gè)結(jié)構(gòu)變量,初始化之后就可以通過(guò)keys來(lái)調(diào)用按鍵的所有功能了。按鍵的具體控制原理后面會(huì)將。接下來(lái)是機(jī)智
    的頭像 發(fā)表于 07-13 14:47 ?3134次閱讀

    機(jī)智Gokit3.0源代碼分析按鍵處理機(jī)制

    結(jié)構(gòu)包括第幾個(gè)按鍵、所屬按鍵時(shí)鐘、Port、Gpio、短按回調(diào)函數(shù)與長(zhǎng)按回調(diào)函數(shù),gokitKeyFunction是一個(gè)函數(shù)指針類型的定義,使用回調(diào)的好處就是一次性定義好,之后按下去
    的頭像 發(fā)表于 07-13 14:57 ?5784次閱讀

    基于機(jī)智Gokit3.0的智能加濕器APP控制系統(tǒng)

    本文選用機(jī)智Gokit3.0開發(fā)板作為核心處理器,進(jìn)行整個(gè)系統(tǒng)的控制和工作,GoKit采用可擴(kuò)展式的硬件設(shè)計(jì)方案。核心硬件是包括:功能擴(kuò)展板、ESP8266 WiFi模塊。使用
    的頭像 發(fā)表于 03-30 19:50 ?685次閱讀

    基于機(jī)智Gokit3.0的智能加濕器APP控制系統(tǒng)

    本文選用機(jī)智Gokit3.0開發(fā)板作為核心處理器,進(jìn)行整個(gè)系統(tǒng)的控制和工作,GoKit采用可擴(kuò)展式的硬件設(shè)計(jì)方案。核心硬件是包括:功能擴(kuò)展板、ESP8266WiFi模塊。使用
    的頭像 發(fā)表于 04-07 16:07 ?788次閱讀
    基于<b class='flag-5'>機(jī)智</b><b class='flag-5'>云</b><b class='flag-5'>Gokit3.0</b>的智能加濕器APP控制系統(tǒng)