In this example, you will use your MKR NB 1500, to query a Network Time Protocol (NTP) server. In this way, your board can get time from Internet.
antenna
SIM card enable for Data
/*H******************************************************* Udp NTP Client Get time from a Network Time Protocol (NTP) time server Demonstrates use of UDP sendPacket and ReceivePacket For more on NTP time servers and messages needed to communicate with m, see http://en.wikipedia.org/wiki/Network_Time_Protocol created 4 Sep 2010 by Michael Margolis modified 9 Apr 2012 by Tom Igoe modified 6 Dec 2017 ported from WiFi101 to MKRGSM by Arturo Guadalupi ********************************************************/ #include <MKRNB.h> #include "arduino_secrets.h" //************************* DEFINES ************************************ #define BAUD 9600 typedef unsigned long ulong; typedef unsigned int uint; //************************* PROTOTYPES ************************************ ulong sendNTPpacket( IPAddress& address); //************************* VARIABLES ************************************ // UDP INSTANCE TO SEND AND RECEIVE PACKETS OVER UDP NBUDP Udp; NBClient Client; // INITIALIZE LIBRARY INSTANCE GPRS Gprs; NB nbAccess; // ENTER SENSITIVE DATA IN Secret tab OR arduino_secrets.h PIN NUMBER const char PINNUMBER[] = SECRET_PINNUMBER; uint localPort = 2390; // LOCAL PORT TO LISTEN FOR UDP PACKETS IPAddress timeServer( 129, 6, 15, 28); // time.nist.gov NTP server const int NTPPKTSIZ = 48; // NTP TIME STAMP IN MSG FIRST 48 BYTES byte PktBuff[NTPPKTSIZ]; // INCOMING AND OUTGOING PACKETS /*F******************************************************************** * **********************************************************************/ void setup() { // Open serial communications and wait for port to open: Serial.begin( BAUD ); while( !Serial ) { ; } // WAIT FOR SERIAL PORT TO CONNECT. (FOR NATIVE USB PORT ONLY) Serial.println( "Starting Arduino GPRS NTP client."); boolean connected = false; // CONNECTION STATE, LOGIN AND PASSWORD while( !connected ) { // ATTACH SHIELD TO GPRS NETWORK WITH APN if( (nbAccess.begin( PINNUMBER ) == NB_READY) && (Gprs.attachGPRS() == GPRS_READY)) connected = true; else { Serial.println( "Not connected"); delay( 1000 ); } } Serial.println( "\nStarting connection to server..."); Udp.begin( localPort ); // AFTER STARTING MODEM NB.begin() } /*F******************************************************************** * **********************************************************************/ void loop() { sendNTPpacket( timeServer ); // SEND AN NTP PACKET TO TIME SERVER delay( 1000 ); // WAIT TO SEE IF A REPLY IS AVAILABLE if( Udp.parsePacket() ) { Serial.println("packet received"); Udp.read( PktBuff, NTPPKTSIZ ); // READ PACKET // TIMESTAMP(FOUR BYTES) @ RCVD PKT[40] // TWO WORDS, LONG. fIRST, ESXTRACT WORDS: ulong highWord = word( PktBuff[40], PktBuff[41] ); ulong lowWord = word( PktBuff[42], PktBuff[43] ); // JOIN FOUR BYTES (TWO WORDS) INTO LONG INT // THIS IS NTP TIME (SECONDS SINCE jAN 1 1900): ulong secsSince1900 = highWord << 16 | lowWord; Serial.print("Seconds since Jan 1 1900 = " ); Serial.println(secsSince1900); // CONVERT NTP TIME INTO EVERYDAY TIME: Serial.print("Unix time = "); // UNIX TIME STARTS ON JAN 1 1970. IN SECONDS, THAT'S 2208988800: const unsigned long svntyYrs = 2208988800UL; unsigned long epoch = secsSince1900 - svntyYrs;// SUBTRACT SVNTY YRS: Serial.println( epoch ); // PRINT UNIX TIME: // PRINT HOUR, MINUTE AND SECOND Serial.print("The UTC time is "); // UTC IS @ GREENWICH mERIDIAN (GMT) Serial.print( (epoch % 86400L) / 3600);// PNT HR (86400 =SECS PER DAY) Serial.print( ':' ); if( ((epoch % 3600) / 60) < 10 ) Serial.print('0'); // CORRECT LEADING ZRO Serial.print((epoch % 3600) / 60); // PNT MIN (3600 == SECS PER MIN) Serial.print(':'); if( (epoch % 60) < 10 ) Serial.print( '0' ); // FIX LEADING ZRO Serial.println( epoch % 60 ); // PRINT SECOND } delay( 10000 ); // WAIT TEN SECONDS BEFORE ASKING FOR TIME AGAIN } /*F******************************************************************** * SEND AN NTP REQUEST TO TIME SERVER AT GIVEN ADDRESS **********************************************************************/ unsigned long sendNTPpacket( IPAddress& address) { // Serial.println( "1" ); memset( PktBuff, 0, NTPPKTSIZ ); // INIT VALS FOR NTP REQUEST (see URL above for PKT details) // Serial.println("2"); PktBuff[0] = 0b11100011; // LI, Version, Mode PktBuff[1] = 0; // Stratum, or type of clock PktBuff[2] = 6; // Polling Interval PktBuff[3] = 0xEC; // Peer Clock Precision // 8 bytes of zero for Root Delay & Root Dispersion PktBuff[12] = 49; PktBuff[13] = 0x4E; PktBuff[14] = 49; PktBuff[15] = 52; // Serial.println("3"); // ALL NTP FIELDS ARE SET, SEND PACKET REQUESTING TIMESTAMP: Udp.beginPacket( address, 123); // NTP REQUESTS ARE TO PORT 123 // Serial.println( "4" ); Udp.write( PktBuff, NTPPKTSIZ); //Serial.println( "5" ); Udp.endPacket(); //Serial.println( "6" ); }
GPRS Constructor
NBClient Constructor
ready ()
connect ()
beginWrite ()
write ()
endWrite ()
connected ()
read ()
available ()
peek ()
flush ()
stop ()
Arduino MKR NB 1500 - Complete product description.
Getting started with MKR NB 1500 - Get everything set up in minutes.
MKRNB library - Your reference for NB Library.
MKRNBToolsTestGPRS - Tries to access internet over GPRS.