在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

機智云Gokit3.0源代碼分析之協議結構體的定義

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

今天重點給大家分析下機智云整個程序的數據格式,機智云運行這么穩定得益于整個數據格式合理規范命名,我們直接進入主題

首先定義了一個數據類型為gizwitsProtocol_t 的全局變量,如下

/** 協議全局變量 **/

gizwitsProtocol_t gizwitsProtocol;

我們追蹤下結構體的定義

__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狀態 事件

volatile gizwitsReport_t lastReportData;

gizwitsIssued_t issuedData; //云端下發控制報文數據

moduleStatusInfo_t wifiStatusData; //WIFI 狀態信息(信號強度)

}gizwitsProtocol_t;

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

但如果不用__packed的話,系統將以默認的方式對齊(假設是4字節),那么它占4 + 4 + 8 + 4 = 20;(不足4字節以4字節補齊)。

這里主要定義了一些gizwits協議的下發報文標志、緩沖區、數據長度、sn、系統時間、上次上報數據的時間、重發機制定義、控制事件、WiFi狀態事件、上次上報的數據、云端下發的控制報文以及WiFi狀態信息這些數據的定義,這里我們重點關注幾個就行了。

首先是 gizwitsIssued_t ,這個結構體里面定義了2個結構體,一個是控制功能Flag,一個是對應的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值,以及電機轉速這6個功能可以被控制,那么這個結構體是在哪里被賦值的呢?我們這主函數的while循環中找到gizwitsHandle這個函數,進去之后追蹤到protocolGetOnePacket這個函數,這個函數就是從gizwits的接收緩沖中拿一個完整的數據包出來,不懂的可以結合我們第二講的串口環形buff,進去一看就明白了。好,到這里我們就接到一幀從WiFi模塊發送到MCU的信號幀了,協議是將接收的數據放gizwitsProtocol的protocolBuf這個數組的,我們接著往下看,

recvHead = (protocolHead_t*)gizwitsProtocol.protocolBuf;

我們往上看recvHead的定義,是一個protocolHead_t的指針,顧名思義,這個應該是協議頭,我們進去看看

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

* 協議標準頭

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

__packed typedef struct

{

uint8_t head[2];

uint16_t len;

uint8_t cmd;

uint8_t sn;

uint8_t flags[2];

} protocolHead_t;

協議頭包括5部分,包頭header固定為0xFFFF,len指從cmd開始到整個數據包結束所占用的字節,命令字節cmd表示具體的命令定義,sn由發送方給出,原路返回就是,標志位flag默認0,之后便是數據區與校驗和了,這里將gizwitsProtocol.protocolBuf強制轉換成protocolHead_t格式 賦給recvHead ,之后就可以通過recvHead 調用協議頭的各項成員數據了,然后通過recvHead-》cmd判斷相應的命令進去相應的語句中去執行不同的命令,這里我們看下CMD_ISSUED_P0,這個的意思是命令為WiFi向MCU發送數據的命令,我們繼續執行,來到protocolIssuedProcess這個函數,進去之后,我們看看數據是怎么定義的

protocolReport_t *protocolIssuedData = (protocolReport_t *)inData;

首先,將gizwitsProtocol.protocolBuf強制轉換成protocolReport_t這個類型的指針,我們看看protocolReport_t的定義,看表面,應該是協議上報數據格式的定義

__packed typedef struct

{

protocolHead_t head;

actionType_t action;

gizwitsReport_t reportData;

uint8_t sum;

} protocolReport_t;

這里包括協議頭、動作、上報數據與校驗和四部分,我們重點看看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;

這個結構體的定義符合了MCU 主動發送狀態時或者回復 wifi 模塊的狀態查詢時攜帶 p0 命令和完整數據區 之后,issuedAction = protocolIssuedData-》action;通過issuedAction 判斷 P0 command 命令碼,這里我們進入ACTION_CONTROL_DEVICE,將P0區的數據轉換成事件格式,由下面這行代碼實現

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

這個函數將P0數據區的數據強制轉換成gizwitsIssued_t格式的數據,也就是我們上面介紹的事件Flag和事件Value。 我們還看到有一個gizwitsProtocol.issuedProcessEvent作為實參傳到函數中,這個也是在gizwitsProtocol_t結構體中定義的,我們看下其結構體定義

__packed typedef struct {

uint8_t num;

uint8_t event[EVENT_MAX];

}eventInfo_t;

這個結構體將上面傳入的數據轉換成相應的時間格式,每個num對應一個事件,處理完之后直接進入對應num處理對應時間就OK了。

處理完這些之后,將gizwitsProtocol.issuedFlag置1, 然后判斷gizwitsProtocol.issuedFlag,進入下面函數

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

}

接下來就看到控制LED的實際出處了

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);

}

下面的處理函數大家就都可以看懂了,可能講的有點亂,但是如果跟著代碼看的話還是很容易理解的,我們看下面這幅圖就一目了然了,我將協議中所有的結構體定義以及連接關系都詳細的標注出來不了,參考這個理解會事半功倍!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 源代碼
    +關注

    關注

    96

    文章

    2949

    瀏覽量

    67556
  • 結構體
    +關注

    關注

    1

    文章

    130

    瀏覽量

    11002
  • 機智云
    +關注

    關注

    2

    文章

    602

    瀏覽量

    26668

原文標題:Gokit3.0 STM32源代碼分析之三

