You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过网页按钮设置Raspberry Pi中C程序的boolean变量?

实现树莓派网页按钮控制C程序布尔变量的几种方案

嘿,这个需求其实挺接地气的,我给你整理了几个实用的实现思路,附带着可直接跑的示例代码,你可以根据自己的技术栈和需求选:

方案1:C程序内置轻量HTTP服务器(最直接)

这个方案不用额外的中间服务,直接让你的C程序自己处理网页请求,用libmicrohttpd这个轻量库就能搞定,树莓派上很容易安装。

步骤1:安装依赖

先在树莓派终端里装libmicrohttpd:

sudo apt-get update && sudo apt-get install libmicrohttpd-dev

步骤2:C程序代码示例

这个代码里有个全局布尔变量toggle_flag,内置了一个HTTP服务器,处理GET请求来修改变量,同时返回简单的网页显示当前状态:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <microhttpd.h>
#include <stdbool.h>

bool toggle_flag = false; // 你要控制的布尔变量

// 处理HTTP请求的回调函数
static int handle_request(void *cls, struct MHD_Connection *connection,
                          const char *url, const char *method,
                          const char *version, const char *upload_data,
                          size_t *upload_data_size, void **con_cls) {
    const char *page_template = 
        "<html><body>"
        "<h1>当前状态: %s</h1>"
        "<form method='GET' action='/toggle'>"
        "<button type='submit'>切换布尔变量</button>"
        "</form>"
        "</body></html>";
    char response[512];

    // 处理切换请求
    if (strcmp(method, "GET") == 0 && strcmp(url, "/toggle") == 0) {
        toggle_flag = !toggle_flag;
    }

    // 生成响应页面
    snprintf(response, sizeof(response), page_template, toggle_flag ? "开启" : "关闭");

    // 返回HTTP响应
    struct MHD_Response *resp = MHD_create_response_from_buffer(strlen(response),
                                                               (void *)response,
                                                               MHD_RESPMEM_PERSISTENT);
    int ret = MHD_queue_response(connection, MHD_HTTP_OK, resp);
    MHD_destroy_response(resp);
    return ret;
}

int main() {
    struct MHD_Daemon *daemon;

    // 启动HTTP服务器,监听8080端口
    daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, 8080,
                              NULL, NULL, &handle_request, NULL, MHD_OPTION_END);
    if (NULL == daemon) {
        fprintf(stderr, "服务器启动失败\n");
        return 1;
    }

    printf("服务器已启动,访问 http://你的树莓派IP:8080 来控制\n");
    printf("按Ctrl+C停止服务器\n");
    getchar();

    MHD_stop_daemon(daemon);
    return 0;
}

步骤3:编译运行

gcc -o c_http_server c_http_server.c -lmicrohttpd
sudo ./c_http_server

然后在浏览器里访问树莓派的IP加8080端口,点击按钮就能切换toggle_flag的值了。

方案2:用Unix本地套接字做中间层(适合不想写HTTP逻辑的情况)

如果你的C程序已经很复杂,不想加HTTP代码,可以让C程序监听一个本地套接字,然后用一个简单的Python Flask网页服务来处理按钮请求,再通过套接字给C程序发消息修改变量。

步骤1:C程序监听套接字的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdbool.h>

bool toggle_flag = false;
#define SOCKET_PATH "/tmp/c_program_socket"

int main() {
    int sockfd, client_fd;
    struct sockaddr_un addr;
    char buffer[1024];
    ssize_t bytes_read;

    // 创建套接字
    if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // 删除旧的套接字文件
    unlink(SOCKET_PATH);

    // 设置套接字地址
    memset(&addr, 0, sizeof(struct sockaddr_un));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);

    // 绑定套接字
    if (bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
        perror("bind");
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(sockfd, 5) == -1) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    printf("等待套接字连接...\n");

    while (1) {
        // 接受客户端连接
        if ((client_fd = accept(sockfd, NULL, NULL)) == -1) {
            perror("accept");
            continue;
        }

        // 读取消息
        bytes_read = read(client_fd, buffer, sizeof(buffer) - 1);
        if (bytes_read > 0) {
            buffer[bytes_read] = '\0';
            printf("收到消息: %s\n", buffer);

            // 根据消息修改布尔变量
            if (strcmp(buffer, "TOGGLE") == 0) {
                toggle_flag = !toggle_flag;
                printf("布尔变量已切换为: %s\n", toggle_flag ? "true" : "false");
            }
        }

        close(client_fd);
    }

    close(sockfd);
    unlink(SOCKET_PATH);
    return 0;
}

