米爾淘寶店| 米爾電子| 米爾微博| English

我用STM32MP1做了個疫情監控平臺3—疫情監控平臺實現

文章來源:米爾科技 發布日期:2020.5.25 瀏覽次數:441 次

1.前言

之前我使用桌面版本Qt實現了肺炎疫情監控平臺:基于Qt的新冠肺炎疫情數據實時監控平臺(開源小項目)

既然Qt是跨平臺的,正好手里有一塊米爾科技的YA157C開發板,那么能不能在嵌入式平臺實現一下呢?

桌面Linux版本的運行效果:

YA157C開發板實現效果:

2.數據接口的獲取

疫情監控平臺的實現,簡單的說,就是數據的展示,而數據從哪里來呢?

現在很多互聯網公司都做了自己的疫情監控平臺,我這里采用的是騰訊新聞的數據源,數據內容很豐富,也比較穩定。

數據來源:實時更新:新冠肺炎疫情最新動態

接口地址的獲取方法可以參考:基于Qt的新冠肺炎疫情數據實時監控平臺(開源小項目)

如果把所有的數據放在一個接口里,數據量會很大,所以騰訊把數據分成了幾個接口

#包含最新疫情數據、各省市最新數據、其他國家最新數據
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5

#包含歷史數據
https://view.inews.qq.com/g2/getOnsInfo?name=disease_other

#最新的辟謠信息
https://vp.fact.qq.com/loadmore?page=0

#辟謠信息詳情
https://vp.fact.qq.com/miniArtData?id=a2141851348ee5f3772c761e25bb57d7 

目前只顯示了一些基本的數據,所以我們只使用到了https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5這個接口中的chinaTotalchinaAdd這兩組數據。

這個接口包括很多數據,全國累計和新增的最新數據,各省市其他國家的最新數據等等。文件大小大概在160KB,液晶屏是7寸IPS屏,1024x600分辨率的,還是比較大的,可以顯示很多信息,后續版本會添加更多數據顯示的。

數據格式:

{ "ret": 0, "data": { "lastUpdateTime": "2020-03-04 11:12:04", "chinaTotal": { "confirm": 80422, "heal": 49914, "dead": 2984, "nowConfirm": 27524, "suspect": 520, "nowSevere": 6416 }, "chinaAdd": { "confirm": 120, "heal": 2654, "dead": 38, "nowConfirm": -2572, "suspect": -67, "nowSevere": -390 }, ...........其他數據............. "isShowAdd": true } }

3.Qt界面的實現

之前的桌面應用程序中,是使用的是Qt5版本開發的,Qt5自帶QJson解析類,而Qt 4沒有帶QJson。為了適配帶有Qt 4庫的板子,我使用了第三方JSON解析庫。這里選擇的是小巧的cJSON解析庫:[cJSON download SourceForge.net](https://sourceforge.net/projects/cjson/)

如果你的板子是Qt 4的庫,那么程序不用修改,直接交叉編譯運行即可使用。

只包含兩個文件:cJSON.c和cJSON.h,把這兩個文件添加到工程里就行了。

整個工程代碼也很簡單:GET接口地址,把接收到的數據保存到本地,調用cJSON解析數據文件,把解析出的數據顯示,數據文件刪除。代碼可以到文章末尾開源地址獲取。下面介紹幾個關鍵部分代碼的實現:

3.1 JSON數據的解析

//打開保存的JSON數據文件,并調用解析函數
void Dialog::parseData(QString filename)
{
    QFile file(filename);

    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "file open failed";
        return;
    }
    QByteArray allData = file.readAll();
    file.close();
// qDebug() << allData;
    getData(allData);
    file.remove();            //刪除文件
    return;
}

