图解丨在嵌入式设备上实现HTTP服务器

您好呀,我是小二。

本期为大家带来一个 WiFi 应用的实际场景,其实在之前「我对 WiFi 驱动移植过程,做了一次总结复盘」这篇文章中有简单提过,但由于内容较多,就单独摘出来了。

来自读者的催更????????????,别着急,小二在努力了!

1 应用场景

我喜欢讲一个东西,先来探讨下他的应用场景。

毕竟知道了用在哪,怎么用,才能写好代码嘛,哈哈????

本次项目,实际的应用场景:通过手机 APP ,连接到设备 WiFi 热点,进行设备的参数配置;

接着结合实际框架,拆分需求如下:

  • 采用 HTTP 协议,使用 POST 方法;

  • 设备端需要作为一个 HTTP 服务器;

  • 不需要支持 CGI ,通过 APP 展示界面即可;

好了,明白了需求,接下来就是实现方案了。

2 方案论证

刚开始的时候,一点头绪都没有。

组长指导的一种方案,就是在新唐数据手册中看到的,采用 Lighttpd 的方案。

后来去查资料,发现一篇介绍不同 HTTP 服务器的文章,挺不错的,如下

常见的几种嵌入式web服务器(https://www.cnblogs.com/quliuliu2013/p/12786301.html)

2.1 Lighttpd

这块刚开始是同事在搞,后来我这边的需求规划出来后,就在想能否使用这种方案。

毕竟方案是现成的,可以节省不少时间。

后来经过分析,发现 Lighttpd 需要一个单独的进程执行,如下图所示

Lighttpd 提供了 CGI 接口,支持 IE 访问固定界面,然后进行参数配置。

实际实现方案,我认为比较好的方法是,Lighttpd 进程接收到参数变更时,写入配置文件 A ,主业务进程监测文件 A 是否有改变,如果检测到改变,则读一次数据。

具体实现方式,参考下图

结合实际情况分析,

1、目前只维护一个主业务进程,如果再增加额外的进程,则维护成本将大大增加。

2、实际不需要 CGI 接口,不需要支持 IE ,APP 做界面显示即可。

经过论证,此方案较复杂,暂且当做最后的备选方案。

2.2 cpp-httplib

接着我就去 GitHub 上寻找 HTTP Server ,发现 cpp-httplib 这个比较好用的库。

GitHub 链接:cpp-httplib(https://github.com/yhirose/cpp-httplib)

在查看了 ReadMe 文件后,很遗憾,我用不了????????????

提示说 GCC 4.8 及以下版本无法正常编译,因为 <regex> 文件已损坏。。。

我去找了找解决方法,发现在 GCC 4.9 版本修复了这个问题,参考 Stack Overflow 回答如下

https://stackoverflow.com/questions/12530406/is-gcc-4-8-or-earlier-buggy-about-regular-expressions

没办法了,我们当前 GCC 版本是 4.8.3 的,肯定不能因为这个库就更换编译器呀,那只能再去找找看咯。

2.3 httpserver

然后就接着去搜索,发现了 httpserver 这个库,只有一个 .h 头文件,感觉很简单。

GitHub 链接:httpserver(https://github.com/jeremycw/httpserver.h)

分析本质需求,发现只需要在主进程中,跑一个 HTTP Server 的线程,监听固定端口,然后采用 HTTP 协议进行通信即可。

简要功能,如下图所示

从上图可以看出

1、主进程中,单独跑一个 HTTP Server 的线程,监听固定端口 8888 ;

2、此线程同时进行数据处理,将参数写入文件 A ;

3、其他业务线程,在需要参数时,直接去文件 A 获取最新参数即可;

3 实现方式

具体实现方式,参考 ReadMe 文件,也很方便实现。

简述一下主要流程:

  • 绑定监听端口号,绑定回调函数;

  • 死循环监听端口;

  • 当需要关闭 HTTP 服务时,通过 flag 标志位,改变当前状态;

  • 关闭 HTTP 服务后,需要释放相应资源;

  • 所有的配置处理接口,在 HandleRequest 回调函数中;

(PS:我这电脑网络有问题,GitHub 一直打不开,手机热点也不行,暂时还没别的好办法,只能麻烦您自己去网页上看啦。)

4 注意事项

在使用过程中,我这遇到一个问题。

您看下边这块代码,是这样的

void hs_init_session(http_request_t* session) {session->flags = HTTP_AUTOMATIC;session->parser = (http_parser_t){};session->stream = (hs_stream_t){};if (session->tokens.buf) {free(session->tokens.buf);session->tokens.buf = NULL;}http_token_dyn_init(&session->tokens, 32);
}

在第 3 、4 行末尾,直接就是一个大括号,里边什么都没写。

然后我的程序在这个地方就一直编译不过去。后来在公司前辈指点下,按照下图所示,添加了 0 之后,就能编译通过了。

推测原因是当前编译器使用的 C 标准,不支持这么高级的用法。

注意:需要修改的不止这一处,其他地方如有编译报错,也需做类似修改。

5 总结

针对本次的功能需求,最困难的地方,在于寻找一个合适的 HTTP Serve 库来使用。

过程虽然艰难,但也锻炼了自己找东西的能力。

好了各位看官,本次的分享到此结束,如果您还意犹未尽,大可从头再看。

最后别忘了赏小二一个 在看 哦????????????

祝您端午安康,工作顺利!


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

嵌入式Linux

微信扫描二维码,关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven详解之仓库

在Maven中&#xff0c;任何一个依赖、插件或者项目构建的输出&#xff0c;都可以称之为构件。 Maven在某个统一的位置存储所有项目的共享的构件&#xff0c;这个统一的位置&#xff0c;我们就称之为仓库。&#xff08;仓库就是存放依赖和插件的地方&#xff09; 任何的构件都有…

Linux内核代码,第一次看到这样使用的宏

晚上看内核代码&#xff0c;看到一个有意思的宏&#xff0c;我之前没有见到过&#xff0c;当然&#xff0c;肯定有人见到过&#xff0c;我写出来是给那些没有看到过的人看的。我说是深夜&#xff0c;那就肯定是深夜代码是从内核里面看到的我们正常使用宏是这样的C语言、嵌入式中…

学习笔记三

三、信息安全风险管理的风险评估<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1、风险评估概述A、风险评估的概念风险评估是信息安全风险管理的第二步&#xff0c;针对确立的风险管理对象所面临的风险进行识别、分析和评价。请…

每日一题(41)—— 数组和链表的区别

数组和链表的区别&#xff1a; 数组&#xff1a;数据顺序存储&#xff0c;固定大小 连表&#xff1a;数据可以随机存储&#xff0c;大小可动态改变

flex柱状图和折线图的混合图使用

<?xml version"1.0"?> <mx:Application xmlns:mx"http://www.adobe.com/2006/mxml"> <mx:Script> <!--[CDATA[ import mx.collections.ArrayCollection; [Bindable] public var data1:ArrayCollectionnew ArrayCollection([{date:&…

给高通提个问题解决为啥那么久?

我第一次接触高通芯片是在中兴那&#xff0c;我们用的是一款很老的芯片&#xff0c;高通的文档非常多&#xff0c;资料非常丰富&#xff0c;如果有问题的话我一般都会从文档里面找答案。但是&#xff0c;但是&#xff0c;并不是所有的问题都是能自己搞定&#xff0c;比如遇到一…

BZOJ4503 两个串 【fft】

题目链接 BZOJ4503 题解 水水题。 和残缺的字符串那题几乎是一样的 同样转化为多项式 同样TLE 同样要手写一下复数才A #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<complex> #include<cmath> #i…

每日一题(42)—— 已知一个数组table,用一个宏定义,求出数据的元素个数

已知一个数组table&#xff0c;用一个宏定义&#xff0c;求出数据的元素个数。 // 总大小除以第一个元素的大小 #define TNTBL (sizeof(table)/sizeof(table[0]))

新公司上班第一天

大家好&#xff0c;文章转自我的朋友helloworld&#xff0c;文中的我并不是我&#xff0c;感谢大家阅读&#xff0c;转载&#xff0c;在看。Hello 各位小伙伴&#xff0c;周一愉快~今天是我到新公司上班的第一天&#xff0c;入职新公司&#xff0c;就好像刚刚谈恋爱一样&#x…

[CTO札记]从Cloud Computing看战略决策:想做、能做与可做 -

1&#xff09;想做--未来方向很多人已经意识到&#xff0c;Cloud Computing未来将是基础设施&#xff0c;扮演水、电、气的角色。可以说&#xff0c;Cloud Computing是很多互联网、电信大公司想做的事。因为&#xff1a;》不仅重要&#xff08;大公司都不想自己的命运掌握在别人…

JAVA基础学习之路(三)类定义及构造方法

类的定义及使用 一&#xff0c;类的定义 class Book {//定义一个类int price;//定义一个属性int num;public static int getMonney(int price, int num) {//定义一个方法return price*num;} }public class test2 {public static void main(String args[]) {Book monney new B…

电子火折子的电路原理

d▲本文要分析的电路看古装剧时&#xff0c;不时可以看到这样的场景&#xff1a;有人从怀里掏出一个“火折子”&#xff0c;对着吹一吹就点着了火&#xff0c;觉得很神奇&#xff1a;更加神奇的是&#xff0c;有才的电子工程师们&#xff0c;重新发明了火折子&#xff0c;也就是…

整理了二个基本的css库(高手请绕道)

前一阵公司唯一的前端开发人员走掉了&#xff0c;短期内也没人顶上来&#xff0c;所以切页面/js这种活儿只能咱自个儿揽过来了&#xff0c;花了大半天捣鼓了下css,整理了二个基本的css库&#xff0c;方便以后切页面&#xff0c;贴在这里备份 说明:p.css ---即public.css&#x…

每日一题(43)—— 数组越界

下面这个程序执行后会有什么错误或者效果: #define  MAX  255 int main() {unsigned char A[MAX],i;for (i0;i<MAX;i){A[i]i;} }解答&#xff1a;死循环加数组越界访问&#xff08;C/C不进行数组越界检查&#xff09; MAX255 数组A的下标范围为:0..MAX-1,这是其一.. 其…

P1133 教主的花园 (动态规划)

题目描述 教主有着一个环形的花园&#xff0c;他想在花园周围均匀地种上n棵树&#xff0c;但是教主花园的土壤很特别&#xff0c;每个位置适合种的树都不一样&#xff0c;一些树可能会因为不适合这个位置的土壤而损失观赏价值。 教主最喜欢 3种树&#xff0c;这3种树的高度分别…

如何快速构建嵌入式全栈知识体系?

嵌入式是一门交叉学科。一个嵌入式电子产品&#xff08;比如手机&#xff09;从底层到上层&#xff0c;一般会涉及半导体芯片、电子电路、计算机、操作系统、多媒体等不同专业领域的知识。很多从事嵌入式开发的朋友&#xff0c;通常来自不同的专业&#xff08;电子、电气、计算…

台湾高僧称游戏中杀人是罪业死后要下地狱

台湾著名高僧净空法师的一段谈因果报应的视频&#xff0c;近来被上传到网络上&#xff0c;引发网友特别是游戏玩家的极大反应。净空法师在这段视频中说&#xff0c;在电子游戏中杀人所造下 的罪业和杀真人是相同的&#xff0c;死后肯定会下阿鼻地狱&#xff0c;出来后也还要慢慢…

SpringBoot 封装返回类以及session 添加获取

1、创建返回类Result public class Result<T>{/*错误码*/private Integer code;/*提示信息 */private String msg;/*具体内容*/private T data;public Integer getCode() {return code;}public void setCode(Integer code) {this.code code;}public String getMsg() {r…

每日一题(44)—— 请列举一个软件中时间换空间或者空间换时间的例子

请列举一个软件中时间换空间或者空间换时间的例子&#xff1a; --->时优 void swap(int a,int b) {int c;ca;ab;bc; } --->空优 void swap(int a,int b) {aab;ba-b;aa-b; }

迅雷的声音:摆脱视频产业的经济化困境

两个视频版权联盟之间的交锋日前到了白热化阶段&#xff0c;居然在深圳发生了两个发布会唱对台的戏剧化场面。迅雷发表声明“承诺推动视频市场正版化”&#xff0c;迅雷CEO甚至表示要去公证处跟对手“比谁的版权多”。在我看来&#xff0c;虽然去公证处大可不必&#xff0c;但至…