联盛德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_NET和DEMO_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);