Jumping Jack Flash weblog

Trasformare un cellulare in antifurto satellitare per auto

Posted in GPS, Java, Javaphone API, jython by jumpjack on 14 novembre 2007

–> SEE ENGLISH VERSION 

Questo script freeware in Jython trasforma un qualunque telefono che supporti le Javaphone API e il blluetooth in un economico (meno di 200 euro) antifurto satellitare per auto: infatti, una volta installato lo script sul telefono, non appena il telefono riceve una chiamata invia a un numero predefinito un SMS contenente le coordinate in cui il telefono stesso si trova, leggendole da un ricevitore GPS esterno.

Il programma è stato testato solo su Motorola a1000, ma dovrebbe funzionare anche su Nokia 9200/9210/9300/9500 e su qualunque telefono supporti PersonalJava, Bluetooth e Javaphone API (purtroppo solo pochi supportano le Javaphone API). 

Cosa vi serve:

Un PDA/telefono che supporti PersonalJava o Personal Profile, le Javaphone API e, il bluetooth (probabilmente va bene qualunque sistema operativo, trattandosi di java)

Una versione di Jython compatibile col telefono (per esempio questa, testata su UIQ 2.1)

JavaBT: Librerie bluetooth per PersonalJava; (JavaBT homepage)

Lo script “LC GPS car tracker“;

Un file di testo contenente il numero a cui inviare l’SMS; il file deve chiamarsi  cellphone.txt;

Un file di testo contenente l’indirizzo del ricevitore GPS, memorizzato come sequenza di 6 numeri esadecimali (ad esempio  000a3a2310c2; è possibile scoprire l’indirizzo del proprio GPS utilizzando un qualunqe programma di gestione bluetooth installato sul PC). Il file si deve chiamare address.txt;

Una volta che vi siete procurati tutto questo, potete procedere con l’installazione: 

Once you have all of above:

– Installate Jython sul telefono (per esempio in D:\jython);

– Decomprimete JavaBT.zip sul PC, e copiate la cartella “se” nella cartella D:\Jython sul cellulare; copiate javabt.dll in c:\system\libs sul cellulare;

– Copiate lo script Jython in d:\jython sul cellulare;

– Copiate i suddett file di testo nella cartella  c:\documents\Media Files\document\LC_GPS_Tracker sul cellulare;

– Avviate Jython sul telefono, dopodichè usatelo per lanciare lo script, e attendete il prompt “READY”;

– Accendete il ricevitore GPS e tenetelo in prossimità del cellulare;

– Attivate il bluetooth sul cellulare;

– Ora provate a chiamare il telefono: non appena riceverà la chiamata, comincerà a mostrare una serie di messaggi sullo schermo. Se tutto va come previsto, dopo un po’ dovreste ricevere sul numero prefissato il messaggio con le coordinate.

NOTA: se il GPS aveva “fatto il fix”, il messaggio terminera con “1,xx”, con xx=numero di satelliti, altrimenti terminerà con “0,00”.

Problemi noti:

Al momento il programma non può funzionare sui SonyEricsson P800/p900/p910, perche’ nessuno di essi supporta le Javaphone API. Se vi interessa una versione per questi telefoni potrei provare a scriverla, ma solo su esplicita richiesta e compatibilmente con tempi e fattibilità…: non dimenticate che è sempre un programma freeware! 😉

– La coppia telefono-ricevitore dovrà essere installata in auto e mantenuta sempre sotto carica, per ovvi motivi; per motivi altrettanto ovvi, entrambi dovranno trovarsi in un luogo nascosto, ma al tempo stesso essere in grado di ricevere segnali GSM e GPS

Car anti-theft with Javaphone PDA

Posted in GPS, Java, Javaphone API, jython, Motorola a1000, Symbian, Symbian UIQ by jumpjack on 9 novembre 2007

—>VEDI VERSIONE ITALIANA 

This Jython script turns any Javaphone API supporting PDA into a car-antitheft: once you install this script on the phone, as soon as you call the phone it will send to a predefined number an SMS containing latitude and longitude read from an external GPS bluetooth receiver.

Successfully tested on Motorola a1000; should work on Nokia 9200/9210/9300/9500 (please leave a comment to confirm if you successfully use this program on other phones than a1000) 

What you need:

A PDA/phone with support for PersonalJava/Personal Profile and Javaphone API  (regardless of O.S.);

A Jython version compatible with the phone (try this port for PersonalJava, tested on Motorola A1000);