//把數據解析出來并顯示在標簽上
void Dialog::getData(QByteArray str)
{
    cJSON *ret_obj;
    cJSON *root_obj;

    root_obj = cJSON_Parse(str);   //創建JSON解析對象,返回JSON格式是否正確
    if (!root_obj)
    {
        disInfo("JSON format error");
        qDebug() << "json format error";
    }
    else
    {
        disInfo("json format ok");
        qDebug() << "json format ok";

        ret_obj = cJSON_GetObjectItem(root_obj, "ret");
        if(cJSON_IsNumber(ret_obj))
        {
            int ret = 1;
            ret = ret_obj->valueint;
// qDebug() << ret_obj->valueint;
        }

        char *data_str = cJSON_GetObjectItem(root_obj, "data")->valuestring;
        cJSON *data_obj = cJSON_Parse(data_str);
        if(!data_obj)
        {
            qDebug() << "data json err";
            cnt_error++;
            QString error = "err:" + QString::number(cnt_error);
            ui->lbe_error->setText(error);
        }
        else
        {
            qDebug() << "data json ok";
            char *lastUpdateTime = cJSON_GetObjectItem(data_obj, "lastUpdateTime")->valuestring;
            qDebug() << lastUpdateTime;
            ui->lbe_update_time->setText(lastUpdateTime);
            cJSON *chinaTotal_obj = cJSON_GetObjectItem(data_obj, "chinaTotal");

            int chinaTotal_confirm    = cJSON_GetObjectItem(chinaTotal_obj, "confirm")->valueint;
            int chinaTotal_heal       = cJSON_GetObjectItem(chinaTotal_obj, "heal")->valueint;
            int chinaTotal_dead       = cJSON_GetObjectItem(chinaTotal_obj, "dead")->valueint;
            int chinaTotal_nowConfirm = cJSON_GetObjectItem(chinaTotal_obj, "nowConfirm")->valueint;
            int chinaTotal_suspect    = cJSON_GetObjectItem(chinaTotal_obj, "suspect")->valueint;
            int chinaTotal_nowSevere  = cJSON_GetObjectItem(chinaTotal_obj, "nowSevere")->valueint;

            ui->lbe_total_confirm->setNum(chinaTotal_confirm);
            ui->lbe_total_heal->setNum(chinaTotal_heal);
            ui->lbe_total_dead->setNum(chinaTotal_dead);
            ui->lbe_total_nowConfirm->setNum(chinaTotal_nowConfirm);
            ui->lbe_total_suspect->setNum(chinaTotal_suspect);
            ui->lbe_total_nowSevere->setNum(chinaTotal_nowSevere);

            cJSON *chinaAdd_obj = cJSON_GetObjectItem(data_obj, "chinaAdd");
            int chinaAdd_confirm    = cJSON_GetObjectItem(chinaAdd_obj, "confirm")->valueint;
            int chinaAdd_heal       = cJSON_GetObjectItem(chinaAdd_obj, "heal")->valueint;
            int chinaAdd_dead       = cJSON_GetObjectItem(chinaAdd_obj, "dead")->valueint;
            int chinaAdd_nowConfirm = cJSON_GetObjectItem(chinaAdd_obj, "nowConfirm")->valueint;
            int chinaAdd_suspect    = cJSON_GetObjectItem(chinaAdd_obj, "suspect")->valueint;
            int chinaAdd_nowSevere  = cJSON_GetObjectItem(chinaAdd_obj, "nowSevere")->valueint;

            lbeDisplay(ui->lbe_add_confirm, chinaAdd_confirm);
            lbeDisplay(ui->lbe_add_heal, chinaAdd_heal);
            lbeDisplay(ui->lbe_add_dead, chinaAdd_dead);
            lbeDisplay(ui->lbe_add_nowConfirm, chinaAdd_nowConfirm);
            lbeDisplay(ui->lbe_add_suspect, chinaAdd_suspect);
            lbeDisplay(ui->lbe_add_nowSevere, chinaAdd_nowSevere);
        }
// cJSON_Delete(ret_obj);
// cJSON_Delete(data_obj);
        cJSON_Delete(root_obj);//釋放內存
        disInfo("更新完成");
        cnt_success++;
        QString success = "ok:" + QString::number(cnt_success);
        ui->lbe_success->setText(success);
    }
}

//數據的顯示
void Dialog::lbeDisplay(QLabel *lbe, int num)
{
    if(num > 0)
        lbe->setText("+" + QString::number(num));
    else
        lbe->setText(QString::number(num));
} 

3.2 獲取本地IP地址

//forexample:192.168.1.111
QString Dialog::GetLocalmachineIP()
{
    QString ipAddress;
    QList ipAddressesList = QNetworkInterface::allAddresses();
    for(QHostAddress &addr : ipAddressesList)
    {
        // 找到不是本地ip,并且是ipv4協議,并且不是169開頭的第一個地址
        if(addr != QHostAddress::LocalHost && addr.protocol() == QAbstractSocket::IPv4Protocol && !addr.toString().startsWith("169"))
        {
            ipAddress = addr.toString();
            break;
        }
    }
    // if we did not find one, use IPv4 localhost
    if (ipAddress.isEmpty())
        ipAddress = QHostAddress(QHostAddress::LocalHost).toString();
    return ipAddress;
} 

桌面Linux版本的運行效果:

4.在開發板上運行Qt程序

