查看: 173|回复: 0

[原创] 微信宠物屋源码v2.3分析

[复制链接]

18

主题

3

好友

526

积分

举人

Rank: 4

  • TA的每日心情
    慵懒
    2016-11-17 11:09
  • 签到天数: 45 天

    [LV.5]常住居民I

    发表于 2016-8-7 22:21:00 |显示全部楼层
    本帖最后由 enenge 于 2016-8-7 22:33 编辑

    如果说之前发的帖子都是水贴,这一炮,必须是干货!!
    额、大神可能又是看30分钟就能看懂,我是足足看了3个下午。。。个人笨



    宠物屋的源代码这里分析的是STM32底板的V2.3版本。可以在本帖直接下载附件。
    硬件原理图什么的,就请大家去自行搜索下载吧。下载的时候注意看自己板子的版本号,下载对应的原理图。


    像代码中那些HAL库,我就不分析了,硬件不一样的HAL库中的函数需要改几个引脚号。
    有兴趣的可以自己写这些HAL,等自己添加了外设的时候,要写自己的外设的HAL添加到工程中。
    这里主要分析让人头疼的Protocol。
    顺便分析程序的运行流程。




    这个程序还是有几个小bug的,而且操作都是用的全局变量、全局数据结构体。
    加之一些memcpy、memcmp等函数,各种报文的结构体,把大伙吓到了。【也许只是把我这种菜鸡吓到了。。】
    试着捋一捋就能捋顺了。
    大家多用"Ctrl+F中的MarkAll",和"在整个工程中搜索"来看代码。那只笔写写画画。

    1. 推荐大家先搞清楚两个全局变量的意思,他们分别作为标志位:

    2. uint8_t p0Flag = 0;  //WiFi控制设备命令,已经下达的标志

    3. 重发机制结构体
    4.     uint32_t        SendTime;      //重发时记录的时间戳
    5.     uint8_t                        SendNum;       //重发次数
    6.     uint8_t                        Flag;          //1、作为需要等待WiFi应答的标志!!!!!
    7.                                                //2、这个标志位也限制MCU上报数据!!!!!
    8.                                                //   只要此标志置位,暂停上报
    9.                                                //   复位标志,则重新允许上报
    10.     uint16_t        ResendBufLen;  //长度
    11.     uint8_t                        Cmd_Buff[Max_UartBuf];     //重发数据缓冲区

    12. Pro_Wait_AckTypeDef         Wait_AckStruct;  


    13. 还有两个全局结构体:

    14. WirteTypeDef_t   WirteTypeDef;   //WiFi写来的数据
    15. ReadTypeDef_t    ReadTypeDef;    //WiFi读走的数据

    16. 这些个搞清楚了,再看代码就不乱了。
    复制代码


    再来说说协议:
    MCU回复WiFi模组要用的 通用协议帧:   
    4.2 WiFi模组与设备MCU的心跳   
    4.5 WiFi模组向MCU汇报工作状态   
    4.6 WiFi模组请求重启MCU   
    4.7 WiFi模组通知MCU得到非法消息   
    4.10 WiFi模组控制更改MCU状态   
    都用通用协议帧来回复     

    然而   
    4.1 WiFi请求MCU系统信息,MCU要回复系统信息   
    4.3 MCU通知WiFi进入配网,WiFi发Ack   
    4.4 MCU通知WiFi重启,WiFi发Ack   
    4.8 WiFi读取MCU状态,MCU回复中要有设备信息和ActionBit位   
    4.9 MCU主动上报,WiFi发应答Ack   
    是需要WiFi回复MCU的!







    大致的流畅:
    1、按键处理
    2、串口信息处理
    3、如果接收到WiFi模组控制MCU的命令,则更新MCU状态,并立即上报MCU状态
    4、每隔1s,采集一次MCU状态


    具体来说明第2条,串口信息处理
    u8 GizWits_MessageHandle(u8 * Message_Buf, u8 Length_buf)
    这里如果收到的是4.10,WiFi控制MCU的命令,则把命令的数据内容传给Message_Buf
    进来之后,抓取一包数据。
    当WiFi的应答非法,或没收到WiFi应答时,启动重发机制。但这里是Bug。具体见代码
    抓取数据包成功,
    判断校验位,校验失败直接扔掉数据帧。
    判断收到WiFi模组的Ack信息,是不是正确的Ack
    下面是重头戏了,根据收到的命令码进行对应的操作:
    其他的略过,只说接收到4.8和4.10时的情况。



    1. //4.8  WiFi读取MCU. Cmd=0x03
    2. //4.10 WiFi控制MCU. Cmd=0x03
    3.         case Pro_W2D_P0_Cmd:   //就是这里
    4.         {
    5.             switch(UART_HandleStruct.Message_Buf[sizeof(Pro_HeadPartTypeDef)])     //标准报头后紧跟一个action(1B)
    6.             {
    7.                     //4.10 WiFi控制MCU. Cmd=0x03 ActionBit=0x01
    8.                     case P0_W2D_Control_Devce_Action:  
    9.                     {
    10.                         Pro_W2D_CommonCmdHandle();  //回复通用协议帧
    11.                         //储存ActionBit之后的信息到Message_Buf,最终传给WriteTypeDef来更改MCU设备状态
    12.                         memcpy(Message_Buf, UART_HandleStruct.Message_Buf+sizeof(Pro_HeadPartP0CmdTypeDef), Length_buf);  
    13.                         p0Flag = 1;   //main()里,依靠此标志,和WriteTypeDef来控制更改设备状态
    14.                         break;
    15.                         }
    16.                         //4.8 WiFi读取MCU. Cmd=0x03 ActionBit=0x02
    17.                         case P0_W2D_ReadDevStatus_Action:  
    18.                         Pro_W2D_ReadDevStatusHandle();
    19.                         break;
    20.                         default:
    21.                             break;
    22.             }
    23.     }
    24.         break;
    复制代码



    艾玛,忘了说最最重要的事。

    不想了解以上代码的同学,可以直接忽略什么上边。

    下面告诉大家在写自己的智能硬件时,需要在源代码基础之上更改的地方。分别是

    Gokit.h中ReadTypeDef 结构WriteTypeDef 结构Main.c中GatherSensorData 函数ControlDeviceHandle 函数对了,别忘了修改代码的ProductKey,在Protocol.h中。每个产品都有属于自己唯一的ProductKey。

    其他的都不用动,可复用性还是超高的!




    这是我注释的源代码,效果如图:

    无标题.jpg
    无标题2.jpg




    微信宠物屋v2.3带注释源码分析.rar (588.05 KB, 下载次数: 8)






    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-9 09:53 , Processed in 0.129487 second(s), 10 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部