IPC mit MWConn

Problemhilfe zur Nutzung von MWconn
Forumsregeln
Um eine schnellere Hilfe bei nicht offensichtlichen Problemen zu bieten, ist es oft erforderlich, ein so genanntes Servilog wiki/index.php/Serviceprotokoll zu erstellen.
Antworten
Skoozy
Beiträge: 8
Registriert: Fr 19. Mär 2010, 11:39

IPC mit MWConn

Beitrag von Skoozy » Fr 19. Mär 2010, 11:49

Hallo Zusammen,

ich möchte für ein zukünftiges Projekt gerne mehrere Statusdaten von MWConn (UMTS/GPRS, Datenrate, Empfangsstärke, ...) auslesen.
Um die IPC per Shared Memory zu testen wollte ich erstmal das C Beispielprogramm von Markus testen.
Ich habe leider momentan noch keine Hardware zur Verfügung, deshalb zunächst folgende frage:

Ab wann erstellt MWConn den Shared Memory Bereich?
Direkt nach Start des Tools, oder erst sobald eine PC Karte erkannt wurde?
Sprich, kann ich die IPC ohne Hardware testen?

Der folgende Code läuft fehlerfrei durch den C-Compiler, findet jedoch keinen MWConn Speicherbereich:

Code: Alles auswählen

#include <stdio.h>
#include <windows.h>


typedef struct
{   
    // Struktur für Datenaustausch mit externen Programmen
    unsigned long len;                 // Länge dieser Struktur in Bytes
    unsigned short structure_version;  // Version dieser Struktur: 3
    unsigned short program_version;    // Version des MWconn-Programms (Hauptversion*256+Nebenversion)
    unsigned long res1[3];             // reserviert

    // Datenrichtung extern->MWconn
    char command[100];                 // von MWconn auszuführendes Kommando
    // "MWCONN_CONNECT": verbinden;
    // "MWCONN_DISCONNECT": trennen;
    // "MWCONN_RECONNECT": neu verbinden;
    // "MWCONN_END": Programm beenden;
    // ":::ATI": AT-Kommando an Gerät senden (hier "ATI")
    // bei Novatel-Geräten nur mit Novatel-DLL;
    // ":250:4000:ATI": desgleichen, jedoch mit
    // Wartezeitangaben, 250ms nach dem Senden
    // beginnt der Empfang, welcher maximal 4 weitere
    // Sekunden später abgeschlossen sein muss;
    // "MWCONN_PATH": aktuellen Programmpfad zurückgeben
    // Datenrichtung MWconn->extern
    // Hinweis: nicht alle Datenkarten unterstützen alle Informationen
        
    unsigned long process_counter;     // dieser Zähler wird von MWconn inkrementiert, sobald neue Daten zur Verfügung stehen
    unsigned long volume;              // summiertes Datenvolumen in kBytes
    unsigned long time;                // summierte Onlinezeit in Minuten
    unsigned long online_time;         // aktuelle Onlinezeit in Sekunden; ==0: offline
    unsigned long offline_time;        // aktuelle/letzte Offline-Zeit in Sekunden
    unsigned long upspeed;             // aktuelle Sendegeschwindigkeit in Bytes/s
    unsigned long downspeed;           // aktuelle Empfangsgeschwindigkeit in Bytes/s
    unsigned char opmode;              // Betriebsart; 0: nicht bekannt; 1: GPRS; 2: UMTS
    unsigned char signal_raw;          // Signalstärke als GSM-Standardwert (0..31)
    unsigned char signal_percent;      // Signalstärke in Prozent (0..100), nur gültig, wenn signal_raw>0
    signed short signal_dbm;           // Signalstärke in dBm
    char network_name[30+1+1];         // Name des Netzwerks
    char plmn[6+1];                    // Public Land Mobile Network, bestehend aus MCC und MNC
    char lac[4+1];                     // Location Area Code
    char cid[4+1];                     // Cell-ID
    char message[64+1];                // ggf. Meldungstext
    char mini_message[48+1];           // ggf. verkürzter Meldungstext
    char error_message[32+1];          // ggf. Fehlermeldung
    unsigned char battery;             // Akku-Zustand; 0: unbekannt
    char rnc[4+1];                     // RNC-ID
    unsigned char internal1[1];        // reserviert
    unsigned long internal2[6];        // reserviert
    char answer[600];                  // Antwort auf AT-Kommando oder "MWCONN_PATH"
} mwcio_t;



