Home » M2M GSM - Nokia - Aplicom 12i - TBOX Teltonika » Ένας ιδιότυπος Configurator στην θέση του Nokia Configurator για το Nokia 12 TBOX της Teltonika

Ένας ιδιότυπος Configurator στην θέση του Nokia Configurator για το Nokia 12 TBOX της Teltonika


Επιτέλους έγινε πραγματικότητα το όνειρο του να υλοποιηθεί η επικοινωνία του υπολογιστή με το Nokia 12 TBOX της Teltonika με την βοήθεια λογισμικού Delphi Pascal σε περιβάλλον Windows 7. Αυτό μπορεί να έχει τρομερά θετικές επιπτώσεις για κάποιον που ενδιαφέρεται να απαγκιστρωθεί από το παμπάλαιο λογισμικό Nokia Configurator, να κατασκευάσει τον δικό του Configurator που θα διαβάζει, γράφει και απεικονίζει με τον τρόπο που θέλει τις παραμέτρους λειτουργίας του Nokia 12 TBOX. Παρακάτω εμφανίζονται τα αποτελέσματα που προέκυψαν μετά την εκτέλεση του κώδικα επικοινωνίας μεταξύ του Nokia 12 TBOX με τον ιδιότυπο Configurator. Επίσης δίνονται οι κώδικες κατασκευής του λογισμικού επικοινωνίας σε Delphi Pascal και κλασσική C. Οι κώδικες είναι σε πρωτόγονη μορφή και εντελώς πειραματικοί. Περιληπτικά:

1. το πρωτόκολλο επικοινωνίας της Nokia για το Nokia 12 TBOX είναι γραμμένο σε γλώσσα C και επιλέχθηκε να μεταγλωτισθεί σε DLL εξάγοντας μία μόνο συνάρτηση, την char* getinfo(). Η char* getinfo() αρχικοποιεί το πρωτόκολλο επικοινωνίας και τους απαραίτητους δείκτες που θα επιστρέψουν κάποιες προεπιλεγμένες πληροφορίες μέσα από την μνήμη του Nokia 12 TBOX, όπως τον αριθμό ΙΜΕΙ του ολοκληρωμένου κυκλώματος, τον κατασκευαστή και την έκδοση του hardware, τον κατασκευαστή και την έκδοση του software και ότι μηνύματα SMS υπάρχουν αποθηκευμένα εντός της κάρτας SIM.

2. επειδή η Delphi Pascal είναι περισσότερο προσιτή στον γράφοντα και με αυτήν μπορεί εύκολα να κατασκευαστεί το GUI ενός λογισμικού, αλλά δεν ήταν δυνατή η μετάφραση του κώδικα του πρωτοκόλλου επικοινωνίας από C σε Delphi Pascal, επιλέχθηκε να κληθεί η συνάρτηση char* getinfo() μέσα από την DLL και τα αποτελέσματα που επιστρέφονται να απεικονίζονται σε ένα memo box του GUI.

Για όσους δεν γνωρίζουν τι είναι το Nokia 12 TBOX, αλλά ενδιαφέρονται να μάθουν, πρόκειται για μια ηλεκτρονική συσκευή, ένα ειδικά μετασκευασμένο κινητό τηλέφωνο δηλαδή, που μπορεί να θεωρηθεί ως ένα υπέρ PLC (programmable logic controler), το οποίο ανήκει στην ομάδα των Μ2Μ (machine to machine) συσκευών και αφού προγραμματισθεί κατάλληλα δύναται να εγκατασταθεί στο επιθυμητό σημείο, να παρακολουθεί κάτι συγκεκριμένο και να μας ενημερώνει όταν συμβούν κάποιες μεταβολές σε αυτό που παρακολουθεί. Το τι θα μπορούσε να παρακολουθηθεί δεν έχει όριο και αφήνεται στην φαντασία του αναγνώστη. Πολύ ενδεικτικά αναφέρεται ότι θα μπορούσε να παρακολουθεί μία είσοδο ή οποία όταν παραβιασθεί να στείλει SMS στον ιδιοκτήτη. Στην δική μου περίπτωση το Nokia 12 TBOX χρησιμοποιείται σε μεγάλες δεξαμενές ύδρευσης εννέα οικισμών και παρακολουθεί αν οι δεξαμενές έχουν νερό ή όχι, αν ο ηλεκτρομηχανολογικός εξοπλισμός των γεωτρήσεων δουλεύει σωστά ή όχι κλπ κλπ κλπ…..

