當前位置:首頁 > 公眾號精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]目前全世界依然都在共同努力抗擊疫情,雖然我們不能成為一線的白衣天使,但我們總可以為這個世界做點什么,比如做一個疫情監(jiān)控擺件,每天早晨起床第一件事就是看今天的疫情情況,時刻提醒自己做好必要的防護措施,養(yǎng)成這樣一個好習(xí)慣,圈友王總的這個項目一出

目前全世界依然都在共同努力抗擊疫情,雖然我們不能成為一線的白衣天使,但我們總可以為這個世界做點什么,比如做一個疫情監(jiān)控擺件,每天早晨起床第一件事就是看今天的疫情情況,時刻提醒自己做好必要的防護措施,養(yǎng)成這樣一個好習(xí)慣,圈友王總的這個項目一出,可謂是震撼全場呀!讓我們來一起欣賞和學(xué)習(xí)一下這個,如下圖,以下是我在基于野火F103的開發(fā)板上將這個項目移植了過來,大體框架已經(jīng)有了,但是獲取疫情的API還有問題,目測是ESP8266指令不兼容SSL,回去更新下ESP8266固件再試試。

文章目錄

  • 前言
  • 開發(fā)板的選擇
  • 獲取疫情數(shù)據(jù)API接口
  • ESP8266發(fā)送HTTPS請求
  • LCD顯示
  • 代碼下載
  • 在其他MCU上的實現(xiàn)

前言

2020,新冠肺炎疫情在全球蔓延,國內(nèi)得到了有效的控制,最近國內(nèi)部分地區(qū)的疫情形勢又緊張起來。

不知道大家是否了解我之前做的一個新冠肺炎疫情監(jiān)控平臺,基于跨平臺Qt實現(xiàn),從桌面Qt,到嵌入式Qt,相關(guān)文章:

基于桌面Qt環(huán)境的疫情監(jiān)控平臺開發(fā)筆記

  • [開源]基于桌面Qt的肺炎疫情監(jiān)控平臺

  • [開源]基于桌面Qt的肺炎疫情監(jiān)控平臺1.1版本

基于嵌入式Qt環(huán)境的疫情監(jiān)控平臺開發(fā)筆記

  • [開源]我用STM32MP1做了個疫情監(jiān)控平臺1—交叉編譯環(huán)境搭建

  • [開源]我用STM32MP1做了個疫情監(jiān)控平臺2—Qt環(huán)境搭建

  • [開源]我用STM32MP1做了個疫情監(jiān)控平臺3—疫情監(jiān)控平臺實現(xiàn)

  • [開源]我用STM32MP1做了個疫情監(jiān)控平臺4—功能完善界面重新設(shè)計

作為疫情監(jiān)控三部曲:桌面PC > 嵌入式ARM Linux > MCU。在前面兩個平臺上實現(xiàn)之后,就想著在內(nèi)存和性能都比較有限的MCU上實現(xiàn),比如STM32F103,但一直都沒有找到一個合適的API接口,直到最近發(fā)現(xiàn)了一個數(shù)據(jù)量比較小,連接比較穩(wěn)定的API。

于是,設(shè)計了這個基于STM32 MCU的疫情監(jiān)控平臺,STM32通過串口和ESP8266進行AT指令交互,連接互聯(lián)網(wǎng)獲取最新的疫情數(shù)據(jù),并顯示在LCD顯示屏上,可以直觀方便的了解到最新的疫情數(shù)據(jù)信息。

最終效果如下:

顯示效果
主板拆分

開發(fā)板的選擇

開發(fā)板用的是我在大四時自己設(shè)計的STM32開發(fā)板——NiceDay,基于STM32F103RET主控。前幾天看大佬說有學(xué)生在大一就自己畫板打樣了,我感到自愧不如?。?/p>

這是我設(shè)計的第二塊板子(第一塊是畢業(yè)設(shè)計兩輪平衡車主板),是在大四快畢業(yè)時,畢設(shè)實物和論文完成之后還有點時間,就設(shè)計了這款板子,最開始是準備做桌面天氣時鐘的。

NiceDay
NiceDay
拆分效果

如果你在百度上搜索:ESP8266 關(guān)鍵字,其中就有我當時的一個回答。

ESP8266

好了,言歸正傳,換個API就是疫情監(jiān)控平臺了:

