1
내 사용 사례는 다음과 같습니다XMLRPC 오류 문자열을 사용하여
- 클라이언트는 XMLRPC 그것으로 호출되는 함수가
여기에 재현으로 코드는 다음과 같은 오류 제공 :
Traceback (most recent call last):
File "rpcclient.py", line 37, in <module>
s.on(pinaddr)
File "/usr/lib/python3.5/xmlrpc/client.py", line 1092, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python3.5/xmlrpc/client.py", line 1432, in __request
verbose=self.__verbose
File "/usr/lib/python3.5/xmlrpc/client.py", line 1134, in request
return self.single_request(host, handler, request_body, verbose)
File "/usr/lib/python3.5/xmlrpc/client.py", line 1150, in single_request
return self.parse_response(resp)
File "/usr/lib/python3.5/xmlrpc/client.py", line 1322, in parse_response
return u.close()
File "/usr/lib/python3.5/xmlrpc/client.py", line 655, in close
raise Fault(**self._stack[0])
xmlrpc.client.Fault: <Fault 1: "<class 'SystemError'>:<built-in function setup> returned NULL without setting an error">
내 테스트를하고 시도 :
서버 아래 코드에서- : 인쇄 (유형 (pin_address가)) 그래서이 괜찮 클래스 'STR'을 반환합니다.
- 나는 기능 하드 코딩 서버 측 호출하는 경우 : 그것은 : GPIO.setup ("P8_45", GPIO.OUT를) 그것이 내가 인쇄 (s.on ("P8_45을")) 사용하는 경우 벌금뿐만 아니라
- 입니다 승인. codeaddress = "p8_45"클라이언트 측에 강제로 지정하면 코드
- 에 주석으로 남겨 둡니다. 실패합니다. CLI를 선
그것은 코드에서 주석 남아있다
python3 rpcclient.py -s 192.168.1.2 on -p p8_45
클라이언트 코드
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import xmlrpc.client
import argparse
import time
RPC_PORT = 1234
RPC_HOSTNAME = "####"
parser = argparse.ArgumentParser()
parser.add_argument("-s", "--server", help="Specify ACME Hostname")
parser.add_argument("-p", "--pinaddress", help="Specify which pin to use")
parser.add_argument("command", help="ACME Command, use 'help' to get all commands")
parser.add_argument("args", nargs='?', help="ACME Command Arguments")
args = parser.parse_args()
if args.server:
serveraddr = "%s:%d" % (args.server, RPC_PORT)
else:
serveraddr = "%s:%d" % (RPC_HOSTNAME, RPC_PORT)
s = xmlrpc.client.ServerProxy("http://%s/ci" % serveraddr)
if args.pinaddress:
pinaddr = "%s" % (args.pinaddress)
# pinaddr = "p8_45"
print ("using pinaddr = ", pinaddr)
if args.command == "version":
print(s.version())
if args.command == "on":
print(s.on(pinaddr))
# print(s.on("P8_45")) this will be accepted
if args.command == "off":
print(s.off(pinaddr))
서버 코드
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
Python RPC Daemon
'''
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler
import subprocess
import Adafruit_BBIO.GPIO as GPIO
VERSION = "123"
def run_cmd(cmd, arg=""):
try:
return subprocess.Popen([cmd, arg], \
stdout=subprocess.PIPE, \
stderr=subprocess.PIPE).communicate()
except:
return False, False
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/ci',)
# Create server
server = SimpleXMLRPCServer(("0.0.0.0", 1234),
requestHandler=RequestHandler)
server.register_introspection_functions()
# Info function, get ACME info string
def version():
return VERSION
server.register_function(version)
def on(pin_address):
print(type(pin_address))
GPIO.setup((pin_address) , GPIO.OUT)
return ("on for ", (pin_address))
server.register_function(on)
def off(pin_address):
GPIO.setup(pin_address,GPIO.IN)
return ("off for ", pin_address)
server.register_function(off)
# Run the server's main loop
server.serve_forever()