【平头哥RVB2601创意应用开发】使用体验06 -- NTP授时
作者 | firr
本篇记录RVB2601使用NTP进行网络授时的开发过程,本人历时三次大时间段投入才搞定,也是SDK使用以来遇到的最大一坑。
1、SNTP行不通
阶段一,历时8小时(一个下午加晚上),使用SNTP组件,各种编译错误,稀里糊涂到直接放弃。最后也是联系平头哥技术支持,了解到SNTP没有适配。这段工作已经过了一段时间,当时也没心情做测评记录,大概问题是SNTP组件需要LWIP包的支持,而SDK中包含SAL组件已经适配了LWIP包,但是功能上,特别是应用层协议适配没有做完整。而单独加载LWIP包,又会出现大量重复定义的情况(与SAL组件中的冲突),因此除非下力气扩展SAL组件,自己添加SNTP支持,否则此路行不通了。
2、尝试NTP
阶段二,大概是两天后,活动微信群中已经有很多网友都反馈了SNTP的问题,有人提到可以使用NTP,但是NTP会遇到SDK中的Bug,就是drv_wifi_at_w800组件中的w800_connect_remote()函数的UDP连接Bug(NTP使用的UDP协议),关键点就是函数实现连接远端TCP或UDP服务器使用的是同一条语句,也就是相同的AT命令,但实际W800的TCP连接和UDP连接,虽然AT命令一样,但是默认参数项有差别。

图6-1 UDP连接Bug点

图6-2 AT+CIPSTART命令格式要求
针对上述问题,解决方法有两个,一是修改“atparser_send()”语句,增加AT命令的本地端口参数——因为TCP也可以传递这个参数,并且改“tcp_client”为“udp_unicast”。二是增加“case NET_TYPE_UDP_UNICAST:”分支的代码,额外提供一个UDP连接的函数调用。

图6-3 两种修改方法
很明显,方法一TCP和UDP使用同一传递的本地端口参数,这样就限制了板子同时开启TCP和UDP的能力,所以本人最终采用了方法二,那么索性将NET_TYPE_TCP_CLIENT分支也做了修改,只保留tcp_client模式的实现。

图6-4 项目最终修改方法
上述方法的确保证TCP和UDP测试的成功,但是NTP依然没有产生效果,于是进一步做代码追踪,最后自己给自己挖了一个坑。因为距离写下此篇也有一段时间了,所以具体过程记不清了,大概是在w800_devops.c中看到函数w800_wifi_module_conn_start()会调用w800_connect_remote(),猜想它就是上一层入口——这一猜想后面通过查看list文件“项目目录/Lst/项目名.asm”发现是错误的。
带着这个错误猜想,本人发现函数中会动态生成一个本地端口,但是没有传递给w800_connect_remote(),于是就以为UDP也要用这里生成的端口,于是做了下述的修改。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