void fastcall()
{
    // Testprozedur zur Ausgabe aller von MWconn bereitgestellten Informationen
    HANDLE mwcioh; // Handle des gemeinsamen Speichers für I/O
    mwcio_t* mwcio;
    static char z[4000];
    char* zp;


    // IO-Bereich öffnen und zuweisen
    mwcioh=NULL; mwcio=NULL; // Voreinstellungen (Fehlerfall)
    #define OFN(a,n) if(mwcioh==NULL) mwcioh=OpenFileMapping(a,FALSE,n);
    OFN(FILE_MAP_ALL_ACCESS,"Global\\MWCONN_IO");
    OFN(FILE_MAP_ALL_ACCESS,"MWCONN_IO");
    OFN(FILE_MAP_READ,"Global\\MWCONN_IO");
    OFN(FILE_MAP_READ,"MWCONN_IO");
    
    // DEBUG
    if(mwcioh==NULL) printf("DEBUG: mwcioh = 0\n");
    
    #define MVOF(a) if(mwcioh!=NULL && mwcio==NULL) mwcio=(mwcio_t*)MapViewOfFile(mwcioh,a,0,0,sizeof(mwcio_t));
    MVOF(FILE_MAP_ALL_ACCESS);
    MVOF(FILE_MAP_READ);

    // DEBUG
    if(mwcio==NULL) printf("DEBUG: mwcio = 0\n\n");

    
    if(mwcio==NULL) // IO-Bereich nicht gültig
        printf("MWconn-IO-Bereich konnte nicht gelesen werden\n\n");
    else // IO-Bereich gültig
    {
        zp= z;
        zp+= sprintf(zp,"Länge der Struktur: %lu Bytes, "
                        "Strukturversion: %u, Programmversion: %u.%u, "
                        "Prozess-Zähler: %lu\n",
                        mwcio->len,mwcio->structure_version,
                        mwcio->program_version>>8,mwcio->program_version&255,
                        mwcio->process_counter);
        zp+= sprintf(zp,"summiertes Datenvolumen: %lu kBytes, "
                        "summierte Onlinezeit: %lu Minuten\n",
                        mwcio->volume,mwcio->time);
        zp+= sprintf(zp,"aktuelle Onlinezeit: %lu Sekunden, "
                        "aktuelle/letzte Offlinezeit: %lu Sekunden\n",
                        mwcio->online_time,mwcio->offline_time);
        zp+= sprintf(zp,"Upspeed: %lu kBytes/s, "
                        "Downspeed: %lu kBytes/s\n",
                        mwcio->upspeed/1000,mwcio->downspeed/1000);
        zp+= sprintf(zp,"Betriebsart: %s, "
                        "Signalstärke: %02u(roh) = %u%% = %idBm\n",
                        mwcio->opmode==1?"GPRS":mwcio->opmode==2?"UMTS":"unbekannt",
                        mwcio->signal_raw,mwcio->signal_percent,mwcio->signal_dbm);
        zp+= sprintf(zp,"Netzname: \"%s\", PLMN: \"%s\", "
                        "LAC: \"%s\", Cell-ID: \"%s\"\n",
                        mwcio->network_name,mwcio->plmn,mwcio->lac,mwcio->cid);
        zp+= sprintf(zp,"Meldung: \"%s\", Mini-Meldung: \"%s\", "
                        "Fehlermeldung: \"%s\"\n",
                        mwcio->message,mwcio->mini_message,mwcio->error_message);
        zp+= sprintf(zp,"Kommando: \"%s\", Antwort: \"%s\"\n",
                        mwcio->command,mwcio->answer);

      //Ausgabe->Caption= z;
      
    } // Ende IO-Bereich gültig


    // IO-Bereich gültig
    if(mwcio!=NULL)
    {
        UnmapViewOfFile(mwcio);
        mwcio= NULL;
    }
    
    if(mwcioh!=NULL)
    {
        CloseHandle(mwcioh);
        mwcioh= NULL;
    }
}



int main(void)
{
    fastcall();
    system("PAUSE");
    return 0;
}
Ist was am Code falsch oder wird der Speicherbereich ohne Hardware nicht angelegt?

Ich bin für jegliche Hilfe dankbar!

Mit freundlichen Grüßen
Jan

Opilionn
Administrator
Beiträge: 719
Registriert: Sa 26. Jul 2008, 18:25

Re: IPC mit MWConn

Beitrag von Opilionn » Fr 19. Mär 2010, 21:54

Hallo!

Der Bereich sollte auch ohne Modem angelegt werden. Zur Sicherheit am besten bei CONFIG.exe das Folgende einstellen:
- auf der Seite "Gerät" bei "Serieller Port" das manuell-Häkchen setzen und NONE eingeben,
- auf der Seite "Verbindung" den automatischen Verbindungsaufbau abschalten.

Dann z.B. GPRS.exe starten. Solange das Programm läuft, sollte auch der Shared-Memory-Bereich existieren. Vielleicht kannst du Näheres über den ProcessExplorer rauskriegen...
http://technet.microsoft.com/en-us/sysi ... 96653.aspx

