[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