Compare commits

...

4 Commits

Author SHA1 Message Date
龚祖望 c14b262e42 add update button and progress component 2022-11-22 16:19:08 +08:00
chunyexixiaoyu 956eafa24b solve the bug compiling 2022-07-14 11:30:03 +08:00
chunyexixiaoyu 27df62c9de 1.add webnet web files
2.add source files adapt to the web.
3.the branch is specific version
2022-07-14 10:42:23 +08:00
chunyexixiaoyu 52811719f7 update the README.md on this branch 2022-07-14 10:32:53 +08:00
25 changed files with 1983 additions and 179 deletions

View File

@ -87,3 +87,14 @@ dns server #1: 223.5.5.5
WebNet 软件包使用需要文件系统和Lwip协议栈的支持。
webnet.c 文件中注意以下定义注意其他操作系统lwip协议栈的大小设置
```
#ifdef ADD_RTTHREAD_FETURES
#if defined(RT_USING_LWIP) && (RT_LWIP_TCPTHREAD_STACKSIZE < 1408)
#error The lwIP tcpip thread stack size(RT_LWIP_TCPTHREAD_STACKSIZE) must more than 1408
#endif
#endif
```
webnet文件夹为该分支的一个前端页面文件版本

View File

@ -53,9 +53,13 @@ if GetDepend(['WEBNET_USING_DAV']):
if GetDepend(['WEBNET_USING_SAMPLES']):
src += Glob('samples/wn_sample.c')
src += Glob('samples/deviceinfoasp.c')
src += Glob('samples/netsetting.c')
src += Glob('samples/uploaddata.c')
if GetDepend(['WEBNET_USING_SAMPLES']) and GetDepend(['WEBNET_USING_UPLOAD']):
src += Glob('samples/wn_sample_upload.c')
CPPPATH = [cwd + '/inc']

View File

