嵌入式開發——boa伺服器下的ajax與cgi通信

来源:http://www.cnblogs.com/xiaokk06/archive/2016/07/10/5658836.html
-Advertisement-
Play Games

博主最近在最有做一個嵌入式課程設計,要求是利用基於cortax a8的物聯網實驗箱做一個簡單的嵌入式網頁交互系統作為課程設計來驗收評分。因為本身自己是學前端的,所以網頁部分並不是重點,主要是和boa伺服器之間的通信,課程實驗給的例子是直接使用printf來列印html標簽形成新的頁面,有過前端開發經 ...


  博主最近在最有做一個嵌入式課程設計,要求是利用基於cortax a8的物聯網實驗箱做一個簡單的嵌入式網頁交互系統作為課程設計來驗收評分。因為本身自己是學前端的,所以網頁部分並不是重點,主要是和boa伺服器之間的通信,課程實驗給的例子是直接使用printf來列印html標簽形成新的頁面,有過前端開發經驗的人都知道這種做法效率低下而且沒有辦法實現非同步刷新,所以博主採用ajax來進行boa伺服器下的非同步通信。

  主要實現及踩過的坑如下:

1. get 還是 post請求:怎麼發請求參見W3School上的ajax教程

   推薦一般人沒有前端基礎的人使用get請求,因為只需要在請求的參數做一個字元串拼接就可以完成基本的ajax請求,具體實現可以參照一下這個網址(http://blog.csdn.net/huguohu2006/article/details/7755107),接下來重點講一下post請求,優勢這裡我就不多講了,前面的教程裡面都有,主要講一下實現方式:

 function sender(url, data) {
            var xhr = createXHR();
            if (xhr) {
                xhr.onreadystatechange = function() {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        console.log(xhr.responseText);
                        console.log(xhr.responseText.toString());
                        var returnValue = xhr.responseText.toString();
                        console.log(returnValue);
                        return returnValue;
                        // firefox下xhr.responseText作為返回值失效的問題
                        // ie可以利用return來得到值。但firefox則不能,只能在readyState == 4 && status == 200時處理一個函數
                        // 這個函數應當作為一個參數傳遞入函數。有個奇怪現象你如果去除紅線部分的註釋,firefox又可以取到值。
                        // 估計是firefox使用ajax取值有個延時造成。
                        //return xhr.responseText.toString();
                    }
                };
                xhr.open("post", url, true);
                // send(string) 僅適用於post請求
                xhr.send(data);
            } else {
                //XMLHttpRequest對象創建失敗
                alert("瀏覽器不支持,請更換瀏覽器!");
            }
        }

 

利用調用sender函數來實現ajax,函數的兩個參數分別是請求的url和要發送的數據,註意post請求只能發送string類型的數據。如果要發送其他類型的數據建議採用jquery封裝的ajax方法,這裡之所以採用原生的ajax方法來發送數據主要有以下幾個原因:

  • jquery庫的體積比較大,有可能mount進開發箱上的linux系統時出現失敗的情況,這種情況可以通過mount u盤的方式解決  mount u盤的命令如下: mount -r /dev/uba4 /web -r為mount進文件的讀寫許可權,具體可執行搜索查詢,uba4為U盤在linux系統上顯示的名字,web為目標文件夾,使用U盤掛載的缺點在於整個U盤的文件會全部被覆制到目標文件夾中,有點綴餘
  • 發送的數據不很多,也沒有其他的類型要求,使用string類型完全可以滿足開發需求,沒必要引入jquery庫增加項目空間
  • 原生的ajax可以更好地解釋http請求的原理


下麵再介紹一下cgi文件對http請求的處理,示例函如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char* get_cgi_data(FILE* fp, char* method)
{
    char* input;
    int len;
    int size=1024;
    int i=0;

    if (strcmp(method, "GET") == 0)  /**< GET method */
    {
        input = getenv("QUERY_STRING");
        return input;
    }

    else if (strcmp(method, "POST") == 0)  /**< POST method */
    {
        len = atoi(getenv("CONTENT_LENGTH"));
        input = (char*)malloc(sizeof(char) * (size+1));

        if (len == 0)
        {
            input[0] = '\0';
            return input;
        }

        while (1)
        {
            input[i] = (char)fgetc(fp);
            if (i == size)
            {
                input[i+1] = '\0';
                return input;
            }
            --len;

            if (feof(fp) || (!(len)))
            {
                i++;
                input[i] = '\0';
                return input;
            }
            i++;
        }
    }
    return NULL;
}

