W801 實現獲取天氣情況

????????看了小安派(AiPi-Eyes 天氣站)的源碼,感覺用W801也可以實現。

一、部分源碼

main.c

#include "wm_include.h"
#include "Lcd_Driver.h"void UserMain(void)
{printf("\n user task \n");Lcd_Init();Lcd_Clear(RED);CreateWeatherTask();
}

?weather.c(該文件需保存為UTF8格式)

#include "Lcd_Driver.h"
#include "wm_include.h"
#include "LCD_calculate.h"
#include "cJSON.h"
#include "ctype.h"#define SSID		"SSID"
#define PASSWORD 	"PASSWORD"#define HTTPURL		"http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=此處需替換為自己的KEY"#define    DEMO_TASK_SIZE      2048
static tls_os_queue_t 	*weather_q = NULL;
static OS_STK 			WeatherTaskStk[DEMO_TASK_SIZE];extern int demo_connect_net(void *, ...);
extern int http_get_demo(void *, ...);/*** @brief** @param weather_data
*/
void cjson_get_weather(char* weather_data)
{cJSON * item = NULL;//cjson對象cJSON* root = cJSON_Parse(weather_data );if (!root) {//printf("Error before: [%s]\n",cJSON_GetErrorPtr());}else{Gui_DrawFont_GBK16(5,95,WHITE,RED,"                           ");item = cJSON_GetObjectItem(root, "city");			//城市Gui_DrawFont_utf8_3bytes_16(5,15,WHITE,RED,item->valuestring);item = cJSON_GetObjectItem(root, "cityEn");			//城市英文Gui_DrawFont_utf8_3bytes_16(40,15,WHITE,RED,item->valuestring);item = cJSON_GetObjectItem(root, "wea");Gui_DrawFont_utf8_3bytes_16(5,35,WHITE,RED,"天氣:");Gui_DrawFont_utf8_3bytes_16(60,35,WHITE,RED,item->valuestring);item = cJSON_GetObjectItem(root, "tem");			//溫度Gui_DrawFont_utf8_3bytes_16(5,55,WHITE,RED,"溫度:");Gui_DrawFont_GBK24(60,55,WHITE,RED,item->valuestring);Gui_DrawFont_utf8_3bytes_16(100,55,WHITE,RED,"℃");item = cJSON_GetObjectItem(root, "win");			//風Gui_DrawFont_utf8_3bytes_16(5,75,WHITE,RED,item->valuestring);item = cJSON_GetObjectItem(root, "air_level");		//空氣質量Gui_DrawFont_utf8_3bytes_16(69,75,WHITE,RED,item->valuestring);}cJSON_free(item);cJSON_Delete(root);}void weather_task(void *sdata)
{Gui_DrawFont_GBK16(5,95,WHITE,RED,"Start......                     ");if(demo_connect_net(SSID,PASSWORD)==WM_SUCCESS){Gui_DrawFont_GBK16(5,95,WHITE,RED,"Connected                    ");tls_os_time_delay(3000);http_get_demo(HTTPURL);}for(;;){tls_os_time_delay(100);}	
}void CreateWeatherTask(void)
{tls_os_queue_create(&weather_q, DEMO_QUEUE_SIZE);tls_os_task_create(NULL, NULL,weather_task,NULL,(void *)WeatherTaskStk,          /* task's stack start address */DEMO_TASK_SIZE * sizeof(u32), /* task's stack size, unit:byte */DEMO_TASK_PRIO,0);
}

?Gui_DrawFont_utf8_3bytes_16函數,用來顯示3字節UTF8編碼的漢字

void Gui_DrawFont_utf8_3bytes_16(unsigned int x, unsigned int y, unsigned int fc, unsigned int bc, char *s)
{unsigned char i,j;unsigned short k,x0;x0=x;while(*s) {	for (k=0;k<sizeof(UTF8_hz16)/sizeof(UTF8_hz16[0]);k++) {if ((UTF8_hz16[k].Index[0]==*s)&&(UTF8_hz16[k].Index[1]==*(s+1))&&(UTF8_hz16[k].Index[2]==*(s+2))){ for(i=0;i<16;i++){for(j=0;j<8;j++) {if(UTF8_hz16[k].Msk[i*2]&(0x80>>j))	Gui_DrawPoint(x+j,y+i,fc);else {if (fc!=bc) Gui_DrawPoint(x+j,y+i,bc);}}for(j=0;j<8;j++) {if(UTF8_hz16[k].Msk[i*2+1]&(0x80>>j))	Gui_DrawPoint(x+j+8,y+i,fc);else {if (fc!=bc) Gui_DrawPoint(x+j+8,y+i,bc);}}}break;}}if(k!=sizeof(UTF8_hz16)/sizeof(UTF8_hz16[0])){s+=3;x+=16;}else		//ASC字符{k=*s;if (k>32) k-=32; else k=0;for(i=0;i<16;i++)for(j=0;j<8;j++) {if(asc16[k*16+i]&(0x80>>j))	Gui_DrawPoint(x+j,y+i,fc);else {if (fc!=bc) Gui_DrawPoint(x+j,y+i,bc);}}s++;x+=8;}}
}

?字模文件(UTF8格式文件)

#ifndef __FONTUTF8_H__
#define __FONTUTF8_H__struct typFNT_UrlCode
{unsigned char Index[3];	char Msk[32];
};
//陰碼、逐行、順向
const struct typFNT_UrlCode UTF8_hz16[] = {"城",0x20,0x28,0x20,0x24,0x20,0x20,0x27,0xFE,0x24,0x20,0xFC,0x20,0x24,0x24,0x27,0xA4,0x24,0xA4,0x24,0xA8,0x24,0xA8,0x3C,0x90,0xE6,0x92,0x49,0x2A,0x08,0x46,0x10,0x82,/*"城",0*/
"市",0x02,0x00,0x01,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x28,0x21,0x10,0x01,0x00,0x01,0x00,/*"市",1*/
"京",0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x45,0x04,0x02,0x00,/*"京",1*/}
#endif

在wm_sdk_w80x_20211115\demo\wm_http_demo.c中http_snd_req函數,增加一行:cjson_get_weather(Buffer);用于處理返回的json信息。


u32 http_snd_req(HTTPParameters ClientParams, HTTP_VERB verb, char *pSndData, u8 parseXmlJson)
{int                   nRetCode;u32                   nSize, nTotal = 0;char                 *Buffer = NULL;HTTP_SESSION_HANDLE   pHTTP;u32                   nSndDataLen ;do{Buffer = (char *)tls_mem_alloc(HTTP_CLIENT_BUFFER_SIZE);if(Buffer == NULL){return HTTP_CLIENT_ERROR_NO_MEMORY;}memset(Buffer, 0, HTTP_CLIENT_BUFFER_SIZE);printf("HTTP Client v1.0\r\n");nSndDataLen = (pSndData == NULL ? 0 : strlen(pSndData));// Open the HTTP request handlepHTTP = HTTPClientOpenRequest(0);if(!pHTTP){nRetCode =  HTTP_CLIENT_ERROR_INVALID_HANDLE;break;}// Set the VerbnRetCode = HTTPClientSetVerb(pHTTP, verb);if(nRetCode != HTTP_CLIENT_SUCCESS){break;}
#if TLS_CONFIG_HTTP_CLIENT_AUTH// Set authenticationif(ClientParams.AuthType != AuthSchemaNone){if((nRetCode = HTTPClientSetAuth(pHTTP, ClientParams.AuthType, NULL)) != HTTP_CLIENT_SUCCESS){break;}// Set authenticationif((nRetCode = HTTPClientSetCredentials(pHTTP, ClientParams.UserName, ClientParams.Password)) != HTTP_CLIENT_SUCCESS){break;}}
#endif //TLS_CONFIG_HTTP_CLIENT_AUTH
#if TLS_CONFIG_HTTP_CLIENT_PROXY// Use Proxy serverif(ClientParams.UseProxy == TRUE){if((nRetCode = HTTPClientSetProxy(pHTTP, ClientParams.ProxyHost, ClientParams.ProxyPort, NULL, NULL)) != HTTP_CLIENT_SUCCESS){break;}}
#endif //TLS_CONFIG_HTTP_CLIENT_PROXYif((nRetCode = HTTPClientSendRequest(pHTTP, ClientParams.Uri, pSndData, nSndDataLen, verb == VerbPost || verb == VerbPut, 0, 0)) != HTTP_CLIENT_SUCCESS){break;}// Retrieve the the headers and analyze themif((nRetCode = HTTPClientRecvResponse(pHTTP, 30)) != HTTP_CLIENT_SUCCESS){break;}printf("Start to receive data from remote server...\r\n");// Get the data until we get an error or end of stream codewhile(nRetCode == HTTP_CLIENT_SUCCESS || nRetCode != HTTP_CLIENT_EOS){// Set the size of our buffernSize = HTTP_CLIENT_BUFFER_SIZE;// Get the datanRetCode = HTTPClientReadData(pHTTP, Buffer, nSize, 300, &nSize);if(nRetCode != HTTP_CLIENT_SUCCESS && nRetCode != HTTP_CLIENT_EOS)break;cjson_get_weather(Buffer);        //增加了這一句nTotal += nSize;}}while(0);   // Run only oncetls_mem_free(Buffer);if(pHTTP)HTTPClientCloseRequest(&pHTTP);if(ClientParams.Verbose == TRUE){printf("\n\nHTTP Client terminated %d (got %d b)\n\n", nRetCode, nTotal);}return nRetCode;
}

二、說明?

1、W801的SDK中DEMO程序有2個函數可以直接用:

extern int demo_connect_net(void *, ...);    //用于連上wifi
extern int http_get_demo(void *, ...);       //用于打開網頁獲得數據

本質也是lwip。

2、W801的實時操作系統底層還是freertos,只是SDK對freertos進行了封裝。。

3、SDK中自帶了cjson,但是版本太低,最好替換為最新的。

4、一般顯示漢字的部分都是GB2312編碼,但是從yiketianqi.com/獲取的json格式是UTF8的,所以修改了所有相關函數、字模為UTF8編碼。

5、程序修改自SDK 的DEMO,還在整理中。

6、程序燒寫及調試信息:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14483.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL主從復制(五):讀寫分離

一主多從架構主要應用場景&#xff1a;讀寫分離。讀寫分離的主要目標是分攤主庫的壓力。 讀寫分離架構 讀寫分離架構一 架構一結構圖&#xff1a; 這種結構模式下&#xff0c;一般會把數據庫的連接信息放在客戶端的連接層&#xff0c;由客戶端主動做負載均衡。也就是說由客戶…

RabbitMQ 消息隊列安裝及入門

市面常見消息隊列中間件對比 技術名稱吞吐量 /IO/并發時效性&#xff08;類似延遲&#xff09;消息到達時間可用性可靠性優勢應用場景activemq萬級高高高簡單易學中小型企業、項目rabbitmq萬級極高&#xff08;微秒&#xff09;高極高生態好&#xff08;基本什么語言都支持&am…

為什么MySQL推薦使用utf8mb4代替utf8?

前言 在MySQL數據庫的世界里&#xff0c;字符集的選擇直接影響著數據的存儲和檢索方式&#xff0c;尤其是對于多語言支持至關重要的應用而言。近年來&#xff0c;utf8mb4字符集逐漸成為MySQL中存儲Unicode字符的標準選擇&#xff0c;逐步取代了傳統的utf8字符集。本文將詳細探…

leetcode124 二叉樹中的最大路徑和-dp

題目 二叉樹中的 路徑 被定義為一條節點序列&#xff0c;序列中每對相鄰節點之間都存在一條邊。同一個節點在一條路徑序列中 至多出現一次 。該路徑 至少包含一個 節點&#xff0c;且不一定經過根節點。 路徑和 是路徑中各節點值的總和。 給你一個二叉樹的根節點 root &…

【Crypto】Rabbit

文章目錄 一、Rabbit解題感悟 一、Rabbit 題目提示很明顯是Rabbit加密&#xff0c;直接解 小小flag&#xff0c;拿下&#xff01; 解題感悟 提示的太明顯了

redis核心面試題二(實戰優化)

文章目錄 10. redis配置mysql實戰優化[重要]11. redis之緩存擊穿、緩存穿透、緩存雪崩12. redis實現分布式session 10. redis配置mysql實戰優化[重要] // 最初實現OverrideTransactionalpublic Product createProduct(Product product) {productRepo.saveAndFlush(product);je…

MQTT 5.0 報文解析 05:DISCONNECT

歡迎閱讀 MQTT 5.0 報文系列 的第五篇文章。在上一篇中&#xff0c;我們已經介紹了 MQTT 5.0 的 PINGREQ 和 PINGRESP 報文。現在&#xff0c;我們將介紹下一個控制報文&#xff1a;DISCONNECT。 在 MQTT 中&#xff0c;客戶端和服務端可以在斷開網絡連接前向對端發送一個 DIS…

手把手教你搭建一個花店小程序商城

如果你是一位花店店主&#xff0c;想要為你的生意搭建一個精美的小程序商城&#xff0c;以下是你將遵循的五個步驟。 步驟1&#xff1a;登錄喬拓云平臺進入后臺 首先&#xff0c;你需要登錄喬拓云平臺的后臺管理頁面。你可以在電腦或移動設備上的瀏覽器中輸入喬拓云的官方網站…

2024.5.26 機器學習周報

目錄 引言 Abstract 文獻閱讀 1、題目 2、引言 3、創新點 4、Motivation 5、naive Lite-HRNet 6、Lite-HRNet 7、實驗 深度學習 解讀SAM(Segment Anything Model) 1、SAM Task 2、SAM Model 2.1、Patch Embedding 2.2、Positiona Embedding 2.3、Transformer …

移動端適配:vw適配方案

vw (Viewport Width) 是一種長度單位&#xff0c;代表視口寬度的百分比。1vw 等于視口寬度的1%。在網頁設計和前端開發中&#xff0c;vw 單位常用于實現響應式設計和屏幕適配&#xff0c;尤其是針對不同尺寸和分辨率的移動設備。 為什么使用vw適配&#xff1f; 響應式: 使用v…

互聯網醫院開發:引領智慧醫療新時代

隨著科技的迅猛發展和互聯網的普及&#xff0c;傳統醫療模式正在迎來一場深刻的變革。互聯網醫院的崛起&#xff0c;打破了時間和空間的限制&#xff0c;為患者和醫療機構帶來了更加便捷、高效、安全的醫療服務體驗。本文將從技術角度深入探討互聯網醫院的開發&#xff0c;包括…

【openpcdet中yaml文件的DATA_AUGMENTOR學習】

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、代碼二、詳細解釋DISABLE_AUG_LISTAUG_CONFIG_LIST1. gt_sampling2. random_world_flip3. random_world_rotation4. random_world_scaling 總結 前言 提示…

多線程(八)

一、wait和notify 等待 通知 機制 和join的用途類似,多個線程之間隨機調度,引入 wait notify 就是為了能夠從應用層面上,干預到多個不同線程代碼的執行順序.( 這里說的干預,不是影響系統的線程調度策略 內核里的線程調度,仍然是無序的. 相當于是在應用程序…

Pod容器資源限制和探針

目錄 一、資源限制 1.Pod和容器的資源請求和限制 2.CPU 資源單位 案例一 案例二 二、健康檢查&#xff0c;又稱為探針&#xff08;Probe&#xff09; 1.探針的三種規則 2.Probe支持三種檢查方法 3.探測獲得的三種結果 案例一&#xff1a;exec 案例二&#xff1a;htt…

OneMO同行 心級服務:中移物聯OneMO模組助力客戶終端寒冷環境下的穩定運行

中移物聯OneMO模組以客戶為中心&#xff0c;基于中國移動心級服務要求&#xff0c;開展“OneMO同行 心級服務 標定一流”高標服務主題活動&#xff0c;升級“服務內容““服務方式”和“服務意識”&#xff0c;為行業客戶提供全新的服務體驗。 近日&#xff0c;某車載監控設備…

Hive語法學習總結

Hive SQL語法學習總結 hive參數庫操作1.創建庫2.具體案例3.庫的其他操作 表和庫的路徑演示表的操作創建表插入數據 hive參數 一 hive常用交互命令hive -e sql語句hive -f sql文件 //文件中是sql語句二 參數的設置方式一&#xff1a;在客戶端中設置參數(當次有效)set 參數名參…

ACM實訓第十七天

Is It A Tree? 問題 考試時應該做不出來&#xff0c;果斷放棄 樹是一種眾所周知的數據結構&#xff0c;它要么是空的(null, void, nothing)&#xff0c;要么是一個或的集合滿足以下屬性的節點之間有向邊連接的節點較多。 ?只有一個節點&#xff0c;稱為根節點&#xff0c;它…

【Crypto】摩絲

文章目錄 一、摩斯解題感悟 一、摩斯 很明顯莫爾斯密碼 iloveyou還挺浪漫 小小flag&#xff0c;拿下 解題感悟 莫爾斯密碼這種題還是比較明顯的

【董曉算法】競賽常用知識之圖論3(最近公共祖先)

前言&#xff1a; 本系列是學習了董曉老師所講的知識點做的筆記 董曉算法的個人空間-董曉算法個人主頁-嗶哩嗶哩視頻 (bilibili.com) 動態規劃系列&#xff08;還沒學完&#xff09; 【董曉算法】動態規劃之線性DP問題-CSDN博客 【董曉算法】動態規劃之背包DP問題&#xff…

智能鎖千千萬,誰是你的NO.1,親身實測凱迪仕傳奇大師K70旗艦新品

智能鎖千千萬&#xff0c;誰是你的NO.1。歡迎來到智哪兒評測室&#xff0c;這次我們為大家帶來了凱迪仕傳奇大師K70系列的一款重磅新品。 在科技的浪潮中&#xff0c;家居安全領域正經歷著前所未有的變革。智能鎖越來越成為家的安全守護神&#xff0c;以及智能生活的得力助手。…