收藏官网首页
查看: 9732|回复: 0

水墨画定时控制系统:gokit时间获取及其分析2

2

主题

3

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2017-11-25 12:03:44 | 显示全部楼层 |阅读模式
免费使用STM32、APP自动代码生成工具
本帖最后由 Genius 于 2017-11-28 16:11 编辑

gokit时间获取及其分析3:http://club.gizwits.com/thread-8038-1-1.html
(一)探索的方法论当拿到一块开发板一无所知的时候,借鉴,就是一个理想的学习途径。
我的项目目标是制作水墨画定时控制系统,在没有联网功能的前提下,时间定时功能是依靠ds3231时钟。但是既然联网了,就没必要再外界设备获取时间,挖掘网络资源,显然是一个力量的方向。
那么问题来了,机智云到底有没有api可以获取网络时间呢?
翻查协议手册:
水墨画控制系统 - 机智云WiFi类设备接入协议文档-MCU方案.png
这个数据手册可以从开发向导里面下载:
开发向导.png
里面的目录有这么一行:
目录.png
看样子有戏!再仔细瞧瞧:
数据.png
看来获取网络时间的接口是有了,但具体应该怎么用呢?
这个时候就要踩在巨人的肩膀上了:
这是机智云社区的大神写的例程:
http://club.gizwits.com/thread-4088-1-1.html


(二)目标的时间获取方法:转载自http://club.gizwits.com/thread-4088-1-1.html实际上现在时间获取并不需要这么麻烦,关键的API已经生成好了,具体方法可以看我下一篇帖子——网络时间获取3。这里是为了展示我学习思考的过程。
step1:在gizwits_protocol.h的PROTOCOL_CMDTYPE结构体添加2个命令码:
1.png

step2:在gizwits_protocol.c文件里编写一个获取网络时间的API,即发送命令码0x17;
2.png


step3:在gizwits_protocol.h文件**一下定义的获取网络时间API,另外**一个结构体用来保存时间:年、月、日、时、分、秒;
3.png

step4:在gizwits_protocol.c里面的int32_t gizwitsHandle(dataPoint_t *currentData)函数里面添加以下代码,即WIFI模组返回时间后,就读取时间;在函数体外面定义一下用来保存时间的结构体mytime;
4.png
5.png



step5:最后在main.c的userhandle里面添加打印日期的代码,这里1s打印一次便于观察;
6.png



(三)分析代码
站在大神的肩膀上学习。我们需要弄懂为什么要这么写?
实际上主要的结论都总结在我上一篇帖子——网络时间获取1,这里主要是展示我学习思考的过程。


1、根据(一)的分析可以得到:获取网络时间都是通过协议的。上报包含某个字节指令的网络数据包,然后服务器返回包含所要信息的网络数据包。
那么,数据手册里面提到的这个函数就很关键了:
11.png
在gizwits_protocol.c找到这个函数:
12.png
重点来看看这个进入条件:
13.png
ret是指什么呢? 就上一行有这么一段:
15.png
转到这个函数:
14.png
他的作用:Get a packet of data from the ring buffer,即:从环形缓冲区获取数据包。
成功返回0,即上面进入判断内部的条件。
综合来看,就是成功上报了某个数据之后,做一些操作。


2、还是看看gizwitsHandle函数:
里面第一个switch判断条件:recvHead->cmd,那么cmd是什么?
21.png
似乎是一个装数据的结构体,直觉告诉我他就是网络命令的那个包,cmd就是包里面的命令字节。
22.png
那么recvHead是什么?
追溯上去看到这么一段:
23.png
我们搜一下recvHead:
24.png
那么gizwitsProtocol.protocolBuf又是什么?
25.png
这是他的结构体。描述一些“重要的结构体”
27.png
Protocol data handle buffer,表示:协议数据处理缓冲区。
在gizwits_product.c开头有:
26.png
这么一来就验证了我上面的猜想。
所以我们只需要在这个里面判断和处理数据。此时还没用对应于0x18的宏定义。


3、现在我们来看看结构体:
我们发现很多这一类的结构体:
protocolHead_t、protocolDeviceInfo_t、protocolCommon_t……
他们的定义在gitwits_protocol.h:
31.png


最核心就是上面说的那个protocolHead_t,它代表了固定的网络数据包头的形式:
32.png


对应于我们要接收的命令0x18:
33.png

的前五个数据,基本上所有的(似乎就是所有的)命令前五个都是这样的。然后其他扩展的结构就以此为基础:
34.png


譬如这个,开头一个protocolHead_t,后面带别的东西。
一看就知道是对应上报数据包的:
35.png


多出来sum就是校验位。

2、再说一个很重要的函数:gizProtocolWaitAck
41.png


那么我们又发现了一个gizwitsProtocol.waitAck结构体:
42.png


protocolWaitAck_t结构体:
43.png



5、再来看看最基本的接收数据包函数:gizProtocolGetOnePacket
51.png
下面有这么一段:
52.png

看样子protocolBuff是保存了整个包的数据,作为一个uint8_t的数据,根据回复包的结构,第9个8位数据是我们开始需要的,所以处理的时候从protocolBuff [8]开始。

6、再看看执行上报操作的函数:uartWrite
61.png

功用:Serialport write operation, send data to WiFi module,就是说通过串口把数据传到wifi。



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

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表