【广东龙芯2K500先锋板试用体验】3.开发http服务与通过websocket实时更新页面数据
大信(QQ:8125036)
电子发烧友网联合广东龙芯发起龙芯2K500
开发板试用活动。龙芯2K500先锋板采用龙芯2K0500芯片。龙芯2K500片内集成64位LA264处理器核、32位DDR3控制器、2D GPU、DVO显示接口、两路PCIe2.0、两路SATA2.0、四路USB2.0、一路USB3.0、两路GMAC、PCI总线、彩色黑白打印接口、HDA及其他常用接口。
一、HTTP服务程序开发
该开发板具备高性能、超低功的特点,能够长时间的不间断工作,因此很适合作为工业数据通讯的服务模块,因此计划移植一个HTTP web服务程序到该板上,上位机能够通过板上的以太网络访问该web服务,该web服务返回开发板的一些基本信息数据,同时通过web页面可以控制板上的IO,达到向下发送控制指令和控制参数等功能。
HTTP服务网上开源的代码很多,在选择时,主要考量的因素是:1要对系统的消耗小,如对CPU,内存,存储等,不能因为HTTP服务占用了硬件过多的资源,以至于留给业务的资源不够。2需要支持HTTP标准的协议,很多http代码实现不完整,造成只能演示个通讯,无法达到工程应用的目标。3 http服务必须是支持高效的epoll的事件触发机制的异步模式,必须要尽可能实时的响应请求和高效的完成通讯。4.需要能够支持websocket这样的连接协议,满足对浏览器客户端的双向实时通讯。5.工程代码结构清晰,便于维护和改造,方便集成其它硬件操作模块。
同时,因为在嵌入式内的http服务,一般多用于设备维护,控制管理,都是管理与应用人员使用浏览器通过http服务来查看设备状态和控制设备,所以对http服务并发要求不大,一般并发在100已足够用。
同样在嵌入式HTTP服务中,需要跟硬件交互,因此需要http服务与硬件具有开放的操作性。也就是http也是硬件的一个应用。同时为了使web应用有良好的用户界面,一般采取动态响应式页面的前端,使用webapp的接口方式对页面提供数据的接口调用,数据接口一般采用ajax 和 websocket方式。而页面结构一般相对简单,因此无需复杂的动态后端脚本语言,无需php之类的这样的服务端中间件,而是直接采用 CGI,FastCGI的方式完成动态页面的生成。
经过调查一番,现有适合嵌入式使用的有nginx, lightHTTP, Httpd,uHttp等。这里经过对比,此次使用 uHttp/Websocket开源嵌入式项目。
工程的开源地址:
https://github.com/uNetworking/uWebSockets
1.下载uWebSockets 源码工程
下载后,进入根目录,查看发现有makefile, 可以尝试直接编译
2.切换交叉编译环境
3.进行尝试编译
make build
编译时出现报错,查看提示,发现缺少uSocket库,回头去看了下readme,发现是这个工程依赖uSocket库,于是再去下载uSocket库,不过很简单,这个库在uWebsocket同一个库下。
试编译,提示出错,缺少另外一个依赖的工程。
4.下载uSocket库
地址:https://github.com/uNetworking/uSockets.git
下载完成后,查看uWebsocket的编译脚本,发下uScket需要放在uWebsocke的目录下,即可直接联编,而不需要分别编译,这样就非常简便。
放置好目录后,再进行编译
输出到最后的应用时,出现报错。
5.检查uWebsocket应用编译报错的原因
经过分步的编译和跟踪编译过程,手动的单步编译能够成功编译出目标文件。对比手动编译和脚本自动编译的脚本执行的差异时,发现uSocket库的库文件已经生成,uWebsocket的文件编译已经完成,而在链接步骤出现异常。说明是自动编译的连接出现问题
链接工具错误,或者没有设置这样的静态库链接工具。
6.修改makefile 脚本
经过分析,发现在库的生成时,其格式有问题,于是修改makefile,执行生成库的编译工具,于是在 uWebsocket工程的Makefile文件里加入指定库生成工具
AR=
ARM-poky-linux-gnueabi-gcc-ar
7.重新编译
修改makefile 后,即可重新编译,则可以顺利的编译出目标文件了。
编译examples例子程序,提示缺少zlib库:
那么就先下载zlib源码,地址:
下载后编译:
8.编译example
进一步可以把uWebsocket带的例子全部编译出来,均可以顺利编译成功。上传开发板运行正常。
9.修改Httpserver例子程序
因为我们需要的是一个http服务,在uWebsocket里刚好有这个程序,就直接在它基础上进行修改了。
主要修改为,加入对文件的预读取,完成静态html,js, css,image等资源的加载和快速输出的功能。另外增加了一个简单的模板功能,即在对静态html文件读取之后,在对里面特定的标签内容进行内容替换。
10. 添加websocket服务
因为在页面上需要实时的跟后台取数据,而高效又延时短的通讯方式属于websocket了。
这里只需要把uWebsocekt工程里的websocet模块合并到httpserver服务里即可。即达到了既能输出html页面又能提供websocket数据通讯。
当使用 http://192.168.50.150/ 时就是访问http服务,而ws://192.168.50.150/ 时就是访问websocket服务。
这样就完成一个紧凑型的,具备动态页面输出和实时通讯协议的http嵌入式服务了。
四、简单WEB页面设计 这里做了个简单的web页面设计,作为一个演示,页面分别输出cpu 信息,内存信息,内容使用信息和文件系统系统。
前端页面使用 bootstrap 架构,方便在不同浏览器上显示。页面主体框架以及静态资源,放到http服务的发布目录下,需要输出的系统信息,则做成模板变量,通过标签替换的方式,填入系统采集的信息。
对于系统内存实时使用数据,则通过前端页面建立websocket连接,websocket服务端实时推动信息,然后前端页面解析并渲染呈现出来。
六、板上运行测试 在编译好http服务和设计好页面资源后,即可以在板上进行部署,因为这个http服务非常简单,没有什么配置文件,其服务端口设置为80,在/home/root下创建www目录作为静态资源发布目录即可。
然后再httpserver传输到/home/root,把静态html等资源传输到www目录下,就可以通过在网络上,打开浏览器访问开发板的IP,即可看页面内容。
七、WEB控制硬件方法总结 通过使用uWebsocket建立嵌入式HTTP服务,可以轻松的完成嵌入式的web管理页面,并且可以完成信息展示,控制的过程。并且数据在浏览器和开发板间传输,是实时传输,页面端使用websocket完成双向的数据通讯,使的前端能够非常平滑的显示硬件的相关参数信息。