概述
本帖最后由 点点&木木 于 2019-4-12 22:44 编辑
我开始考虑如何使用PHP框架来处理像ESP8266系列,ARM皮质和PIC MCU这样的小型中档微控制器。
1.jpg (42.83 KB, 下载次数: 0)
2019-3-13 19:42 上传
硬件组件
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
2.jpg (39.76 KB, 下载次数: 0)
2019-3-13 19:42 上传
PH7在MongooseWebserver上运行
3.jpg (24.69 KB, 下载次数: 0)
2019-3-13 19:42 上传
来自PH7-Mongoose的臭名昭着的Hello World
4.jpg (31.66 KB, 下载次数: 0)
2019-3-13 19:42 上传
在运行的PH7上测试了超过470种PhP脚本
出于好奇,我测试了一些PHPoc库只是为了看看PH7是否会失败?
5.jpg (34.68 KB, 下载次数: 0)
2019-3-13 19:42 上传
PH7能够解析PHPoC脚本
令人惊讶的是,PH7能够解析所有PHPoC脚本。这是一个概念证明,表明可以为嵌入式平台重新使用PHP语言。请继续关注更多信息并进行真正的嵌入式平台测试。
在我们的下一个系列中
在第2部分中,我们将进入让ESP7在ESP8266系列上运行的阶段。
在第3部分中,我们将探讨STM32F4xxxx系列。
在第4部分中,我们将研究Microchip的PIC。
在第5部分中,我们将介绍一些可以从PHP4MCU中受益的应用程序。
原理图
6.png (32.24 KB, 下载次数: 2)
2019-3-13 19:42 上传
代码
此代码使用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 OKrnTransfer-Encoding:chunkedrnrn");
// 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%sn", 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, exitingn");
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, exitingn");
exit(1);
}
printf("Starting web server on port %sn", 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)
2019-3-13 19:43 上传
点击文件名下载附件
下载积分: ST金币 -1
最后
以上就是标致豌豆为你收集整理的php 嵌入式,基于STM32F4VET6的PHP嵌入式(PHP4MCU)的全部内容,希望文章能够帮你解决php 嵌入式,基于STM32F4VET6的PHP嵌入式(PHP4MCU)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复