步骤2:Flask网页服务代码

先安装Flask:

pip install flask

然后写个简单的app.py:

from flask import Flask, render_template_string
import socket

app = Flask(__name__)
SOCKET_PATH = "/tmp/c_program_socket"

@app.route('/')
def index():
    return render_template_string('''
        <html><body>
            <h1>控制C程序布尔变量</h1>
            <form method='POST' action='/toggle'>
                <button type='submit'>切换变量</button>
            </form>
        </body></html>
    ''')

@app.route('/toggle', methods=['POST'])
def toggle():
    try:
        # 连接到C程序的套接字
        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        sock.connect(SOCKET_PATH)
        sock.sendall(b"TOGGLE")
        sock.close()
    except Exception as e:
        return f"连接失败: {str(e)}", 500
    return "已发送切换命令,<a href='/'>返回首页</a>"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

步骤3:运行程序

先启动C程序:

gcc -o c_socket_server c_socket_server.c
./c_socket_server

然后在另一个终端启动Flask服务:

python3 app.py

访问树莓派IP:5000,点击按钮就能触发C程序里的变量切换了。注意要给套接字文件设置正确的权限,比如如果Flask用www-data用户运行,需要让C程序的套接字文件能被该用户访问,可以在C程序里绑定后加chmod(SOCKET_PATH, 0666);。

方案3:用文件做中间介质(最简单的原型方案)

这个方案最容易上手,不用任何网络编程,C程序定时读取一个文件的内容来更新变量,网页端通过CGI或者简单的脚本修改这个文件。

步骤1:C程序代码

#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>

bool toggle_flag = false;
#define FLAG_FILE "/tmp/boolean_flag.txt"

int main() {
    FILE *fp;
    char buffer[10];

    while (1) {
        // 读取文件内容
        fp = fopen(FLAG_FILE, "r");
        if (fp != NULL) {
            fgets(buffer, sizeof(buffer), fp);
            fclose(fp);
            // 更新变量
            if (strcmp(buffer, "true\n") == 0) {
                toggle_flag = true;
            } else if (strcmp(buffer, "false\n") == 0) {
                toggle_flag = false;
            }
            printf("当前布尔变量值: %s\n", toggle_flag ? "true" : "false");
        }
        sleep(1); // 每秒读取一次
    }
    return 0;
}

步骤2:网页端CGI脚本(用Bash)

假设你用Apache作为网页服务器,先启用CGI模块:

sudo a2enmod cgi
sudo systemctl restart apache2

然后在/usr/lib/cgi-bin目录下创建一个toggle_flag.sh脚本:

#!/bin/bash

FLAG_FILE="/tmp/boolean_flag.txt"

# 读取当前值并切换
if [ "$(cat $FLAG_FILE)" = "true" ]; then
    echo "false" > $FLAG_FILE
else
    echo "true" > $FLAG_FILE
fi

# 返回网页响应
echo "Content-type: text/html"
echo ""
echo "<html><body>"
echo "已切换变量,<a href='/'>返回首页</a>"
echo "</body></html>"

给脚本加执行权限:

sudo chmod +x /usr/lib/cgi-bin/toggle_flag.sh

然后创建一个简单的index.html放在/var/www/html:

<html>
<body>
    <h1>控制C程序布尔变量</h1>
    <form method='POST' action='/cgi-bin/toggle_flag.sh'>
        <button type='submit'>切换变量</button>
    </form>
</body>
</html>

步骤3:运行

先启动C程序:

gcc -o c_file_reader c_file_reader.c
./c_file_reader

然后在浏览器访问树莓派的IP,点击按钮就能修改文件,C程序会自动读取更新变量。注意要让www-data用户能读写/tmp/boolean_flag.txt,可以先手动创建文件并设置权限:

echo "false" > /tmp/boolean_flag.txt
sudo chmod 666 /tmp/boolean_flag.txt

内容的提问来源于stack exchange,提问作者Bich Pham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:49:50