#!/usr/bin/env python #--------------------------------------------------------------- # stream.py # socket IO wrapper, supporting BT e TCP, on linux and Symbian S60 # (C) 2006-2007 M.Andreoli #------------------------------------------------------------------ # stream.py encapsulate a simple file send/receive protol and can # be used as stdin and stdout stream in python programming #----------------------------------------------------------------- """ USAGE The server: s=Stream('BT') s.accept(service="XYZ") s.write(' ... data ....') s.sendfile('/tmp/x11.jpg') ok=s.read() if ok=='END': end_server() s.close(); s.shutdown() The client: s.Stream('BT') s.connect(service="XYZ") data=s.read() s.recfile('/tmp/x11.jpg') s.write('END') sleep_some_time() s.close() Variants: s.accept(port=13) s.connect(host='...', port=13) """ import sys,os import socket import time import string import traceback stack='symbian' try: import bluetooth stack='bluez' except: stack='symbian' # count how many chunks we can have spliting a # file in blocksize (with rest) def chunkcount(filename,blocksize): size=os.path.getsize(filename) blocks=size/blocksize rest=size % blocksize if rest!=0: blocks+=1 return blocks # internal function def trace(msg=''): error_type, error, traceback = sys.exc_info() if error==None: error="" sys.stderr.write("STREAM-TRACE: %s: %s\n" % (msg, error) ) raise Exception,"TRACE: %s" % msg #----------------- # the main class #------------------ # create objects of type stream, and work using both # transports: bluetooth and TCP/IP class Stream: def __init__(self,verbose=0,mode='BT'): self.MAX_BUFFER=5120 self.client=None self.server=None self.peer=('None',0) self.verbose=verbose self.log=lambda x: sys.stderr.write(x+"\n") self.mode=mode self.host='' self.port=None def debug(self,msg): if self.verbose: sys.stderr.write("STREAM: "+msg+"\n") #------------------- # low level IO #------------------- def close(self): if self.client == None: return try: self.client.close() self.client=None self.debug("%s closed connection" % repr(self.peer)) self.peer=('None',0) except: self.debug("problem closing connection") def shutdown(self): self.close() if self.server!=None: self.server.close() def read_(self,n=1): return self.client.recv(n) def write_(self,str): try: return self.client.sendall(str) except: n=len(str) sent=0 while sent128 # Es: # char(2) 'ab' # char(130) '28' 'asdfakdfkaf 28 characters .....' def readline(self): return self.read() def raw_input(self,prompt=None): if prompt: self.write(prompt) return self.readline() def write(self,data=''): n=len(data) if n==0: return 0 #sys.stderr.write("write(): [%s]\n" % data) if n<=128: self.write_(chr(n)) return self.write_(data) else: nn=str(n); l=len(nn) self.write_(chr(128+l)) self.write_(nn) sentbytes=0 while sentbytes=0: sock = socket.socket(socket.AF_BT,socket.SOCK_STREAM) else: # we support only bluez clients sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) elif self.mode=='TCP': sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) else: raise Exception, "mode=None in create_socket()" return sock # only return the first target (host,port) # NB: is service=None,the output is architetture-depending def find_service(self,service=None): if self.mode!='BT': trace("find_service(): only BT") if sys.platform.find("symbian")>=0: print "please, look to the phone device ..." #output: ('host',{u'service':port}) host,services = socket.bt_discover() print "Discovered: %s, %s"%(host, services) if service==None: return (host,services) # search the specific service name # and return port=0 if not found port=services.get(service,0) return (host,port) else: # we assume Bluez print "bluez devices discovering ..." try: if service!=None: device = bluetooth.find_service(name=service)[0] host=device["host"] port=device["port"] return (host,port) else: device = bluetooth.find_service() return device except: raise Exception,"bluez bluetooth unavailable" # connect(): you can specify or the service= or # the host/port pair def connect(self,service=None,host=None,port=None): self.host=host self.port=port # discovery? if service!=None: self.host,self.port=self.find_service(service) if self.host==None or self.port==None or self.port==0: trace("connect(): no host or no port") self.client = self.create_socket() if self.client == None: self.log("impossible to create the socket") raise Exception,"create_socket() failed!" target=(self.host,int(self.port)) self.log("Connecting to %s, via %s port %s" %(self.host,self.mode,self.port)) self.client.connect(target) sys.stdout.flush() self.log( "Connected." ) return True #-------------------------- # MAIN #-------------------------- # simple TCP python console if __name__ == '__main__': print "ciao"