基于ARM的智能灯光控制系统(9)设备管理

设备管理网页界面

设备管理页面程序(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);

}

Copyright © 2016 www.91arm.com 【91创客学堂】