安防监控实现之控制命令下发(命令下发--html通过CGI与用户进程交互)

本文围绕仓储项目,介绍了html通过CGI与用户进程交互实现命令下发的过程。包括基础知识中的消息队列,实现步骤如将html文件和.cgi程序放于boa服务器www目录、编写应用程序消息队列处理部分等,还进行了源码分析和测试。

声明

华清远见教育集团 15年专注高端IT培训 做良心教育,做专业教育,做受人尊敬的职业教育

创客学院官网:http://www.makeru.com.cn/
华清远见创客学院嵌入式课程链接:http://www.makeru.com.cn/emb
华清远见创客学院物联网课程链接:http://www.makeru.com.cn/iot

基础知识

  • 消息队列

https://zhuzhongwei.blog.youkuaiyun.com/article/details/90112127

命令下发–html通过CGI与用户进程交互

在本文介绍的仓储项目中,用户通过客户端的一些控件实现对向底层硬件发送指令,这一过程是命令数据的下发;用户还可以实时查看到仓库的环境数据,这是数据的上报。总体上分为三个的对象和两条数据流向,网页端-服务器-底层实现命令数据的下发和环境数据的上报,也就实现了人机交互的过程。下面是命令下发部分框图:
在这里插入图片描述

  • 目的:完成html 和 CGI 和 用户进程 的交互,实现命令下发并接受到返回结果。随便从程序上加以分析这一过程。

实现步骤

  1. 实现html文件,放在boa服务器的www目录下
  2. 实现.cgi程序,放在boa服务器的www目录下
  3. 编写应用程序消息队列处理部分,实现与cgi进行交互
  4. 在开发板上运行boa服务器,运行应用程序
  5. 测试结果

在这里插入图片描述

源码分析

接收请求线程-pthread_client_request.c

处理消息队列里请求的线程.

#include "data_global.h"

extern int msgid;
extern key_t key;

extern pthread_mutex_t  mutex_client_request;
extern pthread_mutex_t  mutex_refresh;
extern pthread_mutex_t  mutex_sqlite;
extern pthread_mutex_t	mutex_transfer;
extern pthread_mutex_t	mutex_sms;
extern pthread_mutex_t	mutex_buzzer;
extern pthread_mutex_t	mutex_led;
extern pthread_mutex_t	mutex_camera;

extern pthread_cond_t   cond_client_request;
extern pthread_cond_t   cond_refresh;
extern pthread_cond_t   cond_sqlite;
extern pthread_cond_t	cond_transfer;
extern pthread_cond_t	cond_sms;
extern pthread_cond_t	cond_buzzer;
extern pthread_cond_t	cond_led;
extern pthread_cond_t	cond_camera;

extern char recive_phone[12] ;
extern char center_phone[12] ;


struct msg msgbuf;







//:处理消息队列里请求的线程.
void *pthread_client_request(void *arg)
{
    printf("pthread_client_request\n");

# if 1

    	if ((key = ftok("/tmp", 'g')) < 0)
    	{
    		perror("ftok failed .\n");
    		exit(-1);
    	}
    
    	msgid = msgget(key, IPC_CREAT | IPC_EXCL | 0666);
    	if (msgid == -1)
    	{
    		if (errno == EEXIST)
    		{
    			msgid = msgget(key, 0777);
    		}
    		else {
    			perror("fail to msgget");
    			exit(1);
    		}
    	}
    	printf("pthread_client_request\n");
    
    	while (1) 
    	{
    		bzero(&msgbuf, sizeof(msgbuf));
    		printf("wait form client request...\n");
    		msgrcv (msgid, &msgbuf, sizeof (msgbuf) - sizeof (long), 1L, 0);
    		printf ("Get %ldL msg\n", msgbuf.msgtype);
    		printf ("text[0] = %#x\n", msgbuf.text[0]);
    
    		switch (msgbuf.msgtype)
    		{
    		case DEVICE_CTRL_TYPE_LED:
    			printf("hello led\n");
    			break;
    		case DEVICE_CTRL_TYPE_BEEP:
    			printf("hello beep\n");
    			break;
    		case DEVICE_CTRL_TYPE_SEG:
    			printf("hello seg\n");
    			break;
    		case DEVICE_CTRL_TYPE_FAN:
    			printf("hello fan\n");
    			break;
    
    		case DEVICE_CTRL_TYPE_SET_ENV:
    			printf("set env data\n");
    			printf("temMAX: %d\n", *((int *)&msgbuf.text[1]));
    			printf("temMIN: %d\n", *((int *)&msgbuf.text[5]));
    			printf("humMAX: %d\n", *((int *)&msgbuf.text[9]));
    			printf("humMIN: %d\n", *((int *)&msgbuf.text[13]));
    			break;
    		case 6L:
    		case 7L:
    		case 8L:
    		case 9L:
    			printf("extern module \n");
    			break;
    		case DEVICE_CTRL_TYPE_GPRS:
    		{
    			int i = 0 , j = 0 ;
    			for (i = 0 ; i < 11; i++) {
    				recive_phone[i] = msgbuf.text[i];
    			}
    			recive_phone[i] = '\0';
    			printf("recive:%s\n", recive_phone);
    			for (j = 0 ; msgbuf.text[i] != '\0' && j < 12; i++, j++)
    			{
    				center_phone[j] =  msgbuf.text[i];
    			}
    			center_phone[j] = '\0';
    			printf("center:%s\n", center_phone);
    #if 0
    			pthread_mutex_lock (&mutex_slinklist);
    			sqlite_InsertLinknode (ENV_UPDATE, all_info_RT, sto_no, 0);//0,0分别是仓库号和货物种类号
    			pthread_mutex_unlock (&mutex_slinklist);
    			pthread_cond_signal (&cond_sqlite);
    #endif
    		}
    		break;
    		default:
    			break;
    
    		}
    	}
    #endif
    
    }

测试结果

信息说明
在这里插入图片描述LED_ON
在这里插入图片描述LED_OFF
在这里插入图片描述BEEP_ON
在这里插入图片描述BEEP_OFF
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值