2017-12-22 1 views
1

My Anwendungsfall verwendet, ist:XMLRPC Fehler von einem Client, wenn eine Zeichenfolge

  • ein Client sendet Daten über xmlrpc
  • den XMLRPC-Server diese Daten abruft, um die Funktion mit ihm aufgerufen wird als Parameter

Der Code wie hier gibt den folgenden Fehler reproduziert:

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"> 

meine Tests und versucht:

  1. vom Servercode unter: print (Typ (pin_address)) ist dies Klasse 'str' kehrt so gut.
  2. wenn ich die Funktion hart codierten Server-Seite aufrufen: GPIO.setup ("P8_45", GPIO.OUT) es ist in Ordnung als auch
  3. , wenn ich Druck verwenden (s.on ("P8_45")): es ist OK. Es ist im Code
  4. kommentiert, wenn ich pinaddr = "p8_45" Client-Seite erzwinge, schlägt es fehl. Es ist links im Code

Die CLI Linie kommentiert:

python3 rpcclient.py -s 192.168.1.2 on -p p8_45 

der Client-Code

#!/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)) 

der Servercode

#!/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() 

Antwort

0

Eigentlich kam das von einem Leerzeichen, das von der Serverseite nicht richtig geparst wurde.

Verwandte Themen