通过Web界面对程序运行的参数进行自定义、修改,实现自己需要的用户配置。
程序不提供用户数据定义、修改的界面,那么它是不完整的。
以RPC服务为桥梁,HTML页面做前端。
官方的wifi设置例子,使用Microsoft.XMLHTTP对象,最原始的ajax操作来完成后端和界面的数据交换。
资源足够,还是使用jquery方便。
MO的webserver非常强,不拿来使用太可惜。
使用C编程,资源消耗确实小,但是编写确实麻烦,没有mjs来得方便。但是最终还是得用C来写。
1、界面使用bootstrap?
它的尺寸大,有人建议使用CDN源,这个办法不错。但若是连接到NodeMCU的AP模式时,手机无法上网,不能获得远端文件。
而且它依赖jquery,尺寸也很大。
当然Node的存储空间是足够的。
这儿推荐: minicss和zeptojs,合起来尺寸是64K。qeptojs和jquery语法类似,迁移没有困难。
2、自定义Schema
除了OS预定义的wifi, i2c等配置外,可定义自己的数据结构。
- ["r0", "o", {title: "relay_0"}]
- ["r0.idx", "i", 0, {title: "relay no."}]
- ["r0.enable", "b", false, {title: "enabled"}]
- ["r0.title", "s", "relay 0", {title: "description"}]
- ["r0.priority", "i", 1, {title: "priority level"}]
仿照示例来写,最后生成一个结构体:
struct sys_config_r0 {
int idx;
int enable;
char *title;
int priority;
};
可以在gen下的sysconfig.h中看到,可以使用get_cfg()来做访问。
结构体不能复用,多个类似的数据,只能duplicate了。
3、通过rpc写配置
关键一点,ajax提交的数据,要和定义的数据类型一致,否则提交不成功。但reponse是null,可在uart界面可以看到错误提示。
// save to server
$("#save").click(function (ev) {
ev.preventDefault();
var priority = 0;
var d = {
config: {
r0: {
idx: parseInt($("#idx").val()),
enable: $("#en").is(":checked"),
title: $("#title").val(),
priority: 0
}
}
};
$.ajax({
type: "POST",
url: "/rpc/Config.Set",
contentType: "text/plain; charset=utf-8",
data: JSON.stringify(d),
success: function (xhr, type) {
$.ajax({
type: "POST",
url: "/rpc/Config.Save",
contentType: "text/plain; charset=utf-8",
data: JSON.stringify({ reboot: false }),
});
},
error: function (xhr, type) {
alert("写失败");
}
})
});
使用$.ajax,而不是$.post,因为这里需要指定contentType,MOS只认识text格式,其他的编码不识别(也可以试一下)。
向MOS提交的数据,不是原生表单数据、JSON数据, 必须是JSON转变为字符串(见上代码)。
需要注意JSON数据的层次路径,config是根路径。
4、前端可以使用HTML5
可以毫无顾忌的扔掉IE浏览器,使用最新的HTML 5标准来写页面。
可以使用websocket通信。
如果要在android手机中写一个app,使用websocket会是很好的选择。
可以看到,内存损耗很小,比lua固件节省太多。