最終效果

獲取疫情數(shù)據(jù)API接口

2020新冠疫情的爆發(fā),各大互聯(lián)網(wǎng)IT公司和個人都開發(fā)了實時疫情地圖平臺,騰訊新聞、丁香園、網(wǎng)易、新浪等等,這些數(shù)據(jù)大小都在幾百KB,對于PC和嵌入式Linux來說,不用在意數(shù)據(jù)量的大小,但是對于存儲非常有限的MCU來說,數(shù)據(jù)量的大小是不得不考慮的一個問題,而且對于ESP8266來說,AT指令的方式,SSL緩存最大只有4096個字節(jié)的緩存!

經(jīng)過網(wǎng)上一番搜索,找到了幾個數(shù)據(jù)量小的API,但是有的接口連接不穩(wěn)定,剛連上就掉線了,最后終于找到了一個連接穩(wěn)定,數(shù)據(jù)量小,數(shù)據(jù)齊全的接口:https://lab.isaaclin.cn/nCoV/zh

這是一位國人使用服務(wù)器爬蟲獲取了丁香園的數(shù)據(jù),然后開放了API接口供大家免費使用,目前已經(jīng)被調(diào)用了2千萬次,這個網(wǎng)站還包括了多個接口,我只使用到了其中的疫情數(shù)據(jù)這一個接口:https://lab.isaaclin.cn/nCoV/api/overall,數(shù)據(jù)量大概為1300個字節(jié)。

JSON數(shù)據(jù)內(nèi)容如下:

json數(shù)據(jù)格式

為了能使用ESP8266獲取這個API返回的內(nèi)容,我們還需要知道以下信息:TCP連接類型,端口號,API地址。

我們在瀏覽器中按F12,打開開發(fā)者模式,在地址欄輸入https://lab.isaaclin.cn/nCoV/api/overall這個接口地址,可以很容易的獲取到我們想要的信息:

服務(wù)器地址:47.102.117.253
端口號:443
API地址:https://lab.isaaclin.cn/nCoV/api/overall

關(guān)于端口號,如果API地址是http開頭的,一般是選擇TCP連接類型,80端口;如果是https開頭的,一般是選擇SSL連接類型,443端口。這個信息在后面會用到。

API獲取

ESP8266發(fā)送HTTPS請求

WiFi模塊選擇的是樂鑫的ESP8266-01S模組,支持AP、Station和AP&Station混合模式。

ESP8266-01S

在進行正式的開發(fā)之前,我們先測試一下使用串口模塊連接ESP8266,直接發(fā)送AT指令的方式來獲取疫情數(shù)據(jù)。

整體流程是:配置工作模式 > 連接WiFi > 與服務(wù)器建立SSL連接 > 發(fā)送GET請求獲取數(shù)據(jù)

0.為了確保模塊保持初始狀態(tài),在進行配置之前,先讓模塊恢復(fù)出廠設(shè)置:AT+RESTORE

AT+RESTORE

 ets Jan  8 2013,rst cause:2, boot mode:(3,7)

2nd boot version : 1.5
  SPI Speed      : 40MHz
  SPI Mode       : DIO
  SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000

ready

獲取AT固件版本信息:AT+GMR

AT+GMR

AT version:1.2.0.0(Jul  1 2016 20:04:45)
SDK version:1.5.4.1(39cb9a32)
Ai-Thinker Technology Co. Ltd.
Dec  2 2016 14:21:16
OK

有的AT固件版本不支持HTTPS連接。最新版本的AT固件是支持HTTPS連接的,下載地址:https://docs.ai-thinker.com/_media/esp8266/ai-thinker_esp8266_at_firmware_dout_v1.5.4.1-a_20171130.rar

1.WiFi模塊設(shè)置為Station模式:AT+CWMODE=1

2.配網(wǎng),連接WiFi:AT+CWJAP="ssid","password"

AT+CWMODE=1

OK
AT+CWJAP="stm32_2019_ncov","www.wangchaochao.top"

WIFI CONNECTED
WIFI GOT IP

OK

3.設(shè)置單連接模式:AT+CIPMUX=0

4.設(shè)置SSL連接大?。?code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px;max-width: 100%;overflow-wrap: break-word;font-size: inherit;line-height: inherit;border-radius: 4px;color: rgb(233, 105, 0);background: rgb(248, 248, 248);box-sizing: border-box !important;">AT+CIPSSLSIZE=4096

