嵌入式开发——boa服务器下的ajax与cgi通信

博主最近在最有做一个嵌入式课程设计,要求是利用基于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函数。

时间: 2024-12-25 17:11:34

嵌入式开发——boa服务器下的ajax与cgi通信的相关文章

嵌入式Boa服务器上CGI开发-(转自Bryce.Xiao)

嵌入式WEB服务器常见的有lighttpd shttpd thttpdboa mathopd minihttpdappwebgoahead========================================================================嵌入式WEB服务器BOA的移植方法(一)2007-2-26 16:20:00  随着Internet技术的兴起,在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的B/S结构

嵌入式Linux上通过boa服务器实现cgi/html的web上网【转】

转自:http://blog.csdn.net/tianmohust/article/details/6595996 版权声明:本文为博主原创文章,未经博主允许不得转载. 嵌入式Linux上通过boa服务器实现cgi/html的web上网简介: 第一步 Boa程序的移植 1.下载Boa源码 2.生成Makefile文件 3.修改Makefile文件 4.编译 第二步 Boa的配置 第三步boa的执行 1.将根文系统ramdisk在电脑主机上mount &nda  嵌入式linux上通过boa服务

嵌入式boa服务器移植

问题1:交叉工具链:cross-2.95.3.tar.bz2(下载地址:http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/),开始使用的交叉工具链是arm-linux-gcc-3.3.2(下载地址:http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.3.2.tar.bz2), 使用该工具链编译出来的boa,在开发板上运行时,提示ssh: /lib/i686/l

为嵌入式开发板客户端自己动手在虚拟机上搭建NTP服务器

网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某些时间标准.目前采用的时间标准是世界协调时UTC(Universal Time Coordinated).NTP的主要开发者是美国特拉华大学的David L. Mills教授.NTP对于我们个人来说有什么用呢,简单的讲,当你的计算机时间不准确了,你可以接入到互联网,从网上同步一下时间,看多方便. 对于企业来说,当你有成百上千的计算机,都不能直接连接互联网,时

为嵌入式开发板客户端自己动手在虚拟机上搭建时间同步NTP服务器

网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某些时间标准.目前采用的时间标准是世界协调时 UTC(Universal Time Coordinated).NTP的主要开发者是美国特拉华大学的David L. Mills教授.NTP对于我们个人来说有什么用呢,简单的讲,当你的计算机时间不准确了,你可以接入到互联网,从网上同步一下时间,看多方便. 对于企业来说,当你有成百上千的计算机,都不能直接连接互联网,

(转)在嵌入式Linux系统(OK6410)中移植Boa 服务器

OK6410的Boa服务器移植: <一> Boa的编译 1. 从 www.boa.org 下载 Boa 服务器的最新版:boa-0.94.13.tar.gz. 2. 解压:tar xzf boa-0.94.13.tar.gz 3. 进入解压后的文件夹 boa-0.94.13内部的 src文件夹,对源文件进行如下修改 ================================================= 由于arm-linux-gcc 编译器版本过高,对语法的支持有一些改变,所以需要

嵌入式开发技术三级

1.酒店客房的门锁系统是由总台服务器和若干客房指纹锁组成,其基本功能具体描述如下: a.客房的指纹锁与总台服务器之间通过通信网络连接. b.旅客在总台登记住宿时,录入其指纹信息,并提取其特征值存储在总台服务器中.同时录入一个密码(若干位数字组成),以备指纹无法开锁时,用密码开锁. c.旅客在开客房指纹锁时,把相应手指放在门锁的指纹采集部件上,采集相应的指纹图像信息,并传输给总台服务器. d.总台服务器接收到某个客房指纹锁传输来的指纹图像信息后,进行特征值求取并进行匹配,若匹配正确,则回送开锁指令

【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11) 开发环境 : -- 操作系统 : Vmware11 + RedHat6.3 企业版 + Win8.1; -- 硬件 : OK-6410-A 开发

与一线Linux嵌入式开发工程师的对话

转:与一线Linux嵌入式开发工程师的对话 陈工程师一直做Linux的嵌入式开发,作为在开发一线的工程师,他对很多问题的看法可能更切合实际需求,于是,通过邮件,就嵌入式开发方面的问题,请他谈了一下自己的看法: 问:关于嵌入式开发,我们准备给同学们讲解一些入门知识,从你一线开发经验来说,给我们一些建议: 陈工回答: 对于嵌入式Linux入门,如果有一定基础,可以从驱动开始:如果没有基础,我个人建议还是从应用程序开始.因为从应用程序开始是最容易的,也是 最直观的.而驱动程序运行在内核态,驱动本身的结