Αποτελέσματα από την επικοινωνία του Nokia 12 TBOX με τον ιδιότυπο Configurator

—————————————————————————————————-

hLinkReadyEvent=384

hStopEvent=388

hObserverEvent=392

sys_pro_start( 255, 10, 5, portIndex, 115200 )=1

WaitForSingleObject( hLinkReadyEvent, 10000 )=0

LINK READY=1

orb env._major=0

et_object env._major=0

ET_get_IMEI env._major=0

ET_get_IMEI(et_object,&env)=352540003551826

ET_get_numberOfLeds env._major=0

ET_get_numberOfLeds(et_object,&env)=2

ET_getDeviceInfo env._major=0

hwManufacturer=Nokia Mobile Phones

hwProductName=Nokia 12i

hwVersion.major=10

hwVersion.minor=2

hwVersion.build=0

hwVersion.date=0

swManufacturer=Nokia Mobile Phones

swProductName=RX-2

swVersion.major=6

swVersion.minor=3

swVersion.build=0

swVersion.date=1118793600

metadata.=41856612

metadata.=41856616

metadata.=41856620

ET_getParamList env._major=0

value.=41852756

value.=41852760

ET_readShortMessage env._major=0

index=1

phoneNumber=+306985164896

message=KTH

Going back to reread Short Messages

ET_readShortMessage env._major=0

index=2

phoneNumber=3a7c4#9

message=ENHMEP  EITE ANA YTIKA  IA TON TPO O  EITOYP IA  TH  Y HPE IA  E E XO  Y O OI OY COSMOTE Internet On The Go  TO www.cosmote.gr,  THN ENOTHTA MOBILE INTERNET A O

Going back to reread Short Messages

ET_readShortMessage env._major=0

index=3

phoneNumber=+306985164896

message=KAKHN

Going back to reread Short Messages

ET_readShortMessage env._major=0

index=4

phoneNumber=+306985164896

message=KTN

Going back to reread Short Messages

ET_readShortMessage env._major=0

index=5

phoneNumber=+306985164896

message=KH. TKANX

Going back to reread Short Messages

ET_readShortMessage env._major=0

index=6

phoneNumber=+306985164896

message=  TK

Going back to reread Short Messages

ET_readShortMessage env._major=0

index=7

phoneNumber=3b0*4386a4213935

message=MONO AYTH THN  EM TH Y EP- PO  OPE   TO  APA I H  OY  EN TI  XANEI ! 28 IOYNIOY, MONA IKE  TIME   E O E  TI  H EKTPIKE  KAI H EKTPONIKE   Y KEYE .  PO ABETE!

Going back to reread Short Messages

ET_readShortMessage env._major=0

index=8

phoneNumber=+306985164896

message=ANTE PE E ITE OY

Going back to reread Short Messages

ET_readShortMessage env._major=0

index=9

phoneNumber=+306985164896

message= A APIE

Going back to reread Short Messages

ET_readShortMessage env._major=1

Exception raised=1

CORBA_free( et_object )=1

SetEvent( hStopEvent )=1

CORBA_free( orb )=1

sys_pro_stop()=1

CloseHandle( hStopEvent )=1

CloseHandle( hLinkReadyEvent )=1

CloseHandle( hObserverEvent )=1

Κώδικας σε γλώσσα Delphi Pascal για την ενεργοποίηση της DLL

—————————————————————————

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

Tgetinfo = function () : PChar; cdecl;

TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

dllHandle : cardinal;

