[python] XMLRPC a unicode

slush slush na slush.cz
Pátek Červen 12 02:39:29 CEST 2009


Pokud by to nekoho zajimalo, problem jsem (docasne nafurt) vyresil
timto zpusobem:

#!/usr/bin/python
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
import serial
import base64

device = '/dev/arduino'
baud = 57600
timeout = 1

server_listen = 'localhost'
server_port = 8000

class NetSerial(serial.Serial):
    # Original function returns bool sometimes...
    def inWaiting_int(self):
        return int(self.inWaiting())

    # Beware UTF-8 :-)
    def write_base64(self, s):
        self.write(base64.b64decode(s))

class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

server = SimpleXMLRPCServer((server_listen, server_port),
                            requestHandler=RequestHandler,
                            allow_none=True, encoding='ascii')

server.register_introspection_functions()
server.register_instance(NetSerial(device, baud, timeout=timeout))
server.serve_forever()

pyserial jsem tedy rozsiril o funkci write_base64, ktera uz tedy
nemusi resit UTF-8 ;-). Predpokladam, ze stejny hack bude fungovat i
na read, az to budu potrebovat. Reseni bohuzel neni transparentni a
trida nema s pyserial kompatibilni rozhrani, ale co se da delat. Kdyby
nekdo vedel, jak presvedcit XMLRPC s UTF, rad to upravim.

Ostatne v reseni bylo zapotrebi udelat jeste hack s inWaiting(). Moc
jsem to nestudoval, ale zda se, ze takhle to funguje...

Marek

2009/6/12 slush <slush na slush.cz>:
> Zdravim,
>
> potrebuji pristupovat k seriovemu portu pocitace A z pocittace B na
> lokalni siti. Napadlo me pouzit XML-RPC jako transparentni mezivrstvu
> k pyserial tak, ze se klientska aplikace (puvodne bezici na A, nyni
> nove na B) temer nemusi upravovat - pouze misto lokalni instance
> pyserial vytvorim klienta XMLRPC.
>
> Zda se, ze by to i mohlo fungovat, bohuzel na port potrebuji posilat
> binarni data. A zde jsem narazil na problem s kodovanim znaku u
> knihovny xmlrpclib. Pri snaze zapsat binarni data mi to vrati tento
> traceback:
>
>  File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
>    return codecs.utf_8_decode(input, errors, True)
> UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0:
> unexpected code byte
>
> Data skladam nasledujicim zpusobem:
>  data = chr(255)+'a'+chr(e.axis)+chr(mapped)
> kde e.axis i mapped jsou 1B cisla. Jedna se tedy o obycejne ASCII.
>
> S tim si bohuzel nevim rady, UTF jsem se v pythonu vzdy vyhybal, jako
> cert krizi. Nedokaze nekdo poradit, prosim?
>
>
> S pozdravem
> Marek
>


Další informace o konferenci Python