PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C/C++] Raspi Systemzeit: aus Internet geupdated oder von File gelesen und expoliert?



HaWe
23.04.2016, 14:01
hallo,
wie ist das mit der Raspi Systemzeit:
wie kann ich aus einem C/C++ Programm feststellen, ob die derzeit ermittelte Systemzeit übers Internet geupdated wurde oder ob (ohne Internet) ein alter gesicherter Wert von einem SD-File gelesen und expoliert wurde?

Gibt es so etwas wie ein Raspi system flag wie
_SYSTEMTIME_UPDATED_ // (1==current time updated, 0==last time base read from file)
:?:

Oder kann man selber auf andere Weise per Software feststellen, wie "zuverlässig" die momentane System-Zeit ist ?

Peter(TOO)
23.04.2016, 14:29
Hallo,

Oder kann man selber auf andere Weise per Software feststellen, wie "zuverlässig" die momentane System-Zeit ist ?

Du kannst die lokale Zeit mit der Zeit im Internet vergleichen.
Hört sich jetzt blöd an.

Aber wenn du kein Internet hast, kann die aktuelle Zeit nicht aus dem Internet stammen.
Andernfalls kannst du direkt vergleichen ob die Zeit stimmt.

Neben dem Internet, bekommt man die Atomzeit auch über einen DCF 77 Empfänger oder vom GPS, sofern vorhanden.

MfG Peter(TOO)

HaWe
23.04.2016, 14:38
das ist zwar richtig - aber es könnte ja auch sein, dass die letzte Systemzeit vor - sagen wir - 2 Stunden aus dem Internet geholt wurde, und nur momentan kein Internet vorhanden ist. Trotzdem wird sie dann stimmen.

Extra Hardware ist momentan für diese Fragestellung keine Option.

Immerhin ist es ein erster Schritt mit dem Versuch der Internet-Zeitabfrage -
wie mache ish das denn genau (C/C++ Code), was du vorschlägst?

Mxt
23.04.2016, 14:39
Hallo,

laut dieser Doku
http://manpages.ubuntu.com/manpages/precise/en/man2/ntp_gettime.2freebsd.html
müsste bei ntp_gettime() der Rückgabewert TIME_ERROR kommen, wenn

Clock not synchronized

Ob das sicher funktioniert, kann ich nicht sagen. Auf der Kommandozeile sehe ich bei meinem Raspi ein paar Merkwürdigkeiten.

Ein
timedatectl status
liefert falscherweise "NTP enabled : no" und erst nach einiger Laufzeit "NTP synchronized : yes".

Sicherer scheint ein
ntpq -p
wenn da Einträge mit einem (Sekunden-)Wert in der "when" Spalte stehen, hat er mit diesem Server gesprochen.

HaWe
23.04.2016, 15:13
sorry, verstehe ich nicht ganz... :(

könntest du das bitte mal in C/C++ Code beschreiben?

so in der Art?


#include <stdio.h>
#include <sys/timex.h>

int main() {
// ...?
// ...?
printf("Zeit zuletzt aktualisiert per Internet (ja/nein) %d", ntp_gettime() );

getchar();
return 0;

}


grrrrr... wieder keine Code-Tags... :mad:


irgendwas scheint aber noch zu fehlen...:

error: too few arguments to function ntp_gettime()



ein timex t als Argument nimmt er auch nicht:

timex t;
..
printf("Zeit zuletzt aktualisiert per Internet (ja/nein) %d", ntp_gettime(t) );

Mxt
23.04.2016, 15:15
Ja, da bist du schon auf dem richtigen Weg. Die Klammern habe ich geschrieben, um zu zeigen, dass das eine Funktion ist. Da müssen schon die Parameter rein.

Beispiel ist C++ ! Übersetzen mit g++ -std=c++11


#include <sys/timex.h>
#include <iostream>

using namespace std;

int main()
{
ntptimeval dummy;

int result = ntp_gettime(&dummy);

if (result == TIME_OK) {
cout << "Hat Netzzeit" << endl;
}
else if (result == TIME_ERROR) {
cout << "Keine Netzzeit" << endl;
}
else {
cout << "Was anderes" << endl;
}

return 0;
}


Nur ob das sich auch richtig verhält, wenn keine Netzzeit da ist, darfst du selber ausprobieren.

HaWe
23.04.2016, 15:24
danke, c++11 geht schlecht, aber g++ nehme ich auch immer schon!
ich probiers mal mit dem normalen g++ aus...

- - - Aktualisiert - - -

Haha...!
sieht verdammt gut aus...


Hat Netzzeit

jetzt wird mal abgeklemmt und neu gestartet... 8-)

