![]()
qualcuno mi potrebbe consigliare come fare x aggiungere al mio programma il modo per inviare e ricevere sms senza passare per internet?
tipo collegare il cellulare al pc e fare tutto da li?
![]()
qualcuno mi potrebbe consigliare come fare x aggiungere al mio programma il modo per inviare e ricevere sms senza passare per internet?
tipo collegare il cellulare al pc e fare tutto da li?
ciao,
collega il cellulare con il cavetto o con il bluetooth, apri la com relativa e li passi i comandi AT.
oppure esistono dei componenti già pronti che svolgono la comunicazione con il modem.
se vuoi un qualcosa già pronto e free ti passo una libreria qui (la mia!!!).
se vuoi una cosa a pagamento allora basta che cerchi su google oppure guardi tra i link pubblicitari di html.it (mi pare di aver visto qualcosa).
ciao,
anzitutto grazie x la risp.
ma è davvero la tua? cioè lai fatta tu ?![]()
mi spiegheresti questo passaggio ?![]()
codice:#region sms non letti private void button2_Click(object sender, EventArgs e) { this.listBox2.Items.Clear(); System.Threading.Thread t = new System.Threading.Thread(RunThread_button2); t.Start(); } void RunThread_button2() { this.switchBoard.Enqueue ( SwitchBoard.GetCommandReadSMS ( SwitchBoard.SMSFolder.Unread, new ATC_SMS.SMSReceivedEventHandler(Logicall_NotReadSMS_Received) ), this.portInUse ); } void NotReadSMS_Received(object sender, SMS result) { this.listBox2.Items.Add("Numero destinatario : " + result.PhoneNumber); this.listBox2.Items.Add("Testo : " + result.Message); this.listBox2.Items.Add("-------------------"); } void Logicall_NotReadSMS_Received(object sender, SMS result) { if (this.InvokeRequired) { ATC_SMS.SMSReceivedEventHandler d = new ATC_SMS.SMSReceivedEventHandler(NotReadSMS_Received); this.Invoke(d, sender, result); } else { NotReadSMS_Received(sender, result); } } #endregion
si "lo" () fatta io.
ho modificato un po il codice per commentare meglio i passaggi:
EDIT: nella demo ho scritto numero destinatario ma chiaramente era mittentecodice:#region sms non letti private void button2_Click(object sender, EventArgs e) { this.listBox2.Items.Clear(); System.Threading.Thread t = new System.Threading.Thread(RunThread_button2);//creo un nuovo thread t.Start();//avvio il thread } void RunThread_button2() { SwitchBoard.SMSFolder cartella = SwitchBoard.SMSFolder.Unread;//indico che mi servono sms non letti ATC_SMS.SMSReceivedEventHandler metodoRicevente = new ATC_SMS.SMSReceivedEventHandler(Logicall_NotReadSMS_Received);//passo il nome del metodo che riceverà la risposta con gli sms ATC_SMS comandoSMS = SwitchBoard.GetCommandReadSMS(cartella, metodoRicevente);//con questo creo un comando già configurato da inviare a switchBoard this.switchBoard.Enqueue(comandoSMS, this.portInUse);//accodo il comando a switchBoard che provvederà a elaborare il tutto attraverso la porta com collegata al modem (il nome devi settarlo in portInUse "com1" o "com2" o dove si trova il modem). } void NotReadSMS_Received(object sender, SMS result) { this.listBox2.Items.Add("Numero mittente : " + result.PhoneNumber); this.listBox2.Items.Add("Testo : " + result.Message); this.listBox2.Items.Add("-------------------"); } void Logicall_NotReadSMS_Received(object sender, SMS result) { if (this.InvokeRequired)//questo è necessario per modificare un elemento del form da un thread diverso { ATC_SMS.SMSReceivedEventHandler d = new ATC_SMS.SMSReceivedEventHandler(NotReadSMS_Received); this.Invoke(d, sender, result);//chiamo il metodo che mi elabora il risultato scrivendo nella listbox gli sms attraverso un delegato } else { NotReadSMS_Received(sender, result);//chiamo il metodo che mi elabora il risultato scrivendo nella listbox gli sms } } #endregion![]()
funziona![]()
non trovavo più il post perché e diverso il titolo ce (tramite dispositivo GSM o simile) di piu
ce un modo per sapere la porta COM senza provarle tutte la mia era COM17 partito da 1?![]()
ma cio un'altra domanda io voglio fare un programma che così tutti gli utente di una lan possono mandare sms che pero non voglio mettere un telefonino in ogni computer
Sarebbe bello che possono anche avere un tipo popup che si apre quando arriva un sms destinato a lui con il testo e il mittente
Si puo fare cosi?
Non ti chiedo codice ma come fare come lo creo un mecenismo cosi?
Altra possibilità, che non richiede nemmeno un telefonino collegato, è utilizzare i web service.
facilissimi da usare e a buon mercato. Io per esempio utilizzo SmsHosting, cerca su google, se ti interessa questa opzione ti posto tutto il codice necessario.
Unico inconveniente, puoi solo inviare
Ma l'URL che hai indicato non porta da nessuna parte...Originariamente inviato da U235
se vuoi un qualcosa già pronto e free ti passo una libreria qui (la mia!!!).![]()
A questo punto sarei curioso di sapere dove kamkamg ha scaricato la tua libreria.![]()
![]()
Originariamente inviato da kamkamg
funziona![]()
non trovavo più il post perché e diverso il titolo ce (tramite dispositivo GSM o simile) di piu
ce un modo per sapere la porta COM senza provarle tutte la mia era COM17 partito da 1?![]()
ma cio un'altra domanda io voglio fare un programma che così tutti gli utente di una lan possono mandare sms che pero non voglio mettere un telefonino in ogni computer
Sarebbe bello che possono anche avere un tipo popup che si apre quando arriva un sms destinato a lui con il testo e il mittente
Si puo fare cosi?
Non ti chiedo codice ma come fare come lo creo un mecenismo cosi?![]()
anzitutto, devi sapere che la libreria non è del tutto testata, quindi, la devi prendere così com'è senza garanzie.
Detto questo, andiamo avanti.
Per sapere il nome della porta COM che ti interessa, puoi guardare nelle proprietà del modem (di windows).
Per la seconda questione è un po più complicato, dovresti creare un webservice in questo modo :
per la popup diciamo che dovresti interrogare il web service lavorando sul db con delle query in modo da restituire solo gli sms desiderati secondo parametri.codice:[ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class SMSService { static SwitchBoard SwitchBoard; static System.Timers.Timer timer; static ATC_SMS ATC_letturaMessaggi; static SMSService() { if (SwitchBoard == null) { try { //creo un nuovo device passando la porta corrispondente al modem da utilizzare //volendo avere più modem a disposizione basta creare più device Device device = new Device("COM17"); //creo il "centralino" che conterrà i device istanziati, e le do un nome. SwitchBoard = new SwitchBoard("test"); //aggiungo il device al centralino (con false non faccio il test per recuperare informazioni sul device) SwitchBoard.AddDevice(device, false); } catch (Exception e) { } //creo il comando per leggere gli sms dalla cartella Read (non ho messo non letti per mia praticità sui test) //passo anche un delegato per il metodo read che scriverà gli sms in un db ATC_letturaMessaggi = SwitchBoard.GetCommandReadSMS(SwitchBoard.SMSFolder.Read, new ATC_SMS.SMSReceivedEventHandler(read)); //accodo al "centralino" il comando per leggere gli sms //il comando avra il suo ciclo e per ogni sms trovato lo manderà al metodo read //il thread va avanti senza attendere la risposta in read ovviamente. SwitchBoard.Enqueue(ATC_letturaMessaggi); //creo un timer per fare in modo che periodicamente possa controllare se ci sono nuovi sms timer = new System.Timers.Timer(); timer.Interval = 60000; timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.Enabled = true; timer.Start(); } } static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { //accodo al "centralino" il comando di lettura degli sms dal device SwitchBoard.Enqueue(ATC_letturaMessaggi); } [OperationContract] public void WriteSMS(string numero, string testo) { try { //creo un nuovo comando per inviare sms ATC_SMS ATC_invioMessaggi = SwitchBoard.GetCommandSentSMS(testo, numero); //accodo il comando al centralino SwitchBoard.Enqueue(ATC_invioMessaggi); } catch { } } static void read(object sender, SMS sms) { //carichi gli sms in un database //bisogna cancellare il messaggio dal telefono in modo che non ci sia più nella cartella //per farlo bisogna creare il comando con ATC_SMS (se non hai capito come fare dalla demo poi ti spiego) e la stringa mi pare fosse AT+CMGD=<indice sms> } [OperationContract] public List<UserArgsSMS> ReadSMS() { //restituisci i dati dal database } } [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] [DataContract(Name = "UserArgsSMS", Namespace = "")] public class UserArgsSMS { [DataMember(Name = "PhoneNumber")] public string PhoneNumber { get; set; } [DataMember(Name = "Text")] public string Text { get; set; } }
io ho fatto un po di test, ma per niente approfonditi, perché devo ancora crearmi un simulatore per il modem. non sarebbe conveniente mettere sotto stress il webService a 10 centesimi a sms.
comunque la cosa mi ha incuriosito, mi devo fare l'emulatore per il modem così posso fare tutti i test che mi pare.
un idea per farlo mi ronza già in testa, ma a limite se avrò bisogno, aprirò un post per chiedere una mano.
se vuoi provare fai pure, però fossi in te aspetterei ancora qualche giorno per vedere cosa concludo.
evidentemente ho fatto casino modificando il post subito dopo aver postato (anche se sono quasi certo di aver ricontrollato), in quanto non ero sicuro del file. quindi i casi sono due :Originariamente inviato da gibra
Ma l'URL che hai indicato non porta da nessuna parte...
A questo punto sarei curioso di sapere dove kamkamg ha scaricato la tua libreria.
o è stato flash a scaricare il precedente file, oppure ha usato questo
ma dovresti chiedere a lui![]()
![]()
ciao,
ieri mi sono costruito l'emulatore del sistema. Ho utilizzato un emulatore di porte a livello kernel (software) creando delle coppie di porte (NULLMODEM ma senza cavo), poi mi sono costruito un emulatore di modem, sempre a livello software, in modo da avere delle risposte coerenti e poter testare il web service.
Dai test effettuati non ho riscontrato problemi per il sovraccarico eventuale (richieste simultanee, intasamenti ecc.), però questo dipende anche dal fatto che l'emulatore modem è veloce, e molto dipende dalla velocità del modem che utilizzi (occhio a non squagliarlo). Chiaramente ho simulato anche qualche eventuale errore, ma la realtà e sempre la realtà...
Un problema da non sottovalutare è che il web service, come potrai notare, è soggetto a lettura temporizzata attraverso un timer statico, questo fa si che quando un utente effettua la prima richiesta (all'avvio), venga creata la classe statica che provvede appunto a temporizzare l'operazione di lettura. La classe statica ha la durata di una sessione (dipende dalle impostazioni del server ma credo 30 minuti) e quindi teoricamente scade se non vi sono altre richieste web entro la scadenza. Ma questo non dovrebbe essere un problema, anche perchè ci dovrebbe essere un interrogazione frequente da parte dei client (magari con ajax e timer) per controllare eventuali nuovi arrivi. Da notare che le richieste dalla classe d'istanza prelevano dati da database, quindi sono indipendenti e non creano ulteriori richieste sul modem per non rallentarlo, ma per l'invio accodano direttamente al modem.
comunque ho realizzato anche un servizio windows per ovviare a questo problema, quando viene avviato praticamente fa tutto lui, dopo averlo configurato, mette gli sms arrivati, sotto forma di file testuale, in una cartella apposita (configurata), e per inviarli basta metterli in un altra cartella (sempre testuali e anche questa cartella configurabile), al resto pensa tutto il servizio. ma questo lo sto ancora finendo anche se già funzionante, perchè voglio valutare alcune cose. Anche al servizio windows si potrebbe collegare un web service, oppure passare attraverso socket o tutti quei modi che esistono per trasferire file nella rete.
La gestione dei thread che portano a termine le richieste è già inclusa nella libreria.
Il web server, così come l'ho scritto qui, usa due modem (ma ne puoi usare quanti vuoi), uno l'ho dedicato per la ricezione dei messaggi, ma all'occorrenza, ad esempio immaginando di voler suddividere il carico degli invii simultanei quando sono molti, si possono instradare gli sms in uscita anche in questo device.
Ecco come dovrebbe andare il codice del web service :
la libreria la puoi usare anche per altre applicazioni che usano la porta com, anche se non devono comunicare SMS, ma anche per altri protocolli di domanda/risposta incapsulando la logica nei "comandi". ma questo è un altro argomentocodice:[ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class SMSService { static object lockThis = new object();//oggetto che uso per bloccare l'accesso da diversi thread a SwitchBoard (senza bloccare la classe) static SwitchBoard switchBoard = null;//campo SwitchBoard a cui inpedisco di accere da diversi thread (uno alla volta) static SwitchBoard SwitchBoard//proprietà che svolge la funzione di accesso alla risorsa condivisa { get { //il vero e proprio loock dell'oggetto lockThis che quando in blocco non cosente di accedere a se stessa se non dal thread che la "detiene" lock(lockThis) { return switchBoard;//il risultato e che non posso accedere a questa risorsa se non una volta per thread } } set { //il vero e proprio loock dell'oggetto lockThis che quando in blocco non cosente di accedere a se stessa se non dal thread che la "detiene" lock (lockThis) { switchBoard = value;//il risultato e che non posso accedere a questa risorsa se non una volta per thread } } } static System.Timers.Timer timer;//timer per la lettura dei messaggi dal telefono static SMSService() { Thread t = new Thread(init); t.Start();//avvio un nuovo thread } static void init() { if (SwitchBoard == null) { try { //creo un nuovo device passando la porta corrispondente al modem da utilizzare //volendo avere più modem a disposizione basta creare più device Device device = new Device("COM40"); device.SetPortProperty(U235Phone.SinglePort.ProxyCom.SerialPortProperty.ReadTimeout, 10000); device.SetPortProperty(U235Phone.SinglePort.ProxyCom.SerialPortProperty.WriteTimeout, 10000); //device.OnClosePort += new U235Phone.SinglePort.ClosePort(device_OnClosePort);//se si vuole si può avere un feedback ad esempio per calcolare una coda Device device2 = new Device("COM30"); device2.SetPortProperty(U235Phone.SinglePort.ProxyCom.SerialPortProperty.ReadTimeout, 10000); device2.SetPortProperty(U235Phone.SinglePort.ProxyCom.SerialPortProperty.WriteTimeout, 10000); //device2.OnClosePort += new U235Phone.SinglePort.ClosePort(device_OnClosePort);//se si vuole si può avere un feedback ad esempio per calcolare una coda //creo un nuovo "centralino" che contiene i device istanziati, e le do un nome. SwitchBoard = new SwitchBoard("SMSService"); //aggiungo il device al centralino (con false non faccio il test per recuperare informazioni sul device) SwitchBoard.AddDevice(device, false); SwitchBoard.AddDevice(device2, false); //creo il comando per leggere gli sms dalla cartella Read //passo anche un delegato per il metodo read che scriverà gli sms in un db ATC_SMS ATC_letturaMessaggi = SwitchBoard.GetCommandReadSMS(SwitchBoard.SMSFolder.Unread, new ATC_SMS.SMSReceivedEventHandler(read)); //ATC_letturaMessaggi.OperationLength = 1;eventuale lunghezza prevista (per statistiche su coda) //accodo al "centralino" il comando per leggere gli sms //il comando avra il suo ciclo e per ogni sms trovato lo manderà al metodo read //il thread va avanti senza attendere la risposta in read ovviamente. SwitchBoard.Enqueue(ATC_letturaMessaggi,"COM40"); //creo un timer per fare in modo che periodicamente possa controllare se ci sono nuovi sms timer = new System.Timers.Timer(); timer.Interval = 30000; timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.Enabled = true; timer.Start(); } catch (Exception e) { //log } } } static void device_OnClosePort(string portName, int operationLength) { //codice che viene eseguito quando un comando ha terminato la sua esecuzione } static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Thread t = new Thread(runTimer); t.Start(); } static void runTimer() { //accodo al "centralino" il comando di lettura degli sms dal device (uso per ricevere sms sempre COM40, ma all'occorrenza lo posso utilizzare per invio) ATC_SMS ATC_letturaMessaggi = SwitchBoard.GetCommandReadSMS(SwitchBoard.SMSFolder.Unread, new ATC_SMS.SMSReceivedEventHandler(read)); SwitchBoard.Enqueue(ATC_letturaMessaggi, "COM40"); } [OperationContract] public List<UserArgsSMS> ReadSMS() { //codice per restituire gli sms dal database } [OperationContract] public void WhiteSMS(string numero, string testo) { try { string porta = "COM30"; Random r = new Random(); if (r.Next(10) > 8) porta = "COM40";//scelgo random la porta per simulare una statistica di coda ATC_SMS ATC_invioMessaggi = SwitchBoard.GetCommandSentSMS(testo, numero);//creo il comando per inviare il messaggio SwitchBoard.Enqueue(ATC_invioMessaggi,porta);//lo accodo al centralino passando la porta casuale } catch { //Log } } static void read(object sender, SMS sms) { //codice per inserire gli sms provenienti dal device in un database } } [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] [DataContract(Name = "UserArgsSMS", Namespace = "")] public class UserArgsSMS { [DataMember(Name = "PhoneNumber")] public string PhoneNumber { get; set; } [DataMember(Name = "Text")] public string Text { get; set; } }
mi piacerebbe rendere il tutto open source e pubblicare tutto il codice, ma mi vergogno parecchio di come l'ho scritto![]()
e poi non è che interessi più di tanto questa cosa per fare un progetto open source...
fammi sapere.
ciao.
gazie mooooltooooo interessante![]()
quanti smms posso inviare con questo sistema? tipo in 1 min.?
mi sta venendo un idea![]()