NACHTRAG:
Wenn du das Programm CONTROL.exe erzeugst (GPRS.exe kopieren und entsprechend umbenennen), kannst du damit nachprüfen, ob der Shared-Memory-Bereich existiert. CONTROL.exe liest den nämlich aus und sagt auch Bescheid, ob er existiert.
Unter Linux wüsste ich, mit welchem Kommando man sich die Shared-Memory-Bereiche auflisten lassen kann, bei Windows ist mir dafür kein Kommando bekannt. Aber vielleicht weiß jemand einen Tipp...?

hErMeS
Administrator
Beiträge: 331
Registriert: Sa 26. Jul 2008, 11:47
Kontaktdaten:

Re: IPC mit MWConn

Beitrag von hErMeS » Sa 20. Mär 2010, 19:25

http://technet.microsoft.com/en-us/sysi ... 64922.aspx
Mit diesem Tool kann man sich die Sachen anzeigen lassen. Die Parameter -osv sollten alles anzeigen.

Skoozy
Beiträge: 8
Registriert: Fr 19. Mär 2010, 11:39

Re: IPC mit MWConn

Beitrag von Skoozy » So 21. Mär 2010, 02:38

Hallo zusammen,

ich habe festgestellt, dass der MWCONN_IO Bereich tatsächlich erst angelegt wird, wenn reale Hardware angeschlossen wird,
bzw. die Software dann erst weit genug startet um die entsprechende Funktionalität aufzurufen.
Auch nach dem Einstellen von serieller Port = NONE und deaktivieren des automatischen Verbindungsaufbaus hat die IPC leider nicht funktioniert.

Nach mehrmaligem check und diversen Experimenten, war ich mir sicher, dass mein Code korrekt ist.
Dies bestätigt mir auch das von hErMeS empfohlene, im übrigen hierfür genau richtige (danke dafür!), Tool!

MWConn legt, sobald man es startet ein Handle Namens "MWconn_Aktivsignal" im Speicher ab.
Da ich nicht herausgefunden habe in wie weit die CONFIG.exe den Shared Memory Bereich auswertet,
vermute ich mal, dass die CONFIG.exe sich an dem Aktivsignal orientiert.

Da mich das Thema nun geärgert hat, habe ich mir im Bekanntenkreis einen Huawei E160 geliehen und es damit getestet.
Wie oben bereits erwähnt, funktioniert die IPC hiermit auf anhieb bestens! (bis jetzt nur lesen getestet)

Nach nun längerem rumprobieren und beschäftigen mit dem Tool MWConn an dieser Stelle schon mal ein großes Lob an Markus!
Sehr kompakte (das mag ich), funktionelle und vielseitige Software! Das Angebot der recht simplen Kommunikation über IPC ist super!
Außerdem schon mal vielen Dank für den schnellen Support hier über das Forum!

Gute Nacht und freundliche Grüße!
Jan

Skoozy
Beiträge: 8
Registriert: Fr 19. Mär 2010, 11:39

Re: IPC mit MWConn

Beitrag von Skoozy » Mo 3. Mai 2010, 16:25

Hallo zusammen,

ich habe mich nun noch etwas eingehender mit der Sache befasst und noch zwei Fragen zu dem Thema:

1) Mir ist aufgefallen, dass die STRUCT Variable "unsigned char opmode" mehr als die Werte 0 (unbekannt), 1(GSM), 2(UMTS) annehmen kann. Bei meinen Tests konnte ich hier u.a. eine 6 mit dem Titel HSPA in MWconn vorfinden.
Gibt es darüber hinaus weitere Zahlen für z.b. EDGE? Eine komplette Liste wäre hier wirklich sehr hilfreich.

2) In wie weit hat sich etwas an dem STRUCT der IPC verändert von MWconn Version 5.5 zu 5.6.
Ich habe meine Anwendung auf die IPC mit Version 5.5 hin entwickelt, würde aber gerne zu 5.6 migrieren.
Eine Info hierzu wäre nett!

Vielen Dank schon mal im Vorraus und noch mal ein großes Lob an den/die Entwickler!

Mit freundlichen Grüßen
Jan

Opilionn
Administrator
Beiträge: 719
Registriert: Sa 26. Jul 2008, 18:25

Re: IPC mit MWConn

Beitrag von Opilionn » So 30. Mai 2010, 19:31

Hallo Jan, danke für den Hinweis!
EDGE=5, HSPA=6. Wenn du nur die Netze brauchst (GPRS bzw. UMTS), kannst du das Bit 2 wegwerfen (and 0x3). Ich werd das in die Anleitung aufnehmen.

Die Strukturen sind abwärtskompatibel, das heißt, eine einmal geschriebene Anwendung sollte auch mit zukünftigen Strukturen klarkommen. Soweit ich mich erinnere, hat sich zuletzt vor einigen Monaten beim PLMN etwas geändert, der ist nun 6-stellig.

Schöne Grüße
Opilionn

Antworten