- - - Aktualisiert - - -

hmmmm... schade.

Auch nach runterfahren, Strom aus, Wifi raus, Strom rein, Neustart....

auch ohne inet sagt er leider wieder


Hat Netzzeit

Mxt
23.04.2016, 15:35
Da bin ich jetzt leider überfragt. Notfalls musst du die Sourcen von ntpq durchsuchen. Oder das Programm aus deinem aufrufen und die Ausgabe zerlegen ...

HaWe
23.04.2016, 15:35
-std=c++11
hab ich jetzt auch ausprobiert, macht aber keinen Unterschied, angeblich immer "hat Netzzeit"

Vlt hat noch wer eine Idee?

Vielen Dank aber für deine Hilfe!

HaWe
23.04.2016, 19:37
wie kann ich von einem C/C++ Programm aus feststellen, ob eine Internetverbindung besteht (z.B. irgendwas anpingen) ?

Mxt
24.04.2016, 07:58
(z.B. irgendwas anpingen) ?

Hallo,
eine andere Lösung finde ich über Google auch nicht. Im Gegensatz zu Windows scheint Linux dafür keine fertige Betriebssystemfunktion zu haben.

HaWe
24.04.2016, 09:32
ping als Linux-Konsolen-Kommando funktioniert ja, z.B.

ping 216.58.209.99
(== Google.de)
- mehr bräuchte ich ja gar nicht!
Nur ob es klappt würde schon reichen, ohne weitere Details.

Ich brauche das eben nur auf C/C++ - Sourcecode-Ebene.

(@Peter-2: wie hattest du es denn vor in deinem 2. Post hier im Topic?
Oder war das nur eine vage Idee ohne genaue Kenntnis, wie man das macht?)

ps,
was ich brauche, ist kein ping Monster-Code, sondern notfalls eine Lib, die ich #includen kann, und dann eine dort implementierte Funktion nutze, in der Art

#include <tcptools.h>

//...
int i = ping("216.58.209.99"); // i<=0: error, i>0: success
printf("%d \n", i);
//...

Mxt
24.04.2016, 09:47
Du kannst das Kommdozeilen ping auch aus deinem Programm aufrufen.

So wie hier im ersten Listing
http://ubuntuforums.org/showthread.php?t=1803980

HaWe
24.04.2016, 13:53
super gut! :D
schon das erste Beispielprogramm funktioniert auf Anhieb!


if (system("ping -c1 -s1 www.google.com"))
{
cout<<"There is no internet connection \n";
}



perfekt!

Tausend Dank!

- - - Aktualisiert - - -

so, isch 'abe fertig! :p

jetzt kann ich mit diesen Programmfunktionen die Internet-Verbindung überprüfen und die augenblickliche Systemzeit vorformatiert abfragen



#include <iostream>
#include <stdio.h>
#include <time.h>
#include <string.h>


void getdatetime(int &year, int &mon, int &day, int &hour, int &min, int &sec, int &dow) {
time_t t = time(NULL);
struct tm tm = * localtime(&t);

year = (int)tm.tm_year+1900-2000,
mon = (int)tm.tm_mon+1;
day = (int)tm.tm_mday;
hour = (int)tm.tm_hour;
min = (int)tm.tm_min;
sec = (int)tm.tm_sec;
dow = (int)tm.tm_wday+1;

}


int main()
{
char sbuf[100];

int year, mon, day, hour, min, sec, dow;


if (system( "ping -c1 -s1 www.google.de") ) {
printf("internet connx failed \n");
}
else {
printf("internet connx OK ! :) \n");
}

getdatetime(year, mon, day, hour, min, sec, dow) ;
sprintf( sbuf, "%d %d %d %d %d %d %d", year, mon, day, hour, min, sec, dow );
printf(sbuf);

getchar();
return 0;
}


und die ermittelten date/time Integerwerte dann verwenden, um ggf meine RTC nicht nur manuell, sondern auch automatisch per inet zu synchronisieren....



