最近在最有做一個嵌入式課程設計,要求是利用基於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為隨身碟在linux系統上顯示的名字,web為目標檔案夾,使用隨身碟掛載的缺點在於整個隨身碟的檔案會全部被複製到目標檔案夾中,有點綴餘
•發送的資料不很多,也沒有其他的類型要求,使用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函數。
以上所述是小編給大家介紹的Boa伺服器下的ajax與cgi通訊的全部敘述,希望對大家有所協助,如果大家想瞭解更多內容敬請關注云棲社區!