Netzmitteilungen mit gsm shield lesen

Hallo Gemeinde,

ich bin neu hier, und hoffe Ihr könnt mir helfen.

Für ein Projekt mit dem gsm shield brauche ich ein Funktion, mit der ich das Guthaben auf der Simkarte auslesen kann.
Beim Tel geht das mit *101#.
Wie kann ich den Text, der zurückgesendet wird mit gsm schield auslesen?

Erst schon mal danke,
Frank

Wenn du die Antwort als SMS bekommst müsste das machbar sein....

Gruß

Hallo

das Problem ist, die Mitteilungen kommen nicht per SMS. Die Texte worum es geht sind Providerantworten auf USSD-Codes.
Sie erscheine beim Handy auf dem Display und können nicht gespeichert werden. Wenn ich einen solchen Code per voiceCall abschicke, kann ich an den LED´s erkennen, das was zurück kommt. Weiß aber nicht wie ich an die Daten komme.
Gruß Frank

Ich hab kein GSM Shield und kann das jetzt nicht testen, aber generell kann man bei den meisten Chips mit nem

AT+CUSD=1,"*101#",15

USSD-Anfragen absetzen. Die Rückgabe kommt dann nach der Bestätigung mit OK.

Hey,
das klingt doch schon mal gut. Ich habe wenig Ahnung von den AT Befehlen. Wofür steht die 1 und die 15 im Befehl. Wie wird der Text zurückgegeben?
Gruß Frank

Ich glaube nicht das der Befehl "*101#" ein "AT-Comand" ist. Der Provider erkennt daran das du eine Anfrage gestellt hast und schickt dir diese, aber das ist bestimmt keine AT Antwort.
Schau mal ob du im Internet eine Liste von allen AT Comands findest, dann muss diese Funktion ja dabei stehen.

Gruß

Hallo,
*101# ist sicher kein AT-befehl. Dieser diente als Beispiel. Aber es ist ein USSD-Befehl. Die Befehle zu senden ist mein Problem nicht. Die Antwort vom Provider ist mein Problem. Der Provider schickt die Antwort als Netzmitteilung (was immer das heißt) zurück. Mein Problem ist, das ich wissen muss, wie viel Guthaben auf der Karte steht. Dieses als SMS an eine andere Nummer gesendet wird. Ich habe keine Ahnung, wie ich den zurückgesendeten Text auslesen kann.
Gruß Frank

/klugscheißermodus an
Wenn du die Info über das Guthaben per SMS verschickst stimmt deine Info ja schon nicht mehr... :stuck_out_tongue_closed_eyes:
/klugscheißermodus aus

Bei einigen Providern kannst du das Guthaben auch online abragen, weiß jetzt nur nicht mehr genau bei welchen.

Stimmt.
es geht geht sich auch nur darum, reagieren zu können, bevor die Karte leer ist.

Scherheinz:
Wenn du die Info über das Guthaben per SMS verschickst stimmt deine Info ja schon nicht mehr... :stuck_out_tongue_closed_eyes:

Haha. Wenn man weiß was eine SMS kostet müsste man diese nur abziehen.

Na wenn es nur um SMS geht kannst du ja wirklich dein Betrag nach dem Aufladen eintragen und bei jeder SMS den Wert abziehen. So kannst du in jede SMS dein Guthaben einpflegen oder die Anzahl der noch verschickbaren SMS.

Gruß

Es muss doch ein Möglichkeit geben diese Netzmitteilungen auszulesen. Klar weiß ich, das es verschiedene Möglichkeiten gibt. Es bleibt aber schätzen. Und es geht nicht nur um SMS, aber meistens.

Gruß Frank

Manawyrm:
Ich hab kein GSM Shield und kann das jetzt nicht testen, aber generell kann man bei den meisten Chips mit nem

AT+CUSD=1,"*101#",15

USSD-Anfragen absetzen. Die Rückgabe kommt dann nach der Bestätigung mit OK.

Bei mir funktioniert das ohne Probleme:

Hey Scherheinz,

Habe das grade auch nochmal probiert, funktioniert bei mir jetzt auch. Hatte beim ersten mal einen Fehler gemacht. Weißt du auch, wie ich den Text in ein Array kriege?
Bei der fertigen Anwendung hängt kein Computer am Port.
Erst ein dickes Danke

Frank

Ich hab den Code Schnipsel von Serenifly benutzt

const int SERIAL_BUFFER_SIZE = 81;
char serialBuffer[SERIAL_BUFFER_SIZE];

void loop()
{
   if(readSerial())
       processSerial();
}

bool readSerial()
{
	static unsigned int index;

	if(Serial.available() > 0)
	{		
		char c = Serial.read();
		
	        if(c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
		{
			serialBuffer[index++] = c;
		}
                else if(c == '\n')
		{
			serialBuffer[index] = '\0';
			index = 0;
			return true;
		}
	}
	return false;
}

void processSerial()
{
     Serial1.print(serialBuffer);
}

Hallo
da hätte ich auch selber drauf kommen können, einfach den seriellen Puffer auslesen. Oft denkt man doch zu kompliziert.
Besten Dank, damit komme ich weiter.

Die Puffergröße kann man anpassen wenn man weniger Text will. Hier wird ja eigentlich nur der erste Satz gebraucht. Der Code hat nämlich die Eigenschaft, dass er die Daten aus dem seriellen Eingangspuffer ausliest selbst wenn sie nicht ins Array passen und dann trotzdem den String korrekt terminiert.

Serenifly:
Die Puffergröße kann man anpassen wenn man weniger Text will. Hier wird ja eigentlich nur der erste Satz gebraucht. Der Code hat nämlich die Eigenschaft, dass er die Daten aus dem seriellen Eingangspuffer ausliest selbst wenn sie nicht ins Array passen und dann trotzdem den String korrekt terminiert.

Ich benutze das so 1 zu 1 bei meinen Projekten und bin sehr zufrieden damit 8)

Und dss zu parsen und den Betrag auszulesen geht so:

const char searchString[] PROGMEM = "betr\xE4gt";
const char searchStringAlternate[] PROGMEM = "EUR";
char str[] = "Ihr Guthaben betr\xE4gt 12.05 EUR. Blah blah";

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  parseString();
  parseStringAlternate();

  delay(2000);
}

void parseString()
{
  char* ptr = strstr_P(str, searchString);
  if (ptr != NULL)
  {
    ptr = ptr + strlen_P(searchString) + 1;
    float value = atof(ptr);
    Serial.print(F("Guthaben: "));
    Serial.println(value);
  }
  Serial.println();
}

void parseStringAlternate()
{
  char* ptr = strstr_P(str, searchStringAlternate);
  if (ptr != NULL)
  {
    int spaceCount = 0;
    while (spaceCount != 2)
    {
      if (*(--ptr) == ' ')
        spaceCount++;
    }

    float value = atof(ptr);
    Serial.print(F("Guthaben: "));
    Serial.println(value);
  }
  Serial.println();
}

Anmerkung dazu:
Das sind zwei Varianten. Das Problem ist hier eventuell der Umlaut. Nach der normalen erweiterten ASCII Tabelle ist 'ä' -> \xE4:

Da sollte man vielleicht mal mit einem Terminal-Programm schauen als was das genau codiert ist. Wenn es damit Probleme gibt funktioniert dann nämlich strstr() wahrscheinlich nicht.

Deshalb die zweite Variante. Die umgeht das mit dem Umlaut und such statt dessen nach dem "EUR". Dann geht man zwei Leerzeichen zurück und hat die Zahl.