5.與服務(wù)器建立HTTPS/SSL連接:AT+CIPSTART="SSL","47.102.117.253",443

6.設(shè)置為透傳模式:AT+CIPMODE=1

7.啟動透傳:AT+CIPSEND

8.發(fā)送GET HTTPS請求:GET https://lab.isaaclin.cn/nCoV/api/overall

串口指令交互

如果以上都配置正確,會收到服務(wù)器返回的數(shù)據(jù),也就是我們的想要的疫情數(shù)據(jù)。

如果SSL連接不斷開,一直在透傳模式,就可以每隔一段時間GET一次API,這樣就可以獲取到最新的疫情數(shù)據(jù)了。

經(jīng)過多次GET請求測試發(fā)現(xiàn),連接還比較穩(wěn)定,沒有出現(xiàn)掉線的情況,但是由于API的訪問限制,不要太頻繁的發(fā)送GET請求,否則可能會被API開發(fā)者把IP封掉。

當然,如果連接斷開,就要重新執(zhí)行建立SSL連接,設(shè)置透傳模式,開始透傳這幾個操作。如果要主動斷開SSL連接,可以先發(fā)送不帶回車換行的+++退出透傳,然后使用AT+CIPCLOSE關(guān)閉SSL連接。

單獨的AT指令測試沒問題,那我們就可以使用MCU的串口來自動完成和ESP8266的AT指令交互了。

2020-08-02_234442

JSON數(shù)據(jù)的解析

數(shù)據(jù)是JSON格式的,解析庫使用的是開源小巧的cJSON庫,只有兩個文件,使用起來非常方便。

在進行解析之前,先來分析一下JSON原始數(shù)據(jù)的格式:results鍵的值是一個數(shù)組,數(shù)組只有一個JSON對象,獲取這個對象對應(yīng)鍵的值可以獲取到國內(nèi)現(xiàn)存和新增確診人數(shù)、累計和新增死亡人數(shù),累計和新增治愈人數(shù)等數(shù)據(jù)。

全球疫情數(shù)據(jù)保存在globalStatistics鍵里,它的值是一個JSON對象,對象僅包含簡單的鍵值對,這些鍵的值,就是全球疫情數(shù)據(jù),其中updateTime鍵的值是更新時間,這是毫秒級UNIX時間戳,可以轉(zhuǎn)換為標準北京時間。

{
    "results": [{
        "currentConfirmedCount"509,
        "currentConfirmedIncr"16,
        "confirmedCount"85172,
        "confirmedIncr"24,
        "suspectedCount"1899,
        "suspectedIncr"4,
        "curedCount"80015,
        "curedIncr"8,
        "deadCount"4648,
        "deadIncr"0,
        "seriousCount"106,
        "seriousIncr"9,
        "globalStatistics": {
            "currentConfirmedCount"4589839,
            "confirmedCount"9746927,
            "curedCount"4663778,
            "deadCount"493310,
            "currentConfirmedIncr"281,
            "confirmedIncr"711,
            "curedIncr"424,
            "deadIncr"6
        },
        "updateTime"1593227489355
    }],
    "success"true
}

先定義了結(jié)構(gòu)體ncov_data,用于存儲國內(nèi)和全球疫情數(shù)據(jù):

struct ncov_data{
    long currentConfirmedCount;
    long currentConfirmedIncr;
    long confirmedCount;
    long confirmedIncr;
    long curedCount;
    long curedIncr;
    long seriousCount;
    long seriousIncr;
    long deadCount;
    long deadIncr;
    char updateTime[20];
};

對應(yīng)的解析函數(shù):

