Separate library that holds helper functions for the main OMF code.

Revision:
0:6156b29d3c91
Child:
1:1c31b413ba0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/osisoft-omf.cpp	Mon Jan 22 17:11:34 2018 +0000
@@ -0,0 +1,141 @@
+//Copyright 2017 OSIsoft, LLC
+//
+//Licensed under the Apache License, Version 2.0 (the "License");
+//you may not use this file except in compliance with the License.
+//You may obtain a copy of the License at
+//
+//<http://www.apache.org/licenses/LICENSE-2.0>
+//
+//Unless required by applicable law or agreed to in writing, software
+//distributed under the License is distributed on an "AS IS" BASIS,
+//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//See the License for the specific language governing permissions and
+//limitations under the License.
+
+#include "osisoft-omf.h"
+#include "mbed.h"
+#include "https_request.h"
+#include "ntp-client/NTPClient.h"
+#include "omf-config.h"
+
+// ---------------------------------------------------------------------------------------------------
+
+// The clock is set usign NTP; if that fails, the clock defaults to the below time
+const int DEFAULT_HARD_CODED_UTC_TIME = 1513175347;
+
+// ---------------------------------------------------------------------------------------------------
+
+// ************************************************************************
+// Helper function: prints out an HTTP response
+// ************************************************************************
+ 
+void dump_response(HttpResponse* res)
+{
+    printf("\n----- HTTPS POST response -----\n");
+    // Print the status code
+    mbedtls_printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str());
+    // Print the headers
+    mbedtls_printf("Response headers:\n");
+    for (size_t ix = 0; ix < res->get_headers_length(); ix++) {
+        mbedtls_printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str());
+    }
+    // Print the body
+    mbedtls_printf("Response body (%d bytes):\n\n%s", res->get_body_length(), res->get_body_as_string().c_str());
+}
+
+// ************************************************************************
+// Helper function that casts floats into strings
+// ************************************************************************
+
+string OMFLib_float_to_string(float f) {
+    char buffer[20];
+    int n = sprintf (buffer, "%f", f);
+    return string(buffer);
+}
+
+// ************************************************************************
+// Helper function that sends an actual web request
+// ************************************************************************
+
+//void OMFLib_sendMessageToEndpoint(NetworkInterface* network, const char* action, const char* message_type, const char* body) { // Old: doesn't re-use sockets
+void OMFLib_sendMessageToEndpoint(TLSSocket* socket, const char* action, const char* message_type, const char* body) {
+    printf("\n----- HTTPS POST request -----\n");
+    
+    // Create the new request
+    //HttpsRequest* post_req = new HttpsRequest(network, SSL_CA_PEM, HTTP_POST, TARGET_URL); // Old: doesn't re-use sockets
+    HttpsRequest* post_req = new HttpsRequest(socket, HTTP_POST, TARGET_URL);
+
+    // Turn on debugging - this hides TLS connection information
+    post_req->set_debug(true);
+
+    // Add headers: content type and authentication
+    post_req->set_header("Content-Type", "application/json");
+
+    // Set OMF headers
+    post_req->set_header("producertoken", PRODUCER_TOKEN);
+    post_req->set_header("messagetype", message_type);
+    post_req->set_header("action", action);
+    post_req->set_header("messageformat", "JSON");
+    post_req->set_header("omfversion", "1.0");
+        
+    // Send the body
+    printf("Now sending request...");
+    printf("\nOutgoing message headers:\n\tmessagetype: %s\n\taction: %s", message_type, action);
+    printf("\nOutgoing message body:\n\t%s\n", body);
+    HttpResponse* post_res = post_req->send(body, strlen(body));
+
+    // Check the response for an error
+    if (!post_res) {
+        printf("HttpRequest failed (error code %d)\n", post_req->get_error());
+        printf("Socket connection status after error: %d\n", socket->connected());
+        //return 1;
+    } else {
+        // Print the response
+        dump_response(post_res);
+    }
+
+    // Free up the request object
+    delete post_req;
+}
+
+// ************************************************************************
+// Gets the current time in the appropriate OMF format
+// ************************************************************************
+
+string OMFLib_getCurrentTimeString() {
+    // Declar vars
+    char timestampBuffer[80];
+    time_t now;
+    struct tm ts;
+    
+    // Get the current time
+    time(&now);
+    
+    // Cast the current time into the correct format
+    ts = *localtime(&now);
+    strftime(timestampBuffer, sizeof(timestampBuffer), "%Y-%m-%dT%H:%M:%SZ", &ts);
+    
+    // Return the result
+    return string(timestampBuffer);
+}
+
+// ************************************************************************
+// Sets the clock via NTP via the nwtwork
+// ************************************************************************
+
+void OMFLib_syncClockViaNTP(NetworkInterface* network) {
+    // Hard-code a start time... see https://www.epochconverter.com/   
+    set_time(DEFAULT_HARD_CODED_UTC_TIME);
+    
+    printf("\n----- Setting internal clock -----\n");
+    // See https://github.com/ARMmbed/ntp-client-example/blob/master/main.cpp
+    
+    NTPClient ntp(network);
+    time_t timestamp = ntp.get_timestamp();
+    if (timestamp > 0) {
+        set_time(timestamp);
+        printf("Clock set via NTP to UTC %s", ctime(&timestamp));
+    } else {
+        printf("NTP time sync failed; clock set to %i UTC seconds.", DEFAULT_HARD_CODED_UTC_TIME);
+    }
+}
\ No newline at end of file