IPC mit MWConn
Verfasst: 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:
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
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;
}
Ich bin für jegliche Hilfe dankbar!
Mit freundlichen Grüßen
Jan