- 1、后台
- 1.1、定义数据结构
- 1.3、模拟温度获取
- 1.4、向cgi发送数据
- 1.5、Makefile
- 2、前端
前置:
BOA安装:嵌入式web – BOA的安装、配置与测试
CGI的引入:嵌入式web – CGI
前后端分离引入:嵌入式web – 前后端分离
CGI案例:嵌入式web – CGI案例
1、后台 1.1、定义数据结构主要内容:
1、后台生成两个可执行文件
2、一个模拟获取温度并写入共享内存
3、一个从共享内存读出数据,格式化成json数据后发给cgi
4、前端解析json数据,并自动刷新
- 头文件 task.h
#ifndef TASK_H #define TASK_H #define MAX_TASK 5 #define PATHNAME "/home" #define PRJ_ID 16 #include#include #include #include //单个机房信息 struct task_msg{ double temp;//温度 char label[16];//机房名称 }; //多个机房 typedef struct task_info{ int num;//机房总数 struct task_msg data[MAX_TASK]; }tasks_info; extern void* init_shm(void); extern void detach_shm(void *ptr); #endif //TASK_H
- 具体实现:task.c
#include "task.h"
void* init_shm(void){
key_t shm_key;
int shm_id;
void *ret;
shm_key = ftok(PATHNAME,PRJ_ID);
if(shm_key == -1){
return NULL;
}
shm_id = shmget(shm_key,
sizeof(tasks_info),IPC_CREAT|0644);
if(shm_id == -1){
perror("shm get error");
return NULL;
}
ret = shmat(shm_id,NULL,0);
return ret;
}
void detach_shm(void *ptr){
shmdt(ptr);
}
1.3、模拟温度获取对共享内存不熟悉的可参考:System V IPC 共享内存
- get_temp.c
#include "task.h" #include1.4、向cgi发送数据#include static tasks_info *tasks;//共享内存映射 void get_data(int); int main(){ srand(time(NULL) ); //初始化共享内存 tasks = (tasks_info *)init_shm(); if(tasks == NULL){ return -1; } //死循环修改共享内存的数据 while (1){ get_data(5); sleep(1); } } void get_data(int num){ tasks->num = num; int i; for(i = 0;i //模拟温度 tasks->data[i].temp = (rand()%9000+1000)/100.0; sprintf(tasks->data[i].label,"机房%d",i+1); } }
- temp_cgi.c
#include "task.h"
#include "cJSON.h"
static tasks_info *tasks;
void send_json();
int main(){
//http协议
printf("Content-Type:text/html;charset=utf-8rn");
printf("rn");
//获取共享内存映射
tasks = (tasks_info *)init_shm();
if(tasks == NULL){
return -1;
}
send_json();
return 0;
}
void send_json(){
int num;//机房数量
cJSON *cjson;//用于格式化整个数据
cJSON *data;//用于格式化单个task_msg
cJSON *datas;//用于格式化所有的task_msg
char *ptr;//用于向cgi打印
char temp[32];//获取温度
cjson = cJSON_CreateObject();
if(cjson == NULL){
goto end;
}
datas = cJSON_CreateArray();
if(datas == NULL){
goto end;
}
num = tasks->num;
cJSON_AddItemToObject(cjson,"num",
cJSON_CreateNumber(num));
cJSON_AddItemToObject(cjson,"data",datas);
for(int i=0;i
data = cJSON_CreateObject();
if(data == NULL){
goto end;
}
cJSON_AddItemToArray(datas,data);
cJSON_AddItemToObject(data,"label",
cJSON_CreateString(tasks->data[i].label));
snprintf(temp, sizeof(temp),"%.2lf",tasks->data[i].temp);
cJSON_AddItemToObject(data,"temp",
cJSON_CreateString(temp));
}
ptr = cJSON_Print(cjson);
printf("%s",ptr);
free(ptr);//ptr在堆空间
ptr = NULL;
end:{
cJSON_Delete(cjson);
return;
};
}
1.5、Makefile
TARGET1 := cgi TARGET2 := get_temp TARGET +=$(TARGET1) $(TARGET2) CROSS_COMPILE := CC = $(CROSS_COMPILE)gcc LD = $(CROSS_COMPILE)ld OBJS1 := temp_cgi.o task.o cJSON.o OBJS2 := get_temp.o task.o cJSON.o OBJS += $(OBJS1) $(OBJS2) CFLAGS += -Wall LDFLAGS += OUTPUT_DIR = /home/venom/web_prj/jobs/cgi/ all:$(TARGET) $(TARGET1):$(OBJS1) $(CC) $(LDFLAGS) $^ -o $@ cp $(TARGET1) $(OUTPUT_DIR) $(TARGET2):$(OBJS2) $(CC) $(LDFLAGS) $^ -o $@ %.o:%.c $(CC) -c $(CFLAGS) $^ -o $@ clean: rm -f $(TARGET) $(OBJS)2、前端
解析json数据,并自动刷新
bootstrap测试
序号
机房名称
温度值
- 执行get_temp程序在打开浏览器



