打印
[应用方案]

微信宠物屋源码v2.3分析

[复制链接]
1101|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Thethree|  楼主 | 2016-11-26 19:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
物屋的源代码这里分析的是STM32底板的V2.3版本。可以在本帖直接下载附件。        硬件原理图什么的,就请大家去自行搜索下载吧。下载的时候注意看自己板子的版本号,下载对应的原理图。

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

        环形缓冲区的代码RingBuffer已经分析过了,大家可以看我之前发的帖子http://bbs.ickey.cn/group-topic-id-68221.html



        擦,我发现在这里根本没办法一一细说。。。
        算了我发几个图给大家意淫一下,具体的看代码吧

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



沙发
Thethree|  楼主 | 2016-11-26 19:05 | 只看该作者
        推荐大家先搞清楚两个全局变量的意思,他们分别作为标志位:

uint8_t p0Flag = 0;  //WiFi控制设备命令,已经下达的标志重发机制结构体    uint32_t        SendTime;      //重发时记录的时间戳    uint8_t                        SendNum;       //重发次数    uint8_t                        Flag;          //1、作为需要等待WiFi应答的标志!!!!!                                               //2、这个标志位也限制MCU上报数据!!!!!                                               //   只要此标志置位,暂停上报                                               //   复位标志,则重新允许上报    uint16_t        ResendBufLen;  //长度    uint8_t                        Cmd_Buff[Max_UartBuf];     //重发数据缓冲区Pro_Wait_AckTypeDef         Wait_AckStruct;  

        还有两个全局结构体

WirteTypeDef_t   WirteTypeDef;   //WiFi写来的数据ReadTypeDef_t    ReadTypeDef;    //WiFi读走的数据
        这些个搞清楚了,再看代码就不乱了。




        再来说说协议:

    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的!
       

使用特权

评论回复
板凳
Thethree|  楼主 | 2016-11-26 19:05 | 只看该作者
        大致的流畅:
        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.84.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)])     //标准报头后紧跟一个action(1B)            {                    //4.10 WiFi控制MCU. Cmd=0x03 ActionBit=0x01                    case P0_W2D_Control_Devce_Action:                      {                        Pro_W2D_CommonCmdHandle();  //回复通用协议帧                        //储存ActionBit之后的信息到Message_Buf,最终传给WriteTypeDef来更改MCU设备状态                        memcpy(Message_Buf, UART_HandleStruct.Message_Buf+sizeof(Pro_HeadPartP0CmdTypeDef), Length_buf);                          p0Flag = 1;   //main()里,依靠此标志,和WriteTypeDef来控制更改设备状态                        break;                        }                        //4.8 WiFi读取MCU. Cmd=0x03 ActionBit=0x02                        case P0_W2D_ReadDevStatus_Action:                          Pro_W2D_ReadDevStatusHandle();                        break;                        default:                            break;            }    }        break;

使用特权

评论回复
地板
Thethree|  楼主 | 2016-11-26 19:06 | 只看该作者
废话不多说,上几张图,大家看代码吧。
       

使用特权

评论回复
5
Thethree|  楼主 | 2016-11-26 19:07 | 只看该作者





        艾玛,忘了说最最重要的事。
        不想了解以上代码的同学,可以直接忽略什么上边。
        下面告诉大家在写自己的智能硬件时,需要在源代码基础之上更改的地方。分别是
Gokit.h中ReadTypeDef 结构WriteTypeDef 结构Main.c中GatherSensorData 函数ControlDeviceHandle 函数对了,别忘了修改代码的ProductKey,在Protocol.h中。每个产品都有属于自己唯一的ProductKey。

使用特权

评论回复
6
Thethree|  楼主 | 2016-11-26 19:07 | 只看该作者
本帖最后由 Thethree 于 2016-11-26 19:09 编辑



        艾玛,忘了说最最重要的事。
        不想了解以上代码的同学,可以直接忽略什么上边。
        下面告诉大家在写自己的智能硬件时,需要在源代码基础之上更改的地方。分别是
Gokit.h中ReadTypeDef 结构WriteTypeDef 结构Main.c中GatherSensorData 函数ControlDeviceHandle 函数对了,别忘了修改代码的ProductKey,在Protocol.h中。每个产品都有属于自己唯一的ProductKey。
        
        

        其他的都不用动,可复用性还是超高的!但是可读性太差、还有Bug作为开源的代码。。。咳咳、跑题了。
        
        


        下面是我的智能灯**弄好了的情况:







使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

236

帖子

4

粉丝