uint8_t parse_ncov_data(void)
{
    int ret = 0;
    cJSON *root, *result_arr;
    cJSON *result, *global;
    time_t updateTime;
    struct tm *time;

    //root = cJSON_Parse((const char *)str);   //創(chuàng)建JSON解析對象,返回JSON格式是否正確
    printf("接收到的數(shù)據(jù):%d\r\r\n"strlen((const char*)USART2_RX_BUF));    //JSON原始數(shù)據(jù)
    root = cJSON_Parse((const char*)USART2_RX_BUF);

    if (root != 0)
    {
        printf("JSON format ok, start parse!!!\r\n");
        result_arr = cJSON_GetObjectItem(root, "results");
        if(result_arr->type == cJSON_Array)
        {
            printf("result is array\r\n");
            result = cJSON_GetArrayItem(result_arr, 0);
            if(result->type == cJSON_Object)
            {
                printf("result_arr[0] is object\r\n");

                /* china data parse */
                dataChina.currentConfirmedCount = cJSON_GetObjectItem(result, "currentConfirmedCount")->valueint;
                dataChina.currentConfirmedIncr = cJSON_GetObjectItem(result, "currentConfirmedIncr")->valueint;
                dataChina.confirmedCount = cJSON_GetObjectItem(result, "confirmedCount")->valueint;
                dataChina.confirmedIncr = cJSON_GetObjectItem(result, "confirmedIncr")->valueint;
                dataChina.curedCount = cJSON_GetObjectItem(result, "curedCount")->valueint;
                dataChina.curedIncr = cJSON_GetObjectItem(result, "curedIncr")->valueint;
                dataChina.deadCount = cJSON_GetObjectItem(result, "deadCount")->valueint;
                dataChina.deadIncr = cJSON_GetObjectItem(result, "deadIncr")->valueint;

                printf("------------國內(nèi)疫情-------------\r\n");
                printf("現(xiàn)存確診:   %5d, 較昨日:%3d\r\n", dataChina.currentConfirmedCount, dataChina.currentConfirmedIncr);
                printf("累計確診:   %5d, 較昨日:%3d\r\n", dataChina.confirmedCount, dataChina.confirmedIncr);
                printf("累計治愈:   %5d, 較昨日:%3d\r\n", dataChina.curedCount, dataChina.curedIncr);
                printf("累計死亡:   %5d, 較昨日:%3d\r\n", dataChina.deadCount, dataChina.deadIncr);
                printf("現(xiàn)存無癥狀: %5d, 較昨日:%3d\r\n\r\n", dataChina.seriousCount, dataChina.seriousIncr);

                global = cJSON_GetObjectItem(result, "globalStatistics");
                if(global->type == cJSON_Object)
                {
                    dataGlobal.currentConfirmedCount = cJSON_GetObjectItem(global, "currentConfirmedCount")->valueint;
                    dataGlobal.currentConfirmedIncr = cJSON_GetObjectItem(global, "currentConfirmedIncr")->valueint;
                    dataGlobal.confirmedCount = cJSON_GetObjectItem(global, "confirmedCount")->valueint;
                    dataGlobal.confirmedIncr = cJSON_GetObjectItem(global, "confirmedIncr")->valueint;
                    dataGlobal.curedCount = cJSON_GetObjectItem(global, "curedCount")->valueint;
                    dataGlobal.curedIncr = cJSON_GetObjectItem(global, "curedIncr")->valueint;
                    dataGlobal.deadCount = cJSON_GetObjectItem(global, "deadCount")->valueint;
                    dataGlobal.deadIncr = cJSON_GetObjectItem(global, "deadIncr")->valueint;

                    printf("\r\n**********global ncov data**********\r\n");

                    printf("------------全球疫情-------------\r\n");
                    printf("現(xiàn)存確診: %8d, 較昨日:%5d\r\n", dataGlobal.currentConfirmedCount, dataGlobal.currentConfirmedIncr);
                    printf("累計確診: %8d, 較昨日:%5d\r\n", dataGlobal.confirmedCount, dataGlobal.confirmedIncr);
                    printf("累計死亡: %8d, 較昨日:%5d\r\n", dataGlobal.deadCount, dataGlobal.deadIncr);
                    printf("累計治愈: %8d, 較昨日:%5d\r\n\r\n", dataGlobal.curedCount, dataGlobal.curedIncr);

                } else return 1;

                /* 毫秒級時間戳轉(zhuǎn)字符串 */
                updateTime = (time_t )(cJSON_GetObjectItem(result, "updateTime")->valuedouble / 1000);
                updateTime += 8 * 60 * 60/* UTC8校正 */
                time = localtime(&updateTime);
                /* 格式化時間 */
                strftime(dataChina.updateTime, 20"%m-%d %H:%M", time);
                printf("更新于:%s\r\n", dataChina.updateTime);/* 06-24 11:21 */
            } else return 1;
        } else return 1;
        printf("\r\nparse complete \r\n");
        gui_show_ncov_data(dataChina, dataGlobal);
    }
    else
    {
        printf("JSON format error:%s\r\n", cJSON_GetErrorPtr()); //輸出json格式錯誤信息
        return 1;
    }
    cJSON_Delete(root);

    return ret;
}