如果在桌面運行正常,就可以使用ya157c構建套件來編譯工程,生成可以在開發板上運行的程序,然后使用scp命令傳輸到開發板上。

#使用網線把開發板連接上路由器
#使用udhcpc自動獲取IP地址
udhcpc 

#查看獲取到的ip地址
ifconfig

#確認連接到互聯網
ping www.baidu.com
#如果有回復數據,說明已經成功連接上互聯網

#使用scp命令或共享目錄的方式把可執行文件傳輸到開發板上
scp qte_2019_ncov root@192.168.1.109:/home/root

#執行程序
./qte_2019_ncov 

最終效果

這個版本是上一個版本的,右上角沒有顯示開發板的IP地址和成功失敗次數統計,最新版本的程序中已經添加了這個功能。

桌面Linux版效果:

5.使用無線模塊聯網

YA157C開發板已經板載了一個WiFi & 藍牙模組——AP6212,可以直接連接無線網,這樣就不需要使用網線的方式聯網了。

#關閉eth0
ifconfig eth0 down

#啟用wlan0
rfkill unblock wifi
ifconfig wlan0 up

#在當前文件夾生成WiFi配置文件
wpa_passphrase "M6_Note" "qwert125" > wifi.conf

#查看生成的WiFi配置信息
cat wifi.conf

#加載WiFi配置文件
wpa_supplicant -B -c wifi.conf -i wlan0

#掃描附近的WiFi信息
iw dev wlan0 scan | grep SSID

#自動獲取IP地址
udhcpc -i wlan0

#設置DNS
echo "nameserver 114.114.114.114" > /etc/resolv.conf

#連接互聯網
iw wlan0 link

#測試網絡連接
ping www.wangchaochao.top 

為了方便快捷的連接WiFi,可以把以上命令寫成一個shell腳本,需要連接WiFi時,直接執行這個腳本就可以了。先在本地生成WiFi配置信息:

connect_wifi.sh腳本文件內容:

#!/bin/bash

WF_SSID="M6_Note"
WF_PASSWORD="qwert125"

#關閉eth0
ifconfig eth0 down

#使能wlan0
rfkill unblock wifi
ifconfig wlan0 up

#輸出WiFi信息
echo "WiFi_SSID:$WF_SSID"
echo "WiFi_PASSWORD:$WF_PASSWORD"

#在當前文件夾生成WiFi配置信息
wpa_passphrase $WF_SSID $WF_PASSWORD > $WF_SSID.conf

#加載WiFi配置文件
wpa_supplicant -B -c /home/root/$WF_SSID.conf -i wlan0

#掃描附近的WiFi
iw dev wlan0 scan | grep SSID

#自動獲取IP地址
udhcpc -i wlan0

#配置DNS
echo "nameserver 114.114.114.114" > /etc/resolv.conf

#連接網絡
iw wlan0 link echo "WiFi連接成功" 

WiFi賬號和密碼修改一下,就可以直接使用了。

6.代碼下載

整個Qt工程代碼已經開源在Github,Qt4/Qt5兼容。如果下載速度很慢,可以選擇國內的Gitee速度會快很多。

#Github
https://github.com/whik/qte_2019_ncov

#Gitee
https://gitee.com/whik/qte_2019_ncov 

目前界面還比較簡單,7寸的顯示屏可以顯示很多內容,之后會盡量完善界面信息,歡迎大家關注!


本文來自米爾科技,原文地址: http://www.inbisnis.com/resource/540.asp,轉載請注明出處。

比較和選型

手冊教程

應用筆記

好書推薦

技術支持服務指南

常見問題解答

电影中国免费-韩国三圾片大全 https://www.1905.com/电影网 https://www.youku.com/优酷网 https://www.iqiyi.com/爱奇艺

小影影视,2345影视大全最新最好看,影视大全韩国在线观看

小影大全,天狼影院2019天狼影视大全,影视大全免费追剧

最新影视免费观看,最新影视资讯

小影视频,真人男女自拍免费视频,黄瓜视频

小影影视,天天看高清影视在线观看,YY6080影视理论

小影影视,天天看高清影视在线观看,YY6080影视理论

小影大全,天狼影院2019天狼影视大全,影视大全免费追剧

小影影视,三分钟免费观看视频,2345影视大全

最新影视免费观看,最新影视资讯

小影影视,天天看高清影视在线观看,YY6080影视理论

欢乐颂小说 小说网 有声小说下载 《完美世界》txt全集 我欲封天txt下载 旷世神医 琅琊榜 海宴 小说 我欲封天txt下载 小说阅读网站 绝色狂妃 仙魅 小说