栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

嵌入式web -- 综合参考案例

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

嵌入式web -- 综合参考案例

文章目录
    • 1、后台
      • 1.1、定义数据结构
      • 1.3、模拟温度获取
      • 1.4、向cgi发送数据
      • 1.5、Makefile
    • 2、前端

前置:
BOA安装:嵌入式web – BOA的安装、配置与测试
CGI的引入:嵌入式web – CGI
前后端分离引入:嵌入式web – 前后端分离
CGI案例:嵌入式web – CGI案例

主要内容:
1、后台生成两个可执行文件
2、一个模拟获取温度并写入共享内存
3、一个从共享内存读出数据,格式化成json数据后发给cgi
4、前端解析json数据,并自动刷新

1、后台

1.1、定义数据结构
  • 头文件 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);
}

对共享内存不熟悉的可参考:System V IPC 共享内存

1.3、模拟温度获取
  • get_temp.c
#include "task.h"
#include 
#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);
    }
}

1.4、向cgi发送数据
  • 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程序在打开浏览器

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/966124.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号