int main(void)
{
    char* input;
    char* method;
    char name[64];
    char passwd[64];
    int i=0;
    int j=0;

    printf("Content-type:text/html\n\n");
    printf("The following is query result:");
    method = getenv("REQUEST_METHOD");
    input = get_cgi_data(stdin, method);

    printf("string is: %s", input);

    return 0;
}

上麵包含了c語言處理兩種請求的方法,get請求比較簡單,直接使用getenv("QUERY_STRING")就可以獲取到請求發送的數據,post請求的處理則比較負責,先獲取請求內容長度,然後根據長度來動態分配一個等長的字元串空間,將發送的數據傳給字元串,然後再根據自己項目的需要進行相應的處理即可。

PS:發送http請求時對應的成功程式printf之後就是http請求接受到的相應,也就是對應的xhr的responseText屬性值,另外.c文件需要理由arn-linux-gcc -o helloworld.cgi helloworld.c命名交叉編譯得到對應的.cgi文件。然後博主用的是在每一次請求成功之後繼續發送下一次請求,因為如果直接使用setInterval函數進行迴圈請求感測器數據的話會產生比較大的延時,基本等同於進程,如果直接通過文件存儲感測器數據的方式則可以使用setInterval函數。

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 含義:滾動條高度 作用:滾動載入(ajax),滾動導航固定定位,滾動彈框定位等等. 展示滾動導航和側邊欄滾動固定定位的效果:查看效果 1、chrome瀏覽器 2、各瀏覽器下 scrollTop的差異 IE6/7/8/9/10: 對於沒有doctype聲明的頁面里可以使用 document.body. ...
  • 關於前端對話框、消息框的優秀插件多不勝數。造輪子是為了更好的使用輪子,並不是說自己造的輪子肯定好。所以,這個博客系統基本上都是自己實現的,包括日誌記錄、響應式佈局等等一些本可以使用插件的。好了,廢話不多時。我們來實現自己的對話框和消息框。 ...
  • jQuery 的 setter/getter 共用一個函數,通過是否傳參來表明它是何種意義。簡單說傳參它是 setter,不傳它是 getter。 一個函數具有多種意義在編程語言中並不罕見,比如函數重載:一組具有相同函數名,不同參數列表的函數,這組函數被稱為重載函數。重載的好處是減少了函數名的數量, ...
  • 文章同步自個人博客:http://www.52cik.com/2016/07/11/generator co.html 此前只是簡單使用而沒有真正的去研究 Generator,這次要好好折騰下這貨。 <! more 非同步編程 對於 jser 來說,非同步非常熟悉了吧,但是真正理解非同步的卻不多,因為大部 ...
  • 一、起因 ES6新納入了很多振奮人心的新特性,真的很讓人忍不住去嘗試一下。不過,由於現在大部分的瀏覽器對ES6的支持程度都不是很好。所以如果想要放心地使用一些新特性,還需要用一些工具,將ES6或者ES7的代碼轉為ES5的代碼。今天,就配置了一下環境,寫了一個react-router,主要是練習自己的 ...
  • 一、主類關係圖 二、類職責 2.1、observable(普通監控對象類) observable(他其是一個function)的內部實現:1.首先聲明一個名為observable的fn(這個可以說是一個類)2.增加一個ko惟一的latestValue(最新值)屬性來存儲形參傳入的值3.如果支持原生_... ...
  • 一、position:fixed 鎖定位置(相對於瀏覽器的位置),例如有些網站的右下角的彈出視窗。 示例: 二、position:absolute 絕對位置: 1.外層沒有position:absolute(或relative);那麼div相對於瀏覽器定位,如下圖中b(距離瀏覽器右邊框為50像素,距 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...