Biblioteka do odbierania i wysyłania SMS (komendy AT)

0

Witam,

zna ktoś jakąś bibliotekę do odbierania i wysyłania SMS po przez komendy AT? Wiem jak to mniej więcej zrobić ale bym wolał sprawdzone rozwiązanie.

0

synaser
b

0

Albo jakiś ComPort...

Send command: write to port AT+CMGS=”cell_number” (cell_number = destination number)
Send sms text: after you send command AT+CMGS=”cell_number” you will receive response “>” then you need to write sms text to port
if you will receive response “OK”, congrats message was sent

Poszperaj
https://www.google.pl/search?q=delphi+sending+sms+at+command

0

Jeśli łączysz się z telefonem / modemem gsm poprzez wirtualny com to polecam ComPort, przy użyciu tego komponentu wysyłanie i odbieranie sms'ów jest trywialnie proste ;)

0

No dobrze, a jak odebrać SMSa? W komponencie ComPort w zdarzeniu ComPortRxChar jest logowanie "rozmowy" z telefonem w memo... Tylko jak odebrać to +CMTI: "ME", oraz numerek który jest doklejany w drugim przejściu, tak żeby uzyskać coś mądrego, co idzie później obrobić? Albo faktycznie już zdurniałem albo się nie da... tzn nie wiem jak. Wysyłanie komend, to faktycznie proste jest. HLP PLS.

Pozdrawiam.

0

Używam synasera:

AT+CMGF=1
AT+CPMS="SM"
AT+CMGL="ALL"
fetch poszczególnych wiadomości wg. ciągu: '+CMGL:'

Powyższe działa bez zarzutu od ponad roku (grubo powyżej 20000 odebranych sms'ów).

b

0

Otwierasz plik: fs:=TFileStream.Create('COM1',fmWrite);
i normalnie piszesz: Cmp:='AT+CMGF=1'#13; fs.Write(Cmd[1],Length(Cmd));

0

Co prawda kod brzydki bo pisany na kolanie, ale działa od dłuuuugiego czasu niezawodnie ;) Zapisuje smsy do pliku i wysyła informacje w przypadku awarii serwera.

Kod w c#, ale chyba przeniesienie do Delphi nie sprawi problemu:

Maszyna stanu wewnątrz timera z interwałem 10ms:

        private void timerModemMachine_Tick(object sender, EventArgs e)
        {
            timerModemMachine.Enabled = false;

            switch (modemState)
            {
                case 0:         //ustawiam sms tryb tekstowy;
                    switch(inTask) 
                    {
                        case 0:    
                            this.ModemBuffer = "";
                            this.serialPort1.Write("AT+CMGF=1\r\n");
                            inTask = 1;
                            break;
                        case 1:
                            if (this.ModemBuffer.Contains("OK") == true) //tryb tekstowy ystawiony
                            {
                                //this.Text = "tryb tekstowy ustaiowny";
                                inTask = 0;
                                modemState = 1;
                            }
                            break;
                    }
                    break;
                case 1: //odczytuje smsy
                    switch(inTask) 
                    {
                        case 0:
                            this.ModemBuffer = "";
                            this.serialPort1.Write("AT+CMGR="+smsReadCounter+"\r\n");
                            inTask = 1;
                            break;
                        case 1:
                            if (this.ModemBuffer.Contains("OK") == true && this.ModemBuffer.Contains("+CMGR") == true ) //odczytalem sms
                            {
                                string[] smsContent = ModemBuffer.Split('\n');
                                if (smsContent.Length >= 4 && this.ModemBuffer.Contains("READ") == true)
                                {
                                    smsContent[1] = smsContent[1].Replace("\r", "");
                                    smsContent[1] = smsContent[1].Replace("\n", "");
                                    smsContent[2] = smsContent[2].Replace("\r", "");
                                    smsContent[2] = smsContent[2].Replace("\n", "");
                                    string smsCont = smsContent[1] + " -> " + smsContent[2];
                                    string output = exec.RunCommand("echo \"" + smsCont + "\" >> smsDb");

                                    this.ModemBuffer = "";
                                    this.serialPort1.Write("AT+CMGD=" + smsReadCounter + "\r\n");
                                    inTask = 2;
                                }
                                else
                                {
                                    inTask = 0;
                                    smsReadCounter++;
                                    if (smsReadCounter >= 20)
                                    {
                                        smsReadCounter = 0;
                                        modemState = 2;
                                        //MessageBox.Show("Zakonczylem odczyt 20 smsow");
                                    }
                                }
                                
                            }
                            break;
                        case 2:
                            if (this.ModemBuffer.Contains("OK") == true)
                            {
                                //to nizej na koncu
                                inTask = 0;
                                smsReadCounter++;
                                if (smsReadCounter >= 20)
                                {
                                    smsReadCounter = 0;
                                    modemState = 2;
                                    //MessageBox.Show("Zakonczylem odczyt 20 smsow");
                                }
                            }
                            break;
                    }
                    break;
                case 2: //sleep
                    sleepCounter++;
                    if (sleepCounter >= 600)
                    {
                        sleepCounter = 0;
                        modemState = 1;
                    }
                    if (this.SendRaport == 1)
                    {
                        this.SendRaport = 0;
                        modemState = 3;
                    }
                    if (this.SendRaport == 2)
                    {
                        this.SendRaport = 0;
                        modemState = 4;
                    }
                    if (this.SendRaport == 3)
                    {
                        this.SendRaport = 0;
                        modemState = 5;
                    }
                    break;
                case 3:
                    switch(inTask){
                        case 0:
                            this.ModemBuffer = "";
                            this.serialPort1.Write("AT+CMGS=\""+textBox5.Text+"\"\r\n");
                            inTask = 1;
                            break;
                        case 1:
                            if (this.ModemBuffer.Contains(">") == true)
                            {
                                this.ModemBuffer = "";
                                this.serialPort1.Write("Ct Manager 1.0 SMS testowy.\x1A");
                                inTask = 2;
                            }
                            break;
                        case 2:
                            if (this.ModemBuffer.Contains("OK") == true)
                            {
                                modemState = 2;
                                inTask = 0;
                            }
                            break;
                    }
                    break;
                case 4:
                    switch (inTask)
                    {
                        case 0:
                            this.ModemBuffer = "";
                            this.serialPort1.Write("AT+CMGS=\"" + textBox5.Text + "\"\r\n");
                            inTask = 1;
                            break;
                        case 1:
                            if (this.ModemBuffer.Contains(">") == true)
                            {
                                this.ModemBuffer = "";
                                this.serialPort1.Write(ALARM_SERWER_OK);
                                inTask = 2;
                            }
                            break;
                        case 2:
                            if (this.ModemBuffer.Contains("OK") == true)
                            {
                                modemState = 2;
                                inTask = 0;
                            }
                            break;
                    }
                    break;
                case 5:
                    switch (inTask)
                    {
                        case 0:
                            this.ModemBuffer = "";
                            this.serialPort1.Write("AT+CMGS=\"" + textBox5.Text + "\"\r\n");
                            inTask = 1;
                            break;
                        case 1:
                            if (this.ModemBuffer.Contains(">") == true)
                            {
                                this.ModemBuffer = "";
                                this.serialPort1.Write(ALARM_NOT_RUNNING);
                                inTask = 2;
                            }
                            break;
                        case 2:
                            if (this.ModemBuffer.Contains("OK") == true)
                            {
                                modemState = 2;
                                inTask = 0;
                            }
                            break;
                    }
                    break;
            }
            timerModemMachine.Enabled = true;
        }


        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int buffBytes = this.serialPort1.BytesToRead;
            byte[] UartBufferTemp = new byte[buffBytes];
            this.serialPort1.Read(UartBufferTemp, 0, buffBytes);
            this.Invoke((MethodInvoker)delegate
            {
                this.ModemBuffer += ASCIIEncoding.ASCII.GetString(UartBufferTemp);
            });
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1