本帖最后由 Genius 于 2017-11-28 16:11 编辑  
 
gokit时间获取及其分析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 [8]开始。  
 6、再看看执行上报操作的函数:uartWrite  
功用:Serialport write operation, send data to WiFi module,就是说通过串口把数据传到wifi。  
 
 
 |