WebIOPiをRaspbian Busterで動かす

WebIOPiをRaspbian Busterで動かす

背景

知人がWebIOPiをRaspbian Busterで動かそうとして、Raspbian Stretch では動いたが、Raspbian Busterだと動かないと言っていたので、 興味本位でデバッグしてみた。

私はこれを使おうと思ってないので、「鳴かぬなら鳴かせてみせようホトトギス」なだけなので、詳しい使い方とかは調べてません。

参照

そもそものインストール手順は、
WebIOPi のインストール
開発が終了したWebIOPiを最新のRaspbianで動作させよう。
あたりを参考にしてちょ。

いきなり結論

で、まぁ結論から言うと、根本原因は、BusterのPython3がPython3.7にバージョンアップされたこと。
ちなみに、StretchのPython3はPython3.5 。

python/webiopi/utils/thread.py 内の 関数 runLoop()の中でasyncを変数に使っていたため、SyntaxErrorが発生していた模様。
Pythom3.7では(正確にはPython3.6から)asyncは予約語になっているため、エラーとなっていた。

で、変数名をasyncからそれ以外(例えばasync_Flag)に変更すれば良い。

で、patchファイル

修正内容のpatchファイルがこちら。
ついでにCプログラムのコンパイルの際に出るワーニングも消すようにちょこっと修正しときました。(こっちの修正は、かなりヤッツケ…)

diff -upr WebIOPi-0.7.1.old/python/native/cpuinfo.c WebIOPi-0.7.1/python/native/cpuinfo.c
--- WebIOPi-0.7.1.old/python/native/cpuinfo.c	2019-09-03 00:04:59.959369913 +0900
+++ WebIOPi-0.7.1/python/native/cpuinfo.c	2019-09-02 23:55:16.207501342 +0900
@@ -35,7 +35,8 @@ char *get_cpuinfo_revision(char *revisio
       return 0;
 
    while(!feof(fp)) {
-      fgets(buffer, sizeof(buffer) , fp);
+      char* aaa = fgets(buffer, sizeof(buffer) , fp);
+      aaa = aaa;
       sscanf(buffer, "Hardware	: %s", hardware);
       if (strcmp(hardware, "BCM2708") == 0)
          rpi_found = 1;
diff -upr WebIOPi-0.7.1.old/python/native/gpio.c WebIOPi-0.7.1/python/native/gpio.c
--- WebIOPi-0.7.1.old/python/native/gpio.c	2019-09-03 00:04:59.969368480 +0900
+++ WebIOPi-0.7.1/python/native/gpio.c	2019-09-02 23:58:58.757767098 +0900
@@ -23,6 +23,7 @@ SOFTWARE.
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <string.h>
 #include <fcntl.h>
 #include <sys/mman.h>
diff -upr WebIOPi-0.7.1.old/python/webiopi/utils/thread.py WebIOPi-0.7.1/python/webiopi/utils/thread.py
--- WebIOPi-0.7.1.old/python/webiopi/utils/thread.py	2019-09-03 00:04:44.520586361 +0900
+++ WebIOPi-0.7.1/python/webiopi/utils/thread.py	2019-09-02 23:54:10.087479478 +0900
@@ -33,14 +33,14 @@ def stop(signum=0, frame=None):
             task.stop()
                 
 
-def runLoop(func=None, async=False):
+def runLoop(func=None, async_Flag=False):
     global RUNNING
     RUNNING = True
     signal.signal(signal.SIGINT, stop)
     signal.signal(signal.SIGTERM, stop)
 
     if func != None:
-        if async:
+        if async_Flag:
             TASKS.append(Task(func, True))
         else:
             while RUNNING:

これをwebiopi-buster.patchとして保存し、以下のコマンドを実行する。

patch -p1 -i webiopi-buster.patch

で後はsettup.shを実行して、その後は参照ページの通り進めれば良い。

めでたしめでたし