@ -85,8 +85,9 @@ int webnet_module_log(struct webnet_session* session, int event)
}
else if (event == WEBNET_EVENT_URI_POST)
{
printf("physical url: %s", request->path);
printf(" mime type: %s", mime_get_type(request->path));
printf("event post uri physical url: %s", request->path);
printf("mime type: %s", mime_get_type(request->path));
}
else if (event == WEBNET_EVENT_RSP_HEADER)
{

103
samples/deviceinfoasp.c Normal file
View File

@ -0,0 +1,103 @@
#include "deviceinfoasp.h"
deviceinfo xidatong_deviceinfo =
{
DEVICE_NUM_DEFUALT,
DEVICE_NAME_DEFUALT,
DEVICE_TYPE_DEFUALT,
DEVICE_SERIAL_DEFUALT,
RT_THREAD_KERNEL,
SYSTEM_VERSION,
WEB_VERSION
};
void deviceinfo_default()
{
/*
*/
//memset((char *)(&xidatong_deviceinfo),0,sizeof(xidatong_deviceinfo));
}
void asp_var_device_name(struct webnet_session* session)
{
assert(session != NULL);
static const char *temp = "<html><body>%s";
webnet_session_printf(session, temp, xidatong_deviceinfo.name);
}
void asp_var_device_number(struct webnet_session* session)
{
assert(session != NULL);
static const char *temp = "<html><body>%d" ;
webnet_session_printf(session, temp,xidatong_deviceinfo.number);
}
void asp_var_device_type(struct webnet_session* session)
{
assert(session != NULL);
static const char *temp = "<html><body>%s";
webnet_session_printf(session, temp, xidatong_deviceinfo.type);
}
void asp_var_device_serial(struct webnet_session* session)
{
assert(session != NULL);
static const char *temp = "<html><body>%s";
webnet_session_printf(session, temp, xidatong_deviceinfo.serial);
}
void asp_var_os_type(struct webnet_session* session)
{
assert(session != NULL);
static const char *temp = "<html><body>%s";
webnet_session_printf(session, temp, xidatong_deviceinfo.ostype);
}
void asp_var_web_version(struct webnet_session* session)
{
assert(session != NULL);
static const char *temp = "<html><body>%s";
webnet_session_printf(session, temp,xidatong_deviceinfo.webversion);
}
void asp_var_system_firmware(struct webnet_session* session)
{
assert(session != NULL);
static const char *temp = "<html><body><font size=\"+2\">系统固件 %s</font><br><br>";
webnet_session_printf(session, temp, xidatong_deviceinfo.system_firmware);
}
void cgi_device_reboot(struct webnet_session* session)
{
const char* mimetype;
const char *response = "{\"code\":0}";
static char order_sh[] = "reboot";
mimetype = mime_get_type(".html");
session->request->result_code = 200;
webnet_session_set_header(session, mimetype, 200, "Ok", -1);
webnet_session_printf(session, response);
#ifdef ADD_RTTHREAD_FETURES
extern int msh_exec(char *cmd, rt_size_t length);
printf("reboot \n\r");
msh_exec(order_sh,rt_strlen(order_sh));
#elif defined ADD_XIZI_FETURES
#endif
}
extern void mqttweb_default();
extern void private_prtweb_default();
void cgi_device_recovery(struct webnet_session* session)
{
const char* mimetype;
const char *response = "{\"code\":0}";
mimetype = mime_get_type(".html");
session->request->result_code = 200;
webnet_session_set_header(session, mimetype, 200, "Ok", -1);
webnet_session_printf(session, response);
mqttweb_default();
private_prtweb_default();
}

39
samples/deviceinfoasp.h Normal file
View File

@ -0,0 +1,39 @@
#ifndef _DEVICEINFO_H
#define _DEVICEINFO_H
#include <webnet.h>
#include <wn_module.h>
#define RT_THREAD_KERNEL "rt-thread kenel"
#define NUTTX_OS_KERNEL "nuttx kenel"
#define XIZI_OS_KERNEL "xizi kenel"
#define DEVICE_NAME_DEFUALT "xidatong"
#define DEVICE_TYPE_DEFUALT "gateway"
#define DEVICE_SERIAL_DEFUALT "12345678910"
#define DEVICE_NUM_DEFUALT (1)
#define WEB_VERSION "1.0.0"
#define SYSTEM_VERSION "1.1.1"
typedef struct
{
int number;
char name[16];
char type[16];
char serial[16];
char ostype[16];
char system_firmware[8];
char webversion[8];
}deviceinfo;
void deviceinfo_default();
void asp_var_device_name(struct webnet_session* session);
void asp_var_device_number(struct webnet_session* session);
void asp_var_device_type(struct webnet_session* session);
void asp_var_device_serial(struct webnet_session* session);
void asp_var_os_type(struct webnet_session* session);
void asp_var_web_version(struct webnet_session* session);
void asp_var_system_firmware(struct webnet_session* session);
void cgi_device_reboot();
void cgi_device_recovery();
#endif

View File

@ -1,81 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> WebNet </title>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
</head>
<body>
<h1>WebNet</h1>
该组件是基于RT-Thread的Webnet进行移植修改 为小型嵌入式设备定制作为web server具有低资源占用扩展性好的特点。
<hr>
<h2>WebNet 功能</h2>
<ul>
<li>支持 HTTP 1.0/1.1 规范
<li>支持 AUTH 基本认证
<li>支持 CGI 事件处理
<li>支持 ASP 变量替换
<li>支持 SSI 文件嵌入
<li>支持 INDEX 目录显示
<li>支持 ALIAS 别名
<li>支持 upload 文件上传
</ul>
<hr>
<h3>1. AUTH Test</h3>
WebNet 基本认证功能设计成与 URL 目录相挂钩,在使用时可以<b>根据目录划分访问权限</b>
<br/><br/>
<a href="/admin/">基本认证功能测试:用户名及密码为 <b>admin:admin</b></a>
<br/><br/>
<hr>
<h3>2. CGI Test</h3>
WebNet CGI 功能可以让用户执行指定的函数CGI测试
<br/><br/>
<a href="/cgi-bin/hello">> hello world</a>
<br/>
<a href="/cgi-bin/calc">> calc</a>
<br/><br/>
<hr>
<h3>3. ASP Test</h3>
WebNet 实现的是一种简化方式的 ASP 变量替换,即当页面中有<b><% %></b> 标记出现时,将自动替换成用户注册的字符串并输。
<br/><br/>
<a href="/version.asp">ASP 功能测试:访问 version.asp 文件,打印当前 RT-Thread 系统版本号</a>
<br/><br/>
<hr>
<h3>4. SSI Test</h3>
SSI 功能模块可以用于执行服务器上程序或者插入文本内容到网页中页面代码中有 <b>#include virtual="/xxx"</b> 或者 <b>#include file="/xxx"</b> 标记存在时,将自动解析成对应文件中的信息。
<br/><br/>
<a href="/index.shtml">SSI 功能测试:访问 /version.shtml 页面,其中嵌套了 /index.html 页面</a>
<br/><br/>
<hr>
<h3>5. INDEX Test</h3>
INDEX 功能模块可以自动显示目录下文件列表,当访问目录中不存在 index.htm, index.html, index.asp 等文件时,将自动显示这个目录下的文件列表。
<br/><br/>
<a href="/admin/">INDEX 功能测试:访问/admin 目录,列出目录下所有文件</a>
<br/><br/>
<hr>
<h3>6. ALIAS Test</h3>
ALIAS 别名模块可以给当前资源文件夹设置多个别名,可以用于<b>长路径的简化操作</b>,方便用户对资源的访问。
<br/><br/>
<a href="/test/">ALIAS 功能测试:访问 /test 目录会跳转到 /admin 目录</a>
<br/><br/>
<hr>
<h3>7. Upload File Test</h3>
文件上传模块可以用于上传文件到指定的目录,这里上传到根目录下的 /upload 目录。
<br/><br/>
<form name="upload" method="POST" enctype="multipart/form-data" action="/upload">
<input type="file" name="file1" >
<input type="submit" name="submit" value="上传">
</form>
<br/>
<a href="/upload/">点击浏览上传文件的目录</a>
<br/><br/>
</body>
</html>

View File

@ -1,14 +0,0 @@
<html>
<head>
<title> SSI Test </title>
</head>
<body>
<h1> SSI Test</h1>
<font size=\"+2\">The <b>index.html</b> page embedded in the following page</font>
<br/><br/>
<a href="javascript:history.go(-1);">Go back to root</a>
<hr>
<!--#include virtual="/index.html" -->
</body>
</html>

213
samples/netsetting.c Normal file
View File

@ -0,0 +1,213 @@
#include "netsetting.h"
static mqttsetting mqttweb;
static local_tcpip local_tcpipweb;
static private_prt private_prtweb;
void mqttweb_default()
{
strcpy(mqttweb.server_addr,ALIYUN_SERVER_ADDR);
strcpy(mqttweb.server_port,ALIYUN_SERVER_PORT);
strcpy(mqttweb.topic,ALIYUN_SERVER_TOPIC);
strcpy(mqttweb.username,ALIYUN_USERNAME);
strcpy(mqttweb.password,ALIYUN_PASSWORD);
strcpy(mqttweb.clientid,ALIYUN_CLIENTID);
}
void local_tcpipweb_default()
{
strcpy(local_tcpipweb.local_ipaddr,LOCAL_IP_ADDR);
strcpy(local_tcpipweb.netmask_addr,LOCAL_NETMASK_ADDR);
strcpy(local_tcpipweb.gateway_addr,LOCAL_GATEWAY_MASK);
strcpy(local_tcpipweb.dns_server0,LOCAL_DNS_SERVER0);
strcpy(local_tcpipweb.dns_server1,LOCAL_DNS_SERVER1);
}
void private_prtweb_default()
{
strcpy(private_prtweb.server_addr,PRIVATE_SERVER_ADDR);
strcpy(private_prtweb.server_port,PRIVATE_SERVER_PORt);
strcpy(private_prtweb.username,PRIVATE_USERNAME);
strcpy(private_prtweb.passward,PRIVATE_PASSWORD);
}
char *json_create_mqtt_data(void)
{
char *json_data = RT_NULL;
cJSON *root = cJSON_CreateObject();
cJSON_AddItemToObject(root, "pub_topic", cJSON_CreateString(mqttweb.topic));
cJSON_AddItemToObject(root, "server_addr", cJSON_CreateString(mqttweb.server_addr));
cJSON_AddItemToObject(root, "server_port", cJSON_CreateString(mqttweb.server_port));
cJSON_AddItemToObject(root, "username", cJSON_CreateString(mqttweb.username));
cJSON_AddItemToObject(root, "password", cJSON_CreateString(mqttweb.password));
cJSON_AddItemToObject(root, "clientID", cJSON_CreateString(mqttweb.clientid));
json_data = cJSON_PrintUnformatted(root);
cJSON_Delete(root);
return json_data;
}
void cgi_mqtt_get_data(struct webnet_session *session)
{
cgi_head();
request = request;
body = json_create_mqtt_data();
webnet_session_printf(session, body);
free(body);
}
void cgi_mqtt_save_data(struct webnet_session *session)
{
cgi_head();
const char *response = "{\"code\":0}";
const char *tpub_topic = webnet_request_get_query(request, "pub_topic");
const char *tserver_addr = webnet_request_get_query(request, "server_addr");
const char *tserver_port = webnet_request_get_query(request, "server_port");
const char *tusername = webnet_request_get_query(request, "username");
const char *tpassword = webnet_request_get_query(request, "password");
const char *tclientID = webnet_request_get_query(request, "clientID");
/*configuration*/
memset((char*)(&mqttweb),0,sizeof(mqttweb));
strcpy(mqttweb.server_addr,tserver_addr);
strcpy(mqttweb.server_port,tserver_port);
strcpy(mqttweb.topic,tpub_topic);
strcpy(mqttweb.username,tusername);
strcpy(mqttweb.password,tpassword);
strcpy(mqttweb.clientid,tclientID);
printf("\n\r \
mqtt serveraddr: %s \n \
mqtt server_port: %s \n \
mqtt topic: %s \n \
mqtt username: %s \n \
mqtt password: %s \n \
mqtt clientid: %s \n \
",mqttweb.server_addr,mqttweb.server_port,mqttweb.topic, \
mqttweb.username,mqttweb.password,mqttweb.clientid);
webnet_session_printf(session, response);
}
static void device_get_tcpip_parameter()
{
#ifdef ADD_RTTHREAD_FETURES
struct netdev *netdev_device = netdev_get_by_name("e0");
/*
printf("ip address: %s\n", inet_ntoa(netdev_device->ip_addr));
printf("netmask address: %s\n", inet_ntoa(netdev_device->netmask));
printf("gw address: %s\n", inet_ntoa(netdev_device->gw));
printf("dns0 address: %s\n", inet_ntoa(netdev_device->dns_servers[0]));
printf("dns1 address: %s\n", inet_ntoa(netdev_device->dns_servers[1]));
*/
strcpy(local_tcpipweb.local_ipaddr,inet_ntoa(netdev_device->ip_addr));
strcpy(local_tcpipweb.netmask_addr,inet_ntoa(netdev_device->netmask));
strcpy(local_tcpipweb.gateway_addr,inet_ntoa(netdev_device->gw));
strcpy(local_tcpipweb.dns_server0,inet_ntoa(netdev_device->dns_servers[0]));
strcpy(local_tcpipweb.dns_server1,inet_ntoa(netdev_device->dns_servers[1]));
#elif defined ADD_XIZI_FETURES
#endif
}
char *json_create_tcpip_data(void)
{
char *json_data = RT_NULL;
cJSON *root = cJSON_CreateObject();
cJSON_AddItemToObject(root, "local_ipaddr", cJSON_CreateString(local_tcpipweb.local_ipaddr));
cJSON_AddItemToObject(root, "netmask_addr", cJSON_CreateString(local_tcpipweb.netmask_addr));
cJSON_AddItemToObject(root, "gateway_addr", cJSON_CreateString(local_tcpipweb.gateway_addr));
cJSON_AddItemToObject(root, "dns_server0", cJSON_CreateString(local_tcpipweb.dns_server0));
cJSON_AddItemToObject(root, "dns_server1", cJSON_CreateString(local_tcpipweb.dns_server1));
json_data = cJSON_PrintUnformatted(root);
cJSON_Delete(root);
return json_data;
}
void cgi_tcpip_get_data(struct webnet_session *session)
{
cgi_head();
request = request;
device_get_tcpip_parameter();
body = json_create_tcpip_data();
webnet_session_printf(session, body);
free(body);
}
void cgi_tcpip_save_data(struct webnet_session *session)
{
cgi_head();
ip_addr_t addr;
const char *response = "{\"code\":0}";
const char *local_ipaddr = webnet_request_get_query(request, "local_ipaddr");
const char *netmask_addr = webnet_request_get_query(request, "netmask_addr");
const char *gateway_addr = webnet_request_get_query(request, "gateway_addr");
const char *dns_server0 = webnet_request_get_query(request, "dns_server0");
const char *dns_server1 = webnet_request_get_query(request, "dns_server1");
#ifdef ADD_RTTHREAD_FETURES
struct netdev *netdev_device = netdev_get_by_name("e0");
inet_aton(local_ipaddr, &addr);
netdev_set_ipaddr(netdev_device, &addr);
inet_aton(netmask_addr, &addr);
netdev_set_netmask(netdev_device, &addr);
inet_aton(gateway_addr, &addr);
netdev_set_gw(netdev_device, &addr);
inet_aton(dns_server0, &addr);
netdev_set_dns_server(netdev_device,0, &addr);
inet_aton(dns_server1, &addr);
netdev_set_dns_server(netdev_device,0, &addr);
#elif defined ADD_XIZI_FETURES
#endif
/*configuration*/
memset((char*)(&local_tcpipweb),0,sizeof(local_tcpipweb));
strcpy(local_tcpipweb.local_ipaddr,local_ipaddr);
strcpy(local_tcpipweb.netmask_addr,netmask_addr);
strcpy(local_tcpipweb.gateway_addr,gateway_addr);
strcpy(local_tcpipweb.dns_server0,dns_server0);
strcpy(local_tcpipweb.dns_server1,dns_server1);
webnet_session_printf(session, response);
}
char *json_create_private_prt_data()
{
char *json_data = RT_NULL;
cJSON *root = cJSON_CreateObject();
cJSON_AddItemToObject(root, "server_addr", cJSON_CreateString(private_prtweb.server_addr));
cJSON_AddItemToObject(root, "server_port", cJSON_CreateString(private_prtweb.server_port));
cJSON_AddItemToObject(root, "username", cJSON_CreateString(private_prtweb.username));
cJSON_AddItemToObject(root, "passward", cJSON_CreateString(private_prtweb.passward));
json_data = cJSON_PrintUnformatted(root);
cJSON_Delete(root);
return json_data;
}
void cgi_private_prt_get_data(struct webnet_session *session)
{
cgi_head();
request = request;
body = json_create_private_prt_data();
webnet_session_printf(session, body);
free(body);
}
void cgi_private_prt_save_data(struct webnet_session *session)
{
cgi_head();
ip_addr_t addr;
const char *response = "{\"code\":0}";
const char *server_addr = webnet_request_get_query(request, "server_addr");
const char *server_port = webnet_request_get_query(request, "server_port");
const char *username = webnet_request_get_query(request, "username");
const char *passward = webnet_request_get_query(request, "passward");
/*configuration*/
memset((char*)(&private_prtweb),0,sizeof(private_prtweb));
strcpy(private_prtweb.server_addr,server_addr);
strcpy(private_prtweb.server_port,server_port);
strcpy(private_prtweb.username,username);
strcpy(private_prtweb.passward,passward);
webnet_session_printf(session, response);
}

80
samples/netsetting.h Normal file
View File

@ -0,0 +1,80 @@
#ifndef _NETSETTING_H
#define _NETSETTING_H
#include <webnet.h>
#include <wn_module.h>
#include<cJSON.h>
#include<transform.h>
#define cgi_head() \
; \
const char *mimetype; \
struct webnet_request *request; \
static char *body = NULL; \
request = session->request; \
mimetype = mime_get_type(".html"); \
session->request->result_code = 200; \
webnet_session_set_header(session, mimetype, 200, "Ok", -1);
/*
mqtt platform macro
*/
#define ALIYUN_SERVER_ADDR "hf6mzwdVnJg.iot-as-mqtt.cn-shanghai.aliyuncs.com"
#define ALIYUN_SERVER_PORT "1883"
#define ALIYUN_SERVER_TOPIC "/broadcast/hf6mzwdVnJg/989898"
#define ALIYUN_USERNAME "test1&hf6mzwdVnJg"
#define ALIYUN_PASSWORD "F08C59D320BB72830B9ECC5ACF132BC22B55861B"
#define ALIYUN_CLIENTID "123|securemode=3,signmethod=hmacsha1|"
#define LOCAL_IP_ADDR "192.168.131.29"
#define LOCAL_NETMASK_ADDR "255.255.255.0"
#define LOCAL_GATEWAY_MASK "192.168.130.1"
#define LOCAL_DNS_SERVER0 "0.0.0.0"
#define LOCAL_DNS_SERVER1 "0.0.0.0"
#define PRIVATE_SERVER_ADDR "192.168.131.30"
#define PRIVATE_SERVER_PORt "9898"
#define PRIVATE_USERNAME "admin"
#define PRIVATE_PASSWORD "admin"
typedef struct
{
char topic[100]; //topic
char server_addr[100]; //服务器地址
char server_port[12]; //服务器端口
char username[50]; //用户名
char password[100]; //密码
char clientid[100]; //client id
}mqttsetting;
typedef struct
{
char local_ipaddr[16]; //本地ip
char netmask_addr[16]; //子网掩码
char gateway_addr[16]; //网关
char dns_server0[16];
char dns_server1[16];
}local_tcpip;
typedef struct
{
char server_addr[100]; //私有协议服务器地址
char server_port[12]; //端口号
char username[16]; //用户名
char passward[16]; //密码确认
}private_prt;
void mqttweb_default();
void local_tcpipweb_default();
void private_prtweb_default();
void cgi_mqtt_get_data(struct webnet_session *session);
void cgi_mqtt_save_data(struct webnet_session *session);
void cgi_tcpip_get_data(struct webnet_session *session);
void cgi_tcpip_save_data(struct webnet_session *session);
void cgi_private_prt_get_data(struct webnet_session *session);
void cgi_private_prt_save_data(struct webnet_session *session);
#endif

119
samples/uploaddata.c Normal file
View File

@ -0,0 +1,119 @@
#include "uploaddata.h"
char msg[] = "/mq_upload_web";
sensor_msg eg_temperature;
sensor_msg web_show;
static mqd_t mq_web;
void upload_receive_web_msg_thread()
{
int nbytes = 0;
while(1)
{
nbytes = PrivMqueueReceive(mq_web,(char*)(&eg_temperature), sizeof(eg_temperature), NULL);
if (nbytes < 0)
{
printf("mq_receive error: %d \n",nbytes);
}
else
{
printf("=============mq_receive success:==============\n");
printf(" \
name:%s\n \
brand %s\n \
unit %s\n \
value %s\n", \
eg_temperature.name,eg_temperature.brand,eg_temperature.unit,eg_temperature.value);
memcpy(&web_show,&eg_temperature,sizeof(web_show));
}
}
}
int uploaddata_init()
{
struct mq_attr webmq_attr;
int result = 0;
pthread_t tid = 0;
pthread_attr_t attr;
struct sched_param prio;
prio.sched_priority = 8;
size_t stack_size = 1024 * 11;
webmq_attr.mq_flags = 0;
webmq_attr.mq_maxmsg = 20;
webmq_attr.mq_msgsize = 512;
webmq_attr.mq_curmsgs = 0;
mq_web = PrivMqueueCreate("/mq_web", O_RDONLY|O_CREAT,0666,&webmq_attr);
if (mq_web < 0)
{
printf("mq_open error: %d \n",mq_web);
}else
{
printf("mq_open success: %d \n",mq_web);
}
pthread_attr_init(&attr);
pthread_attr_setschedparam(&attr, &prio);
pthread_attr_setstacksize(&attr, stack_size);
result = pthread_create(&tid, &attr,upload_receive_web_msg_thread, NULL);
if (0 == result)
{
printf("thread_detect_entry successfully!\n");
}
else
{
printf("thread_detect_entry failed! error code is %d.\n", result);
}
/***********demo sensor set parameters***************/
strcpy(eg_temperature.name,"temperature");
strcpy(eg_temperature.brand,"hs300x");
strcpy(eg_temperature.unit,"°C");
}
void upload_send_web_msg()
{
static int seed_t = 20;
float temp = 25;
float tem_decimals = 0;
int nbytes = 0;
memset((char*)eg_temperature.value,0,sizeof(eg_temperature.value));
srand(seed_t);
tem_decimals = ((float)(rand() % 100))/100.0;
temp = temp + tem_decimals;
sprintf(eg_temperature.value,"%f",temp);
printf("rand generate temperature %s \n\r",eg_temperature.value);
nbytes = PrivMqueueSend(mq_web, (char *)(&eg_temperature), sizeof(eg_temperature), 0);
if (nbytes < 0)
{
printf("mq_send error: %d \n",nbytes);
}
else
{
printf("mq_send success: times%d \n",seed_t);
}
seed_t++;
}
#ifdef ADD_RTTHREAD_FETURES
MSH_CMD_EXPORT(upload_send_web_msg, upload_send_web_msg);
#endif
char *json_create_datashow_data()
{
char *json_data = RT_NULL;
cJSON *root = cJSON_CreateObject();
cJSON_AddItemToObject(root, "name", cJSON_CreateString(web_show.name));
cJSON_AddItemToObject(root, "brand", cJSON_CreateString(web_show.brand));
cJSON_AddItemToObject(root, "unit", cJSON_CreateString(web_show.unit));
cJSON_AddItemToObject(root, "value", cJSON_CreateString(web_show.value));
json_data = cJSON_PrintUnformatted(root);
cJSON_Delete(root);
return json_data;
}
void cgi_dateshow_get_data(struct webnet_session *session)
{
cgi_head();
request = request;
body = json_create_datashow_data();
webnet_session_printf(session, body);
free(body);
}

16
samples/uploaddata.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef _UPLOADDATA_
#define _UPLOADDATA_
#include "netsetting.h"
typedef struct
{
char name[32]; //sensor name
char brand[32]; //sensor brand;
char unit[12]; //sensor unit
char value[12]; //sensor value
}sensor_msg;
int uploaddata_init();
void upload_send_web_msg();
void cgi_dateshow_get_data(struct webnet_session *session);
#endif

View File

@ -1,10 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> ASP Test </title>
</head>
<body>
<% version %>
</body>
</html>

View File

@ -20,89 +20,40 @@
* Date Author Notes
* 2022-05-09 chunyexixiaoyu the version transplanted from rt-thread
*/
#include <transform.h>
#include <webnet.h>
#include <wn_module.h>
#include "deviceinfoasp.h"
#include "netsetting.h"
#include "uploaddata.h"
#define XiUOS_VERSION (1)
#define XiUOS_SUBVERSION (0)
#define XiUOS_REVERSION (0)
static void asp_var_version(struct webnet_session* session)
{
assert(session != NULL);
static const char *version = "<html><body><font size=\"+2\">RT-Thread %d.%d.%d</font><br><br>"
"<a href=\"javascript:history.go(-1);\">Go back to root</a></html></body>";
webnet_session_printf(session, version, XiUOS_VERSION, XiUOS_SUBVERSION, XiUOS_REVERSION);
}
static void cgi_calc_handler(struct webnet_session* session)
{
int a, b;
const char* mimetype;
struct webnet_request* request;
static const char* header = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; "
"charset=gb2312\" /><title> calc </title></head>";
static const char* body = "<body><form method=\"post\" action=\"/cgi-bin/calc\"><input type=\"text\" name=\"a\" value=\"%d\"> "
"+ <input type=\"text\" name=\"b\" value=\"%d\"> = %d<br><input type=\"submit\" value=\"\xBC\xC6\xCB\xE3\"></form>"
"<br><a href=\"/index.html\">Go back to root</a></body></html>\r\n";
assert(session != NULL);
request = session->request;
assert(request != NULL);
/* get mimetype */
mimetype = mime_get_type(".html");
a = 1;
b = 1;
/* set http header */
session->request->result_code = 200;
webnet_session_set_header(session, mimetype, 200, "Ok", -1);
webnet_session_write(session, (const uint8*)header, strlen(header));
if (request->query_counter)
{
const char *a_value, *b_value;
a_value = webnet_request_get_query(request, "a");
b_value = webnet_request_get_query(request, "b");
a = atoi(a_value);
b = atoi(b_value);
}
webnet_session_printf(session, body, a, b, a + b);
}
static void cgi_hello_handler(struct webnet_session* session)
{
const char* mimetype;
static const char* status = "<html><head><title> hello </title>"
"</head><body><font size=\"+2\">hello world</font><br><br>"
"<a href=\"javascript:history.go(-1);\">Go back to root</a></body></html>\r\n";
assert(session != NULL);
/* get mimetype */
mimetype = mime_get_type(".html");
/* set http header */
session->request->result_code = 200;
webnet_session_set_header(session, mimetype, 200, "Ok", strlen(status));
webnet_session_write(session, (const uint8*)status,strlen(status));
}
void webnet_test(void)
void webnet_start(void)
{
#ifdef WEBNET_USING_CGI
webnet_cgi_register("hello", cgi_hello_handler);
webnet_cgi_register("calc", cgi_calc_handler);
webnet_cgi_register("mqtt_get", cgi_mqtt_get_data);
webnet_cgi_register("mqtt_save", cgi_mqtt_save_data);
webnet_cgi_register("tcpip_get", cgi_tcpip_get_data);
webnet_cgi_register("tcpip_save", cgi_tcpip_save_data);
webnet_cgi_register("private_prt_get", cgi_private_prt_get_data);
webnet_cgi_register("private_prt_save", cgi_private_prt_save_data);
webnet_cgi_register("device_reboot", cgi_device_reboot);
webnet_cgi_register("device_recovery", cgi_device_recovery);
webnet_cgi_register("datashow", cgi_dateshow_get_data);
#endif
#ifdef WEBNET_USING_ASP
webnet_asp_add_var("version", asp_var_version);
webnet_asp_add_var("device_name", asp_var_device_name);
webnet_asp_add_var("device_number", asp_var_device_number);
webnet_asp_add_var("device_type", asp_var_device_type);
webnet_asp_add_var("device_serial", asp_var_device_serial);
webnet_asp_add_var("os_type", asp_var_os_type);
webnet_asp_add_var("system_firmware", asp_var_system_firmware);
webnet_asp_add_var("web_version", asp_var_web_version);
#endif
#ifdef WEBNET_USING_ALIAS
@ -110,7 +61,7 @@ void webnet_test(void)
#endif
#ifdef WEBNET_USING_AUTH
webnet_auth_set("/admin", "admin:admin");
webnet_auth_set("/", "admin:admin");
#endif
#ifdef WEBNET_USING_UPLOAD
@ -118,9 +69,13 @@ void webnet_test(void)
webnet_upload_add(&upload_entry_upload);
#endif
private_prtweb_default();
mqttweb_default();
uploaddata_init();
webnet_init();
}
#ifdef ADD_RTTHREAD_FETURES
MSH_CMD_EXPORT(webnet_test, wenbet test);
MSH_CMD_EXPORT(webnet_start, wenbet test);
#endif

View File

@ -494,6 +494,7 @@ int webnet_module_handle_event(struct webnet_session *session, int event)
static const char *default_files[] =
{
"",
"deviceinfo.asp",
"/index.html",
"/index.htm",
NULL

153
webnet/chart.html Normal file
View File

@ -0,0 +1,153 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="xidatong webnet" />
<meta name="author" content="gong" />
<!-- <link rel="icon" href="../../favicon.ico" /> -->
<title>xidatong web server set page</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
crossorigin="anonymous"
></script>
<script src="./js/Chart.bundle.min.js"></script>
<!-- Bootstrap core CSS -->
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu"
crossorigin="anonymous"
/>
<!-- Custom styles for this template -->
<link href="./css/layout.css" rel="stylesheet" />
<style>
.mt_30 {
margin-top: 30px;
}
.form-group {
margin-bottom: 20px;
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button
type="button"
class="navbar-toggle collapsed"
data-toggle="collapse"
data-target="#navbar"
aria-expanded="false"
aria-controls="navbar"
>
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img src="./logo/logo.png" height="50px" />
</div>
<!-- <div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#">账号</a></li>
</ul>
</div> -->
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li>
<a href="deviceinfo.asp">系统设置</a>
</li>
<li><a href="tcp.html">网络设置</a></li>
<li class="active"><a href="chart.html">数据显示</a></li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1 class="page-header">数据显示</h1>
<div class="col-sm-12">
<canvas id="myChart"></canvas>
</div>
</div>
</div>
</div>
</body>
<script>
var ctx = $('#myChart');
var myChart = new Chart(ctx, {
type: 'line',
data: {
labels: [],
datasets: [
{
label: '',
data: [],
borderColor: ['rgba(255, 99, 132, 1)'],
fill: false,
borderWidth: 2,
},
],
},
options: {
elements: {
line: {
tension: 0, // 禁用贝塞尔曲线
},
},
scales: {
xAxes: [
{
type: 'time',
time: {
unit: 'minute',
},
scaleLabel: {
display: true,
labelString: '',
},
},
],
},
},
});
function getData() {
$.get(
'/cgi-bin/datashow',
function (data) {
const { name, brand, unit, value } = data;
myChart.data.datasets[0].label = name + '(' + unit + ')';
if (value) {
myChart.data.datasets[0].data.push({
x: Date.now(),
y: value,
});
}
myChart.options.scales.xAxes[0].scaleLabel.labelString = brand;
myChart.update();
},
'json'
);
}
$(function () {
getData();
setInterval(getData, 5000);
});
</script>
</html>

131
webnet/css/layout.css Normal file
View File

@ -0,0 +1,131 @@
/*
* Base structure
*/
/* Move down content because we have a fixed navbar that is 50px tall */
body {
padding-top: 50px;
}
/*
* Global add-ons
*/
.sub-header {
padding-bottom: 10px;
border-bottom: 1px solid #eee;
}
/*
* Top navigation
* Hide default border to remove 1px line.
*/
.navbar-fixed-top {
border: 0;
}
/*
* Sidebar
*/
/* Hide for mobile, show later */
.sidebar {
display: none;
}
@media (min-width: 768px) {
.sidebar {
position: fixed;
top: 51px;
bottom: 0;
left: 0;
z-index: 1000;
display: block;
padding: 20px;
overflow-x: hidden;
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
background-color: #f5f5f5;
border-right: 1px solid #eee;
}
}
/* Sidebar navigation */
.nav-sidebar {
margin-right: -21px; /* 20px padding + 1px border */
margin-bottom: 20px;
margin-left: -20px;
}
.nav-sidebar > li > a {
padding-right: 20px;
padding-left: 20px;
}
.nav-sidebar > .active > a,
.nav-sidebar > .active > a:hover,
.nav-sidebar > .active > a:focus {
color: #fff;
background-color: #428bca;
}
.navbar-brand{
color: #fff !important;
}
/*
* Main content
*/
.main {
padding: 20px;
}
@media (min-width: 768px) {
.main {
padding-right: 40px;
padding-left: 40px;
}
}
.main .page-header {
margin-top: 0;
}
/*
* Placeholder dashboard ideas
*/
.placeholders {
margin-bottom: 30px;
text-align: center;
}
.placeholders h4 {
margin-bottom: 0;
}
.placeholder {
margin-bottom: 20px;
}
.placeholder img {
display: inline-block;
border-radius: 50%;
}
a{
color: black;
}
.nav-sidebar{
font-size: 25px;
line-height: 2;
margin-top: 25vh;
}
.nav-tabs .active a{
color: #428bca !important;
}
.form-group{
display: flex;
align-items: center;
}
.navbar{
background-color: #428bca;
}

147
webnet/deviceinfo.asp Normal file
View File

@ -0,0 +1,147 @@
<%@Language="vbscript" Codepage="65001"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="xidatong webnet" />
<meta name="author" content="gong" />
<!-- <link rel="icon" href="../../favicon.ico" /> -->
<title>xidatong web server set page</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- Custom styles for this template -->
<link href="./css/layout.css" rel="stylesheet" />
<style>
.mt_15 {
margin-top: 15vh;
}
.form-group {
margin-bottom: 20px;
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button
type="button"
class="navbar-toggle collapsed"
data-toggle="collapse"
data-target="#navbar"
aria-expanded="false"
aria-controls="navbar"
id="navbarToggle"
>
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img src="./logo/logo.png" height="50px" />
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#"></a></li>
<li><a href="#"></a></li>
<li><a href="#"></a></li>
</ul>
</div>
<!-- <div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#">账号</a></li>
</ul>
</div> -->
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li class="active">
<a href="deviceinfo.asp">系统设置</a>
</li>
<li><a href="tcp.html">网络设置</a></li>
<li><a href="chart.html">数据显示</a></li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1 class="page-header">系统设置</h1>
<ul class="nav nav-tabs card-header-tabs">
<li role="presentation" class="active">
<a href="deviceinfo.asp">系统信息</a>
</li>
<li role="presentation">
<a href="systemModify.html">系统维护</a>
</li>
</ul>
<div class="col-sm-8 col-sm-offset-3 mt_15">
<form>
<div class="form-group row">
<label for="name" class="col-sm-3 col-xs-3 text-left"
>设备名称</label
>
<div class="col-sm-4">
<span class="form-control" id="name" disabled /><% device_name %>
</div>
</div>
<div class="form-group row">
<label for="no" class="col-sm-3 col-xs-3 text-left"
>设备编号</label
>
<div class="col-sm-4">
<span class="form-control" id="no" disabled /><% device_number %>
</div>
</div>
<div class="form-group row">
<label for="type" class="col-sm-3 col-xs-3 text-left"
>设备类型</label
>
<div class="col-sm-4">
<span class="form-control" id="type" disabled /><% device_type %>
</div>
</div>
<div class="form-group row">
<label for="seqNo" class="col-sm-3 col-xs-3 text-left"
>设备序列号</label
>
<div class="col-sm-4">
<span class="form-control" id="seqNo" disabled /><% device_serial %>
</div>
</div>
<div class="form-group row">
<label for="kernelType" class="col-sm-3 col-xs-3 text-left"
>内核类型</label
>
<div class="col-sm-4">
<span class="form-control" id="kernelType" disabled /><% os_type %>
</div>
</div>
<div class="form-group row">
<label for="webVersion" class="col-sm-3 col-xs-3 text-left"
>Web版本</label
>
<div class="col-sm-4">
<span class="form-control" id="webVersion" disabled /><% web_version %>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>

29
webnet/index_origin.html Normal file
View File

@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>xidatong web server set page </title>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
</head>
<body>
<h1>xidatong web setting<h1>
<br/><br/>
<br/><br/>
<br/><br/>
<a href="/deviceinfo.asp"><EFBFBD><EFBFBD><EFBFBD>Ϣ</a>
<hr>
<br/><br/>
<br/><br/>
<a href="/netsetting.html"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></a>
<h3>7. Upload File Test</h3>
<20>ļ<EFBFBD><C4BC>ϴ<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4>ļ<EFBFBD><C4BC><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF>µ<EFBFBD> /upload Ŀ¼<C4BF><C2BC>
<br/><br/>
<form name="upload" method="POST" enctype="multipart/form-data" action="/upload">
<input type="file" name="file1" >
<input type="submit" name="submit" value="<22>ϴ<EFBFBD>">
</form>
<br/>
<a href="/upload/"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Ŀ¼</a>
<br/><br/>
</body>
</html>

7
webnet/js/Chart.bundle.min.js vendored Normal file

File diff suppressed because one or more lines are too long

BIN
webnet/logo/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

211
webnet/mqtt.html Normal file
View File

@ -0,0 +1,211 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="xidatong webnet" />
<meta name="author" content="gong" />
<!-- <link rel="icon" href="../../favicon.ico" /> -->
<title>xidatong web server set page</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
crossorigin="anonymous"
></script>
<!-- Bootstrap core CSS -->
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu"
crossorigin="anonymous"
/>
<!-- Custom styles for this template -->
<link href="./css/layout.css" rel="stylesheet" />
<style>
.mt_15 {
margin-top: 15vh;
}
.mt_30 {
margin-top: 30px;
}
.form-group {
margin-bottom: 20px;
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button
type="button"
class="navbar-toggle collapsed"
data-toggle="collapse"
data-target="#navbar"
aria-expanded="false"
aria-controls="navbar"
>
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img src="./logo/logo.png" height="50px" />
</div>
<!-- <div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#">账号</a></li>
</ul>
</div> -->
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li>
<a href="deviceinfo.asp">系统设置</a>
</li>
<li class="active"><a href="tcp.html">网络设置</a></li>
<li><a href="chart.html">数据显示</a></li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1 class="page-header">网络设置</h1>
<ul class="nav nav-tabs card-header-tabs">
<li role="presentation">
<a href="tcp.html">TCP/IP</a>
</li>
<li role="presentation" class="active">
<a href="mqtt.html">Mqtt云平台设置</a>
</li>
<li role="presentation">
<a href="privateProtocol.html">私有协议</a>
</li>
</ul>
<div class="col-sm-8 col-sm-offset-3 mt_15">
<form>
<div class="form-group row">
<label for="publish-topic" class="col-sm-3 col-xs-3 text-left"
>发布主题</label
>
<div class="col-sm-4">
<input class="form-control" id="publish-topic" />
</div>
</div>
<div class="form-group row">
<label for="server-addr" class="col-sm-3 col-xs-3 text-left"
>服务器地址</label
>
<div class="col-sm-4">
<input class="form-control" id="server-addr" />
</div>
</div>
<div class="form-group row">
<label for="server-port" class="col-sm-3 col-xs-3 text-left"
>端口号</label
>
<div class="col-sm-4">
<input class="form-control" id="server-port" />
</div>
</div>
<div class="form-group row">
<label for="username" class="col-sm-3 col-xs-3 text-left"
>用户名</label
>
<div class="col-sm-4">
<input class="form-control" id="username" />
</div>
</div>
<div class="form-group row">
<label for="password" class="col-sm-3 col-xs-3 text-left"
>密码</label
>
<div class="col-sm-4">
<input type="password" class="form-control" id="password" />
</div>
</div>
<div class="form-group row">
<label for="clientID" class="col-sm-3 col-xs-3 text-left"
>客户端id</label
>
<div class="col-sm-4">
<input class="form-control" id="clientID" />
</div>
</div>
<a
type="submit"
onclick="saveMQTT()"
class="col-sm-4 col-sm-offset-3 btn btn-primary mt_30"
>保存</a
>
</form>
</div>
</div>
</div>
</div>
</body>
<script>
var pubtopicDiv = $('#publish-topic');
var serverAddrDiv = $('#server-addr');
var serverPortDiv = $('#server-port');
var usernameDiv = $('#username');
var passwordDiv = $('#password');
var clientIDDiv = $('#clientID');
function getMQTT() {
$.get(
'/cgi-bin/mqtt_get',
function (data) {
const {
pub_topic,
server_addr,
server_port,
username,
password,
clientID,
} = data;
pubtopicDiv.val(pub_topic);
serverAddrDiv.val(server_addr);
serverPortDiv.val(server_port);
usernameDiv.val(username);
passwordDiv.val(password);
clientIDDiv.val(clientID);
},
'json'
);
}
function saveMQTT() {
serverAddrDiv.parent('div').removeClass('has-error');
$.post(
'/cgi-bin/mqtt_save',
{
pub_topic: pubtopicDiv.val(),
server_addr: serverAddrDiv.val(),
server_port: serverPortDiv.val(),
username: usernameDiv.val(),
password: passwordDiv.val(),
clientID: clientIDDiv.val(),
},
function (data) {
alert('保存成功');
}
);
}
$(function () {
getMQTT();
});
</script>
</html>

119
webnet/netsetting.html Normal file
View File

@ -0,0 +1,119 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>xidatong web server set page </title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>网络设置<h1>
<br/><br/>
<br/><br/>
<br/><br/>
<div class="card-body main-card" >
<div class="card-title">MQTT代理服务器设置</div>
<form>
<div class="row">
<div class="form-group col-md-6">
<label for="publish-topic">发布主题</label>
<input type="text" class="form-control" id="publish-topic" required >
</div>
<div class="form-group col-md-6">
<label for="server-addr">服务器地址</label>
<input type="text" class="form-control" id="server-addr" required >
</div>
<div class="form-group col-md-6">
<label for="port">端口号</label>
<input type="text" class="form-control" id="server-port" required >
</div>
</div>
<div class="row">
<div class="form-group col-md-6">
<label for="username">用户名</label>
<input type="text" class="form-control" id="username" required >
</div>
<div class="form-group col-md-6">
<label for="password">密码</label>
<input type="password" class="form-control" id="password" required >
</div>
</div>
<div class="row">
<div class="form-group col-md-6">
<label for="receiver">客户端id</label>
<input type="text" class="form-control" id="clientID" required >
</div>
</div>
<button type="button" id="btnSaveSmtp" class="btn btn-outline-secondary btn-md btn-block"
onclick="saveMQTT()" >保存配置</button>
</form>
</div>
</body>
</html>
<script>
function saveMQTT() {
var pubtopicDiv = document.getElementById('publish-topic');
var serverAddrDiv = document.getElementById('server-addr');
var serverPortDiv = document.getElementById('server-port');
var usernameDiv = document.getElementById('username');
var passwordDiv = document.getElementById('password');
var clientIDDiv = document.getElementById('clientID');
if (serverAddrDiv.value == "" ||
serverPortDiv.value == "" ||
usernameDiv.value == "" ||
passwordDiv.value == "" ||
clientIDDiv.value == "" ||
pubtopicDiv.value == "") {
alert("设置项不能有空!");
} else {
$.ajax({
url: "/cgi-bin/mqtt_save",
type: "POST",
data: {
pub_topic: pubtopicDiv.value,
server_addr: serverAddrDiv.value,
server_port: serverPortDiv.value,
username: usernameDiv.value,
password: passwordDiv.value,
clientID: clientIDDiv.value,
},
dataType: "json",
success: function (data) {
alert('保存成功!');
}
});
}
}
function getMQTT(){
var pubtopicDiv = document.getElementById('publish-topic');
var serverAddrDiv = document.getElementById('server-addr');
var serverPortDiv = document.getElementById('server-port');
var usernameDiv = document.getElementById('username');
var passwordDiv = document.getElementById('password');
var clientIDDiv = document.getElementById('clientID');
$.ajax({
url: "/cgi-bin/mqtt_get",
type: "GET",
dataType: "json",
success: function (data) {
pubtopicDiv.value = data.pub_topic
serverAddrDiv.value = data.server_addr;
serverPortDiv.value = data.server_port;
usernameDiv.value = data.username;
passwordDiv.value = data.password;
clientIDDiv.value = data.clientID;
}
});
}
window.onload = function () {
getMQTT();
}
</script>

194
webnet/privateProtocol.html Normal file
View File

@ -0,0 +1,194 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="xidatong webnet" />
<meta name="author" content="gong" />
<!-- <link rel="icon" href="../../favicon.ico" /> -->
<title>xidatong web server set page</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
crossorigin="anonymous"
></script>
<!-- Bootstrap core CSS -->
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu"
crossorigin="anonymous"
/>
<!-- Custom styles for this template -->
<link href="./css/layout.css" rel="stylesheet" />
<style>
.mt_15 {
margin-top: 15vh;
}
.mt_30 {
margin-top: 30px;
}
.form-group {
margin-bottom: 20px;
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button
type="button"
class="navbar-toggle collapsed"
data-toggle="collapse"
data-target="#navbar"
aria-expanded="false"
aria-controls="navbar"
>
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img src="./logo/logo.png" height="50px" />
</div>
<!-- <div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#">账号</a></li>
</ul>
</div> -->
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li>
<a href="deviceinfo.asp">系统设置</a>
</li>
<li class="active"><a href="tcp.html">网络设置</a></li>
<li><a href="chart.html">数据显示</a></li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1 class="page-header">网络设置</h1>
<ul class="nav nav-tabs card-header-tabs">
<li role="presentation">
<a href="tcp.html">TCP/IP</a>
</li>
<li role="presentation">
<a href="mqtt.html">Mqtt云平台设置</a>
</li>
<li role="presentation" class="active">
<a href="privateProtocol.html">私有协议</a>
</li>
</ul>
<div class="col-sm-8 col-sm-offset-3 mt_15">
<form>
<div class="form-group row">
<label for="server_addr" class="col-sm-3 col-xs-3 text-left"
>服务器地址</label
>
<div class="col-sm-4">
<input class="form-control" id="server_addr" />
</div>
</div>
<div class="form-group row">
<label for="server_port" class="col-sm-3 col-xs-3 text-left"
>端口号</label
>
<div class="col-sm-4">
<input class="form-control" id="server_port" />
</div>
</div>
<div class="form-group row">
<label for="username" class="col-sm-3 col-xs-3 text-left"
>用户名</label
>
<div class="col-sm-4">
<input class="form-control" id="username" />
</div>
</div>
<div class="form-group row">
<label for="passward" class="col-sm-3 col-xs-3 text-left"
>密码</label
>
<div class="col-sm-4">
<input type="password" class="form-control" id="passward" />
</div>
</div>
<a
type="submit"
onclick="savePrivateProtocol()"
class="col-sm-4 col-sm-offset-3 btn btn-primary mt_30"
>保存</a
>
</form>
</div>
</div>
</div>
</div>
</body>
<script>
var serverAddr = $('#server_addr');
var serverPort = $('#server_port');
var userName = $('#username');
var passWard = $('#passward');
function validateIP(str) {
var pattern =
/((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}/g;
return pattern.test(str);
}
function getPrivateProtocol() {
$.get(
'/cgi-bin/private_prt_get',
function (data) {
const { server_addr, server_port, username, passward } = data;
serverAddr.val(server_addr);
serverPort.val(server_port);
userName.val(username);
passWard.val(passward);
},
'json'
);
}
function savePrivateProtocol() {
let valid = validateIP(serverAddr.val());
if (valid) {
serverAddr.parent('div').removeClass('has-error');
$.post(
'/cgi-bin/private_prt_save',
{
server_addr: serverAddr.val(),
server_port: serverPort.val(),
username: userName.val(),
passward: passWard.val(),
},
function (data) {
alert('保存成功');
}
);
} else {
serverAddr.parent('div').addClass('has-error');
alert('服务器地址有误');
}
}
$(function () {
getPrivateProtocol();
});
</script>
</html>

164
webnet/systemModify.html Normal file
View File

@ -0,0 +1,164 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="xidatong webnet" />
<meta name="author" content="gong" />
<!-- <link rel="icon" href="../../favicon.ico" /> -->
<title>xidatong web server set page</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- Custom styles for this template -->
<link href="./css/layout.css" rel="stylesheet" />
<style>
.mt_15 {
margin-top: 15vh;
}
.form-group {
margin-bottom: 20px;
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button
type="button"
class="navbar-toggle collapsed"
data-toggle="collapse"
data-target="#navbar"
aria-expanded="false"
aria-controls="navbar"
>
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img src="./logo/logo.png" height="50px" />
</div>
<!-- <div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#">账号</a></li>
</ul>
</div> -->
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li class="active">
<a href="deviceinfo.asp">系统设置</a>
</li>
<li><a href="tcp.html">网络设置</a></li>
<li><a href="chart.html">数据显示</a></li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1 class="page-header">系统设置</h1>
<ul class="nav nav-tabs card-header-tabs">
<li role="presentation">
<a href="deviceinfo.asp">系统信息</a>
</li>
<li role="presentation" class="active">
<a href="systemModify.html">系统维护</a>
</li>
</ul>
<div class="col-sm-8 col-sm-offset-3 mt_15">
<form
name="upload"
method="POST"
enctype="multipart/form-data"
action="/upload"
target="stop"
>
<div class="form-group row">
<a href="#" onclick="restart()" class="col-sm-2 btn btn-default"
>重启</a
>
<span class="col-sm-offset-1">重新启动设备</span>
</div>
<div class="form-group row">
<a onclick="recovery()" class="col-sm-2 btn btn-default"
>简单恢复</a
>
<span class="col-sm-offset-1">简单恢复设备参数</span>
</div>
<div class="form-group row form-inline">
<input
type="file"
name="file1"
id="inputFile"
style="display: inline-block"
/>
<input
type="submit"
name="submit"
value="升级固件"
class="col-sm-offset-1 btn btn-primary"
onclick="test()"
></input
>
</div>
</form>
<div class="col-sm-9" style="margin-left: -30px;">
<div class="progress" style="display:none">
<div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
<span class="val">0%</span>
</div>
</div>
</div>
<iframe name="stop" style="display:none"></iframe>
</div>
</div>
</div>
</div>
</body>
<script>
function restart() {
console.log('restart');
$.post('/cgi-bin/device_reboot', function (data) {
alert('重启成功');
});
}
function recovery() {
console.log('recovery');
$.post('/cgi-bin/device_recovery', function (data) {
alert('恢复成功');
});
}
function test(){
$('.progress').show()
let rate = 0
var interval = setInterval(()=>{
if(rate<=100){
$('.progress-bar').width(rate+'%')
$('.val').html(rate+'%')
rate++
}else{
rate = 0
clearInterval(interval)
restart()
}
},100)
}
$(function () {
});
</script>
</html>

212
webnet/tcp.html Normal file
View File

@ -0,0 +1,212 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="xidatong webnet" />
<meta name="author" content="gong" />
<!-- <link rel="icon" href="../../favicon.ico" /> -->
<title>xidatong web server set page</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
crossorigin="anonymous"
></script>
<!-- Bootstrap core CSS -->
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu"
crossorigin="anonymous"
/>
<!-- Custom styles for this template -->
<link href="./css/layout.css" rel="stylesheet" />
<style>
.mt_15 {
margin-top: 15vh;
}
.mt_30 {
margin-top: 30px;
}
.form-group {
margin-bottom: 20px;
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button
type="button"
class="navbar-toggle collapsed"
data-toggle="collapse"
data-target="#navbar"
aria-expanded="false"
aria-controls="navbar"
>
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img src="./logo/logo.png" height="50px" />
<!-- <a class="navbar-brand" href="#"></a> -->
</div>
<!-- <div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#">账号</a></li>
</ul>
</div> -->
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li>
<a href="deviceinfo.asp">系统设置</a>
</li>
<li class="active"><a href="tcp.html">网络设置</a></li>
<li><a href="chart.html">数据显示</a></li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1 class="page-header">网络设置</h1>
<ul class="nav nav-tabs card-header-tabs">
<li role="presentation" class="active">
<a href="tcp.html">TCP/IP</a>
</li>
<li role="presentation">
<a href="mqtt.html">Mqtt云平台设置</a>
</li>
<li role="presentation">
<a href="privateProtocol.html">私有协议</a>
</li>
</ul>
<div class="col-sm-8 col-sm-offset-3 mt_15">
<form>
<div class="form-group row">
<label for="local_ipaddr" class="col-sm-3 col-xs-3 text-left"
>设备IPv4地址</label
>
<div class="col-sm-4">
<input class="form-control" id="local_ipaddr" />
</div>
</div>
<div class="form-group row">
<label for="netmask_addr" class="col-sm-3 col-xs-3 text-left"
>IPv4子网掩码</label
>
<div class="col-sm-4">
<input class="form-control" id="netmask_addr" />
</div>
</div>
<div class="form-group row">
<label for="gateway_addr" class="col-sm-3 col-xs-3 text-left"
>IPv4默认网关</label
>
<div class="col-sm-4">
<input class="form-control" id="gateway_addr" />
</div>
</div>
<div class="form-group row">
<label for="dns_server0" class="col-sm-3 col-xs-3 text-left"
>首选DNS服务器</label
>
<div class="col-sm-4">
<input class="form-control" id="dns_server0" />
</div>
</div>
<div class="form-group row">
<label for="dns_server1" class="col-sm-3 col-xs-3 text-left"
>备用DNS服务器</label
>
<div class="col-sm-4">
<input class="form-control" id="dns_server1" />
</div>
</div>
<a
type="submit"
onclick="saveTcpip()"
class="col-sm-4 col-sm-offset-3 btn btn-primary mt_30"
>保存</a
>
</form>
</div>
</div>
</div>
</div>
</body>
<script>
var localIpaddr = $('#local_ipaddr');
var netmaskAddr = $('#netmask_addr');
var gatewayAddr = $('#gateway_addr');
var dnsServer0 = $('#dns_server0');
var dnsServer1 = $('#dns_server1');
function validateIP(str) {
var pattern =
/((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}/g;
return pattern.test(str);
}
function getTcpip() {
$.get(
'/cgi-bin/tcpip_get',
function (data) {
const {
local_ipaddr,
netmask_addr,
gateway_addr,
dns_server0,
dns_server1,
} = data;
localIpaddr.val(local_ipaddr);
netmaskAddr.val(netmask_addr);
gatewayAddr.val(gateway_addr);
dnsServer0.val(dns_server0);
dnsServer1.val(dns_server1);
},
'json'
);
}
function saveTcpip() {
let valid = validateIP(localIpaddr.val());
if (valid) {
localIpaddr.parent('div').removeClass('has-error');
$.post(
'/cgi-bin/tcpip_save',
{
local_ipaddr: localIpaddr.val(),
netmask_addr: netmaskAddr.val(),
gateway_addr: gatewayAddr.val(),
dns_server0: dnsServer0.val(),
dns_server1: dnsServer1.val(),
},
function (data) {
alert('保存成功');
}
);
} else {
localIpaddr.parent('div').addClass('has-error');
alert('设备IPv4地址有误');
}
}
$(function () {
getTcpip();
});
</script>
</html>