getinfo : Tgetinfo;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

res: pchar;

begin

memo1.Lines.Clear;

dllHandle := LoadLibrary(‘easydll.dll’) ;

if dllHandle 0 then

begin

@getinfo := GetProcAddress(dllHandle, ‘getinfo’);

if Assigned (getinfo) then

res:=getinfo()  //call the function

else

memo1.Lines.Add(‘”getinfo” function not found’);

FreeLibrary(dllHandle);

end

else

begin

memo1.Lines.Add(‘easydll.dll not found / not loaded’);

end;

memo1.Lines.Add(String(res));

end;

end.

Κώδικας σε γλώσσα C για την κατασκευή της DLL

———————————————————–

#include “stdafx.h”

#include

#include

#include

#include

#include

#include “sys_pro.h”

#include “wirelessDevice_egsmt.h”

#include “wirelessDevice_egsmt_client.h”

#include “wirelessDevice_egsmt_server.h”

//Function declarations

extern “C” __declspec(dllexport) HANDLE hLinkReadyEvent;

HANDLE hLinkReadyEvent;

extern “C” __declspec(dllexport) HANDLE hStopEvent;

HANDLE hStopEvent;

extern “C” __declspec(dllexport) char* __cdecl getinfo();

char* getinfo();

void handleException( CORBA_Environment * env_ptr );

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD  ul_reason_for_call,

LPVOID lpReserved

)

{

return TRUE;

}

char* getinfo()

