|
轉(zhuǎn) 微信寵物屋v2.3源碼分析
0.jpg (25.15 KB, 下載次數(shù): 36)
下載附件
2018-5-12 17:42 上傳
源碼分析
--132654 整理
如果說之前發(fā)的帖子都是水貼,這一炮,必須是干貨!!
額、大神可能又是看30分鐘就能看懂,我是足足看了3個下午。。。個人笨
寵物屋的源代碼這里分析的是STM32底板的V2.3版本。可以在本帖直接下載附件。
硬件原理圖什么的,就請大家去自行搜索下載吧。下載的時候注意看自己板子的版本號,下載對應(yīng)的原理圖。
像代碼中那些HAL庫,我就不分析了,硬件不一樣的HAL庫中的函數(shù)需要改幾個引腳號。
有興趣的可以自己寫這些HAL,等自己添加了外設(shè)的時候,要寫自己的外設(shè)的HAL添加到工程中。
這里主要分析讓人頭疼的Protocol。
順便分析程序的運(yùn)行流程。
擦,我發(fā)現(xiàn)在這里根本沒辦法一一細(xì)說。。。
算了我發(fā)幾個圖給大家意淫一下,具體的看代碼吧
這個程序還是有幾個小bug的,而且操作都是用的全局變量、全局?jǐn)?shù)據(jù)結(jié)構(gòu)體。
加之一些memcpy、memcmp等函數(shù),各種報文的結(jié)構(gòu)體,把大伙嚇到了。【也許只是把我這種菜雞嚇到了。。】
試著捋一捋就能捋順了。
大家多用 大家多用"Ctrl+F中的 中的MarkAl l",和 ,和"在整個工程中搜索 在整個工程中搜索"來看代碼。那只筆寫寫畫畫。 來看代碼。那只筆寫寫畫畫。
推薦大家先搞清楚兩個全局變量的意思,他們分別作為標(biāo)志位:
uint8_t p0Flag = 0; //WiFi控制設(shè)備命令,已經(jīng)下達(dá)的標(biāo)志
/*重發(fā)機(jī)制結(jié)構(gòu)體
uint32_t SendTime; //重發(fā)時記錄的時間戳
uint8_t SendNum; //重發(fā)次數(shù)
uint8_t Flag; //1、作為需要等待WiFi應(yīng)答的標(biāo)志!!!!!
//2、這個標(biāo)志位也限制MCU上報數(shù)據(jù)!!!!!
// 只要此標(biāo)志置位,暫停上報
// 復(fù)位標(biāo)志,則重新允許上報
uint16_t ResendBufLen; //長度
uint8_t Cmd_Buff[Max_UartBuf]; //重發(fā)數(shù)據(jù)緩沖區(qū)
*/
Pro_Wait_AckTypeDef Wait_AckStruct;
還有兩個全局結(jié)構(gòu)體:
WirteTypeDef_t WirteTypeDef; //WiFi寫來的數(shù)據(jù)
ReadTypeDef_t ReadTypeDef; //WiFi讀走的數(shù)據(jù)
這些個搞清楚了,再看代碼就不亂了。
再來說說協(xié)議:
MCU回復(fù)WiFi模組要用的 通用協(xié)議幀:
4.2 WiFi模組與設(shè)備MCU的心跳
4.5 WiFi模組向MCU匯報工作狀態(tài)
4.6 WiFi模組請求重啟MCU
4.7 WiFi模組通知MCU得到非法消息
4.10 WiFi模組控制更改MCU狀態(tài)
都用通用協(xié)議幀來回復(fù)
然而
4.1 WiFi請求MCU系統(tǒng)信息,MCU要回復(fù)系統(tǒng)信息
4.3 MCU通知WiFi進(jìn)入配網(wǎng),WiFi發(fā)Ack
4.4 MCU通知WiFi重啟,WiFi發(fā)Ack
4.8 WiFi讀取MCU狀態(tài),MCU回復(fù)中要有設(shè)備信息和ActionBit位
4.9 MCU主動上報,WiFi發(fā)應(yīng)答Ack
是需要WiFi回復(fù)MCU的!
大致的流暢:
1、按鍵處理
2、串口信息處理
3、如果接收到WiFi模組控制MCU的命令,則更新MCU狀態(tài),并立即上報MCU狀態(tài)
4、每隔1s,采集一次MCU狀態(tài)
具體來說明第2條,串口信息處理:
u8 GizWits_MessageHandle(u8 * Message_Buf, u8 Length_buf)
這里如果收到的是4.10,WiFi控制MCU的命令,則把命令的數(shù)據(jù)內(nèi)容傳給Message_Buf
進(jìn)來之后,抓取一包數(shù)據(jù)。
當(dāng)WiFi的應(yīng)答非法,或沒收到WiFi應(yīng)答時,啟動重發(fā)機(jī)制。但這里是Bug。具體見代碼
抓取數(shù)據(jù)包成功,
判斷校驗(yàn)位,校驗(yàn)失敗直接扔掉數(shù)據(jù)幀。
判斷收到WiFi模組的Ack信息,是不是正確的Ack
下面是重頭戲了,根據(jù)收到的命令碼進(jìn)行對應(yīng)的操作:
其他的略過,只說接收到4.8和4.10時的情況。
//4.8 WiFi讀取MCU. Cmd=0x03
//4.10 WiFi控制MCU. Cmd=0x03
case Pro_W2D_P0_Cmd: //就是這里
{
switch(UART_HandleStruct.Message_Buf[sizeof(Pro_HeadPartTypeDef)]) //標(biāo)準(zhǔn)報頭后緊跟一個action(1B)
{
//4.10 WiFi控制MCU. Cmd=0x03 ActionBit=0x01
case P0_W2D_Control_Devce_Action:
{
Pro_W2D_CommonCmdHandle(); //回復(fù)通用協(xié)議幀
//儲存ActionBit之后的信息到Message_Buf,最終傳給WriteTypeDef來更改MCU設(shè)備狀態(tài)
memcpy(Message_Buf, UART_HandleStruct.Message_Buf+sizeof(Pro_HeadPartP0CmdTypeDef), Length_buf);
p0Flag = 1; //main()里,依靠此標(biāo)志,和WriteTypeDef來控制更改設(shè)備狀態(tài)
break;
}
//4.8 WiFi讀取MCU. Cmd=0x03 ActionBit=0x02
case P0_W2D_ReadDevStatus_Action:
Pro_W2D_ReadDevStatusHandle();
break;
default:
break;
}
}
break;
廢話不多說,上幾張圖,大家看代碼吧。
0.jpg (55.93 KB, 下載次數(shù): 42)
下載附件
2018-5-12 17:44 上傳
其他的都不用動, 其他的都不用動,可復(fù)用性還是超高的!但是可讀性太差、還有Bug作為開源的代碼。。。咳咳、跑題了。
|
-
-
微信寵物屋原碼.rar
2018-5-12 14:21 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
593.87 KB, 下載次數(shù): 17, 下載積分: 黑幣 -5
|