/*
*
* RTC DS3231
*
* test demo
* ver 0001
*
*/


#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>

#include <wiringPi.h>
#include <wiringPiI2C.h>

#define byte uint8_t

// RTC DS3231
#define ADDR_RTCDS3231 0x68
int frtcds3231;



//================================================== ===================================
// Convert normal decimal numbers to binary coded decimal
//================================================== ===================================
byte decToBcd(byte val) { return( (val/10*16) + (val%10) ); }


//================================================== ===================================
// Convert binary coded decimal to normal decimal numbers
//================================================== ===================================
byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); }


//================================================== ===================================




void setDS3231time( byte year, byte month, byte dayOfMonth, byte hour, byte
minute, byte second, byte dayOfWeek)
{
// sets time and date data to DS3231

wiringPiI2CWriteReg8(frtcds3231, 0, decToBcd(second)); // set seconds
wiringPiI2CWriteReg8(frtcds3231, 1, decToBcd(minute)); // set minutes
wiringPiI2CWriteReg8(frtcds3231, 2, decToBcd(hour)); // set hours
wiringPiI2CWriteReg8(frtcds3231, 3, decToBcd(dayOfWeek)); // ( 1=Sunday, 7=Saturday)
wiringPiI2CWriteReg8(frtcds3231, 4, decToBcd(dayOfMonth)); // set dayOfMonth (1 to 31)
wiringPiI2CWriteReg8(frtcds3231, 5, decToBcd(month)); // set month
wiringPiI2CWriteReg8(frtcds3231, 6, decToBcd(year)); // set year (0 to 99)

}


//================================================== ===================================



int main() {
int year, month, dayOfMonth, hour, minute, second, dayOfWeek;
int i=0, check;
char sbuf[100];

frtcds3231 = wiringPiI2CSetupInterface( "/dev/i2c-0", ADDR_RTCDS3231 );

printf(" RTC DS3231 \n");
printf("Set new Date/Time: enter 1\n");
printf("else: display time\n\n");

i = getchar();

//debug
//printf("%d \n", i);

while (i=='1') {
// get string yy mm dd hh mm ss dw : gets() ?
printf("yy mm dd hh mm ss dw (DayOfWeek) \n");
check=scanf("%d %d %d %d %d %d %d", &year, &month, &dayOfMonth, &hour, &minute, &second, &dayOfWeek);

getchar();
printf("check=%d\n", check);

if(check==7) {
printf("%d \n", year);
printf("%d \n", month);
printf("%d \n", dayOfMonth);
printf("%d \n", hour);
printf("%d \n", minute);
printf("%d \n", second);
printf("%d \n", dayOfWeek);
setDS3231time( year, month, dayOfMonth, hour, minute, second, dayOfWeek );
}

printf(" RTC DS3231 \n");
printf("Set new Date/Time: enter 1\n");
printf("else: display time\n\n");
i=0;
i = getchar();

}



while(1) {
second = bcdToDec(wiringPiI2CReadReg8 (frtcds3231, 0) & 0x7f );
minute = bcdToDec(wiringPiI2CReadReg8 (frtcds3231, 1) );
hour = bcdToDec(wiringPiI2CReadReg8 (frtcds3231, 2) & 0x3f );
dayOfWeek = bcdToDec(wiringPiI2CReadReg8 (frtcds3231, 3) );
dayOfMonth = bcdToDec(wiringPiI2CReadReg8 (frtcds3231, 4) );
month = bcdToDec(wiringPiI2CReadReg8 (frtcds3231, 5) );
year = bcdToDec(wiringPiI2CReadReg8 (frtcds3231, 6) );
-
sprintf(sbuf, "20%02d/%02d/%02d %02d:%02d:%02d", year, month, dayOfMonth, hour, minute, second);
printf(sbuf);

printf(" Day of week %1d: ", dayOfWeek);
switch(dayOfWeek){

case 1:
printf("Sunday");
break;
case 2:
printf("Monday");
break;
case 3:
printf("Tuesday");
break;
case 4:
printf("Wednesday");
break;
case 5:
printf("Thursday");
break;
case 6:
printf("Friday");
break;
case 7:
printf("Saturday");
break;
}
printf("\n");

delay (1000);


}

return (0);
}




das war der Sinn des ganzen!

tausend Dank nochmal Mxt für deine Hilfe!

:cool: