php 嵌入式,基于STM32F4VET6的PHP嵌入式(PHP4MCU)

本帖最后由 点点&木木 于 2019-4-12 22:44 编辑

我开始考虑如何使用PHP框架来处理像ESP8266系列,ARM皮质和PIC MCU这样的小型中档微控制器。

851f1456299fc7e6d0742f2ae7c162b4.gif

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

851f1456299fc7e6d0742f2ae7c162b4.gif

2.jpg (39.76 KB, 下载次数: 0)

2019-3-13 19:42 上传

PH7在MongooseWebserver上运行

851f1456299fc7e6d0742f2ae7c162b4.gif

3.jpg (24.69 KB, 下载次数: 0)

2019-3-13 19:42 上传

来自PH7-Mongoose的臭名昭着的Hello World

851f1456299fc7e6d0742f2ae7c162b4.gif

4.jpg (31.66 KB, 下载次数: 0)

2019-3-13 19:42 上传

在运行的PH7上测试了超过470种PhP脚本

出于好奇,我测试了一些PHPoc库只是为了看看PH7是否会失败?

851f1456299fc7e6d0742f2ae7c162b4.gif

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中受益的应用程序。

原理图

851f1456299fc7e6d0742f2ae7c162b4.gif

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 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----

zip.gif

PH7-master.zip

(424.31 KB, 下载次数: 8)

2019-3-13 19:43 上传

点击文件名下载附件

下载积分: ST金币 -1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值