|
本帖最后由 点点&木木 于 2019-4-12 22:44 编辑 我开始考虑如何使用PHP框架来处理像ESP8266系列,ARM皮质和PIC MCU这样的小型中档微控制器。
硬件组件 ESP8266 ESP-01 ESP ESP8266 ESP-01 × 1 ESP8266 ESP-12E ESP ESP8266 ESP-12E × 1 STMicroelectronics STM32F4VET6 × 1 手动工具和制造机器 内六角扳手 OpenBuilds Allen扳手 跳线电线杜邦 各种类型根据您的需要 介绍 关于PHP4MCU: 这个项目超出了请求,怀疑为什么不在微控制器上运行PHP框架。在互联网上研究可以让PHP软件直接在微控制器上运行 - 比如Python(Micropyhton,PyMite,PyonChip,Pumbaa等),JavaScript(Espruino,Mjs等......),Basic语言(GreatCow,B4M,RfoBasic,PicBasic等)和其他。甚至Forth,Rust,Go,Pawn,Falcon,TinyC,MicroPascal都是将便携式主要语言融入小型存储设备平台的一些例子。 为什么PHP上的PHP很难?这里的答案是PHP本身可以作为transpiller,翻译器或代码生成器来查看。PHP将您的脚本代码作为输入/源语言格式化,例如: <?php echo "I am a Php script"; ?>然后它解析代码,生成HTML格式的输出,然后再将其发送回Web服务器,然后将结果发送回浏览器。正如您所看到的,PHP是一个中间件解释器,位于Web服务器下方,用于处理特殊格式的服务器端Web脚本。 在小型内存设备上运行PHP,例如ESP8266,意味着您需要在该设备上安装微型Web服务器,因为PHP不能独立运行。其次,您需要为Webserver<----> PHP通信(这是双向的)或进程间通信或用于通信的任何内容实现的CGI(通用网关接口)协议。但我们会尽可能坚持使用Web标准,但没有理由破坏或修改任何标准甚至从头开始创建。 我研究了在互联网上进行的许多尝试,而其中大多数只是从PC上远程运行的网络服务器,我遇到了两次值得注意的尝试。第一个:http://www.phpoc.com/上的PHPoC 和http://github.com/phpoc?tab=ove ... 12-01&to=2016-12-31。这里有一个Hackster社区页面,请参阅:https://www.hackster.io/phpoc 。 PHPoC是专门为一系列嵌入式硬件和网关开发的,因此固件不是开源的,而是库。所以这意味着它不是真正意义上的开源。 我遇到的第二次尝试是PH7的http://ph7.symisc.net/和http://github.com/symisc/PH7。PH7已被合并为C源文件和头文件的两个文件。合并的源文件大约16页。它是一个手工制作的PHP解释器,带有VM。是针对Unix和Windows平台的为路由器开发的PH7,因为它是专门为Unix和Windows上的产品开发的。一个已编译的Linux二进制文件大约在500k到800k之间,没有条纹,这意味着它可以被条带化到大约300k到500k的大小。 其翻译的PH7语法也是直接手工编码而不是EBNF(ExtendedBackus-Naur Form),我相信这导致它不再被维护。 好吧,我采用了PH7的方式,因为它是用C语言编写的。我自己用C语言。在使用它的源代码之后,我能够在我的Ubuntu盒子上编译它。接下来,我能够为STM32F4VET6Black编译它,这是一个ARM Cortex M4,它是一个512K闪存,192 + 4 RAM。这些步骤提升了修改PH7和服务器的希望和动力,作为这次冒险的一个启动。 在开/关模式下几周之后,我终于开始添加网络服务器,同时将其解释器移植到EBNF。在IFJ捷克语中还有其他教育尝试,证明这是最好的。 下面的屏幕截图显示了我第一次尝试使用Mongoose网络服务器运行PH7的Ubuntu Linux机器:(http://mongoose-os.com/) file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png
PH7在MongooseWebserver上运行
来自PH7-Mongoose的臭名昭着的Hello World
在运行的PH7上测试了超过470种PhP脚本 出于好奇,我测试了一些PHPoc库只是为了看看PH7是否会失败?
PH7能够解析PHPoC脚本 令人惊讶的是,PH7能够解析所有PHPoC脚本。这是一个概念证明,表明可以为嵌入式平台重新使用PHP语言。请继续关注更多信息并进行真正的嵌入式平台测试。 在我们的下一个系列中 在第2部分中,我们将进入让ESP7在ESP8266系列上运行的阶段。 在第3部分中,我们将探讨STM32F4xxxx系列。 在第4部分中,我们将研究Microchip的PIC。 在第5部分中,我们将介绍一些可以从PHP4MCU中受益的应用程序。 原理图
代码 此代码使用CGI接口实现我们的Web服务器,以便我们可以将.php文件传递给php cgi二进制文件,以解析,编译并将输出返回给Webserver。将其另存为项目文件夹中的webserver.c。随着时间的推移,我们将在我们的系列和部件中添加,删除和改编。 // Copyright (c) 2015 Cesanta SoftwareLimited // All rights reserved // Copyright (c) Copyright (C)2011,2012,2013,2014,2015,2016,2017 Symisc Systems. // Copyright (c) SanyaadeAdekoya(Pat-EtaElectronics Ltd). MIT license #include "mongoose.h" struct device_settings { char setting1[100]; char setting2[100]; }; static const char *s_http_port = "8000"; static struct mg_serve_http_opts s_http_server_opts; static struct device_settings s_settings = {"value1", "value2"}; // const char *cgi_interpreter ="/home/sanyaade/Downloads/WebServers/Embedded-Systems/Mongoose/Packages/mongoose-master/examples/myServer/ifj"; static void handle_save(struct mg_connection *nc, struct http_message *hm) { // Get form variables and store settings values mg_get_http_var(&hm->body, "setting1", s_settings.setting1, sizeof(s_settings.setting1)); mg_get_http_var(&hm->body, "setting2", s_settings.setting2, sizeof(s_settings.setting2)); // Send response mg_http_send_redirect(nc, 302, mg_mk_str("/"), mg_mk_str(NULL)); } static void handle_get_cpu_usage(struct mg_connection *nc) { // Generate random value, as an example of changing CPUusage // Getting real CPU usage depends on the OS. intcpu_usage = (double) rand() / RAND_MAX * 100.0; // Use chunked encoding in order to avoid calculatingContent-Length mg_printf(nc, "%s", "HTTP/1.1 200 OK\r\nTransfer-Encoding:chunked\r\n\r\n"); // Output JSON object which holds CPU usage data mg_printf_http_chunk(nc, "{ \"result\": %d }", cpu_usage); // Send empty chunk, the end of response mg_send_http_chunk(nc, "", 0); } static void handle_ssi_call(struct mg_connection *nc, const char *param) { if (strcmp(param, "setting1") == 0) { mg_printf_html_escape(nc, "%s", s_settings.setting1); } else if (strcmp(param, "setting2") == 0) { mg_printf_html_escape(nc, "%s", s_settings.setting2); } } static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { struct http_message *hm = (struct http_message *)ev_data; switch (ev) { case MG_EV_HTTP_REQUEST: if(mg_vcmp(&hm->uri, "/save") == 0) { handle_save(nc, hm); } else if(mg_vcmp(&hm->uri, "/get_cpu_usage") == 0) { handle_get_cpu_usage(nc); } else { mg_serve_http(nc, hm, s_http_server_opts); // Serve staticcontent } break; case MG_EV_SSI_CALL: handle_ssi_call(nc, ev_data); break; default: break; } } static void push_data_to_all_websocket_connections(struct mg_mgr *m) { struct mg_connection *c; intmemory_usage = (double) rand() / RAND_MAX * 100.0; for (c = mg_next(m, NULL); c != NULL; c = mg_next(m, c)) { if (c->flags &MG_F_IS_WEBSOCKET) { mg_printf_websocket_frame(c, WEBSOCKET_OP_TEXT, "%d", memory_usage); } } } int main(void) { struct mg_mgr mgr; struct mg_connection *nc; cs_stat_t st; cs_stat_t cgi_st; mg_mgr_init(&mgr, NULL); nc= mg_bind(&mgr, s_http_port, ev_handler); if (nc == NULL) { fprintf(stderr, "Cannot bind to%s\n", s_http_port); exit(1); } // Set up HTTP server parameters mg_set_protocol_http_websocket(nc); s_http_server_opts.document_root = "web_root"; // Set up webroot directory if(mg_stat(s_http_server_opts.document_root, &st) != 0) { fprintf(stderr, "%s", "Cannot findweb_root directory, exiting\n"); exit(1); } //mg_serve_http( opts.cgi_interpreter ="ph7_interp"); // opts.cgi_interpreter = "ph7_interp" ; // mg_serve_http_opts.cgi_interpreter ="ph7_interp" s_http_server_opts.cgi_interpreter = "/home/sanyaade/Downloads/WebServers/Embedded-Systems/Mongoose/Packages/mongoose-master/examples/myServer/ph7_cgi"; //set up cgi-interpreter directory if (mg_stat(s_http_server_opts.cgi_interpreter,&cgi_st) != 0) { fprintf(stderr, "%s", "Cannot findcgi_interpreter directory, exiting\n"); exit(1); } printf("Starting web server on port %s\n", s_http_port); for (;;) { static time_t last_time; time_t now = time(NULL); mg_mgr_poll(&mgr, 1000); if (now - last_time >0) { push_data_to_all_websocket_connections(&mgr); last_time = now; } } mg_mgr_free(&mgr); return 0; } 相关文件 sanyaade-iot / PH7----
PH7-master.zip
(424.31 KB, 下载次数: 8)
|
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版