使用SWIG / PHP控制Raspberry Pi上的应用程序(mjpg-streamer)

时间:2016-01-02 20:58:40

标签: php raspberry-pi swig lighttpd

我尝试通过覆盆子pi上的swig / c / php界面启动'mjpg-streamer'。以前,通过swig / c / php成功控制了两个应用程序:

  • 通过i2cset进行GPIO控制
  • 通过wiringPI进行GPIO控制

如果是'mjpg-streamer',我使用了以下代码:

    void stream(void) {
        system("export LD_LIBRARY_PATH=/usr/local/lib/");
        system("mjpg_streamer -o 'output_http.so -w /media/MINIUSB/dev/Control/www' -i 'input_raspicam.so -x 640 -y 480 -fps 15'");
    }

并像GPIO控件一样运行'make'

    swig -Wextra -php camera.i
    gcc -fpic -c `php-config --includes` camera.c camera_wrap.c
    gcc -shared camera_wrap.o camera.o -o camera.so
    cp camera.so `php-config --extension-dir`
    service lighttpd restart

最后我运行'chmod 4755 /usr/local/lib/input_raspicam.so'和'chmod 4755 /usr/local/lib/output_http.so',因为我这样做是为了启用'i2cset'等。

在这个例子中我不使用/dev/video[0..n],也许它应该是另一个设备。

系统在raspbian jessie,php-5.6.14,php5- [dev,cli,cgi],lighttpd,swig-2.0.12下运行。根据phpinfo(),模块已成功加载。

有谁知道出了什么问题?

2 个答案:

答案 0 :(得分:0)

我不认为对系统的两次调用不会像你那样连续运行。第一次调用的导出将仅影响针对system 的特定调用生成的的shell进程的环境。对系统的下一次调用将继承其父级的环境,该环境不会被更改。相反,您可能想要做的是:

system("LD_LIBRARY_PATH=/usr/local/lib/ mjpg_streamer -o 'output_http.so -w /media/MINIUSB/dev/Control/www' -i 'input_raspicam.so -x 640 -y 480 -fps 15'");

这将为调用mjpg_streamer的进程设置环境。或者更好的是使用putenv / setenv代替。

由于您正在使用PHP并且只是调用系统,因此您最好使用PHP shell_exec或类似的,因为您的C中没有任何PHP无法做到的事情(它只是调用bash对你来说,这是一种方式)

答案 1 :(得分:0)

构建应用程序时,可以使用gcc -Wl,-rpath,/usr/local/lib ...将rpath构建到.so中,而不是使用LD_LIBRARY_PATH。

正如@Flexo所指出的那样,设置环境变量的单独系统()不会影响后续调用system()的环境