声明
华清远见教育集团 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 和 用户进程 的交互,实现命令下发并接受到返回结果。随便从程序上加以分析这一过程。
实现步骤
- 实现html文件,放在boa服务器的www目录下
- 实现.cgi程序,放在boa服务器的www目录下
- 编写应用程序消息队列处理部分,实现与cgi进行交互
- 在开发板上运行boa服务器,运行应用程序
- 测试结果

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





被折叠的 条评论
为什么被折叠?



