图解丨在嵌入式设备上实现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语言、嵌入式中…

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;比如遇到一…

新公司上班第一天

大家好&#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;也就是…

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

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

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

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

嵌入式系统开发者需要掌握什么技术?

大家好&#xff0c;我是小嵌&#xff0c;在知乎上看到这个问题&#xff0c;其中有一个答主的答案很经典&#xff0c;特此分享给大家。说实话&#xff0c;问题中嵌入式开发这个话题有点庞大&#xff0c;毕竟它涵盖的领域和范围很宽泛。作为一个在嵌入式软件开发方面工作了十多年…

做决定要趁早

之前接触的一个读者朋友&#xff0c;几个月前跟我咨询了问题&#xff0c;那时候因为有个决定困扰他&#xff0c;已经快抑郁了&#xff0c;不过到现在为止&#xff0c;还没有做决定。做决定这个事情&#xff0c;我希望不要拖太久&#xff0c;不要咨询太多无关的人&#xff0c;做…

2009第二届C++技术大会即将在上海隆重召开

2009第二届C技术大会即将在上海隆重召开 作为软件开发语言的翘楚&#xff0c;C对于现代软件的发展功不可没&#xff0c;特别是在系统软件开发领域&#xff0c;C扮演着关键的角色。中国作为全球软件产业最具潜力的市场&#xff0c;越来越多的企业认识到了C及相关系统软件技术在软…

大数据开发你需要知道的十个技术

前言 “当你不创造东西时&#xff0c;你只会根据自己的感觉而不是能力去看待问题。” – WhyTheLuckyStiff 汇总一些自己在大数据路上走过的弯路&#xff0c;愿大家不再掉坑… 1.分布式存储 传统化集中式存储存在已有一段时间。但大数据并非真的适合集中式存储架构。Hadoop设计…

华为这个事,是不是刷KPI?

最近闹的比较热闹的事情是&#xff0c;华为有人提交到Linux 上的代码被审核员点名批评刷KPI&#xff0c;并且&#xff0c;这个邮件还上了头条。提交的代码修改如下From: Zhen Lei <thunder.leizhenhuawei.com> To: Kees Cook <keescookchromium.org>,Anton Voronts…

前端小demo——全选和全不选

模拟购物车&#xff0c;实现全选或者全不选&#xff0c;或者其中任意一件单品单选的效果。 点击顶部复选框实现全选 列表中任意一项未选中&#xff0c;顶部复选框就是未选中的状态 <!DOCTYPE html> <html><head lang"en"><meta charset"UT…

毕业2年,我的工作小结

文章转自我的读者朋友&#xff0c;他毕业后从事的是BSP开发工作&#xff0c;主要做LCD模块&#xff0c;我们算是认识比较久&#xff0c;刚毕业那会聊的也挺多&#xff0c;时间过得很快&#xff0c;想不到他已经毕业两年了。最近几天公司&#xff0c;公司的小鲜肉多了起来。我偶…

Something about WinCE6.0 R3

Windows Embedded家族 Windows Embedded CE概览 WinCE6.0 R3新增组件 R3的发布让WinCE6.0如虎添翼 嵌入式系统的Silverlight 引入Silverlight后UI新的体系结构 触摸手势的支持将彻底改变用户体验

我现在都在这里买元器件了!

记得上大学那会做单片机项目需要买元件&#xff0c;我们就需要跑到市中心去买&#xff0c;绕过大大小小的街道&#xff0c;可以看到坐在柜台的老板&#xff0c;然后跟老板拉扯几句&#xff0c;然后进入大包小包的买卖中。做一个最小系统板至少也要花个小100块钱&#xff0c;大学…

高考失利要不要复读?

对于我&#xff0c;如果考不好&#xff0c;我一定会复读。这个事情在每个人身上可能会不同&#xff0c;所以先从我说起&#xff0c;我出生在一个非常贫穷的农民家庭&#xff0c;我有好几个表哥&#xff0c;还有几个堂哥&#xff0c;甚至于我哥&#xff0c;他们读书都非常差&…