嵌入式開發——boa服務器下的ajax與cgi通訊

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

  主要實現及踩過的坑以下:前端

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

   推薦通常人沒有前端基礎的人使用get請求,由於只須要在請求的參數作一個字符串拼接就能夠完成基本的ajax請求,具體實現能夠參照一下這個網址(http://blog.csdn.net/huguohu2006/article/details/7755107),接下來重點講一下post請求,優點這裏我就很少講了,前面的教程裏面都有,主要講一下實現方式:linux

 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方法來發送數據主要有如下幾個緣由:web

  • 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請求的處理,示例函以下:ajax

#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函數。服務器

相關文章
相關標籤/搜索