首页 > 其他分享 >嵌入式开发——boa服务器下的ajax与cgi通信

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

时间:2023-02-16 09:34:58浏览次数:38  
标签:cgi return 请求 char xhr ajax input boa

博主最近在最有做一个嵌入式课程设计,要求是利用基于cortax a8的物联网实验箱做一个简单的嵌入式网页交互系统作为课程设计来验收评分。因为本身自己是学前端的,所以网页部分并不是重点,主要是和boa服务器之间的通信,课程实验给的例子是直接使用printf来打印html标签形成新的页面,有过前端开发经验的人都知道这种做法效率低下而且没有办法实现异步刷新,所以博主采用ajax来进行boa服务器下的异步通信。

主要实现及踩过的坑如下:

1. get 还是 post请求:怎么发请求参见W3School上的ajax教程

推荐一般人没有前端基础的人使用get请求,因为只需要在请求的参数做一个字符串拼接就可以完成基本的ajax请求,具体实现可以参照一下这个网址(http://blog.csdn.net/huguohu2006/article/details/7755107),接下来重点讲一下post请求,优势这里我就不多讲了,前面的教程里面都有,主要讲一下实现方式:

  1. function sender(url, data) {
  2. var xhr = createXHR();
  3. if (xhr) {
  4. xhr.onreadystatechange = function() {
  5. if (xhr.readyState == 4 && xhr.status == 200) {
  6. console.log(xhr.responseText);
  7. console.log(xhr.responseText.toString());
  8. var returnValue = xhr.responseText.toString();
  9. console.log(returnValue);
  10. return returnValue;
  11. // firefox下xhr.responseText作为返回值失效的问题
  12. // ie可以利用return来得到值。但firefox则不能,只能在readyState == 4 && status == 200时处理一个函数
  13. // 这个函数应当作为一个参数传递入函数。有个奇怪现象你如果去除红线部分的注释,firefox又可以取到值。
  14. // 估计是firefox使用ajax取值有个延时造成。
  15. //return xhr.responseText.toString();
  16. }
  17. };
  18. xhr.open("post", url, true);
  19. // send(string) 仅适用于post请求
  20. xhr.send(data);
  21. } else {
  22. //XMLHttpRequest对象创建失败
  23. alert("浏览器不支持,请更换浏览器!");
  24. }
  25. }

利用调用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请求的处理,示例函如下:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. char* get_cgi_data(FILE* fp, char* method)
  6. {
  7. char* input;
  8. int len;
  9. int size=;
  10. int i=;
  11.  
  12. if (strcmp(method, "GET") == ) /**< GET method */
  13. {
  14. input = getenv("QUERY_STRING");
  15. return input;
  16. }
  17.  
  18. else if (strcmp(method, "POST") == ) /**< POST method */
  19. {
  20. len = atoi(getenv("CONTENT_LENGTH"));
  21. input = (char*)malloc(sizeof(char) * (size+));
  22.  
  23. if (len == )
  24. {
  25. input[] = '\0';
  26. return input;
  27. }
  28.  
  29. while ()
  30. {
  31. input[i] = (char)fgetc(fp);
  32. if (i == size)
  33. {
  34. input[i+] = '\0';
  35. return input;
  36. }
  37. --len;
  38.  
  39. if (feof(fp) || (!(len)))
  40. {
  41. i++;
  42. input[i] = '\0';
  43. return input;
  44. }
  45. i++;
  46. }
  47. }
  48. return NULL;
  49. }
  50.  
  51. int main(void)
  52. {
  53. char* input;
  54. char* method;
  55. char name[];
  56. char passwd[];
  57. int i=;
  58. int j=;
  59.  
  60. printf("Content-type:text/html\n\n");
  61. printf("The following is query result:");
  62. method = getenv("REQUEST_METHOD");
  63. input = get_cgi_data(stdin, method);
  64.  
  65. printf("string is: %s", input);
  66.  
  67. return ;
  68. }

上面包含了c语言处理两种请求的方法,get请求比较简单,直接使用getenv("QUERY_STRING")就可以获取到请求发送的数据,post请求的处理则比较负责,先获取请求内容长度,然后根据长度来动态分配一个等长的字符串空间,将发送的数据传给字符串,然后再根据自己项目的需要进行相应的处理即可。

PS:发送http请求时对应的成功程序printf之后就是http请求接受到的相应,也就是对应的xhr的responseText属性值,另外.c文件需要理由arn-linux-gcc -o helloworld.cgi helloworld.c命名交叉编译得到对应的.cgi文件。然后博主用的是在每一次请求成功之后继续发送下一次请求,因为如果直接使用setInterval函数进行循环请求传感器数据的话会产生比较大的延时,基本等同于进程,如果直接通过文件存储传感器数据的方式则可以使用setInterval函数。

标签:cgi,return,请求,char,xhr,ajax,input,boa
From: https://www.cnblogs.com/kn-zheng/p/17125513.html

相关文章

  • fetch和ajax的区别,fetch请求携带cookie问题
    相关文档链接https://developer.mozilla.org/zh-CN/docs/Web/API/fetchhttps://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetchhttps://developer.......
  • 网页跨域ajax请求问题
    今天用php的项目网页请求另一个服务器的rails项目的api。首先解决php项目的跨域问题。服务器是ubuntu用的apache2。修改文件 /etc/apache2/apache2.conf,添加一......
  • djiango框架前端数据通过Ajax传到后端进行处理
    最近在琢磨搭建测试平台,python相对来说简单一点,框架的话就选择djiango框架,既然搭建平台就肯定需要进行数据处理,摸索了一下,在此记录一下数据的梳理流程。1.首先自己写一个......
  • [LeetCode] 1138. Alphabet Board Path
    Onanalphabetboard,westartatposition (0,0),correspondingtocharacter board[0][0].Here, board=["abcde","fghij","klmno","pqrst","uvwxy","z"],......
  • kubeadm的部署+Dashboard+以及连接私有仓库 Harbor
    一、kubeadm部署K8S集群架构主机名IP地址安装组件master(2C/4G,cpu核心数要求大于2)192.168.10.10docker、kubeadm、kubelet、kubectl、flannenode01(2C/2G)1......
  • ArcGIS中提取多波段影像中的单个波段
    方法一:BandMath方法二:将band和combination(波段、组合)修改为需要提取的波段,点击确定即可。这个方法通过试验验证可用参考:https://www.cnblogs.com/caoyimingGIS/p/755......
  • 二进制部署k8s+calico+dashboard+nginx+keepalived
    192.168.190.200k8s-master1192.168.190.202k8s-node1192.168.190.201k8s-master2192.168.190.110vip#查看yum中可升级的内核版本yumlistkernel--showdup......
  • 1138.alphabet-board-path 字母板上的路径
    问题描述1138.字母板上的路径解题思路考虑到'z'单独在一个地方,因此移动顺序中,左下、右上不能反过来,即不能先往下再往左或者先往右再往上。代码classSolution{publi......
  • AJAX动态加载下拉框数据
    1、type表数据2、前端页面现在的想法是点击商品类型下拉框,动态加载所有商品类型利用select标签的id属性3、jQuery代码部分这句放在自执行函数里面loadProductType("/ssm_tes......
  • springmvc文件上传(ajax请求 带参数)
    前言这里用ajax文件上传,并携带几个参数,网上查到的大多都是没带参数只有文件的。由于我项目代码太多,这里只给出关键代码。操作我用的SSM框架,传之前,先在WEB-INF/dispatcherSe......