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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/332377.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外卖小程序开发指南:从源码开始构建高效的外卖平台

今天&#xff0c;笔者将为您详细讲解如何从源码开始构建一个高效的外卖小程序&#xff0c;帮助您快速进入这一蓬勃发展的市场。 一、需求分析与设计 需求分析包括&#xff1a; 1.用户需求 2.市场需求 3.技术需求 二、前端开发 以下是开发步骤&#xff1a; -使用微信开发…

【论文阅读】Prompt Fuzzing for Fuzz Driver Generation

文章目录 摘要一、介绍二、设计2.1、总览2.2、指导程序生成2.3、错误程序净化2.3.1、执行过程净化2.3.2、模糊净化2.3.3、覆盖净化 2.4、覆盖引导的突变2.4.1、功率调度2.4.2、变异策略 2.5、约束Fuzzer融合2.5.1、论据约束推理2.5.1、模糊驱动融合 三、评估3.1、与Hopper和OSS…

使用梦畅闹钟,结合自定义bat、vbs脚本等实现定时功能

梦畅闹钟-每隔一段时间运行一次程序 休息五分钟bat脚本&#xff08;播放音乐视频&#xff0c;并锁屏&#xff09; chcp 65001 echo 回车开始休息5分钟 pause explorer "https://www.bilibili.com/video/BV1RT411S7Tk/?p47" timeout /t 3 /nobreak rundll32.exe use…

变分自动编码器(VAE)深入理解与总结

本文导航 0 引言1 起源1.1 自编码器的任务定义1.2 自编码器存在的问题1.3 VAE的核心思路 2 VAE的建模过程2.1 VAE的任务定义2.2 真实分布 ϕ \phi ϕ是什么&#xff0c;为什么要逼近这个分布的参数&#xff0c;如何做&#xff1f;2.3 “重参数化&#xff08;Reparameterization…

前端开发工程师——数据可视化

canvas canvas绘制线段 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthd…

渗透工具CobaltStrike工具的下载和安装

一、CobalStrike简介 Cobalt Strike(简称为CS)是一款基于java的渗透测试工具&#xff0c;专业的团队作战的渗透测试工具。CS使用了C/S架构&#xff0c;它分为客户端(Client)和服务端(Server)&#xff0c;服务端只要一个&#xff0c;客户端可有多个&#xff0c;多人连接服务端后…

CST初级教程 六

本篇教程将以差分线为例&#xff0c;实例讲解参数化建模及参数扫描。 一 Project创建 点击New and Recent&#xff0c;再点击New Template 点击MICROVAVES & RF/OTICAL&#xff0c;然后在选中Circuit & Components。 点击对话框中Next按钮&#xff0c;在弹出对话框…

WPF之容器标签之Canvas布局标签

Canvas: 定义一个区域&#xff0c;可在其中使用相对于 Canvas 区域的坐标以显式方式来定位子元素。 实例 可以在子标签使用Canvas属性设置定位 <Canvas Width"500" Height"300"><StackPanel Width"100" Height"100"Backgro…

【C#】未能加载文件或程序集“CefSharp.Core.Runtime.dll”或它的某一个依赖项。找不到指定的模块。

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景错误提示分析原因解决方法Chromium知识点相关文章 背景 最近在使…

c语言:模拟strlen(三种方法)最全版本

1.计数的方法 #include <stdio.h> #include <assert.h> int my_strlen(const char * str)//const的使用优化 {int count0;assert(str)while(*str){count;str;}return count; } 2.用指针的方法&#xff08;指针-指针&#xff09; #include <stdio.h> #incl…

unity开发Hololens 制作滑动框

一定要做到最后一步&#xff0c;才会有效果 1、创建空物体 ,并添加组件 创建空物体 命名ScrollingObjectCollection&#xff0c; 添加组件如下图 下面是各个组件展开的内容 2、在ScrollingObjectCollection 下面创建两个空物体&#xff0c;分别命名Container、Clipping…

MT3040 矩形覆盖

代码&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll; const int N 3e5 10; int n, ans, d, w; stack<int> s; // 单调栈 // 如果楼高度类似121&#xff08;凸&#xff0c;两边相等&#xff0c;中间比两边的大&#xff09;&…

学 Python 具体能干什么?

Python 是一种功能强大、用途广泛的编程语言&#xff0c;因其简洁易读的语法和丰富的库生态系统而备受欢迎。学习 Python后&#xff0c;你可以从事以下几方面的工作&#xff1a; 1. Web 开发 Python 有很多流行的 Web 框架&#xff0c;如&#xff1a; Django&#xff1a;一个…

HTML与CSS的学习

什么是HTML,CSS&#xff1f; HTML(HyperText Markup Language):超文本标记语言。 超文本:超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息&#xff0c;还可以定义图片、音频、视频等 标记语言:由标签构成的语言 >HTML标签都是预定义好的。例如:使用<a>…

2024/05/25学习记录

1、面经复习&#xff1a;前端广度 2、代码随想录刷题&#xff1a;动态规划 3、rosebush 完成input组件基础

HCIP的学习(22)

BGP优化 [r1-bgp]peer 12.0.0.2 default-route-advertise ---BGP下放缺省路由&#xff0c;无论本地的路由表中是否存在缺省路由&#xff0c;都会向对等体下发一条下一跳为本地的缺省路由&#xff0c;从而减少网络中路由数量&#xff0c;节省对等体的设备资源 BGP协议优先级 缺…

返回枚举类给前端

1. 前言 在实际开发过程中&#xff0c;前端的下拉框或者单选按钮的内容通常的需要和后端匹配的&#xff0c;故一般会由后端将下拉框的内容或单选框的内容传给前端&#xff0c;而这些内容在后端一般是由枚举类存储的&#xff0c;如果后端直接返回枚举类&#xff0c;返回结果将会…

idea2023的git从dev分支合并到主分支master

1.本地项目切换到主分支master 右键项目-git-Branches 依次点击项目-Remote-Origin-master-CheckOut 现在你的idea中的这个项目就是远程master分支的代码了。 2.合并dev分支到master 右击项目-git-Merge 选择origin-dev 点击Merge按钮&#xff0c;此时只是合并到本地的maste…

小程序的深层了解

一:wxss的全局样式和局部样式 写在文件上,第一个路径会执行全局和局部自带的wxss给wxml,会执行wxml,会执行json和js. 无论那个文件都会执行文件夹内的和外部的app.wxss,但是如果有一样的属性,则看属性的权重,权重一样,则设置局部样式. 二:全局配置 wx:key"写的是data内…

AI数据面临枯竭

Alexandr Wang&#xff1a;前沿研究领域需要大量当前不存在的数据&#xff0c;未来会受到这个限制 Alexandr Wang 强调了 AI 领域面临的数据问题。 他指出&#xff0c;前沿研究领域&#xff08;如多模态、多语言、专家链式思维和企业工作流&#xff09;需要大量当前不存在的数…