【前言】 RVB2601在与自己的服务器建立连接上,同步服务器时间,初始化RTC时间。由于现有的NTP组件存在问题,几经周折后还没有弄好,只好与自己的服务同步时间。
【步骤】
1、在原来建立TCP连接的基础上,方法见:【平头哥RVB2601创意应用开发】u8g2+IP - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn) 。
2、服务器在第一次连接时返回时间:
def send_message(self, data):
# 发送数据
data = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return self._stream.write(data.encode('utf-8'))
3、在init.c中注册接收回调函数:
if(app_netmgr_hdl) {
//init uservice for wifi
utask_t *task = utask_new("netmgr", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);
netmgr_service_init(task);
//join AP, WIFI_SSID & WIFI_PSW both are Macro
netmgr_config_wifi(app_netmgr_hdl, WIFI_SSID, sizeof(WIFI_SSID), WIFI_PSW, sizeof(WIFI_PSW));
//init w800 AT parser
w800_module_init(task, &w800_param);
//register input event callback for w800 module
// w800_packet_input_cb_register(&w800_in);
//start uservice
w800_packet_input_cb_register(&w800_data_receive_callback);//注册接收回调函数
netmgr_start(app_netmgr_hdl);
//subscribe events which is managed by netmgr uservice
event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
}
4、回调函数中解释出时间并调置RTC时间:
void w800_data_receive_callback(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports)
{
uint8_t *buf;
csi_rtc_time_t base_time;
csi_error_t ret = 0;
buf = (uint8_t *)data;
if(len == 0)
{
return;
}
//返回格式为:2022-02-01 11:11:00
base_time.tm_year = ((int)(buf[0]-'0')*1000 + (int)(buf[1]-'0')*100 + (int)(buf[2]-'0')*10 + (int)(buf[3]-'0'))-1900;
base_time.tm_mon = ((int)(buf[5]-'0')*10 + (int)(buf[6]-'0'))-1;
base_time.tm_mday = (int)(buf[8]-'0')*10 +(int)(buf[9]-'0');
base_time.tm_hour = (int)(buf[11]-'0')*10 + (int)(buf[12]-'0');
base_time.tm_min = (int)(buf[14]-'0')*10 + (int)(buf[15]-'0');
base_time.tm_sec = (int)(buf[17]-'0')*10 + (int)(buf[18]-'0');
LOGD(TAG,"year:%04d-%2d-%2d %2d:%2d:%2d",base_time.tm_year,base_time.tm_mon,base_time.tm_mday,base_time.tm_hour,base_time.tm_min,base_time.tm_sec);
ret = csi_rtc_init(&g_rtc, 0);
ret = csi_rtc_set_time(&g_rtc, &base_time);
if(ret == 0)
{
LOGD(TAG,"set time OK!");
}
else{
LOGD(TAG,"set time ERROR!");
}
}
5、在显示任务中增加显示功能:
void test_getIP_task()
{
char ssid[32];
int bssid[6];
int channel;
int rssi;
char disp[40];
//先获取AP信息,判断是否联网
//偿试连接到服务器
//发送数据
char ip[16];
char gw[16];
char mask[16];
csi_rtc_time_t this_time;
csi_error_t ret;
int ipinfo = -1;
while(1){
ipinfo = w800_link_info(ip,gw,mask);
if(ipinfo == 0){
u8g2_ClearBuffer(&u8g2);
u8g2_SetFont(&u8g2,u8g2_font_u8glib_4_tr);
u8g2_DrawStr(&u8g2,5,8,ip);//显示IP地址
}
ipinfo = w800_ap_info(ssid, bssid, &channel, &rssi);
if(ipinfo == 0)
{
sprintf(disp,"RSSI:%d",rssi);
u8g2_DrawStr(&u8g2,80,8,disp);
}
u8g2_SetFont(&u8g2,u8g2_font_7x13_tr);
//获取时间
ret = csi_rtc_get_time(&g_rtc, &this_time);
sprintf(disp,"%04d-%02d-%02d",this_time.tm_year+1900,this_time.tm_mon+1,this_time.tm_mday);
u8g2_DrawStr(&u8g2,15,24,disp);
sprintf(disp,"%02d:%02d:%02d",this_time.tm_hour,this_time.tm_min,this_time.tm_sec);
u8g2_DrawStr(&u8g2,20,40,disp);
u8g2_SendBuffer(&u8g2);
aos_msleep(1000);
}
}
效果:
【感想】这块板的学习真的是吃力,慢慢的增加功能中,期待早点完成!加油!!!