Hey,
ich möchte mit dem Modemanschluss meines Laptops meine Telefonanlage "bedienen" und Anrufe annehmen und Nummern wählen usw...
Also das klingt alles schwieriger als es ist. Das meiste funktioniert schon und zwar über den SerialPort.
So als kurze Einführung: um mit der Telefonanlage zu kommunizieren gibt es Standardbefehle (
www.netzmafia.de/skr...en/modem/dfue3.html). Und auch die Telefonanlage sendet solche Befehle z.B. "RING" bei einem eingehenden Anruf.
Ich kann also mit den Befehlen schon mal wählen und Anrufe annehmen.
Am Anfang muss ich den Port erst mal öffnen:
C#-Quelltext
1: 2:
| SerialPort serialport = new SerialPort("COM3") serialport.Open(); |
Das erste Problem ist, dass der Port von Windows (hab Win7) schon verwendet wird. Ich muss immer die eine svhost.exe beenden, da sonst beim öffen des Ports, die Exception "...wird von einem anderen Prozess verwendet" kommt.
Wie kann ich dass umgehen? schließlich braucht Windows den Anschluss ja nicht, bzw. ich benutze kein Prog. von Windows, dass den Port braucht.
Als nächstes möchte ich, dass, sobald ein Gespräch angenommen wurde, ein Sound abgespielt wird. (Also über den SerialPort gesendet wird, sodass es der Anrufer hört xD).
Wie geht das? muss ich das irgendwie als Stream senden oder so^^?
Achja so sende ich die (normalen) Befehle zum Modem:
C#-Quelltext
1: 2: 3:
| StreamWriter st = new StreamWriter(serialport.BaseStream); st.WriteLine("Hier steht der Befehl"); st.Flush(); |
Hier ist mal der Code den ich für die anderen Befehle hab (ist nur die Klasse, die im Hauptprogramm benutzt wird!!):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.IO.Ports; using System.Threading;
namespace TestModem { class SerialPort_Modem { SerialPort serialport; StreamReader streamreader; StreamWriter streamwriter; bool callacqired = false;
Thread thCheckResponses;
public SerialPort_Modem(string Portname) { serialport = new SerialPort(Portname); }
public void Init() { serialport.ReadTimeout = -1;
if (!serialport.IsOpen) serialport.Open(); thCheckResponses = new Thread(CheckResponses); thCheckResponses.Start(); } public void Dispose() { if(serialport.IsOpen) serialport.Close(); thCheckResponses.Abort(); }
public void Call(string number) { StreamWriter st = new StreamWriter(serialport.BaseStream); st.WriteLine("ATDT 0," + number); st.Flush(); callacqired = true; } public void SendCommand(string command) { StreamWriter st = new StreamWriter(serialport.BaseStream); st.WriteLine(command); st.Flush(); }
private void CheckResponses() { while (true) { try { string response = serialport.ReadLine(); if (response != "" && response != null) Console.WriteLine("Response: " + response);
if (response.Contains("RING")) callacqired = AnswerPhone(); else if(response.Contains("BUSY") || response.Contains("NO CARRIER") || response.Contains("NO DIALTONE")) callacqired = false;
} catch (Exception e) { Console.WriteLine("Error (Requesting):" + e.Message); } } } private bool AnswerPhone() { try { StreamWriter st = new StreamWriter(serialport.BaseStream); st.WriteLine("ATH1"); st.Flush(); return true; } catch (Exception e) { Console.WriteLine("Error (Calling):" + e.Message); return false; } } } } |
DANKE für eure Antworten!!!
MFG Anti