JavaBT: PersonalJava bluetooth libraries; (JavaBT homepage)

The LC GPS car tracker jython script;

A text file containing the number to send the SMS to; it must be named cellphone.txt;

A text file containing the bluetooth address of your GPS receiver, stored as a sequence of 6 hexadecimal numbers
(for example 000a3a2310c2; you can get your GPS’ address from any bluetooth program installed on your PC). File must be named address.txt;

Once you have all of above:

– Install Jython on your phone (let’s suppose you install it into D:\jython);

– Unpack JavaBT zip package on your PC; copy whole “se” folder into d:\jython folder onto the phone;  copy javabt.dll into
c:\system\libs folder on your phone;

– Copy the jython script into d:\jython folder on the phone

– Copy the above described text files in c:\documents\Media Files\document\LC_GPS_Tracker onto the phone;

– Launch Jython on the phone, and once it’s started use the menu to start the jython script. Wait for “READY.” prompt to appear;

– Turn on your GPS receiver, and keep it within phone bluetooth range;

– Now call your phone: as soon as it receives the call, it will start displaying some debug data on the screen. If all works properly, in a few seconds you should receive the SMS on the predefined number. NOTE: if the GPS got the fix, you’ll see in the message “1,xx” at the end of SMS, with xx=number of satellites; else you’ll see “0,00”.

KNOWN ISSUES:

This program CAN’T work on SonyEricsson P800/p900/p910, as they do not support Javaphone API. If you are interested on a version for these phones, I could try writing a Javaphone-indipendent version, but it would be quite tricky, so I’ll (try to) do it only upon request: don’t forget this program is FREEware!

Ricercare contatto in rubrica con Javaphone API

Posted in Java, Javaphone API, Motorola a1000, Symbian, Symbian UIQ by jumpjack on 26 febbraio 2007

cdb = javax.pim.addressbook.ContactDatabase()

db = cdb.openDatabase() # Apre database di default

dbnames = cdb.getDatabaseNames() # elenca db disponibili

scorre i vari items:

cis = ecd.items()

ci = cis.next()

Crea gruppo (=categoria su a1000):

g = javax.pim.addressbook.ContactGroup()

aggiunge card (precedentemente creata o trovata) al gruppo:

g.addContact(c)

imposta nome gruppo:

g.setFormattedName(“nome”)

Trova nominativo “tizio” in campo “N”:

nomi = ecd.items(“N”,”tizio”)

nomi.next().getName() # mostra nome/i trovato/i

Accedere alla porta COM dell’a1000 con le Javaphone API

Posted in Java, Javaphone API, Motorola a1000, Symbian, Symbian UIQ by jumpjack on 15 febbraio 2007

http://www.jugsardegna.org/vqwiki/jsp/Wiki?action=action_view_attachment&attachment=JavaComm_Macomer2006.pdf

http://www2.mokabyte.it/cms/article.run?articleId=IMR-4TE-FU8-AKB_7f000001_30480431_06a21703

http://www.mokabyte.it/2000/01/jca.htm

import javax.comm.CommPortIdentifier

cpi = javax.comm.CommPortIdentifier

portid = cpi.getPortIdentifier(“COM1”)

port = portid.open(“MiaApplicazione”,5000)  # Stringa arbitraria che dice al Sistema quale applicazione sta richiedendo l’uso della porta; massimo tempo di attesa per ottenere il possesso della porta.

port.setSerialPortParams(115200,port.DATABITS_8,port.STOPBITS_1,port.PARITY_NONE)  # parametri consentiti: da verificare