{

HANDLE hObserverEvent;

CORBA_ORB orb;

CORBA_Object et_object;

CORBA_boolean bWait = CORBA_FALSE;

CORBA_octet portIndex = 1;

CORBA_Environment env;

char * phoneNumber = “+306985164896”;

char * message = “koufales”;

char bufr[10000];

int j;

struct _timeb timebuffer;

hLinkReadyEvent = CreateEvent( NULL, TRUE, FALSE, NULL );   j =sprintf(bufr,”hLinkReadyEvent=%d\r\n”,hLinkReadyEvent);

hStopEvent = CreateEvent( NULL, TRUE, FALSE, NULL );             j+=sprintf(bufr+j,”hStopEvent=%d\r\n”,hStopEvent);

hObserverEvent = CreateEvent( NULL, TRUE, FALSE, NULL );       j+=sprintf(bufr+j,”hObserverEvent=%d\r\n”,hObserverEvent);

memset( &env, 0, sizeof( CORBA_Environment ));                          j+=sprintf(bufr+j,”sys_pro_start( 255, 10, 5, portIndex, 115200 )=%d\r\n”,sys_pro_start( 255, 10, 5, portIndex, 115200 ));

DWORD wfso1=WaitForSingleObject( hLinkReadyEvent, 5000 );   j+=sprintf(bufr+j,”WaitForSingleObject( hLinkReadyEvent, 10000 )=%d\r\n”,wfso1);

if ( wfso1 == WAIT_OBJECT_0 )

{                                                                                                  j+=sprintf(bufr+j,”LINK READY=%d\r\n”,1);

orb = CORBA_ORB_init( “ORB”, &env );                               j+=sprintf(bufr+j,”orb env._major=%d\r\n”,env._major);

if ( env._major == CORBA_NO_EXCEPTION )

{

et_object = CORBA_ORB_resolve_initial_references( orb, “ET”, &env );

j+=sprintf(bufr+j,”et_object env._major=%d\r\n”,env._major);

if ( env._major == CORBA_NO_EXCEPTION )

{

CORBA_char* hwManufacturer=0;

CORBA_char* hwProductName=0;

struct wirelessDevice_Device_Version hwVersion={0,0,0,0};

CORBA_char* swManufacturer=0;

CORBA_char* swProductName=0;

struct wirelessDevice_Device_Version swVersion={0,0,0,0};

wirelessDevice_Device_MetadataList* metadata=0;

CORBA_any* value=0;

ET_get_IMEI(et_object,&env);

j+=sprintf(bufr+j,”ET_get_IMEI env._major=%d\r\n”,env._major);

if ( env._major != CORBA_NO_EXCEPTION )

{                                                                               j+=sprintf(bufr+j,”Exception raised=%d\r\n”,1);

handleException( &env );

}

else

{

j+=sprintf(bufr+j,”ET_get_IMEI(et_object,&env)=%s\r\n”,ET_get_IMEI(et_object,&env));

}

ET_get_numberOfLeds(et_object,&env);

j+=sprintf(bufr+j,”ET_get_numberOfLeds env._major=%d\r\n”,env._major);

if ( env._major != CORBA_NO_EXCEPTION )

{                                                                               j+=sprintf(bufr+j,”Exception raised=%d\r\n”,1);

handleException( &env );

}

else

{

j+=sprintf(bufr+j,”ET_get_numberOfLeds(et_object,&env)=%d\r\n”,ET_get_numberOfLeds(et_object,&env));

}

ET_getDeviceInfo( et_object, &hwManufacturer, &hwProductName, &hwVersion, &swManufacturer,&swProductName, &swVersion, &metadata, &env );

j+=sprintf(bufr+j,”ET_getDeviceInfo env._major=%d\r\n”,env._major);

if ( env._major != CORBA_NO_EXCEPTION )

{                                                                               j+=sprintf(bufr+j,”Exception raised=%d\r\n”,1);

handleException( &env );

}

else

{

j+=sprintf(bufr+j,”hwManufacturer=%s\r\n”,hwManufacturer);

j+=sprintf(bufr+j,”hwProductName=%s\r\n”,hwProductName);

j+=sprintf(bufr+j,”hwVersion.major=%d\r\n”,hwVersion.major);

j+=sprintf(bufr+j,”hwVersion.minor=%d\r\n”,hwVersion.minor);

j+=sprintf(bufr+j,”hwVersion.build=%d\r\n”,hwVersion.build);

j+=sprintf(bufr+j,”hwVersion.date=%d\r\n”,hwVersion.date);

j+=sprintf(bufr+j,”swManufacturer=%s\r\n”,swManufacturer);

j+=sprintf(bufr+j,”swProductName=%s\r\n”,swProductName);

j+=sprintf(bufr+j,”swVersion.major=%d\r\n”,swVersion.major);

j+=sprintf(bufr+j,”swVersion.minor=%d\r\n”,swVersion.minor);

j+=sprintf(bufr+j,”swVersion.build=%d\r\n”,swVersion.build);

j+=sprintf(bufr+j,”swVersion.date=%d\r\n”,swVersion.date);

j+=sprintf(bufr+j,”metadata.=%d\r\n”,&metadata->_maximum);

j+=sprintf(bufr+j,”metadata.=%d\r\n”,&metadata->_length);

j+=sprintf(bufr+j,”metadata.=%d\r\n”,&metadata->_buffer);

}

ET_getParam(et_object,”ActivityStatus”,&value,&env);

j+=sprintf(bufr+j,”ET_getParamList env._major=%d\r\n”,env._major);

if ( env._major != CORBA_NO_EXCEPTION )

{                                                                               j+=sprintf(bufr+j,”Exception raised=%d\r\n”,1);

handleException( &env );

}

else

{

j+=sprintf(bufr+j,”value.=%d\r\n”,&value->_type);

j+=sprintf(bufr+j,”value.=%d\r\n”,&value->_value);

}

ET_MessageStorage ms;CORBA_long index=1;CORBA_char* message;ET_PhoneNumber phoneNumber;

rereadShortMessage: ET_readShortMessage(et_object,ET_SIM,index,&message,&phoneNumber,&env);

j+=sprintf(bufr+j,”ET_readShortMessage env._major=%d\r\n”,env._major);

if ( env._major != CORBA_NO_EXCEPTION )

{                                                                               j+=sprintf(bufr+j,”Exception raised=%d\r\n”,1);

handleException( &env );

}

else

{

j+=sprintf(bufr+j,”index=%d\r\n”,index);

j+=sprintf(bufr+j,”phoneNumber=%s\r\n”,phoneNumber);

j+=sprintf(bufr+j,”message=%s\r\n”,message);

j+=sprintf(bufr+j,”Going back to reread Short Messages\r\n”);

index=index+1;

goto rereadShortMessage;

}

CORBA_free( et_object );                                   j+=sprintf(bufr+j,”CORBA_free( et_object )=%d\r\n”,1);

j+=sprintf(bufr+j,”SetEvent( hStopEvent )=%d\r\n”,SetEvent( hStopEvent ));

//Sleep( 1000 );                           j+=sprintf(bufr+j,”Sleep( 2000 )=%d\n”,1);

}

else

{                                                                                   j+=sprintf(bufr+j,”Exception raised=%d\r\n”,1);

handleException( &env );

}

CORBA_free( orb );                                                           j+=sprintf(bufr+j,”CORBA_free( orb )=%d\r\n”,1);

}

else

{                                                                                              j+=sprintf(bufr+j,”Exception raised=%d\r\n”,1);

handleException( &env );

}

}

else

{                                                                                                  j+=sprintf(bufr+j,”Could not initialize a link to the terminal.\r\n”);

j+=sprintf(bufr+j,”Check that the terminal is connected to the COM%d port\r\n”,(int)portIndex );

j+=sprintf(bufr+j,”and that the port is not used by any other application\r\n”);

}

j+=sprintf(bufr+j,”sys_pro_stop()=%d\r\n”,sys_pro_stop());

j+=sprintf(bufr+j,”CloseHandle( hStopEvent )=%d\r\n”,CloseHandle( hStopEvent ));

j+=sprintf(bufr+j,”CloseHandle( hLinkReadyEvent )=%d\r\n”,CloseHandle( hLinkReadyEvent ));

j+=sprintf(bufr+j,”CloseHandle( hObserverEvent )=%d\r\n”,CloseHandle( hObserverEvent ));

return bufr;

//   FILE *stream = fopen( “fprintf2”, “w” );

//   fprintf(stream,”%s”,bufr);

//   fclose(stream);

}

