RaspberryPiでRaspbianを使用しています。スーパーバイザーを使用してサービスとして実行されているLCDを制御するPythonスクリプト(LCD.py)があります。
Webページにメッセージを入力してLCDに表示させたいのですが。これは、LCD.pyスクリプトが読み取るいくつかの変数を変更する必要があることを意味すると思います。おそらく、モードを変更するためのフラグを変更してから、サーバーによって実行される別のPythonスクリプト(CGI.py)を使用してメッセージ自体を変更する必要があります。
これを行うための最良の方法は何ですか?それとも私は完全に異なることをするべきですか?ページの読み込みごとにスクリプトを実行することはできず、バックグラウンドで実行する必要があるため、通常のCGIタイプのものとは異なると思います(スクロール、フラッシュなど)
編集:これまでのところあなたの助けに感謝します、私は家に帰った今夜私のLCDデーモンコードを投稿します。
私はこれについてもう少し進んでいます。SimpleXMLRPCServerとスレッドを使用しようとしましたが、現在これは機能しません。スレッドは実際には同時に実行されないためだと思います。これは私がテストしていた私のサーバーコードです:
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
import threading
import time
globalMessage = "Hi, I havnt been changed!"
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
requestHandler=RequestHandler)
server.register_introspection_functions()
# Register an instance; all the methods of the instance are
# published as XML-RPC methods (in this case, just 'div').
class serverFunctions:
def setMessage(self, message):
global globalMessage
globalMessage = message
print(globalMessage)
class serverThread(threading.Thread):
def run(self):
server.register_instance(serverFunctions())
# Run the server's main loop
server.serve_forever()
print("test");
class lcdThread(threading.Thread):
def run(self):
global globalMessage
while(1):
oldMessage = globalMessage
if(oldMessage != globalMessage): print("Message has changed")
else: print ("Message has not changed")
print(globalMessage)
time.sleep(1)
serverThread().start()
#lcdThread().start()
と私のクライアントコード:
import xmlrpclib
s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.setMessage("hello world")
lcdThread()。start()行のコメントを外すと、lcd whileループでスタックし、サーバーが応答していないと思います。マルチプロセッシングは何か違いがありますか?exec()関数について詳しく教えてください。exec()を使用して別のスクリプトのグローバル変数を変更するにはどうすればよいですか?
編集:これがデーモンである私のLCD.pyコードです、設定しようとしているメッセージ変数imは約半分下にあります。
#!/usr/bin/python
from Adafruit_CharLCD import Adafruit_CharLCD
from subprocess import *
from time import sleep, strftime
from datetime import datetime
from datetime import timedelta
from os import system
from os import getloadavg
from glob import glob
import RPi.GPIO as GPIO
#Variables
lcd = Adafruit_CharLCD() #Stores LCD object
cmdIP = "ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1" #Current IP
cmdHD = "df -h /dev/sda1 | awk '{print $5}'" # Available hd space
cmdSD = "df -h / | awk '{print $5}'" # Available sd space
cmdRam = "free -h"
temp = 0
#Run shell command
def run_cmd(cmd):
p = Popen(cmd, shell=True, stdout=PIPE)
output = p.communicate()[0]
return output
#Initalises temp device
def initialise_temp():
#Initialise
system("sudo modprobe w1-gpio")
system("sudo modprobe w1-therm")
#Find device
devicedir = glob("/sys/bus/w1/devices/28-*")
device = devicedir[0]+"/w1_slave"
return device
#Gets temp
def get_temp(device):
f = open (device, 'r')
sensor = f.readlines()
f.close()
#parse results from the file
crc=sensor[0].split()[-1]
temp=float(sensor[1].split()[-1].strip('t='))
temp_C=(temp/1000.000)
temp_F = ( temp_C * 9.0 / 5.0 ) + 32
#output
return temp_C
#Gets time
def get_time():
return datetime.now().strftime('%b %d %H:%M:%S\n')
#Gets uptime
def get_uptime():
with open('/proc/uptime', 'r') as f:
seconds = float(f.readline().split()[0])
array = str(timedelta(seconds = seconds)).split('.')
string = array[0]
return string
#Gets average load
def get_load():
array = getloadavg()
average = 0
for i in array:
average += i
average = average / 3
average = average * 100
average = "%.f" % average
return str(average + "%")
#def get_ram():
def get_ram():
ram = run_cmd(cmdRam)
strippedRam = ram.replace("\n"," ");
splitRam = strippedRam.split(' ')
totalRam = int(splitRam[52].rstrip("M"))
usedRam = int(splitRam[59].rstrip("M"))
percentage = "%.f" % ((float(usedRam) / float(totalRam)) * 100)
return percentage + "%"
#Gets the SD usage
def get_sd():
sd = run_cmd(cmdSD)
strippedSD = sd.lstrip("Use%\n")
return strippedSD
#Gets the HD usage
def get_hd():
hd = run_cmd(cmdHD)
strippedHD = hd.lstrip("Use%\n")
return strippedHD
#This is the variable im trying to set
#def get_message():
# message = "hello"
# return message
def scroll():
while(1):
lcd.scrollDisplayLeft()
sleep(0.5)
#Message and IP - PERFECT
def screen1():
ipaddr = run_cmd(cmdIP)
lcd.message('Raspberry Pi\n')
lcd.message('IP: %s' % (ipaddr))
#Uptime - tick
def screen2():
uptime = get_uptime()
lcd.message('Total Uptime\n')
lcd.message('%s' % (uptime))
#Ram and load - PERFECT
def screen3():
ram = get_ram()
lcd.message('Ram Used: %s\n' % (ram))
load = get_load()
lcd.message('Avg Load: %s' % (load))
#Temp and time - tick time
def screen4():
time = get_time();
lcd.message('Temp %s\n' % (temp))
lcd.message('%s' % (time))
#HD and SD usage - PERFECT
def screen5():
sd = get_sd()
lcd.message('SD Used: %s\n' % (sd))
hd = get_hd()
lcd.message('HD Used: %s' % (hd))
#Web message
#def screen6():
# message = get_message()
# lcd.message(message)
#Pause and clear
def screenPause(time):
sleep(time)
#In here to reduce lag
global temp
temp = str(get_temp(device));
lcd.clear()
###########################################################################################################
try:
#Initialise
lcd.begin(16,2)
device = initialise_temp()
lcd.clear()
#Main loop
while(1):
screen1()
screenPause(5)
screen2()
screenPause(5)
screen3()
screenPause(5)
screen5()
screenPause(5)
screen4()
screenPause(5)
except KeyboardInterrupt:
GPIO.cleanup()
ありがとうジョー