当前位置: 首页 > news >正文

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

解决方案&#xff1a; 情况一、SpringBoot 版本 小于 2.4.0 版本&#xff0c;添加以下依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId> </dependency> 情况二、SpringBoot…...

经典面试题:进程、线程、协程开销问题,为什么进程切换的开销比线程的大?

上下文切换的过程&#xff1f; 上下文切换是操作系统在将CPU从一个进程切换到另一个进程时所执行的过程。它涉及保存当前执行进程的状态并加载下一个将要执行的进程的状态。下面是上下文切换的详细过程&#xff1a; 保存当前进程的上下文&#xff1a; 当操作系统决定切换到另…...

鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法

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

QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139136356 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

设计一套Kafka到RocketMQ的双写+双读技术方案,实现无缝迁移!

设计一套Kafka到RocketMQ的双写双读技术方案&#xff0c;实现无缝迁移&#xff01; 1、背景2、方案3、具体逻辑 1、背景 假设你们公司本来线上的MQ用的主要是Kafka&#xff0c;现在要从Kafka迁移到RocketMQ去&#xff0c;那么这个迁移的过程应该怎么做呢&#xff1f;应该采用什…...

Mysql下Limit注入方法(此方法仅适用于5.0.0<mysql<5.6.6的版本)

SQL语句类似下面这样&#xff1a;&#xff08;此方法仅适用于5.0.0<mysql<5.6.6的版本&#xff09; SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT &#xff08;注入点&#xff09; 问题的关键在于&#xff0c;语句中有 order by 关键字&#xff0c;mysql…...

Makefile学习笔记15|u-boot顶层Makefile01

Makefile学习笔记15|u-boot顶层Makefile01 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长&#xff0c;谢谢。 这里是目录 版本号信息 # 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 &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0 --> 0 1 --&…...

sql server怎么存储图片

sql server怎么存储图片 在SQL Server中&#xff0c;可以使用VARBINARY数据类型来存储图片。以下是一个简单的例子&#xff0c;展示了如何将图片存储到数据库中&#xff0c;并从数据库中检索出来。 首先&#xff0c;创建一个表来存储图片数据&#xff1a; CREATE TABLE Image…...

大模型提示词Prompt学习

引言 关于chatGPT的Prompt Engineer&#xff0c;大家肯定耳朵都听起茧了。但是它的来由&#xff1f;&#xff0c;怎么能用好&#xff1f;很多人可能并不觉得并不是一个问题&#xff0c;或者说认定是一个很快会过时的概念。但其实也不能说得非常清楚&#xff08;因为觉得没必要深…...

蓝桥杯python组备赛指南

文章目录 前言刷题网站idle操作常用标准库mathdatetime 常见Q&A 前言 最近结束了比赛&#xff0c;我对比赛的过程进行了详细的复盘&#xff0c;并计划撰写一篇文章。这篇文章旨在为准备参加蓝桥杯的学弟学妹们提供帮助&#xff0c;我希望我的文章和笔记能对你们有所裨益。…...

架构师系列-定时任务解决方案

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

新计划,不断变更!做自己,接受不美好!猪肝移植——早读(逆天打工人爬取热门微信文章解读)

时间不等人 引言Python 代码第一篇 做自己&#xff0c;没有很好也没关系第二篇结尾 引言 新计划&#xff1a; 早上一次性发几个视频不现实 所以更改一下 待后面有比较稳定的框架再优化 每天早上更新 早到8点 晚到10点 你刚刚好上班或者上课 然后偷瞄的看两眼 学习一下 补充知…...

【数据结构】二叉树-堆(上)

个人主页~ 二叉树-堆 一、树的概念及结构1、概念2、相关概念3、树的表示4、树的实际应用 二、二叉树的概念和结构1、概念2、特殊二叉树3、二叉树的性质4、二叉树的存储结构&#xff08;1&#xff09;顺序存储&#xff08;2&#xff09;链式存储 三、二叉树的顺序结构以及实现1、…...

【Spring Boot】在项目中使用Spring AI

Spring AI是Spring框架中用于集成和使用人工智能和机器学习功能的组件。它提供了一种简化的方式来与AI模型进行交互。下面是一个简单的示例&#xff0c;展示了如何在Spring Boot项目中使用Spring AI。 步骤 1: 添加依赖 首先&#xff0c;在pom.xml文件中添加Spring AI的依赖&…...

【java程序设计期末复习】chapter3 运算符、表达式和语句

运算符、表达式和语句 Java提供了丰富的运算符&#xff0c;如算术运算符、关系运算符、逻辑运算符、位运算符等。 Java语言中的绝大多数运算符和C语言相同&#xff0c;基本语句&#xff0c;如条件分支语句、循环语句等也和C语言类似&#xff0c;因此&#xff0c;本章就主要知识…...

【建议收藏】30个较难Python脚本,纯干货分享

本篇较难&#xff0c;建议优先学习上篇 &#xff1b;20个硬核Python脚本-CSDN博客 接上篇文章&#xff0c;对于Pyhon的学习&#xff0c;上篇学习的结束相信大家对于Pyhon有了一定的理解和经验&#xff0c;学习完上篇文章之后再研究研究剩下的30个脚本你将会有所成就&…...