文章出處:【微信號:IoTMaker,微信公眾號:機智云開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    GoKit試用體驗】+機智GoKit開發套件學習分享1開箱圖

    本帖最后由 孤雨冰狐 于 2015-6-9 10:34 編輯 機智GoKit開發套件學習分享1開箱圖今天我申請的機智
    發表于 06-08 17:13

    GoKit試用體驗】利用機智提供的免費服務自定義遠程控制

    。其他的很多函數和結構都是可以通用的部分。最后,如果細心去理解好了MCU的模板程序,配合官網后臺自動生成的數據協議,確實如機智官網所說,
    發表于 07-27 14:10

    【科技亦能傳承】轉贈 Gokit2.0,免費換加強版Gokit3.0

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

    【萬元大獎】機智智能硬件創新大賽

    。//幸運觀眾獎的禮物設置:機智大禮包、Gokit3.0Gokit2.0 、T恤 、GoDay入場券、數據線(其他項目)2016.08.29~2016.08.30專家評審專家評審
    發表于 07-06 13:42

    機智想說愛你不容易 - 如何開發接入機智的物聯網設備

    機智平臺標準接入協議App與設備通訊v4.0.1,機智平臺標準接入
    發表于 09-27 13:26

    Gokit 3試用體驗】(8)微信控制Gokit體驗機智寵物屋

    ,而實現微信控制Gokit的二維碼只有在紙字版的說明書上有,如下圖所示。于是悲劇了……  經過機智網官網論壇查詢資料、機智網QQ群咨詢問題,最后拿到了相應的控制二維碼,在Gokit S
    發表于 10-02 12:19

    重磅| Gokit1.0用戶真情回饋-Gokit3.0免費兌換

    表達機智由衷的謝意,特在金秋十月送上真誠回饋:Gokit1.0用戶憑Gokit1.0開發板,免費兌換Gokit3.0
    發表于 10-16 19:16

    如何使用機智開發一款智能硬件產品

    應用,圖形化編程!STM32L432 Nucleo-32案例-3分鐘打造手機APP遠程空氣質量監測應用機智4.0自動協議代碼、MCU工程生成工具體驗李~的筆記
    發表于 12-26 15:56

    機智在Amazon Alexa平臺發布Smarthome和Custom Skill,實現亞馬遜Echo直接控制Gokit

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

    機智2016~2017優秀項目盤點

    】之無線工業粉塵監測儀【Gokit 3】倉鼠管家和OpenHamtaro開源項目【Gokit智慧宿舍【Gokit 3】
    發表于 09-22 13:03

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

    Gokit,通過機智的物聯網平臺,能夠滿足我的需求,那么怎么來做呢?根據經驗所得,需要對這個工作拆分為幾部分:機智平臺數據點
    發表于 07-07 12:19

    機智Gokit3.X源代碼分析之一

    將每個按鍵的物理GPIO以及長短按回調函數都賦值到相應數組,這里一共初始化了2個按鍵,之后將數組地址傳到keys這個結構變量,初始化之后就可以通過keys來調用按鍵的所有功能了。按鍵的具體控制原理后面會將。接下來是機智
    的頭像 發表于 07-13 14:47 ?3278次閱讀

    機智Gokit3.0源代碼分析按鍵處理機制

    結構包括第幾個按鍵、所屬按鍵時鐘、Port、Gpio、短按回調函數與長按回調函數,gokitKeyFunction是一個函數指針類型的定義,使用回調的好處就是一次性定義好,之后按下去
    的頭像 發表于 07-13 14:57 ?6040次閱讀

    基于機智Gokit3.0的智能加濕器APP控制系統

    本文選用機智Gokit3.0開發板作為核心處理器,進行整個系統的控制和工作,GoKit采用可擴展式的硬件設計方案。核心硬件是包括:功能擴展板、ESP8266 WiFi模塊。使用
    的頭像 發表于 03-30 19:50 ?927次閱讀

    基于機智Gokit3.0的智能加濕器APP控制系統

    本文選用機智Gokit3.0開發板作為核心處理器,進行整個系統的控制和工作,GoKit采用可擴展式的硬件設計方案。核心硬件是包括:功能擴展板、ESP8266WiFi模塊。使用
    的頭像 發表于 04-07 16:07 ?1118次閱讀
    基于<b class='flag-5'>機智</b><b class='flag-5'>云</b><b class='flag-5'>Gokit3.0</b>的智能加濕器APP控制系統
    主站蜘蛛池模板: 国产嫩草影院在线观看 | 性欧美另类| 色人岛 | 九九碰| 婷婷五月花 | 日本特黄视频 | 免费观看黄色网页 | 日日噜噜噜噜人人爽亚洲精品 | 在线观看高清免费播放 | 中文字幕佐山爱一区二区免费 | 日本在线一级 | 免费国产成人α片 | 国产成人精品一区二区三区 | 国产国产成人人免费影院 | 天堂bt资源www在线 | 中文字幕亚洲一区婷婷 | 国产欧美一区二区三区观看 | 在线看片成人免费视频 | 免费一级特黄 | 又色又污又爽又黄的网站 | 深深激情网 | 亚洲日本中文字幕天天更新 | 黄的三级在线播放 | 中日韩毛片 | 超级碰碰青草免费视频92 | 久久新地址 | 91精品国产亚洲爽啪在线影院 | 伊人成人在线观看 | 唐人呦一呦xxxx视频 | 天天玩夜夜操 | 毛片网站免费在线观看 | 天天操天天添 | 性毛片 | 国产精品资源网站在线观看 | 免费福利在线播放 | 天堂网中文在线 | 四虎网址在线 | 手机看片91| 亚洲bbb| 天天爽夜夜爽精品免费 | 开心激情小说 |