联盛德W801系列7-测试OTA和ntp获取网络时间

1.建立HTTP服务器

有很多方法可以架设HTTP文件服务器,我这里选最简单的方法:用现成的软件建立局域网服务器。软件也很多,我用的是 Http File Server2.4 Build 301 汉化绿色版绿色中文版
一.打开软件
在这里插入图片描述
二.把OTA专用的img文件w800_ota.img所在目录 《./bin/w800》 拉拽到软件的“Virtual File System”窗口:
在这里插入图片描述
三.查看本机IP,在浏览器输入 http:192.168.110.25/w800 (IP地址替换成自己的),能看到下面几个文件,说明架设服务器成功。
在这里插入图片描述

2.控制台命令中开放OTA相关功能

2.1配置《wm_demo.h》相关宏定义

W801的SDK已经有基于http协议的OTA(空中升级)功能,且已经支持控制台命令测试。只要配置了《wm_demo.h》的相关宏定义就可以了。

#define DEMO_ON		1
#define DEMO_OFF	0

//demo console
#define DEMO_CONSOLE				DEMO_ON
......
//connect demo
#define DEMO_CONNECT_NET			(DEMO_ON && DEMO_CONSOLE)
......
//http demo
#define DEMO_HTTP					(DEMO_ON && DEMO_CONSOLE)
......

OTA的前提是能联网,所以联网的命令也要开放。配置好DEMO_CONNECT_NETDEMO_HTTP,编译,下载,运行:
在这里插入图片描述
出现上面红框中的命令就说明配置成功了。
先t-connect(“ssid”,“pwd”)配网,配网成功后进入下一步。

2.2使用t-httpfwup进行OTA

输入控制台指令:

t-httpfwup(http:192.168.110.25/w800/w800_ota.img)

调试口打印信息,更新完毕后自动重启(第12行开始是重启后的信息):

Location: http://192.168.110.25/w800/w800_ota.img
content_length: 610648
download 1460 / 610648
download 2920 / 610648
download 4380 / 610648
download 5840 / 610648
.......
download 606788 / 610648
download 608835 / 610648
download 610280 / 610648

 user taskV02 

uart2 demo param=9600, 0, 0

