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 GPIO
	
  InitLCD();            //初始化屏幕
  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();            //连接WIFI
	
	buff=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/PASSWORD
	InfSsidSet("SSID",4);    /* set ssid */
	InfKeySet(0, "PASSWORD",8);  /* set pw */

	InfEncModeSet(PARAM_ENC_MODE_AUTO);
	InfConTryTimesSet(0);                       /* set trytime */	
	InfWiFiStart();

	//Waiting for connect success
	OSSemPend(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 terminator

	 if (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_region
    
    ROM  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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js —— 前后端的身份认证 之用 express 实现 JWT 身份认证

JWT的认识 什么是 JWT JWT&#xff08;英文全称&#xff1a;JSON Web Token&#xff09;是目前最流行的跨域认证解决方案。 JWT 的工作原理 总结&#xff1a;用户的信息通过 Token 字符串的形式&#xff0c;保存在客户端浏览器中。服务器通过还原 Token 字符串的形式来认证用…

idea2024 nacos中文报错

idea2024 nacos中文报错 报错提示为&#xff1a;Input length 1 报错原因&#xff1a;项目启动编码与nacos编码不一致。 处理方式 添加启动参数utf8修改项目编码格式为utf8 修改idea.vmoptions Help -> Edit Custom 添加一行&#xff1a;-Dfile.encodingUTF-8

解决LabVIEW通过OPC Server读取PLC地址时的错误180121602

在使用LabVIEW通过OPC Server读取PLC地址时&#xff0c;若遇到错误代码180121602&#xff0c;建议检查网络连接、OPC Server和PLC配置、用户权限及LabVIEW设置。确保网络畅通&#xff0c;正确配置OPC变量&#xff0c;取消缓冲设置以实时读取数据&#xff0c;并使用诊断工具验证…

项目9-网页聊天室2(登录)

0.前端知识储备 Ajax请求中的async:false/true的作用 - front-gl - 博客园 (cnblogs.com) 01.前端页面展示 02.后端代码 2.1 CONTROLLER RequestMapping("/login")public Result login(String username, String password, HttpSession httpSession){User user …

macOS Monterey 12.7.5 (21H1222) Boot ISO 原版可引导镜像下载

macOS Monterey 12.7.5 (21H1222) Boot ISO 原版可引导镜像下载 5 月 13 日凌晨&#xff0c;macOS Sonoma 14.5 发布&#xff0c;同时带来了 macOS Ventru 13.6.7 和 macOS Monterey 12.7.5 安全更新。 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#x…

windows上pycharm调试streamlit应用

windows上pycharm调试streamlit应用 开发环境: PyCharm 2023.3.5 (Professional Edition) windows10 conda(python3.11.7) streamlit1.33.0 创建应用 app.py import streamlit as stst.header("hello") st.write("this is a streamlit demo")启动应…

使用Python探究OpenAI API

谁没听说过OpenAI?这家人工智能研究实验室因其著名的产品ChatGPT而改变了世界。它改变了AI实施领域&#xff0c;许多公司现在急于成为下一大热点。 尽管竞争激烈&#xff0c;OpenAI仍然是任何生成式AI业务需求的首选公司&#xff0c;因为它拥有最好的模型和持续的支持。该公司…

【Jmeter】使用Jmeter进行接口测试、跨线程组获取参数

Jmeter接口测试 Jmeter设置成中文实操练习-跨线程组提取参数&#xff0c;使用值HTTP请求默认值&HTTP信息头管理器 相信打算从事测试工程师的同学们&#xff0c;肯定对Jmeter是耳熟能详的。使用Jmeter可以进行接口测试、性能测试、压力测试等等&#xff1b;这个章节介绍如何…

【机器学习论文阅读笔记】Robust Recovery of Subspace Structures by Low-Rank Representation

前言 终于要轮到自己汇报了好崩溃。。盯着论文准备开始做汇报ppt感觉一头乱麻&#xff0c;决定还是写博客理清思路再说吧 参考资料&#xff1a; 论文原文&#xff1a;arxiv.org/pdf/1010.2955 RPCA参考文章&#xff1a;RPCA - 知乎 (zhihu.com) 谱聚类参考文章&#xff1a…

Ubuntu 安装 LibreOffice

1. 删除预安装的LibreOffice Ubuntu 和其他的 Linux 发行版带有预安装的 LibreOffice。这可能不是最新的&#xff0c;这是因为发行版有特定的发行周期。在进行新安装之前&#xff0c;你可以通过以下命令删除 Ubuntu 及其衍生发行版中的的旧版本。 sudo apt remove –purge li…

Java进阶学习笔记2——static修饰成员变量

static&#xff1a; 叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量按照有无static修饰&#xff0c;分为两种&#xff1a; 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机中只有一份&#xff0c;会被类的全部对象共享。静态成员变量。 实…

FL Studio2025新功能大揭秘,你准备好了吗?

FL Studio&#xff0c;常被音乐制作者亲切地称为“水果”编曲软件&#xff0c;是比利时的Image-Line公司研发的一款完整的软件音乐生产环境或数字音频工作站&#xff08;DAW&#xff09;。自从1997年推出以来&#xff0c;它已经成为全世界众多电子音乐制作者和DJ的首选工具&…

信息学奥赛初赛天天练-10-组合数学-排列组合-一次彻底搞懂分组分配问题

更多资源请关注纽扣编程微信公众号 平均分组 是指将所有的元素分成所有组元素个数相等或部分组元素个数相等&#xff0c;即m个不同的元素平均分成n个组&#xff0c;有多少种分组方法 由于是平均分组&#xff0c;分组选择元素时会出现重复&#xff0c;因此结果需要除以A(n,n…

C++的数据结构(十八):并查集

并查集&#xff08;Union-Find&#xff09;是一种用于处理一些不交集&#xff08;Disjoint Sets&#xff09;问题的数据结构。它主要支持两种操作&#xff1a;合并集合&#xff08;Union&#xff09;和查找元素所属集合&#xff08;Find&#xff09;。在解决诸如连通性问题、网…

【Linux】POSIX线程库——线程控制

目录 1.线程创建方法 例&#xff1a;多线程创建 2.线程终止 2.1 return nulptr; 2.2 pthread_exit(nullptr); 3. 线程等待 3.1 等待原因 3.2 等待方法 线程终止的返回值问题 4.线程取消 5. 线程分离 5.1 分离原因 5.2 分离方法 6.封装线程 用的接口是POSIX线程库…

读人工智能时代与人类未来笔记13_网络57

1. jun背控制 1.1. 威慑的目的是通过威胁发动盒站来防止盒站 1.2. jun背控制的目的是通过限制甚至废除57&#xff08;或57类别&#xff09;本身来防止盒站真 1.2.1. 与盒不扩散相配合&#xff0c;以一整套详尽的条约、技术保障措施、监管和其他控制机制为支撑&#xff0c;所…

如何生成Github Badge徽章图标

如何生成徽章Badge 什么是徽章(Badge)生成小徽章shields网站开源项目的徽章lib版本徽章代码测试覆盖度开源协议Github workflow的徽章 开源代码实践效果py-enumjs-enumerate 什么是徽章(Badge) 在开源项目的README中&#xff0c;经常会见到一些徽章(Badge)小图标&#xff0c;如…

ViLT学习

多模态里程碑式的文章&#xff0c;总结了四种多模态方法&#xff0c;根据文字和图像特征特征抽取方式不通。 文章的贡献主要是速度提高了&#xff0c;使用了数据增强&#xff0c;文本的mask 学习自b站朱老师的论文讲解

无线领夹麦克风哪个品牌好?无线麦克风品牌排行榜前十名推荐

​在当今的数字化浪潮中&#xff0c;个人声音的传播和记录变得尤为重要。无论是会议中心、教室讲台还是户外探险&#xff0c;无线领夹麦克风以其卓越的便携性和连接稳定性&#xff0c;成为了人们沟通和表达的首选工具。面对市场上琳琅满目的无线麦克风选择&#xff0c;为了帮助…

小程序多端框架目前所遇问题记录

一、wx.openLocation兼容 1、申请腾讯地图key 2、配置LBS SDK&#xff0c;选择SDK最新版本 3、调用接口&#xff0c;name和address必须输入&#xff0c;不然要报错 uni.openLocation({latitude: Number(this.info.latitude),longitude: Number(this.info.longitude),name:this…