How to get a JSON payload from a php page using a MKR1010?

Hello guys,

So I've been struggling on this for a while. My goal is to create an alarm using the MKR 1010, by in the first time getting the local current time from SSID, and then comparing it to a JSON payload.
However, I cannot seem to get the payload right. I've tried a lot of things but none of them have worked.
Please bear with me, I'm quite new to coding !
Right now I do have a JSON payload which URL is http://hiddendomainname.com/post/json/json_playload.php.

It is structured as such :

Screenshot_2021-10-19_18-02-30

Here's my code so far :


#include <SPI.h>
#include <WiFiNINA.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>
#include <ArduinoHttpClient.h>


int status = WL_IDLE_STATUS;
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;            // your network key Index number (needed only for WEP)
int setTime = 0;
int motorPin = 3;

char serverAddress[] = "hiddendomainname.com";  
int port = 80;
WiFiClient wifi;
HttpClient client= HttpClient(wifi, serverAddress, port);

unsigned int localPort = 2390;      // local port to listen for UDP packets

IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server

const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP

WiFiUDP Udp;
WiFiServer server(80);

void setup() {

  // Open serial communications and wait for port to open:

  Serial.begin(9600);
  pinMode(motorPin, OUTPUT);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

  }

  // check for the WiFi module:

  if (WiFi.status() == WL_NO_MODULE) {

    Serial.println("Communication with WiFi module failed!");

    // don't continue

    while (true);

  }

  String fv = WiFi.firmwareVersion();

  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {

    Serial.println("Please upgrade the firmware");

  }

  // attempt to connect to Wifi network:

  while (status != WL_CONNECTED) {

    Serial.print("Attempting to connect to SSID: ");

    Serial.println(ssid);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:

    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:

    delay(10000);

  }

  Serial.println("Connected to wifi");

  printWifiStatus();

  Serial.println("\nStarting connection to server...");

  Udp.begin(localPort);
}

void loop() {

  sendNTPpacket(timeServer); // send an NTP packet to a time server

  // wait to see if a reply is available

  delay(1000);

  if (Udp.parsePacket()) {

    Serial.println("packet received");

    // We've received a packet, read the data from it

    Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,

    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);

    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);

    // combine the four bytes (two words) into a long integer

    // this is NTP time (seconds since Jan 1 1900):

    unsigned long secsSince1900 = highWord << 16 | lowWord;

    Serial.print("Seconds since Jan 1 1900 = ");

    Serial.println(secsSince1900);

    // now 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 seventyYears = 2208988800UL;

    // subtract seventy years:

    unsigned long epoch = secsSince1900 - seventyYears;

    // print Unix time:

    Serial.println(epoch);

    // print the hour, minute and second:

    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)

    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)

    Serial.print(':');

    if (((epoch % 3600) / 60) < 10) {

      // In the first 10 minutes of each hour, we'll want a leading '0'

      Serial.print('0');

    }

    Serial.println((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    
    WiFiClient client = server.available();   // listen for incoming clients
  
    setTime = collect();

    if (epoch == setTime)
    {
        digitalWrite(motorPin, HIGH); // activate the motor
    }
    if (collect() == 0)
    {
        digitalWrite(motorPin, LOW);  // deactivate the motor
    }
    
  }

  // wait 30 seconds before asking for the time again

  delay(30000);

}

int collect() {
  Serial.println("making GET request");
  String request = "/post/json/json_payload.php"; //url of what we need on our server
  client.beginRequest();
  client.get(request);
  client.endRequest();
  //  read the status code and body of the response
  int statusCode = client.responseStatusCode(); 
  String response = client.responseBody();

  Serial.println(statusCode);
    //Serial.println(response);
   //Serial.println(response);
  Serial.flush();

  DynamicJsonDocument doc(450);
  String json = response;
          
  // Deserialize the JSON document
  DeserializationError error = deserializeJson(doc, json);

  // Test if parsing succeeds.
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return (0);
  }

  int jsonId = doc["id"];
  int jsonTime= doc["time"];


  // Print values.
  Serial.println(jsonId);
  Serial.println(jsonTime);

  return (jsonTime);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address) {

  //Serial.println("1");

  // set all bytes in the buffer to 0

  memset(packetBuffer, 0, NTP_PACKET_SIZE);

  // Initialize values needed to form NTP request

  // (see URL above for details on the packets)

  //Serial.println("2");

  packetBuffer[0] = 0b11100011;   // LI, Version, Mode

  packetBuffer[1] = 0;     // Stratum, or type of clock

  packetBuffer[2] = 6;     // Polling Interval

  packetBuffer[3] = 0xEC;  // Peer Clock Precision

  // 8 bytes of zero for Root Delay & Root Dispersion

  packetBuffer[12]  = 49;

  packetBuffer[13]  = 0x4E;

  packetBuffer[14]  = 49;

  packetBuffer[15]  = 52;

  //Serial.println("3");

  // all NTP fields have been given values, now

  // you can send a packet requesting a timestamp:

  Udp.beginPacket(address, 123); //NTP requests are to port 123

  //Serial.println("4");

  Udp.write(packetBuffer, NTP_PACKET_SIZE);

  //Serial.println("5");

  Udp.endPacket();

  //Serial.println("6");
}

void printWifiStatus() {

  // print the SSID of the network you're attached to:

  Serial.print("SSID: ");

  Serial.println(WiFi.SSID());

  // print your board's IP address:

  IPAddress ip = WiFi.localIP();

  Serial.print("IP Address: ");

  Serial.println(ip);

  // print the received signal strength:

  long rssi = WiFi.RSSI();

  Serial.print("signal strength (RSSI):");

  Serial.print(rssi);

  Serial.println(" dBm");
}

And the monitor writes :

Please upgrade the firmware
Attempting to connect to SSID: FreeBox
Connected to wifi
SSID: FreeBox
IP Address: 192.168.0.19
signal strength (RSSI):-64 dBm

Starting connection to server...
packet received
Seconds since Jan 1 1900 = 3843648666
Unix time = 1634659866
The UTC time is 16:11
making GET request
-3

Also the loop runs very slow (about 70 seconds instead of 30) and I don't know why, and that could be a problem.

Thanks in advance, my brain is really frying on this one... :sweat_smile:

Maybe there is confusion between the global variable 'client' which is connected to the external server and the local variable named 'client' that is accepting incoming connections.

Do you mean that I should change their name or that there is a flaw in my logic ?

I can't try it out at the moment as I'm not home

I changed my code to parse the php page and not just the JSON because I could'nt understand what was going on.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.