2017-12-22 8 views
1

내 사용 사례는 다음과 같습니다XMLRPC 오류 문자열을 사용하여

  • 클라이언트는 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"> 
    

    내 테스트를하고 시도 :

    서버 아래 코드에서
    1. : 인쇄 (유형 (pin_address가)) 그래서이 괜찮 클래스 'STR'을 반환합니다.
    2. 나는 기능 하드 코딩 서버 측 호출하는 경우 : 그것은 : GPIO.setup ("P8_45", GPIO.OUT를) 그것이 내가 인쇄 (s.on ("P8_45을")) 사용하는 경우 벌금뿐만 아니라
    3. 입니다 승인. codeaddress = "p8_45"클라이언트 측에 강제로 지정하면 코드
    4. 에 주석으로 남겨 둡니다. 실패합니다. 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() 
    

    답변

    0

    사실 이것은 서버 측에서 제대로 구문 분석되지 않은 공백 문자에서 발생했습니다.