# parametri per GPS (forse…):
port.setSerialPortParams(4800, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

formato stringa NMEA (GPS):

$GPGGA,164922.982,3859.4108,N,00856.1785,E,1,04,3.4,127.9,M
$GPGGA,xxxx, lat, N, long, E, 1, NumSats, 3.4, altitudine ,M

Lettura dati:
inputbuf = port.getInputStream()
byte= inputbuf.read()

Elencare le porte disponibili sull’a1000 usando le Javaphone API

Posted in Java, Javaphone API, Motorola a1000, Symbian, Symbian UIQ by jumpjack on 15 febbraio 2007

>>> import javax.comm.CommPortIdentifier

>>> cpi = javax.comm.CommPortIdentifier

>>> ids = cpi.getPortIdentifiers()

>>> for i in range(0,22):

>>>    ids[i].getName()

risultato:

16 porte da “IPCCH::00” a “IPCCH::15”

5 porte “ACM1CH::00” a “ACM1CH:4”

porta “COM1”

porta “IRCOM1”

Rilevare una chiamata in Jython con le Javaphone API

Posted in Java, Javaphone API, jython, Motorola a1000, Symbian, Symbian UIQ by jumpjack on 13 febbraio 2007

Ho “esteso” lo script jython di un precedente post: adesso il programma è in grado di accrogersi di una chiamata in arrivo, di leggere il numero del chiamante, e di scegliere di conseguenza se accettare la chiamata o rifiutarla.

Purtroppo sull’a1000 non è possibile nè rispondere alla chiamata nè rifiutarla: in entrambi i casi, infatti, il programma funziona, cioè accetta o rifiuta la chiamata… ma l’applicazione Phone non se ne accorge, e resta ad aspettare all’infinito che l’utente risponda o riagganci… anche se la telefonata in realtà è già stata accettata o rifiutata dallo script Jython!

Un’alternativa sarebbe far inviare dallo scipt Jython una “simulazione di tasto premuto” all’applicazione Phone, in modo da “premere” il tasto “occupato” o “rispondi” nel dialog che appare all’arrivo di una chiamata. Ma bisogna vedere se è tecnicamente possibile.
import javax.telephony.events
import os
import java.lang
import com.symbian.javax.telephony.mobile
import com.symbian.javax.telephony
import com.symbian.epoc.etel
import java.lang.Integer
import java.lang.String
import javax.net.datagram
import com.symbian.javax.net.datagram
from java.awt import Frame,MenuBar,Menu,MenuItem,TextArea,FileDialog
from java.awt.event import ActionEvent

class test(java.awt.Frame, com.symbian.epoc.etel.EtelLineListener):
def __init__(self):
self.size=(208,276)
self.myOutput=java.awt.TextArea(“Hello UIQ from Jython!!!\n”)
self.add(“Center”,self.myOutput)
self.myMenuBar=java.awt.MenuBar()
self.myMenu=java.awt.Menu(“Menu”)
self.myReadFile=java.awt.MenuItem(“Start”,actionPerformed=self.doStart) # Avvio routine principale da menu
self.myMenuExit=java.awt.MenuItem(“Exit”,actionPerformed=self.doExit)
self.myMenuBar.add(self.myMenu)
self.myMenu.add(self.myReadFile)
self.myMenu.add(self.myMenuExit)
self.setMenuBar(self.myMenuBar)
self.setVisible(1)

def doStart(self,event):
p=com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
ts=p.getTerminals()
t=ts[0]
tads=t.getAddresses()
tad=tads[0]
m=com.symbian.javax.telephony.mobile.EpocGsmMobileTerminal(tad,p)
mads=m.getAddresses()
m=mads[0]
print “Numero SIM:”,m.getSubscriptionId()
IMSIFile=open(“c:\\system\\data\\e32user.bin”,’r’)
IMSI=IMSIFile.read()
print “Numero registrato: \n”,IMSI
if java.lang.Integer.toString(m.getSubscriptionId()) != IMSI:
print “BRUTTO LADRONE!!!\n”
jnd=javax.net.datagram
dns=jnd.DatagramNameService
addr=com.symbian.javax.net.datagram.SMSAddress(“xxxxx”)
ds=jnd.DatagramService
serv=ds.getService(addr)
mex=java.lang.String(“ti hanno fregato il cellulare!!!”).getBytes()
d=jnd.Datagram(mex,addr)
serv.send(d)

def doExit(self,event):
java.lang.System.exit(0)

def callActive(self,event): #callListener (mai rilevato???)
print “callActive (callListener)\n”

def callInvalid(self,event): #callListener (mai rilevato???)
print “callInvalid (callListener)”

def callEventTransmissionEnded(self,event): #callListener
print “eventocallEventTransmissionEnded: ( callListener)”, event

def statusChange(self, line, num): # etelline, status (da EtelLineListener)
print “*********STATUSCHANGE*********”
print “Stato attuale: “, num , “\n”
self.myOutput.appendText(“Current call status: ” + java.lang.Integer.toString(num)+ “\n”)

def incomingCall(self, line, call): # etelline, etelcall (da EtelLineListener)
print ” —– INCOMING CALL —–”
self.myOutput.appendText(“INCOMING ” + call.getCallerId() + “…\n”)
print “->incoming call ‘” + call.getCallerId()
# print “prima rispondo,…”
# call.answer() # applicazione Phone si blocca!!
# print “…poi riattacco!”
# call.hangup() # applicazione Phone si blocca!!

def connectionAlerting(self,event):
print “Chiamata in arrivo da numero ”
incomingCall=event.getCall()
conns=incomingCall.getConnections()
# print “Numero connessioni ALERTING: “,len(conns)
addr1=conns[0].getAddress()
addr2=conns[1].getAddress()
numero1=addr1.getName() # Probabilmente numero LOCALE.
numero2=addr2.getName()
# print “1: ” + numero1 + “\n”
self.myOutput.appendText(“Chiamata in arrivo da ” + numero2 + “…”)
print numero2 + “\n”
#da qui non si puo’ riagganciare: solo da metodo incomingCall().

“””
def connectionConnected(self,event):
print “connectionConnected”
def connectionCreated(self,event):
print “connectionCreated: “, event
def connectionDisconnected(self,event):
print “connectionDisconnected”
def connectionFailed(self,event):
print “connectionFailed”
def connectionInProgress(self,event):
print “connectionInProgress”
def connectionUnknown(self,event):
print “connectionUnknown”
“””

if __name__==”__main__”:
myApp=test()

peer=com.symbian.javax.telephony.EpocJtapiPeer()
p=peer.getProvider(“EpocGsmMobileProvider”)
terms=p.getTerminals()
term=terms[0]
addrs=p.getAddresses()
addr=addrs[0]
lines1 = p.getPhone().getVoiceLines()
line1 = lines1[0]
lines2 = p.getVoiceLines()
line2 = lines2[0]
#addr.addCallListener(test()) # aggancia Listener all’Address
term=com.symbian.javax.telephony.mobile.EpocGsmMobileTerminal(addr,p)
#term.addCallListener(test())
line1.addLineListener(test())

print “READY.”

“””
ETEL CALL
public static final int STATUS_UNKNOWN = 0;
public static final int STATUS_IDLE = 1;
public static final int STATUS_DIALLING = 2;
public static final int STATUS_RINGING = 3;
public static final int STATUS_ANSWERING = 4;
public static final int STATUS_CONNECTING = 5;
public static final int STATUS_CONNECTED = 6;
public static final int STATUS_HANGING_UP = 7;

CONNECTION
public static final int IDLE = 48;
public static final int INPROGRESS = 49;
public static final int ALERTING = 50;
public static final int CONNECTED = 51;
public static final int DISCONNECTED = 52;
public static final int FAILED = 53;
public static final int UNKNOWN = 54;

TERMINAL CONNECTION
public static final int IDLE = 64;
public static final int RINGING = 65;
public static final int PASSIVE = 66;
public static final int ACTIVE = 67;
public static final int DROPPED = 68;
public static final int UNKNOWN = 69;

TERMINAL CONNECTION EVENT
public static final int TERMINAL_CONNECTION_ACTIVE = 115;
public static final int TERMINAL_CONNECTION_CREATED = 116;
public static final int TERMINAL_CONNECTION_DROPPED = 117;
public static final int TERMINAL_CONNECTION_PASSIVE = 118;
public static final int TERMINAL_CONNECTION_RINGING = 119;
public static final int TERMINAL_CONNECTION_UNKNOWN = 120;

CALL
public static final int IDLE = 32;
public static final int ACTIVE = 33;
public static final int INVALID = 34;

CALL EVENT
public static final int CALL_ACTIVE = 101;
public static final int CALL_INVALID = 102;
public static final int CALL_EVENT_TRANSMISSION_ENDED = 103;

CONNECTION EVENT
public static final int CONNECTION_ALERTING = 104;
public static final int CONNECTION_CONNECTED = 105;
public static final int CONNECTION_CREATED = 106;
public static final int CONNECTION_DISCONNECTED = 107;
public static final int CONNECTION_FAILED = 108;
public static final int CONNECTION_IN_PROGRESS = 109;
public static final int CONNECTION_UNKNOWN = 110;

SINGLE CALL META EVENT
public static final int SINGLECALL_META_PROGRESS_STARTED = 210;
public static final int SINGLECALL_META_PROGRESS_ENDED = 211;
public static final int SINGLECALL_META_SNAPSHOT_STARTED = 212;
public static final int SINGLECALL_META_SNAPSHOT_ENDED = 213;

ADDRESS_EVENT_TRANSMISSION_ENDED = 100

“””

Rilevare una chiamata in Jython – vecchio post

Posted in Java, Javaphone API, jython, Motorola a1000, Symbian, Symbian UIQ by jumpjack on 9 febbraio 2007

Questo post si è evoluto in quest’altro più completo

Per intercettare una chiamata usando Jython e Javaphone API bisogna usare listener ed eventi di Java.

Quando una classe Java implementa un listener, ogni volta che si verifica un evento gestito da quel listener esso verrà “inoltrato” alla classe; questa lo potrà gestire se contiene un metodo che ha lo stesso nome dell’evento.

Una chiamata è gestita dal listener CallListener. L’arrivo di una chiamata causa un evento callActive(CallEvent event). Il metodo Event.getID() restituisce il tipo di evento: CALL_ACTIVE, CALL_INVALID, CALL_EVENT_TRANSMISSION_ENDED.

Partendo da questo sorgente di esempio:

class action(awt.event.ActionListener):
def actionPerformed(self,event):
java.lang.System.exit(0)

button = awt.Button(“Close Me!”) button.addActionListener(action())

che equivale a questo:

def exit(event):
java.lang.System.exit(0)

button = awt.Button(“Close Me!”, actionPerformed=exit)

si può provare a dedurre il codice Jython necessario a rilevare una chiamata in arrivo:

class gestisciChiamate(java.awt.Frame, javax.telephony.CallListener):
def callActive(self,event):
print “E’ arrivata una chiamata!”

Bisogna però “agganciare” le chiamate alla classe. Se aver definito la classe non è sufficiente, forse bisogna aggiungere un listener all’address del telefono:

“In order to register as a listener for events reported for all calls involving a specific Address, as soon as the Calls are created, an application may implement the CallListener interface and then register with the Address, via the Address.addCallListener method.”

Bisogna quindi “prendere” un Address dal Provider, e applicargli il metodo addListener; tutto questo dovrà essere fatto FUORI dalla classe, nell’inizializzazione del programma (o nel metodo __init__):

[…]
import com.symbian.javax.telephony
peer = com.symbian.javax.telephony.EpocJtapiPeer()
myprovider = peer.getProvider(“EpocGsmMobileProvider”)
terms = myprovider.getTerminals
term = terms[0]
term.addCallListener(gestisciChiamate())

Javaphone API e Motorola a1000 (Symbian UIQ)

Posted in Java, Javaphone API, jython, Motorola a1000, Symbian, Symbian UIQ by jumpjack on 1 febbraio 2007

Il motorola a1000 supporta il Personal Java, il predecessore del “Personal Profile” della piattaforma J2ME. Inoltre, nell’a1000 sono presenti le Javaphone API, librerie java che permettono di accedere a funzioni tipiche del cellulare come rubrica, agenda, SMS… Accedere alle javaphone API tramite Java è piuttosto complicato, essendo piuttosto complicato il java in sè. Ma fortunatamente ci viene in aiuto Python, un linguaggio di scripting, molto piu’ semplice e intuitivo del java, e che permette di “lanciare comandi” anche senza scrivere nessun programma, semplicemente usando una “console”. Il Python supportato dall’a1000 si chiama Jython, che sta per “Python su Java”: in pratica, voi scrivete in Python, e il vostro programma viene interpretato e tradotto in Java, in tempo reale. Questo rende possibili fare cose molto interessanti, come leggere l’IMEI del cellulare, l’IMSI (=numero della carta SIM), effettuare chiamate, inviare SMS. Qui di seguito riporterò man mano le mie scoperte riguardo l’uso delle Javaphone API tramite Jython. Naturalmente ogni commento/suggerimento è benvenuto. Per esempio: è possibile accedere alle “informazioni di cella” con le javaphone API? Da questo link è possibile scaricare JythonQ , il porting di Jython per UIQ: DOWNLOAD JythonQ

Thread di riferimento su Forum Nokia

Programmi di esempio in Jython

Linea di comando per jRun.txt per lanciare script python: -cp D:’jython’awtcons.jar;D:’jython -Dpython.home=d:’jython org.python.util.jython d:’jython’NOMEFILE.py

Leggere livello sel segnale:

>>> import com.symbian.javax.telephony.mobile
>>> mp = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> print mp.getSignalLevel

Effettuare una chiamata “di nascosto”, senza che sia possibile riagganciare!
>>> import com.symbian.javax.telephony.mobile
>>> p = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> ts = p.getTerminals()
>>> t = ts[0]
>>> tads = t.getAddresses()
>>> tad = tads[0]
>>> mc = p.createCall()
>>> call = mc.connect(t,tad,”numero”)

Leggere il “subscriber ID” (IMSI), ovvero il codice univoco associato dalla rete alla propria USIM:
>>> import com.symbian.javax.telephony.mobile
>>> p = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> ts = p.getTerminals()
>>> t = ts[0]
>>> tads = t.getAddresses()
>>> tad = tads[0]
>>> m = com.symbian.javax.telephony.mobile.EpocGsmMobileTerminal(tad,p)
>>> mads = m.getAddresses()
>>> m = mads[0]
>>> print m.getSubscriptionId()

Metodo breve per ottenere l’IMSI:
>>> import com.symbian.javax.telephony.mobile
>>> p = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> print com.symbian.javax.telephony.mobile.EpocMobileAddress(p).getSubscriptionId()

Leggere IMEI:
>>> import com.symbian.epoc.etel
>>> a = com.symbian.epoc.etel.Etel
>>> b= a.getPhone()
>>> print b.getPhoneId().serialNumber

Leggere lo stato della batteria in pecentuale. Purtroppo non funziona: restituisce sempre il valore di default 0x7fff.ffff , come se il cell fosse sempre in carica!
>>> import javax.power.monitor
>>> pm = javax.power.monitor
>>> pmi = pm.PowerMonitor.getInstance()
>>> print pmi.getBatteryLevel()
>>> print pmi.getEstimatedSecondsRemaining()
>>> print pmi.usingExternalPowerSource()

Mandare un SMS a un contatto della rubrica:
>>> import java.lang.String
>>> import javax.net.datagram
>>> jnd = javax.net.datagram
>>> dns = jnd.DatagramNameService
>>> addr = dns.lookupAll(nomedeltizio,”SMS”) (trova tutti i numeri a cui è possibile inviare un SMS, e li mette nell’array addr[] , i cui elementi saranno addr[0], addr[1] ecc…
>>> ds = jnd.DatagramService
>>> serv = ds.getService(addr[0])
>>> mex = java.lang.String(“questo è il messaggio”).getBytes()
>>> d = jnd.Datagram(mex,addr[0])
>>> serv.send(d)

Mandare un SMS a un numero qualunque:
>>> import java.lang.String
>>> import javax.net.datagram
>>> import com.symbian.javax.net.datagram Per poter creare un oggetto Address a partire da una stringa-numero.
>>> jnd = javax.net.datagram
>>> dns = jnd.DatagramNameService
>>> addr = com.symbian.javax.net.datagram.SMSAddress(“+393490000000”)
>>> ds = jnd.DatagramService
>>> serv = ds.getService(addr)
>>> mex = java.lang.String(“questo è il messaggio”).getBytes()
>>> d = jnd.Datagram(mex,addr)
>>> serv.send(d)

Come accedere ai metodi di EtelGsmPhone:
>>> import com.symbian.javax.telephony.mobile
>>> p = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> ph = p.getPhone()

Adesso “ph” è di tipo EtelGsmPhone. Si possono quindi usare metodi come:

– getDetectedNetworks() (restituisce array di EtelGsmNetworkInfo, che contiene .status, .code, .shortName, .longName ; sull’a1000 dà “none”: bisogna usare il metodo getAvailableNetowrks di EpocGsmMobileProvider, ma comunque i risultati non sono leggibili (???). Usando invece getCurrentNetwork() di EpocGsmMobileProvider è possibile conoscere la rete attualmente in uso.

getOwnNumbers() (restituisce array di stringhe; dà “-5” (=NOT SUPPORTED) sull’a1000 😦 )

getSubscriptionId() (=IMSI)

getPhoneId() (restituisce tipo EtelGsmPhoneId, che contiene .manufacturerId, .modelId, .revisionId, .serialNumber (=IMEI)

getVoiceLines() (restituisce array di EtelGsmLine

Chiamate telefoniche
Per gli esempi che seguono, premettere sempre queste istruzioni:

>>> import com.symbian.javax.telephony

>>> jtp = javax.telephony.JtapiPeerFactory.getJtapiPeer(“”)

>>> p = jtp.getProvider(“EpocGsmMobileProvider”)

– Effettuare una chiamata:

>>> lines = p.getPhone().getVoiceLines()

>>> call = lines[0].newCall()

>>> call.dial(“numero”)

>>> cal.hangup()          per riagganciare 

– Rispondere a una chiamata:

>>> calls = p.getCalls()

>>> call=calls[0]

>>> call.answer()

– Riagganciare (rifiutare?)

>>> call.hangup()

– Leggere il numero del chiamante

>>> print call.getCallerId()