基於ARM的智能燈光控制系統(9)設備管理
嵌入式開發培訓(階段2)底層系統開發 視頻地址
智能燈光控制系統 視頻地址
設備管理網頁界面
設備管理頁面程序(dev_con.c)
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "html.h"
#include "config.h"
#include "ipc.h"
void light_tr(char* name,int join,int sw,char type)
{
char type_id[2]="0";
type_id[0] = type + '0';
printf("<tr><td>%s</td>",name);
if(join==1)
printf("<td>在線</td>");
else
printf("<td>下線</td>");
if(sw==1){
printf("<td class=\"center\"><input type=\"radio\" checked=\"checked\" value=\"1\" name=\"sw_sta%s\"> 開啓<input type=\"radio\" value=\"0\" name=\"sw_sta%s\">關閉</td>",type_id,type_id);
}else{
printf("<td class=\"center\"><input type=\"radio\" value=\"1\" name=\"sw_sta%s\"> 開啓<input type=\"radio\" value=\"0\" name=\"sw_sta%s\" checked=\"checked\">關閉</td>",type_id,type_id);
}
printf("<td class=\"center\"><button type=\"submit\" >設置</button></td></tr>");
}
void sensor_tr(char* name,int join,int bind,char type,struct sys_all* shm_dev)
{
int i;
char selected[32] = "";
char type_id[2]="0";
type_id[0] = type + '0';
printf("<tr><td>%s</td>",name);
if(join==1)
printf("<td>在線</td>");
else
printf("<td>下線</td>");
if(bind == 0)
strcpy(selected,"selected=selected");
printf("<td><select name=\"bind%s\"><option value=\"0\" %s >解除綁定</option>",type_id,selected);
for(i=0;i<shm_dev->count_dev;i++){
strcpy(selected,"");
if(bind == shm_dev->sys_dev[i].node.type)
strcpy(selected,"selected=selected");
if(shm_dev->sys_dev[i].node.type==DEV_T_LIGHT1 || shm_dev->sys_dev[i].node.type==DEV_T_LIGHT2 || shm_dev->sys_dev[i].node.type==DEV_T_LIG_NET)
printf("<option value=\"%d\" %s >%s</option>",shm_dev->sys_dev[i].node.type,selected,shm_dev->sys_dev[i].name);
}
printf("</select></td>");
printf("<td class=\"center\"><button type=\"submit\" >設置</button></td></tr>");
}
int main(int argc, char *argv[])
{
int ret = 0;
int i,msgid;
struct sys_all* shm_dev;
char item_name[5][10];
if((msgid=get_msgid()) < 0){
ret = ERR_MSG;
}
if(msg_send(msgid,CMD_GET)==0){
if((shm_dev=(struct sys_all*)set_web_shm())==NULL){
ret = ERR_SHM;
}
}
html_head();
html_title();
html_nav();
html_table_title("設備管理" , "設備設置" , "設備管理" );
if(ret != 0){
html_return_show(ret);
html_end();
return 0;
}
printf("<form method=\"get\" action=\"/cgi-bin/dev_con_post.cgi\">");
strcpy(item_name[0],"設備名稱");
strcpy(item_name[1],"在線狀態");
strcpy(item_name[2],"設備開關");
strcpy(item_name[3],"提交操作");
html_table_head(4,item_name,"燈光設備");
for(i=0;i<shm_dev->count_dev;i++){
if(shm_dev->sys_dev[i].node.type==DEV_T_LIGHT1 || shm_dev->sys_dev[i].node.type==DEV_T_LIGHT2 || shm_dev->sys_dev[i].node.type==DEV_T_LIG_NET)
light_tr(shm_dev->sys_dev[i].name,shm_dev->sys_dev[i].join_sta,
shm_dev->sys_dev[i].sw_sta,shm_dev->sys_dev[i].node.type);
}
html_table_end();
strcpy(item_name[0],"設備名稱");
strcpy(item_name[1],"在線狀態");
strcpy(item_name[2],"關聯設備");
strcpy(item_name[3],"提交操作");
html_table_head(4,item_name,"感應設備");
for(i=0;i<shm_dev->count_dev;i++){
if(shm_dev->sys_dev[i].node.type==DEV_T_RAY)
sensor_tr(shm_dev->sys_dev[i].name,shm_dev->sys_dev[i].join_sta,
shm_dev->sys_dev[i].bind_dev,shm_dev->sys_dev[i].node.type,shm_dev);
}
html_table_end();
printf("</form>");
html_end();
return 0;
}
設備管理頁面處理程序(dev_con_post.c)
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "getvalue.h"
#include "html.h"
#include "config.h"
#include "ipc.h"
int main(int argc, char *argv[])
{
int ret = 0;
char *val = NULL;
char val_name[16];
char type_id[2]="0";
int i,msgid;
struct sys_all* shm_dev;
set_env(getenv("REQUEST_METHOD"),
getenv("CONTENT_LENGTH"),
getenv("QUERY_STRING"));
html_head();
html_refresh("3","/cgi-bin/dev_con.cgi");
html_title();
html_nav();
html_table_title("設備管理" , "設備設置" , "設備管理" );
if((shm_dev=(struct sys_all*)set_web_shm())==NULL){
ret = ERR_SHM;
}else{
for(i=0;i<shm_dev->count_dev;i++){
//根據配置文件實時數據,動態讀取變量名join_sta+id
type_id[0] = shm_dev->sys_dev[i].node.type + '0';
strcpy(val_name,"sw_sta");
strcat(val_name,type_id);
val = get_value(val_name);
if(val != NULL)
shm_dev->sys_dev[i].sw_sta = val[0]-'0';
strcpy(val_name,"bind");
strcat(val_name,type_id);
val = get_value(val_name);
if(val != NULL)
shm_dev->sys_dev[i].bind_dev = val[0]-'0';
}
}
if(ret == 0){
if((msgid=get_msgid()) < 0){
ret = ERR_MSG;
}
if(msg_send(msgid,CMD_SET) < 0)
ret = ERR_MSG;
}
html_return_show(ret);
html_end();
return 0;
}
CGI處理頭文件 (getvalue.h)
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define FIELD_LEN 60 /*how long each name or value can be*/
#define NV_PAIRS 15 /*how many name=value pairs can process*/
typedef struct name_value_st{
char name[FIELD_LEN + 1];
char value[FIELD_LEN + 1];
}name_value;
name_value name_val_pairs[NV_PAIRS];
int num_pairs = 0;/*pairs number*/
const char *M = NULL;
const char *L = NULL;
const char *S = NULL;
static int iread = 0;
void unescape_url(char *url);
void set_env(const char *r_mth, const char *c_len,const char *q_str);
char* get_value(const char *name);
int get_input(void);
void send_error(char *error_test);
char x2c(char *what);
void load_nv_pair(char *tmp_buffer, int nv_entry_number_to_load);
void set_env(const char *r_mth, const char *c_len,const char *q_str)
{
M = r_mth;
L = c_len;
S = q_str;
}
char* get_value(const char *name)
{
int nv_entry_number = 0;
int i = 0;
char* val = NULL;
char *tname = NULL;
if(iread == 0)
{
if ( !get_input()){
return "error";
exit(EXIT_FAILURE);
}
}
for(i = 0; i < num_pairs; i++ )
{
val = name_val_pairs[nv_entry_number].value;
tname = name_val_pairs[nv_entry_number].name;
nv_entry_number++;
if( strcmp(tname,name) == 0 )
{ break;}
else
{ val = NULL;
tname = NULL;
}
}
// printf("\r\n");
iread++;//read value times
return val;
exit(EXIT_SUCCESS);
}
int get_input(void)
{
int nv_entry_number = 0;
int got_data = 0;
char *ip_data = NULL;
int ip_length = 0;
char tmp_buffer[(FIELD_LEN * 2) + 2];
int tmp_offset = 0;
char *tmp_char_ptr = NULL;
int chars_processed = 0;
/*如果是POST方法提交,數據導入ip_data*/
// tmp_char_ptr = getenv("REQUEST_METHOD");
tmp_char_ptr = (char*)M;
if ( tmp_char_ptr)
{
if(strcmp(tmp_char_ptr, "POST") == 0)
{
// tmp_char_ptr = getenv("CONTENT_LENGTH");
tmp_char_ptr = (char*)L;
if (tmp_char_ptr){
ip_length = atoi(tmp_char_ptr);
ip_data = malloc(ip_length + 1);
if (fread(ip_data, 1, ip_length, stdin) != ip_length)
{
send_error("Bad read from stdin");
return(0);
}
ip_data[ip_length] = '\0';
got_data = 1;
}
}
}
/*如果是GET方法提交,數據導入ip_data*/
// tmp_char_ptr = getenv("REQUEST_METHOD");
tmp_char_ptr = (char*)M;
if ( tmp_char_ptr)
{
if(strcmp(tmp_char_ptr, "GET") == 0)
{
// tmp_char_ptr = getenv("QUERY_STRING");
tmp_char_ptr = (char*)S;
if (tmp_char_ptr)
{
// ip_length = atoi(tmp_char_ptr);
ip_length = strlen(tmp_char_ptr);
ip_data = malloc(ip_length + 1);
// strcpy(ip_data, getenv("QUERY_STRING"));
strcpy(ip_data, (char*)S);
ip_data[ip_length] = '\0';
got_data = 1;
}
}
}
if (!got_data){
send_error("No data received");
}
if (ip_length <= 0){
send_error("Input length <= 0");
return(0);
}
memset(name_val_pairs, '\0', sizeof(name_val_pairs));
tmp_char_ptr = ip_data;
while (chars_processed <= ip_length && nv_entry_number < NV_PAIRS)
{
tmp_offset = 0;
while (*tmp_char_ptr && *tmp_char_ptr != '&' && tmp_offset < FIELD_LEN)
{
tmp_buffer[tmp_offset] = *tmp_char_ptr;
tmp_offset++;
tmp_char_ptr++;
chars_processed++;
}
tmp_buffer[tmp_offset] = '\0';
/*decode and load the pair*/
load_nv_pair(tmp_buffer, nv_entry_number);
/*move on to the next name=value pair*/
tmp_char_ptr++;
nv_entry_number++;
}
free(ip_data);
ip_data = NULL;
return(1);
}
void send_error(char *error_text)
{
printf("Content-Type: text/html\r\n");
printf("\r\n");
printf("Woops:- %s\r\n",error_text);
}
void load_nv_pair(char *tmp_buffer, int nv_entry)
{
int chars_processed = 0;
char *src_char_ptr = NULL;
char *dest_char_ptr = NULL;
/*get the part before the '=' sign*/
src_char_ptr = tmp_buffer;
dest_char_ptr = name_val_pairs[nv_entry].name;
while (*src_char_ptr && *src_char_ptr != '=' && chars_processed < FIELD_LEN)
{
/*chang a '+' to a ' ' */
if (*src_char_ptr == '+')
{
*dest_char_ptr = ' ';
}else{
*dest_char_ptr = *src_char_ptr;
}
dest_char_ptr++;
src_char_ptr++;
chars_processed++;
}
/*skip the '=' character*/
if (*src_char_ptr == '=')
{
num_pairs++;
/*get the part after the '=' sign*/
src_char_ptr++;
dest_char_ptr = name_val_pairs[nv_entry].value;
chars_processed = 0;
while (*src_char_ptr && *src_char_ptr != '=' && chars_processed < FIELD_LEN)
{
/*chang a '+' to a ' ' */
if (*src_char_ptr == '+')
{
*dest_char_ptr = ' ';
}else{
*dest_char_ptr = *src_char_ptr;
}
dest_char_ptr++;
src_char_ptr++;
chars_processed++;
}
}
unescape_url(name_val_pairs[nv_entry].name);
unescape_url(name_val_pairs[nv_entry].value);
}
void unescape_url(char *url)
{
int x,y;
for (x=0,y=0; url[y]; ++x,++y ){
if ( (url[x] = url[y]) == '%'){
url[x] = x2c(&url[y+1]);
y += 2;
}
}
url[x] = '\0';
}
/* %xx:用其十六進制ASCII碼值表示的特殊字符。根據值xx將其轉換成相應的ASCII字符*/
char x2c(char *what)
{
register char digit;
digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
digit *= 16;
digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
return(digit);
}