日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用STM32做个东京奥运奖牌榜

發布時間:2023/12/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用STM32做个东京奥运奖牌榜 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

東京奧運會可以說是奧運會歷史上最特殊的一屆,推遲一年、沒有觀眾、環保奧運等。

為了能實時關注獎牌榜,周末在家使用STM32+ESP8266做了一個東京奧運會獎牌榜桌面小擺件,最終效果如下:

原理就是通過STM32驅動ESP8266連接網絡,然后GET接口,讀取到接口返回的JSON數據,然后進行JSON解析,LCD顯示,使用不同的接口就是不同的功能。

和之前不同的是,以上兩個API接口返回的數據都非常簡短,只有幾百字節,而獎牌榜接口返回的數據有20KB之多,使用STM32不能一次處理這么多的數據量,本文采用了一種簡單的方法來進行數據截取,從而減少數據量。

都有哪些內容?

  • API接口獲取

  • JSON數據預處理

  • JSON數據解析

  • 顯示效果

API接口獲取

在進行開發之前,首先要找到一個API接口,請求方式最好是GET,返回數據格式JSON格式的。先上網搜一下,發現已經有很多網友實現獎牌榜數據獲取的功能,使用的大多是:Python、Java、PHP,使用的語言無所謂,重要的API接口是否是我們想要的,最終找到了兩個API接口。

第一個接口是央視網官方的東京奧運專題頁面:

網址如下:

http://2020.cctv.com/medal_list/index.shtml

F12打開開發者模式,可以找到頁面請求的API地址:

這個接口返回的數據量有11KB,格式化后有24KB,JSON數據格式(部分):

可以看到數據比較齊全,包括排名,金、銀、銅、合計獎牌總數,國家ID,國家名稱為UTF-16BE編碼方式,而開發板上的字庫為GBK編碼,這一點不好處理??纯催€有沒其他的接口。

第二個接口是我的小米手機負一屏界面呈現的奧運獎牌榜,類似于這種:

可以跳轉到瀏覽器打開:

http://act.e.mi.com/olympic/index.html

F12打開開發者模式,可以找到請求的API地址:

這個接口返回的數據有21KB,格式化后有33KB,JSON數據格式(部分):

mi_json

這個接口返回數據比較豐富,同樣數據量相比于央視網的要大一些,除了獎牌數量排名等信息,還包括每個國家的國旗圖片地址,更新時間等。國家名稱為UTF-8編碼,要在我們的開發板上進行使用需要進行UTF8-GBK的轉換。

綜上,我們就獲取到了兩個API接口的信息:

奧運獎牌榜央視API接口:

TYPE:?"TCP" PORT:?"80" IP??:?"111.206.176.78" API?:?"http://api.cntv.cn/olympic/getOlyMedals?serviceId=pcocean&itemcode=GEN-------------------------------"

奧運獎牌榜小米手機API接口

TYPE:?"TCP" PORT:?"80" IP??:?"111.206.101.253" API?:?"http://act.e.mi.com/olympic/medal_rank"

為了方便在開發板上直接顯示國家名稱,我們采用小米手機的API接口。

JSON數據預處理

通過分析API接口返回的數據,共包括前90名的獎牌數據,數據長度為21KB:

mi_json

但是我們只需要前10名的數據即可。串口接口緩存長度設置為2500個字節,即返回的21KB字節數據,只接收前2500個字節,然后處理成JSON標準格式就可以了。

處理方法為,倒序查找最后一個}號的位置,將{之后的數據丟棄掉,然后添加上]},這樣就將截取的2500字節數據修改為了標準JSON格式數據:

mi_json_deal

JSON數據解析

從上圖也可以看出,JSON格式比較簡單,使用cJSON可以很方便的進行解析,使用方法可以查看以下文章:

  • 使用cJSON庫解析和構建JSON字符串

定義一個結構體:

typedef?struct?medal{char?rank[5];char?countryname[50];char?count[5];char?gold[5];char?silver[5];char?bronze[5];char?update_time[50];char?countryid[10]; }medalObj;

解析函數,只讀取前7名的獎牌數據:

uint8_t?parse_mi_data(void) {cJSON?*root,?*data_obj,?*list_obj;char?*str;char?dest[USART2_MAX_RECV_LEN];char?*loc;char?gbk[50];char?utf8[50];medalObj?*pobj;medalObj?obj;int?idx;pobj?=?&obj;str?=?(char?*)USART2_RX_BUF;memset(dest,?'\0',?USART2_MAX_RECV_LEN);loc?=?strrchr(str,?'}');strncpy(dest,?str,?loc-str+1);strcat(dest,?"]}");printf("json?data?size:?%d?bytes\r\n",?strlen(dest));root?=?cJSON_Parse((const?char*)dest);if(root?!=?0){printf("JSON?format?ok,?start?parse!!!\r\n");data_obj?=?cJSON_GetObjectItem(root,?"data");if(data_obj->type?==?cJSON_Array){int?size?=?cJSON_GetArraySize(data_obj);for(idx?=?0;?idx?<?size;?idx++){if(size?>=?7?&&?idx?<=?7){list_obj?=?cJSON_GetArrayItem(data_obj,?idx);strcpy(obj.bronze,?cJSON_GetObjectItem(list_obj,?"medal_bronze_count")->valuestring);strcpy(obj.rank,?cJSON_GetObjectItem(list_obj,?"rank")->valuestring);strcpy(obj.count,?cJSON_GetObjectItem(list_obj,?"medal_sum_count")->valuestring);strcpy(obj.silver,?cJSON_GetObjectItem(list_obj,?"medal_silver_count")->valuestring);//utf8->gbkmemset(utf8,?'\0',?sizeof(utf8));memset(gbk,?'\0',?sizeof(gbk));strcpy(utf8,?cJSON_GetObjectItem(list_obj,?"country_name")->valuestring);SwitchToGbk(utf8,?gbk);strcpy(obj.countryname,?gbk);strcpy(obj.gold,?cJSON_GetObjectItem(list_obj,?"medal_gold_count")->valuestring);strcpy(obj.update_time,?cJSON_GetObjectItem(list_obj,?"update_time")->valuestring);printf("%s:?%s?%10s?%s:%s-%s-%s\r\n",pobj->rank,?pobj->update_time,?pobj->countryname,pobj->count,?pobj->gold,?pobj->silver,?pobj->bronze);gui_show_data(48+idx*20,?pobj);}}Show_Str_Mid(200,?225,?(u8?*)pobj->update_time,?12,?120);}?}????else{printf("JSON?format?error:%s\r\n",?cJSON_GetErrorPtr());?//輸出json格式錯誤信息}USART2_RX_STA?=?0;memset(USART2_RX_BUF,?0,?sizeof(USART2_RX_BUF));cJSON_Delete(root);return?0; }

如果出現解析失敗的情況,可能需要調整啟動文件中的堆棧大小:

//startup_stm32f10x_hd.s Stack_Size??????EQU?????0x00000C00 Heap_Size???????EQU?????0x00000200

最終效果

開源地址

我的開發板已經預先寫入了中文字庫,沒有字庫的開發板可能不適用。

全部代碼已經開源在Gitee碼云:

https://gitee.com/whik/stm32_olympic_medals

-END-

大家好,我是張巧龍,一名教電子的大學老師,歡迎關注!

總結

以上是生活随笔為你收集整理的用STM32做个东京奥运奖牌榜的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。