Sequence  Command             Description
------------------------------------------------------------------------------------
1         t-connect           Test connecting ap;t-connect("ssid","pwd"); For open ap, pwd should be empty
2         t-oneshot           Test Oneshot  configuration
3         t-webcfg            Test web server configuration
4         t-uart              Test uart tx/rx; For example t-uart=(9600,0,0),baudrate 9600 ,parity none and 1 stop bit
5         t-httpfwup          Test firmware update via HTTP, like this t-httpfwup=(http://192.168.1.100:8080/WM_W600_SEC.img)
6         t-httpget           Test HTTP get method, like this t-httpget
7         t-httppost          Test HTTP post method, like this t-httppost=(user=winnermicro)
8         t-httpput           Test HTTP put method, like this t-httpput=(user=winnermicro)
9         t-mqtt              Test mqtt
10        demohelp            Display Help information
------------------------------------------------------------------------------------

这个更新速度比串口下载要快速和稳定。使用串口软件 《Upgrade_Tools_V1.4.8.exe》 下载过程中,如果切换到其他软件,很容易导致下载失败;所以我每次用串口下载,都是小心翼翼看着进度条(很无奈)。

3.OTA实用化之一:使用本地http服务器加快下载速度

在开发板上面增加一个按键,检测按键来触发OTA,以取代串口下载。以海凌科的《HLK-W801-kit-V1.0》开发板为例:
在这里插入图片描述

板上面有个 boot 按键,连接到 PA0,用它来触发OTA:


#define	 BOOT0_SCAN_TASK_PRIO					(STACT_DETECT_TASK_PRIO + 1)

#define		IO_IN_BOOT0		WM_IO_PA_00

#define BOOT0_SCAN_TASK_STACK_SIZE 		256 
static OS_STK   boot0ScanKey_task_stk[BOOT0_SCAN_TASK_STACK_SIZE];
void	boot0ScanKey(void)
{	//	海凌科的《HLK-W801-kit-V1.0》开发板上,PA0有按键,使用这个按键来触发程序更新
	int		oldStat,newStat,cnt;
	tls_gpio_cfg(IO_IN_BOOT0, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_PULLHIGH);
	oldStat = newStat = cnt =0;
	while(1){
		if(tls_gpio_read(IO_IN_BOOT0)){
			cnt = 0;
			newStat = 0;
		}else{
			cnt++;
			if(cnt > 9){	//	按键消抖
				newStat = 1;
			}
		}
		if((oldStat == 1)&&(newStat == 0)){	//	松开按键时,触发OTA
			printf("boot0 key down\n"); 
			vTaskDelay( 10 ); 
			t_http_fwup("http://192.168.110.25/w800/w800_ota.img");			
		}
		oldStat = newStat;
         vTaskDelay( 10 ); 
	}
}
void	boot0ScanKeyDemo(void)
{
	tls_os_task_create(NULL, NULL, boot0ScanKey,
					   NULL, (void *)boot0ScanKey_task_stk,  /* task's stack start address */
					   BOOT0_SCAN_TASK_STACK_SIZE * sizeof(u32), /* task's stack size, unit:byte */
					   BOOT0_SCAN_TASK_PRIO, NULL);
}

4.OTA实用化之二:产品空中升级

在产品化的系统中使用OTA,必须有公网IP的http服务器。现在有很多云平台提供oss对象存储,新用户有1-3个月的免费试用期。下面以阿里云的oss对象存储为例说明。
在这里插入图片描述
我因为之前开通过,不是新用户,这次只能购买(5元,半年,40GB):
在这里插入图片描述
使用非常方便,参考官方文档《对象存储 OSS->快速入门->控制台快速入门》,上传好文件之后,是这样:
在这里插入图片描述
去到我们需要的文件:
在这里插入图片描述
查看文件的详情,获取url:
在这里插入图片描述
把这个URL放到我们的程序中去,就可以在产品中实现OTA。产品OTA升级也需要触发机制,可以是按键,遥控器,MQTT命令。

写到这里以为可以收工了,一看题目,还有ntp的内容。真辛苦。

5.ntp获取网络时间

5.1控制台命令测试ntp

《wm_demo.h》 中修改下面的宏定义,就可以通过控制台测试ntp。前提是已经配网成功。

//ntp demo
#define DEMO_NTP					(DEMO_ON && DEMO_CONSOLE)

5.2实际应用中使用ntp

实际应用中,一般系统没有电池RTC,所以每次开机联网成功时,需要获取网络时间。如果设备长期不断电,可能每天要更新一次网络时间,消除W801自身RTC的误差。
在这里插入图片描述
使用ntp代码:

    unsigned int t;	//used to save time relative to 1970
    struct tm *tblock;
    t = tls_ntp_client();

    printf("now Time :   %s\n", ctime((const time_t *)&t));
    tblock = localtime((const time_t *)&t);	//switch to local time
    //printf(" sec=%d,min=%d,hour=%d,mon=%d,year=%d\n",tblock->tm_sec,tblock->tm_min,tblock->tm_hour,tblock->tm_mon,tblock->tm_year);
    tls_set_rtc(tblock);

需要的头文件:

#include "wm_rtc.h"
#include "wm_ntp.h"

然后在需要的地方通过下面的代码获取时间:

	struct tm tblock;
	tls_get_rtc(&tblock);
	//printf("hh:mm:ss  %02d:%02d:%02d\r\n",tblock.tm_hour,tblock.tm_min,tblock.tm_sec);
posted @ 2022-08-12 09:54  汉塘阿德  阅读(145)  评论(0编辑  收藏  举报  来源