void handleException( CORBA_Environment * env_ptr )

{

if ( env_ptr->_major != CORBA_NO_EXCEPTION )

{

char * exp_id = CORBA_exception_id( env_ptr );

// If an exception happened, print id and free it

//        printf( “\nEXCEPTION: %s\n”, exp_id );

if ( strcmp( exp_id, ex_ET_GeneralFailureException ) == 0 )

{

ET_GeneralFailureException * value = (ET_GeneralFailureException *) CORBA_exception_value( env_ptr );

switch( value->reason )

{

case ET_SIM_CARD_MISSING:

//                    printf( “\nSIM card is missing\n” );

break;

case ET_NOT_IN_SERVICE:

//                    printf( “\nNot in service\n” );

break;

case ET_SECURITY_CODE_REQUIRED:

//                    printf( “\nSecurity code is required\n” );

break;

case ET_INVALID_DESTINATION:

//                    printf( “\nInvalid destination\n” );

break;

case ET_NUMBER_TOO_LONG:

//                    printf( “\nNumber too long\n” );

break;

case ET_RESOURCE_RESERVED:

//                    printf( “\nWanted resource is reserved\n” );

break;

case ET_SIM_NOT_READY:

//                    printf( “\nSIM card is not ready\n” );

break;

case ET_INVALID_STATE:

//                    printf( “\nDevice is not in correct state\n” );

break;

case ET_LIMIT_REACHED:

//                    printf( “\nResource limit is reached\n” );

break;

}

}

CORBA_exception_free( env_ptr );

memset( env_ptr, 0, sizeof( CORBA_Environment ));

}

}

Χριστόδουλος Ι. Χατζηλιόντος

Χημ. Μηχ. ΠΕ7

Τεχν. Διευθ. ΤΥΔΕΥΑΚ

Στιγμιότυπο από το λογισμικό Delphi Pascal

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: