Вывести строки, отраженные программой C, и показать их на веб-сервере PHP - PullRequest
1 голос
/ 09 июня 2019

Я на Малине.У меня есть скомпилированная программа C, которая возвращает несколько строк со значениями: т.е.

printf("Input BP : CF \n");

У меня есть веб-сервер с php, который выполняет C-программу по определенному URL, и я хочу показать строки, возвращаемыеС программой.Мне удалось что-то на Windows, но на Rspi он не работает

вот источник PHP:

        else if ($cmd=='temp2')     {
            echo exec("sudo ./spa5");                                       
        }
        else if ($cmd=='err')       {
             exec("sudo ./spa5",$last_line,$retval);                                        /           //  $last_line = system("./spa5 2>&1", $retval);
            //$last_line = system("./spa5 ", $retval);
        //  print_r ($last_line)."</BR> ";
        //  echo ($retval)."</BR> ";
            while( list(,$row) = each($last_line) ) {
              echo $row. "<br />";
        } 

Что-то не так, но где?Я тестировал на WebServer Apache & NGINX

1 Ответ

0 голосов
/ 24 июля 2019

У меня были похожие проблемы с получением C-программы, которая управляет RF-передатчиком на моем Raspberry, работающей с php exec (я использую nginx).
Я использовал C-программу, основанную на следующем учебник по малиновым беспроводным розеткам Возможно, была проблема с аутентификацией, но я мог ее решить, только выполнив следующие шаги.Без Python я мог бы выполнить php, но не получил ни результата, ни ошибки.
Я сделал небольшой обход и использовал скрипт Python для запуска C-программы, и теперь он работает:
Скрипт Python принадлежит пользователю(кто входит в группу sudo): пользователи, права доступа 744

#!/usr/bin/python3.5
import subprocess
import sys
from subprocess import call
if len(sys.argv) != 2:
    print('invalid numbers of arguments. Script will be terminated.')
else:
    print('used argument:', sys.argv[1])
    subprocess.call(["/path/to/myC_Program", sys.argv[1]]);        

Для тестирования скрипта Python вы можете использовать вместо subprocess.call

# subprocess.check_call(["/path/to/myC_Program 1"]);  this returns "no such file"     
# subprocess.check_call(["/path/to/myC_Program", "1"]);this returns the echo of the C-program"`

с
sudo visudo
Я добавил
www-data ALL=(ALL) NOPASSWD: /path/to/myC_Program, NOPASSWD: /path/to/mypythonscript.py

Мой php-файл "light_via_browser.php" (принадлежит root, права доступа 644) вызывает Python-скрипт с аргументом "temp":

<!doctype html>
<html>
    <head>
    <meta name="viewport" content="width=device-width, initial-scale=2, maximum-scale=6.0, minimum-scale=2">
        <title>Light Control</title>
    </head>
    <script>
    </script>
    <style>
    div[type="normal"] {
        clear: left;
        width: 32vw;
        height: 1vw;
        background-color:transparent;
    }
    div[type="inp_left1"] {
        height:11vw;
        width: 11vw; 
        padding: 0vw;
        float:left;
        margin-left: 4vw;
        display:inline;
        border: 1px solid silver;
        background-color:grey;
    }
    div[type="inp_left2"] {
        height:11vw;
        width: 11vw; 
        padding: 0vw;
        float:left;
        margin-left: 1vw;
        display:inline;
        border: 1px solid silver;
        background-color:grey;
    }
    input[type="submit"] {
        width: 6vw;
        font-size: 4vw; 
        margin-left: 2.5vw;
        margin-top: 2vw;
        padding: 1vw 1vw; 
        font-family: Roboto, sans-serif;
        font-weight: 400;
        color: teal;
        border: 1px solid silver;
        background-image: linear-gradient(to top, gainsboro 0%, white 90%);
        border-radius: 2vw;
    }
    </style>
    <body>
        <h3>Lighting Control:</h3>
        <form style='width: 48vw' method="get" action="light_via_browser.php" >
        <div type="inp_left1">
                    <input type="submit" value=1 name="one" >
        </div>
        <div type="inp_left2">
            <input type="submit" value=2 name="two">
        </div>
        <div type="inp_left2">
            <input type="submit" value=3 name="three">
        </div>
        <div type='normal' style='position: relative'>
        </div>
        <div type="inp_left1">
            <input type="submit" value=4 name="four">
        </div>
        <div type="inp_left2">
            <input type="submit" value=5 name="five">
        </div>
        <div type="inp_left2">
            <input type="submit" value=6 name="six">
        </div>
        <div type='normal' style='position: relative'>
        </div>
        <div type="inp_left1">
            <input type="submit" value=7 name="seven">
        </div>
        <div type="inp_left2">
            <input type="submit" value=8 name="eight">
        </div>
        <div type="inp_left2">
            <input type="submit" value=9 name="nine">
        </div>
        <div type='normal' style='position: relative'>
        </div>

        </form>
        <?php
        if(isset($_GET['one'])){
            $temp = (string)$_GET['one']; 
        }else if(isset($_GET['two'])){
            $temp = (string)$_GET['two']; 
        }else if(isset($_GET['three'])){
            $temp = (string)$_GET['three']; 
        }else if(isset($_GET['four'])){
            $temp = (string)$_GET['four']; 
            }else if(isset($_GET['five'])){
            $temp = (string)$_GET['five']; 
        }else if(isset($_GET['six'])){
            $temp = (string)$_GET['six']; 
        }else if(isset($_GET['seven'])){
            $temp = (string)$_GET['seven']; 
        }else if(isset($_GET['eight'])){
            $temp = (string)$_GET['eight']; 
        }else if(isset($_GET['nine'])){
            $temp = (string)$_GET['nine']; 
        }

        switch ($temp) {
            case 9:
                $gpio_cmd = "whoami";
                break;
            default;
                    $gpio_cmd = "sudo python3.5 /path/to/mypythonscript.py $temp";
        }
        exec($gpio_cmd,$output,$status);
        if (0 === $status) {
            $result = sizeof($output);
            switch ($temp) {
                    case 9:
                    $msg =  "just a test:"; 
                    echo "<a>$msg</a><br>";
                    echo "current user is <br>'$output[0]'<br>";
                        break;
                default;
                    switch ($output[0]) {
                        case 3092898:
                            $lamp = "entree";
                            break;
                        case 3092900:
                            $lamp = "shop";
                            break;
                        case 3092904:
                            $lamp = "rear";
                            break;
                        case 8344209:
                            $lamp = "garden";
                            break;
                        case 5084072:
                            $lamp = "Num";
                            break;
                        case 15631240:
                            $lamp = "NA";
                            break;
                        case 15631250:
                            $lamp = "rear";
                            break;
                        case 15631256:
                            $lamp = "shop";
                            break;
                        default;
                    }
                    $msg = "$output[0]: $lamp";
                    echo "$msg<br>";
            }
        } else {
            echo "Command failed with status: $status";
        }
        ?>
    </body>
</html>    

$ result возвращает длину массива $ output.Можно манипулировать / отображать все элементы в этом массиве.

Ниже скриншота браузера, показывающего кнопки и две переменные в качестве возвращаемого результата после нажатия кнопки:
browser with buttons and returned message

Вы можете попробовать, мне интересно, такой подходрешил и вашу проблему.Приветствия.

...