NL6621 实现获取天气情况
一、主要完成的工作
1、建立TASK
INT32 main(VOID)
{/* system Init */SystemInit();OSTaskCreate(TestAppMain, NULL, &sAppStartTaskStack[NST_APP_START_TASK_STK_SIZE -1], NST_APP_TASK_START_PRIO); OSStart();return 1;
}
2、application test task
VOID TestAppMain(VOID * pParam)
{demo_gpio_init(); //初始化LCD GPIOInitLCD(); //初始化屏幕clrScr(VGA_BLACK); //清屏GUI_Write16CnCharMatrix(0,160,"初始化...... ",VGA_BLUE,VGA_BLACK);pLinkUpSem = OSSemCreate(0);InfSysEvtCBSet(AppEvtCallBack);InfLoadDefaultParam();sys_thread_new("weatherThread", weatherThread, NULL, NST_TEST_APP_TASK_STK_SIZE, TCPIP_THREAD_PRIO + 4);while (1) { /* Task body, always written as an infinite loop. */OSTimeDly(20);DBGPRINT_LWIP(DEBUG_INFO, "TestApp RxDataCnt=%d, SendDataCnt=%d.\n", RxDataCnt, SendDataCnt);}}
3、void weatherThread(void *arg)
void weatherThread(void *arg)
{char* buff,*http_data;DBGPRINT(DEBUG_TRACE, " ********************** weatherThread ********************* \n\r");connectWifi(); //连接WIFIbuff=TestWeatherApi(); //从网页API获得天气数据printf("%s\r\n", buff);http_data=https_get_data(buff); //获得JSON部分mem_free(buff);printf("[http_data]:%s\r\n", http_data);extract_all_from_json(http_data); //解析JSON数据mem_free(http_data);//LCD显示GUI_Write16CnCharMatrix(5,20,"日期:",VGA_WHITE,VGA_BLACK);GUI_Write16CnCharMatrix(53,20,city_weather.date,VGA_BLUE,VGA_BLACK);GUI_Write16CnCharMatrix(5,60,"城市:",VGA_WHITE,VGA_BLACK);GUI_Write16CnCharMatrix(53,60,city_weather.city,VGA_BLUE,VGA_BLACK);GUI_Write16CnCharMatrix(5,100,"温度:",VGA_WHITE,VGA_BLACK);GUI_Write16CnCharMatrix(53,100,city_weather.tem,VGA_BLUE,VGA_BLACK);while(1){OSTimeDly(500);}
}
4、void connectWifi(void)
void connectWifi(void)
{UINT8 Err;InfWiFiStop();OSTimeDly(10);InfNetModeSet(PARAM_NET_MODE_STA_BSS); InfAuthModeSet(PARAM_AUTH_MODE_WPA2PSK);//此处根据实际修改SSID/PASSWORDInfSsidSet("SSID",4); /* set ssid */InfKeySet(0, "PASSWORD",8); /* set pw */InfEncModeSet(PARAM_ENC_MODE_AUTO);InfConTryTimesSet(0); /* set trytime */ InfWiFiStart();//Waiting for connect successOSSemPend(pLinkUpSem, 0, &Err);
}
5、char* TestWeatherApi(void)
#define HTTP_HOST "v1.yiketianqi.com"
#define HTTP_URL "api?unescape=1&version=v61&appid=此处替换自己的ID&appsecret=此处替换自己的key"
#define HOST_PORT "80"
static const char* REQUEST = "GET " "/%s" " HTTP/1.1\r\n"
"Host: " "%s" ":" HOST_PORT "\r\n"
"User-Agent: AiPi-DSL_Dashboard\r\n"
"\r\n";char* TestWeatherApi(void)
{char* https_request_handle = mem_malloc(512);char *recv_data;int sock; UINT32 TargetIp;struct sockaddr_in server_addr;ip_addr_t hostip;netconn_gethostbyname(HTTP_HOST, &hostip);DBGPRINT_LWIP(DEBUG_TRACE, "HTTP_HOST:%s,IP:%d\n",HTTP_HOST,hostip.addr);TargetIp =hostip.addr;DBGPRINT_LWIP(DEBUG_TRACE, "TargetIp:%d\n",TargetIp);/* 分配用于存放接收数据的缓冲 */recv_data = mem_malloc(1024*4);if (recv_data == NULL){DBGPRINT_LWIP(DEBUG_ERROR, "TCP Client memory ERR\n");return 0;}/* 一、创建一个socket,类型是SOCKET_STREAM,TCP类型 */if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1){/* 创建socket失败 */DBGPRINT_LWIP(DEBUG_ERROR, "TCP Client Socket error\n");/* 释放接收缓冲 */mem_free(recv_data);return 0;}/* 初始化预连接的服务端地址 */server_addr.sin_family = AF_INET;server_addr.sin_port = htons(atoi(HOST_PORT)); server_addr.sin_addr.s_addr= TargetIp;memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));/* 二、连接到服务端 */if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1){/* 连接失败 */DBGPRINT_LWIP(DEBUG_TRACE, "TCP Client connect error !");lwip_close(sock);///*释放接收缓冲 */mem_free(recv_data);return 0;//OSTimeDly(2000);}else{DBGPRINT_LWIP(DEBUG_TRACE, "TCP Client connect OK!\n");}memset(https_request_handle, 0, 256);sprintf(https_request_handle, REQUEST, HTTP_URL, HTTP_HOST);/* 三、http请求 */if(write(sock, https_request_handle, strlen(https_request_handle))<0){DBGPRINT_LWIP(DEBUG_TRACE, "http write error !");close(sock);}/* 四、读http返回结果 */read(sock, recv_data, 1024*4);shutdown(sock, SHUT_RDWR);close(sock);mem_free(https_request_handle);return recv_data;
}
6、static char* https_get_data(const char* https_request_data)
static char* https_get_data(const char* https_request_data)
{char* request_data = https_request_data;static char* https_data;char* request_value;size_t i;https_data = mem_malloc(1024*3);memset(https_data, 0, 1024*3);request_data += 2;request_value = strtok(request_data, "\n");for (i = 0; i < 15; i++){if (i==14) strcpy(https_data, request_value);memset(request_value, 0, strlen(request_value));request_value = strtok(NULL, "\n");}return https_data;
}
7、json解析
void extract_item_from_json(const char *json_str,char *itemname,char *target)
{char *start = strstr(json_str, itemname); // 查找"cityEn":" char *end;size_t len=20;char item[20]; // +1 for null terminatorif (start != NULL) { start += strlen(itemname); // 跳过itemname end = strchr(start, '"'); // 查找下一个双引号 if (end != NULL) { // 提取 len = end - start; strncpy(item, start, len); item[len] = '\0'; // 添加字符串结束符 printf("Item: %s\n", item); strncpy(target, item, len);target[len] = '\0'; // 添加字符串结束符 } } else { printf("Item[%s] not found in the JSON string.\n",itemname); }
}void extract_all_from_json(const char *json_str)
{extract_item_from_json(json_str,"\"cityEn\":\"",city_weather.city);extract_item_from_json(json_str,"\"tem\":\"",city_weather.tem);extract_item_from_json(json_str,"\"date\":\"",city_weather.date);
}
二、说明
1、NL6621 SDK二次开发,还是用KEIL4吧,KEIL5编译太慢了。
2、没用CJSON,不是不想用,尝试了好长时间还是用不了CJSON,最后JSON自己解析了。
3、编译的bin文件,不要超过192k,否则没法烧录,编译也会失败。
4、scatter_loader.scat没有为适应NuDevTool ver1.11.0.exe修改,需要用bootTool.exe或bootTool_Ack_0822.exe烧录。
; 0x10100-0x40000 for download SRAM FW(including 32KB for customer), interrupt vector locate in 0x10100
LOAD_REGION 0x00010100 0x0002FF00 { ; load region size_regionROM 0x00010100 0x0002FF00 { ; load address = execution address*.o (RESET, +First) ; interrupt vector table, do not change it*(InRoot$$Sections).ANY (+RO)}
5、需要用NuDevTool ver1.11.0.exe烧录工具将字库gb2312_80.bin烧录到0xB0000,不烧录字库运行不了。
#define FLASH_ADDR_BASE 0xB0000
6、源码链接:
链接:https://pan.baidu.com/s/1KQwfkdXDj2R9A_3XGqbgWA?pwd=cmpn
提取码:cmpn
相关文章:

NL6621 实现获取天气情况
一、主要完成的工作 1、建立TASK INT32 main(VOID) {/* system Init */SystemInit();OSTaskCreate(TestAppMain, NULL, &sAppStartTaskStack[NST_APP_START_TASK_STK_SIZE -1], NST_APP_TASK_START_PRIO); OSStart();return 1; } 2、application test task VOID TestAp…...
SpringCloud配置文件bootrap
解决方案: 情况一、SpringBoot 版本 小于 2.4.0 版本,添加以下依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId> </dependency> 情况二、SpringBoot…...
经典面试题:进程、线程、协程开销问题,为什么进程切换的开销比线程的大?
上下文切换的过程? 上下文切换是操作系统在将CPU从一个进程切换到另一个进程时所执行的过程。它涉及保存当前执行进程的状态并加载下一个将要执行的进程的状态。下面是上下文切换的详细过程: 保存当前进程的上下文: 当操作系统决定切换到另…...

鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法
鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发,以后也会记录一些关于鸿蒙相关的问题和解决方法,希望能帮助到大家。 总的来说一般有下面这样的报错 报错一: Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…...

QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139136356 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
设计一套Kafka到RocketMQ的双写+双读技术方案,实现无缝迁移!
设计一套Kafka到RocketMQ的双写双读技术方案,实现无缝迁移! 1、背景2、方案3、具体逻辑 1、背景 假设你们公司本来线上的MQ用的主要是Kafka,现在要从Kafka迁移到RocketMQ去,那么这个迁移的过程应该怎么做呢?应该采用什…...
Mysql下Limit注入方法(此方法仅适用于5.0.0<mysql<5.6.6的版本)
SQL语句类似下面这样:(此方法仅适用于5.0.0<mysql<5.6.6的版本) SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT (注入点) 问题的关键在于,语句中有 order by 关键字,mysql…...
Makefile学习笔记15|u-boot顶层Makefile01
Makefile学习笔记15|u-boot顶层Makefile01 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。 这里是目录 版本号信息 # SPDX-License-Identifier: GPL-2.0VERSION 2024 PATCHLEVEL 01 SUBLEVEL EXTRAVERSION -rc4 NAME 这里定义了u-bo…...

C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记
C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记 ——2024-05-26 夜 code review! 参考博文 C++笔记之获取当前本地时间以及utc时间...
leetcode338-Counting Bits
题目 给你一个整数 n ,对于 0 < i < n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n 1 的数组 ans 作为答案。 示例 1: 输入:n 2 输出:[0,1,1] 解释: 0 --> 0 1 --&…...
sql server怎么存储图片
sql server怎么存储图片 在SQL Server中,可以使用VARBINARY数据类型来存储图片。以下是一个简单的例子,展示了如何将图片存储到数据库中,并从数据库中检索出来。 首先,创建一个表来存储图片数据: CREATE TABLE Image…...

大模型提示词Prompt学习
引言 关于chatGPT的Prompt Engineer,大家肯定耳朵都听起茧了。但是它的来由?,怎么能用好?很多人可能并不觉得并不是一个问题,或者说认定是一个很快会过时的概念。但其实也不能说得非常清楚(因为觉得没必要深…...
蓝桥杯python组备赛指南
文章目录 前言刷题网站idle操作常用标准库mathdatetime 常见Q&A 前言 最近结束了比赛,我对比赛的过程进行了详细的复盘,并计划撰写一篇文章。这篇文章旨在为准备参加蓝桥杯的学弟学妹们提供帮助,我希望我的文章和笔记能对你们有所裨益。…...

架构师系列-定时任务解决方案
定时任务概述 在很多应用中我们都是需要执行一些定时任务的,比如定时发送短信,定时统计数据,在实际使用中我们使用什么定时任务框架来实现我们的业务,定时任务使用中会遇到哪些坑,如何最大化的提高定时任务的性能。 我…...

新计划,不断变更!做自己,接受不美好!猪肝移植——早读(逆天打工人爬取热门微信文章解读)
时间不等人 引言Python 代码第一篇 做自己,没有很好也没关系第二篇结尾 引言 新计划: 早上一次性发几个视频不现实 所以更改一下 待后面有比较稳定的框架再优化 每天早上更新 早到8点 晚到10点 你刚刚好上班或者上课 然后偷瞄的看两眼 学习一下 补充知…...

【数据结构】二叉树-堆(上)
个人主页~ 二叉树-堆 一、树的概念及结构1、概念2、相关概念3、树的表示4、树的实际应用 二、二叉树的概念和结构1、概念2、特殊二叉树3、二叉树的性质4、二叉树的存储结构(1)顺序存储(2)链式存储 三、二叉树的顺序结构以及实现1、…...
【Spring Boot】在项目中使用Spring AI
Spring AI是Spring框架中用于集成和使用人工智能和机器学习功能的组件。它提供了一种简化的方式来与AI模型进行交互。下面是一个简单的示例,展示了如何在Spring Boot项目中使用Spring AI。 步骤 1: 添加依赖 首先,在pom.xml文件中添加Spring AI的依赖&…...
【java程序设计期末复习】chapter3 运算符、表达式和语句
运算符、表达式和语句 Java提供了丰富的运算符,如算术运算符、关系运算符、逻辑运算符、位运算符等。 Java语言中的绝大多数运算符和C语言相同,基本语句,如条件分支语句、循环语句等也和C语言类似,因此,本章就主要知识…...
【建议收藏】30个较难Python脚本,纯干货分享
本篇较难,建议优先学习上篇 ;20个硬核Python脚本-CSDN博客 接上篇文章,对于Pyhon的学习,上篇学习的结束相信大家对于Pyhon有了一定的理解和经验,学习完上篇文章之后再研究研究剩下的30个脚本你将会有所成就&…...

01-05.Vue自定义过滤器
目录 前言过滤器的概念过滤器的基本使用给过滤器添加多个参数 前言 我们接着上一篇文章01-04.Vue的使用示例:列表功能 来讲。 下一篇文章 02-Vue实例的生命周期函数 过滤器的概念 概念:Vue.js 允许我们自定义过滤器,可被用作一些常见的文本…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...