01-05.Vue自定义过滤器

目录 前言过滤器的概念过滤器的基本使用给过滤器添加多个参数 前言 我们接着上一篇文章01-04.Vue的使用示例&#xff1a;列表功能 来讲。 下一篇文章 02-Vue实例的生命周期函数 过滤器的概念 概念&#xff1a;Vue.js 允许我们自定义过滤器&#xff0c;可被用作一些常见的文本…...

WGAN-GP实战指南:从梯度惩罚到高质量数字图像生成

1. 为什么需要WGAN-GP&#xff1a;从GAN的痛点说起 第一次用传统GAN生成手写数字时&#xff0c;我盯着屏幕上一团模糊的像素点发呆——这跟我想象中的"以假乱真"相差甚远。后来才发现&#xff0c;这其实是GAN训练中典型的模式崩溃现象。传统GAN使用JS散度作为损失函数…...

SDMatte移动端优化思路:模型量化与轻量化部署探索

SDMatte移动端优化思路&#xff1a;模型量化与轻量化部署探索 1. 移动端AI部署的挑战与机遇 将大型AI模型部署到移动设备上一直是个技术难题。以SDMatte这样的专业抠图模型为例&#xff0c;原始版本动辄几百MB的模型大小和复杂的计算需求&#xff0c;很难直接在手机或平板上流…...

GLM-4.6V-Flash-WEB效果展示:智能识别华硕/戴尔/联想BIOS界面

GLM-4.6V-Flash-WEB效果展示&#xff1a;智能识别华硕/戴尔/联想BIOS界面 1. 引言&#xff1a;BIOS界面识别的技术挑战 面对不同品牌电脑的BIOS设置界面&#xff0c;即使是经验丰富的技术人员也常常感到头疼。华硕的UEFI界面、戴尔的BIOS配置、联想的设置菜单——每个厂商都有…...

LiP-MS—解锁以药找靶新利器

有限蛋白水解质谱&#xff08;Limited Proteolysis-Mass Spectrometry&#xff0c;Lip-MS&#xff09;作为无标记、原位、高通量的以药找靶技术&#xff0c;彻底打破传统技术壁垒&#xff0c;直接在细胞、组织等天然体系中&#xff0c;精准捕获药物结合的靶蛋白与结合位点&…...

调参不再玄学:手把手教你优化智能车(电磁组)舵机PD控制参数,告别‘画龙’

智能车电磁组舵机控制实战&#xff1a;从参数原理到赛道调优的完整指南 当你的智能车在直道上像喝醉一样左右摇摆&#xff0c;或者在弯道犹豫不决时&#xff0c;大多数问题都指向同一个核心——舵机控制参数设置不当。这不是魔法&#xff0c;而是一门可以通过系统方法掌握的科学…...

应对“中年危机”的前置策略:留学生入职第一天就该考虑的事情——如何建立你的“被动求职”网络?

在 2026 年的北美科技职场&#xff0c;拿到全职 Offer 签下字的那一刻&#xff0c;许多留学生会如释重负地认为自己终于进入了“保险箱”。然而&#xff0c;在残酷的宏观经济周期和快速迭代的 AI 浪潮面前&#xff0c;传统的“绝对稳定”早已不复存在。 无论是硅谷巨头&#xf…...

精选6款智能论文工具,支持AI降重与语言优化,有效降低重复率。

开头总结工具对比&#xff08;技能4&#xff09; &#xfffd;&#xfffd; 为帮助学生们快速选出最适合的AI论文工具&#xff0c;我从处理速度、降重效果和核心优势三个维度&#xff0c;对比了6款热门网站&#xff0c;数据基于实际使用案例&#xff1a; 工具名称 处理速度 降…...

Blender中ACES色彩空间的配置与优化指南

1. 为什么要在Blender中使用ACES色彩空间 第一次在Blender中渲染出图时&#xff0c;我总觉得色彩看起来怪怪的——明明在软件里看着很鲜艳的颜色&#xff0c;导出后却变得灰暗&#xff1b;不同设备上查看同一张图&#xff0c;色彩表现也各不相同。后来才发现&#xff0c;这其实…...

小白也能懂!Claude Code 中 Agent 和 Skill 到底有什么区别?

小白也能懂&#xff01;Claude Code 中 Agent 和 Skill 到底有什么区别&#xff1f; 你用 Claude Code 的时候&#xff0c;一定见过这两个词&#xff1a;Agent 和 Skill。 它们都能让 Claude 变得更"聪明"&#xff0c;但原理完全不同。搞混的人不在少数&#xff0c;包…...

红外遥控技术原理与电路设计实践

1. 红外遥控技术概述红外遥控技术自20世纪70年代问世以来&#xff0c;已经成为家电控制领域最成熟、应用最广泛的无线控制方案。作为一名电子工程师&#xff0c;我在多个家电项目中都深度应用过这项技术。它的核心原理其实很简单&#xff1a;通过红外发光二极管&#xff08;IRE…...