在調(diào)用cJSON_Parse()之后,一定要調(diào)用cJSON_Delete()釋放內(nèi)存,否則會造成內(nèi)存泄露。

如果解析失敗,可以把啟動文件里的堆棧大小設(shè)置大一點:

2020-08-03_001521

LCD顯示

液晶屏使用的是3.2寸 LCD,IL9341驅(qū)動芯片,320*240分辨率,16位并口。由于屏幕分辨率比較低,可顯示的內(nèi)容有限,所以只是顯示了最基本的幾個疫情數(shù)據(jù)。為了減小程序大小,GUI只實現(xiàn)了基本的畫點,畫線函數(shù),字符的顯示,采用的是部分字符取模,只對程序中用到的漢字和字符進行取模。

為了增強可移植性,程序中并沒有使用外置SPI Flash存儲整個字庫,下面是顯示效果:

這個是裸機版本的,基于RT-Thread RTOS也已經(jīng)實現(xiàn),敬請期待!

待優(yōu)化和調(diào)整

目前只使用到了一個API接口,當然,這個平臺也提供其他接口可供使用:

  • 最新的疫情新聞

https://lab.isaaclin.cn//nCoV/api/news

  • 最新的各省市疫情數(shù)據(jù)

https://lab.isaaclin.cn//nCoV/api/area?latest=1&province=%E5%8C%97%E4%BA%AC%E5%B8%82

  • 最新的辟謠信息

https://lab.isaaclin.cn//nCoV/api/rumors

代碼下載

代碼已經(jīng)開源,地址在文末,歡迎大家參與,豐富這個小項目的功能!

GitHub開源地址:https://github.com/whik/stm32_2019_ncov

或者關(guān)注我的公眾號:電子電路開發(fā)學(xué)習(xí)(ID: MCU149),在后臺回復(fù)【STM32疫情監(jiān)控】,我會把工程下載鏈接發(fā)送給你。

如果你手上的硬件和我的一樣,只需要修改工程中的USER\config.h文件中的WiFi信息,就可以直接使用了。

在其他MCU上的實現(xiàn)

其實,我也在其他廠商的MCU上實現(xiàn)了,比如國產(chǎn)的靈動MM32,富芮坤FR8106H等,實現(xiàn)過程都是大同小異,對于在這兩款MCU上的實現(xiàn)感興趣的朋友,可以到我的博客查看詳細的開發(fā)筆記:

  • 基于靈動MM32的新冠肺炎疫情數(shù)據(jù)實時監(jiān)控平臺
    www.wangchaochao.top/2020/06/27/mm32-2019-ncov/

  • 基于FR8016H+ESP8266的新冠肺炎疫情監(jiān)控平臺
    www.wangchaochao.top/2020/07/12/Novel-coronavirus-pneumonia-surveillance-platform-based-on-FR8016H-ESP8266/

推薦閱讀

  • JSON格式簡介

  • 使用cJSON庫解析和構(gòu)建JSON字符串

  • [開源]基于桌面Qt的肺炎疫情監(jiān)控平臺

  • [開源]基于桌面Qt的肺炎疫情監(jiān)控平臺1.1版本

  • [開源]我用STM32MP1做了個疫情監(jiān)控平臺1—交叉編譯環(huán)境搭建

  • [開源]我用STM32MP1做了個疫情監(jiān)控平臺2—Qt環(huán)境搭建

  • [開源]我用STM32MP1做了個疫情監(jiān)控平臺3—疫情監(jiān)控平臺實現(xiàn)

  • [開源]我用STM32MP1做了個疫情監(jiān)控平臺4—功能完善界面重新設(shè)計


  • 我的博客:www.wangchaochao.top

  • 我的公眾號:mcu149

由于微信文章不支持超鏈接,文中出現(xiàn)的軟件、程序等文件下載,可以點擊" 閱讀原文 ",跳轉(zhuǎn)到我的博客文章進行下載。

如果覺得我的文章對你有所幫助,可以隨手點“在看 ”分享,你的支持將是我持續(xù)更新的動力。


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