NL6621 实现获取天气情况

news2024/10/5 13:51:08

一、主要完成的工作

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

弱监督语义分割-对CAM的生成过程进行改进3

三、擦除图像高响应部分以获取更多的分割领域 ECS-Net: Improving Weakly Supervised Semantic Segmentation by Using Connections Between Class Activation Maps&#xff08;ICCV,2021&#xff09; 1.引言 我们首先从图像中擦除高响应区域&#xff0c;并生成这些擦除图像…

数据防泄露解决方案分享

在当今高度数字化和互联的商业环境中&#xff0c;数据防泄密已成为企业保护财产、维护客户隐私和遵守合规要求的重要一环。数据防泄密不仅关乎企业的经济利益&#xff0c;更涉及用户个人信息安全、商业机密保护以及国家安全等核心问题。能做好数据防泄露&#xff0c;对于提升企…

【简单介绍下爬山算法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

AIGC:AI整活!万物皆可建筑设计

在过去的一年里 AI设计爆火 各行业纷纷将之用于工作中 同时不少网友也在借助它整活 万物皆可设计 甲方骂我方案像屎一样 于是我就回馈他屎一样的方案 他有点惊喜&#xff0c;但是没话 不是吧&#xff0c;随便找了个充电头图片 也能生成建筑设计&#xff01;这都能行 鸟…

【EasyX】快速入门——消息处理,音频

1.消息处理 我们先看看什么是消息 1.1.获取消息 想要获取消息,就必须学会getmessage函数 1.1.1.getmessage函数 有两个重载版本,它们的作用是一样的 参数filter可以筛选我们需要的消息类型 我们看看参数filter的取值 当然我们可以使用位运算组合这些值 例如,我们…

React-router 最佳实践

使用的是 BrowserRouter&#xff0c;Routes 和 Route&#xff0c;这是 react-router-dom v5 和 v6 都支持的 API。这种方式的优点是路由配置和应用的其它部分是紧密集成的&#xff0c;这使得路由配置更加直观和易于理解 // router/index.js import { BrowserRouter as Router,…

使用 Docker 部署 Jenkins 并设置初始管理员密码

使用 Docker 部署 Jenkins 并设置初始管理员密码 每一次开始&#xff0c;我都特别的认真与胆怯&#xff0c;是因为我期待结局&#xff0c;也能够不会那么粗糙&#xff0c;不会让我失望&#xff0c;所以&#xff0c;就多了些思考&#xff0c;多了些拘束&#xff0c;所以&#xf…

基于YOLO系列算法(YOLOv5、YOLOv6、YOLOv8以及YOLOv9)和Streamlit框架的行人头盔检测系统

摘要 本文基于最新的基于深度学习的目标检测算法 (YOLOv5、YOLOv6、YOLOv8)以及YOLOv9) 对头盔数据集进行训练与验证&#xff0c;得到了最好的模型权重文件。使用Streamlit框架来搭建交互式Web应用界面&#xff0c;可以在网页端实现模型对图像、视频和实时摄像头的目标检测功能…

Error:(6, 43) java: 程序包org.springframework.data.redis.core不存在

目录 一、在做SpringBoot整合Redis的项目时&#xff0c;报错&#xff1a; 二、尝试 三、解决办法 一、在做SpringBoot整合Redis的项目时&#xff0c;报错&#xff1a; 二、尝试 给依赖加版本号&#xff0c;并且把版本换了个遍&#xff0c;也不行&#xff0c;也去update过ma…

基于springboot+vue的在线考试系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

web自动化之PO模式

PO模式 1、为什么需要PO思想&#xff1f; 首先我们观察和思考一下&#xff0c;目前我们写的作业脚本的问题&#xff1a; 元素定位和操作动 作写到一起了&#xff0c;这就就会用导致一个问题&#xff1a; UI的页面元素比较容易变化的&#xff0c;所以元素定位和脚本操作写到一…

【Sync FIFO介绍及基于Verilog的实现】

Sync FIFO介绍及实现 1 Intro2 Achieve2.1 DFD2.2 Intf2.3 Module 本篇博客介绍无论是编码过程中经常用到的逻辑–FIFO&#xff1b;该FIFO是基于单时钟下的同步FIFO&#xff1b; FiFO分类&#xff1a;同步FiFO VS 异步FiFO&#xff1b; 1 Intro FIFO可以自己实现&#xff0c;但…

如何安全地进行隔离网数据导出,提升文件流转效率?

隔离网&#xff08;也称为隔离区或DMZ&#xff0c;即Demilitarized Zone&#xff09;是一种网络安全措施&#xff0c;用于将内部网络与外部网络&#xff08;如互联网&#xff09;隔离开来&#xff0c;以减少安全风险。隔离网数据导出通常需要采取一些特殊的安全措施来确保数据的…

pod介绍之 容器分类与重启策略

目录 一 pod 基础概念介绍 1&#xff0c;pod 是什么 2&#xff0c;Pod使用方式 3&#xff0c;如何解决一个pod 多容器通信 4&#xff0c;pod 组成 5&#xff0c; k8s 中的 pod 二 pause容器 1&#xff0c;pause容器 是什么 2&#xff0c;pause容器作用 3&#xff…

【嵌入式Linux】Cmake、makefile、Cmakelist

记录嵌入式 linux环境下的编译方式 测试之前确保你的 Ubuntu 机器上安装了Gcc和cmake 1. 编译有以下几种方式 在 Linux系统下&#xff0c;编译一个 .c文件可以有以下几种方式&#xff1a; 直接用 Gcc 编译器编译为可执行文件编写Makefile文件&#xff0c;使用 make 指令&…

[LEECODE每日一题]找出最具竞争力的子序列

好久没有更新CSDN了,这段时间学业压力比较忙所以没有时间写,今天有时间来看看LEECODE的每日一题,碰巧刷到了这样一道题; 题目给的很清楚,既输入一个序列要求给定一个子序列长度,让其输出为一个最有"竞争力"的序列,说白了就是在所有子序列比较中,处于靠前位置的元素要…

Kafka之【生产消息】

消息&#xff08;Record&#xff09; 在kafka中传递的数据我们称之为消息&#xff08;message&#xff09;或记录(record)&#xff0c;所以Kafka发送数据前&#xff0c;需要将待发送的数据封装为指定的数据模型&#xff1a; 相关属性必须在构建数据模型时指定&#xff0c;其中…

第2天 搭建安全拓展_小迪网络安全笔记

1.常见搭建平台脚本使用: 例如 phpstudy IIS Nginx(俗称中间件): 什么是中间件: 中间件是介于应用系统和系统软件之间的一类软件&#xff0c;它使用系统软件所提供的基础服务&#xff08;功能&#xff09;&#xff0c;衔接网络上应用系统的各个部分或不同的应用&#…

论文阅读--ViLD

现在的目标检测数据集&#xff0c;标注的类别都很有限&#xff0c;如图中的base categories&#xff0c;只能检测出toy而不能检测出细分类别&#xff0c;能不能在现有数据集的基础上&#xff0c;不额外打标注&#xff0c;就能直接检测细分物体&#xff1f; &#xff08;a&#…

订餐系统总结、

应用层&#xff1a; SpringBoot:快速构建Spring项目&#xff0c;采用“约定大于配置”的思想&#xff0c;简化Spring项目的配置开发。 SpringMvc&#xff1a;Spring框架的一个模块&#xff0c;springmvc和spring无需通过中间整合层进行整合&#xff0c;可以无缝集成。 Sprin…