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

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

2

主题

3

帖子

92

积分

注册会员

Rank: 2

积分
92
跳转到指定楼层
楼主
发表于 2017-11-25 12:03:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
教您5分钟接入机智云,实现傻瓜式开发
本帖最后由 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。



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

本版积分规则

加入Q群 返回顶部

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

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