水墨画定时控制系统:gokit时间获取及其分析2
本帖最后由 Genius 于 2017-11-28 16:11 编辑gokit时间获取及其分析1:http://club.gizwits.com/thread-8070-1-1.htmlgokit时间获取及其分析3:http://club.gizwits.com/thread-8038-1-1.html(一)探索的方法论当拿到一块开发板一无所知的时候,借鉴,就是一个理想的学习途径。
我的项目目标是制作水墨画定时控制系统,在没有联网功能的前提下,时间定时功能是依靠ds3231时钟。但是既然联网了,就没必要再外界设备获取时间,挖掘网络资源,显然是一个力量的方向。
那么问题来了,机智云到底有没有api可以获取网络时间呢?
翻查协议手册:
这个数据手册可以从开发向导里面下载:
里面的目录有这么一行:
看样子有戏!再仔细瞧瞧:
看来获取网络时间的接口是有了,但具体应该怎么用呢?
这个时候就要踩在巨人的肩膀上了:
这是机智云社区的大神写的例程:
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个命令码:
step2:在gizwits_protocol.c文件里编写一个获取网络时间的API,即发送命令码0x17;
step3:在gizwits_protocol.h文件**一下定义的获取网络时间API,另外**一个结构体用来保存时间:年、月、日、时、分、秒;
step4:在gizwits_protocol.c里面的int32_t gizwitsHandle(dataPoint_t *currentData)函数里面添加以下代码,即WIFI模组返回时间后,就读取时间;在函数体外面定义一下用来保存时间的结构体mytime;
step5:最后在main.c的userhandle里面添加打印日期的代码,这里1s打印一次便于观察;
(三)分析代码
站在大神的肩膀上学习。我们需要弄懂为什么要这么写?
实际上主要的结论都总结在我上一篇帖子——网络时间获取1,这里主要是展示我学习思考的过程。
1、根据(一)的分析可以得到:获取网络时间都是通过协议的。上报包含某个字节指令的网络数据包,然后服务器返回包含所要信息的网络数据包。
那么,数据手册里面提到的这个函数就很关键了:
在gizwits_protocol.c找到这个函数:
重点来看看这个进入条件:
ret是指什么呢? 就上一行有这么一段:
转到这个函数:
他的作用:Get a packet of data from the ring buffer,即:从环形缓冲区获取数据包。
成功返回0,即上面进入判断内部的条件。
综合来看,就是成功上报了某个数据之后,做一些操作。
2、还是看看gizwitsHandle函数:
里面第一个switch判断条件:recvHead->cmd,那么cmd是什么?
似乎是一个装数据的结构体,直觉告诉我他就是网络命令的那个包,cmd就是包里面的命令字节。
那么recvHead是什么?
追溯上去看到这么一段:
我们搜一下recvHead:
那么gizwitsProtocol.protocolBuf又是什么?
这是他的结构体。描述一些“重要的结构体”
Protocol data handle buffer,表示:协议数据处理缓冲区。
在gizwits_product.c开头有:
这么一来就验证了我上面的猜想。
所以我们只需要在这个里面判断和处理数据。此时还没用对应于0x18的宏定义。
3、现在我们来看看结构体:
我们发现很多这一类的结构体:
protocolHead_t、protocolDeviceInfo_t、protocolCommon_t……
他们的定义在gitwits_protocol.h:
最核心就是上面说的那个protocolHead_t,它代表了固定的网络数据包头的形式:
对应于我们要接收的命令0x18:
的前五个数据,基本上所有的(似乎就是所有的)命令前五个都是这样的。然后其他扩展的结构就以此为基础:
譬如这个,开头一个protocolHead_t,后面带别的东西。
一看就知道是对应上报数据包的:
多出来sum就是校验位。
2、再说一个很重要的函数:gizProtocolWaitAck
那么我们又发现了一个gizwitsProtocol.waitAck结构体:
protocolWaitAck_t结构体:
5、再来看看最基本的接收数据包函数:gizProtocolGetOnePacket下面有这么一段:
看样子protocolBuff是保存了整个包的数据,作为一个uint8_t的数据,根据回复包的结构,第9个8位数据是我们开始需要的,所以处理的时候从protocolBuff 开始。
6、再看看执行上报操作的函数:uartWrite
功用:Serialport write operation, send data to WiFi module,就是说通过串口把数据传到wifi。
页:
[1]