Adjust to timer API change, add root makefile

This commit is contained in:
Sergey Lyubka committed 2022-04-13 14:03:00 +01:00
1 parent d630ba743d
commit 186eb998ba
8 files changed
+24 -20

No files matched your search

+115
View File
@@ -0,0 +1,115 @@
#ifndef CERTS_H_
#define CERTS_H_
static const char *s_ca =
"-\n"
"# Note: Amazon ATS endpoint uses this (2018/12/18)\n"
"Subject: C=US, O=Starfield Technologies, Inc., OU=Starfield Class 2 Certification Authority\n"
"Not Before: Jun 29 17:39:16 2004 GMT\n"
"Not After : Jun 29 17:39:16 2034 GMT\n"
"-----BEGIN CERTIFICATE-----\n"
"MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl\n"
"MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\n"
"U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\n"
"NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE\n"
"ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\n"
"ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3\n"
"DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\n"
"8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN\n"
"+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\n"
"X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa\n"
"K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\n"
"1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G\n"
"A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR\n"
"zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0\n"
"YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\n"
"bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\n"
"DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\n"
"L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\n"
"eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\n"
"xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\n"
"VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY\n"
"WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=\n"
"-----END CERTIFICATE-----\n"
"\n"
"# https://www.amazontrust.com/repository/\n"
"Subject: C = US, O = Amazon, CN = Amazon Root CA 1\n"
"Not Before: May 26 00:00:00 2015 GMT\n"
"Not After : Jan 17 00:00:00 2038 GMT\n"
"-----BEGIN CERTIFICATE-----\n"
"MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n"
"ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n"
"b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\n"
"MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\n"
"b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\n"
"ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n"
"9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\n"
"IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\n"
"VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n"
"93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\n"
"jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
"AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\n"
"A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\n"
"U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\n"
"N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\n"
"o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n"
"5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\n"
"rqXRfboQnoZsG4q5WTP468SQvvG5\n"
"-----END CERTIFICATE-----\n"
"\n"
"";
static const char *s_cert =
"-----BEGIN CERTIFICATE-----\n"
"MIIDWjCCAkKgAwIBAgIVAPoY7Fz1DxA+/VgB/GdsOXwg45cRMA0GCSqGSIb3DQEB\n"
"CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t\n"
"IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0yMjA0MTExMjQw\n"
"MTRaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh\n"
"dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvwVAUCWq4PCS0bsU5\n"
"b4meX8klfoyp7yuSkHcPVhBv846TSIh5VeRSR68LOYAYRHaN6C2ybqhb5E42QKRX\n"
"SOA37OFXR3HvcbLF7c7BPkT13kFpymZJA+KUIPZ2Ki2zwWDKi6uP2lZfNxMv9xLo\n"
"8PGuWBCphzadbf4Hi4tGEs2BeXSXRCb4ZaI7gv3DdZHLHJuyrkF040E6flZrXmPv\n"
"dumvmszNZxWl8iIA68Pk7M1npXCr/za9CkIdoeSslKVBY4S0FNSISOxMCMqpV8fS\n"
"w4c8xQ0G4Whxgt1a6sGtm6TBGB1CjbAvQNyLWFeL2U8RRbG82xo5GYuemkaodCvH\n"
"/sBRAgMBAAGjYDBeMB8GA1UdIwQYMBaAFMdnILw/0ZLaKJ2dH2GZTXKu0ciZMB0G\n"
"A1UdDgQWBBQahyFNkNwZFKmVi+c6uWW9Iif95TAMBgNVHRMBAf8EAjAAMA4GA1Ud\n"
"DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAb4Tlb2kvWcv5Dz4kCc43AFbA\n"
"Jv1MHwltznedpiyAyqXGU8s6UJCrhHKpjABHHcigkCD3iUlxLMTNhzEuTNBR1zfS\n"
"PMVP5EVmzOSRGvQNvhURRGkGVlNytv4VHTzaZUcuqhqNvw/Slvo0i2vlAPK0VIKQ\n"
"EPNle86zpUypAf2UlyrOT5vD1s7x5HmoHiKdUMqEiB6G/rack4vtUpA2V8fugKrH\n"
"QmBVXWHqTbpTUbqPk3PxmV1zqt5C9ZRVjjIDvW+Hl2zfVEoVq8l6BcLZmxFUnvA/\n"
"/aBWQ3k+V1fg3dUck3OCRGMsYYgBsvey6X+9oa+JFZh5mFtjA45C2SRtYtLesQ==\n"
"-----END CERTIFICATE-----\n"
"";
static const char *s_key =
"-----BEGIN RSA PRIVATE KEY-----\n"
"MIIEowIBAAKCAQEAr8FQFAlquDwktG7FOW+Jnl/JJX6Mqe8rkpB3D1YQb/OOk0iI\n"
"eVXkUkevCzmAGER2jegtsm6oW+RONkCkV0jgN+zhV0dx73Gyxe3OwT5E9d5Bacpm\n"
"SQPilCD2diots8Fgyourj9pWXzcTL/cS6PDxrlgQqYc2nW3+B4uLRhLNgXl0l0Qm\n"
"+GWiO4L9w3WRyxybsq5BdONBOn5Wa15j73bpr5rMzWcVpfIiAOvD5OzNZ6Vwq/82\n"
"vQpCHaHkrJSlQWOEtBTUiEjsTAjKqVfH0sOHPMUNBuFocYLdWurBrZukwRgdQo2w\n"
"L0Dci1hXi9lPEUWxvNsaORmLnppGqHQrx/7AUQIDAQABAoIBAHX/c6QALoZC2uHI\n"
"/ODy4ZJS/NkPfaEZ0kc0drr1LVP8UVzQ9c+AuyoCtqLyl+2zCWV83DFP2fjX7yq9\n"
"e5iedOsXPrM6ZGQ+EaiRYJ6dD++CqKg+Gy4qTZTmDJKI/uYQjsttumF6VULX1yn8\n"
"19VM7vX+ajFndmN71XF7XqZNOWwS4kEk5znQ7oesMOzPazRDsdJmCCnvVc4h99jJ\n"
"IYOtCs9s2aLoSD/7lATKaVquuRNBdkcWmKqc3vYMUQwjk14ID7t31TBZtlLJC+Df\n"
"tn+LCH1C0cuTq86VV17lc9ObTj/xkc8tb3OEYAv8E7rOioJVKU6EMViGa0oJk1+f\n"
"tW6hqYECgYEA1GR0z69HzeGZun2ZbjX7DC8EPAI4PZY5EZ1O7RZQorLLKP7R+9sg\n"
"KtgSJwtKAgpi84I0iuMbE2VciCYfXao+UpWLxkAPZkAt6qcMGJ0kYVd42n0Rwesh\n"
"8bd/r6ojSnj0DY7zAsoXctdQiNDiGmCyrDvWqmGuM6XCDcuzlG4LbkMCgYEA09cq\n"
"tSDyZowGWafKIDW4JXLE3PQdJStM3hAmNisrx0mRB7HmNgs3gR4/L4giZnE2hI+O\n"
"6IofiLjDjSmenWkvWw8Jy/QrhWpAuWlfeEpHaN910IXemFyqzMz0jL9s/Bn4BOYQ\n"
"WiqV19Pj4EjSrum76e17mBNq8vc72C4wXS3gj9sCgYB2q/KAoIVUSbtlcgwqgkrV\n"
"Uefhx7O45ZjZeLXCzvcbER9mtoqJWLQufDAYVLxzS25idNv6xk44ligPgo1//kF4\n"
"T0qb6OsxzKZbOB8QGa1cHk3OdpdXbJO4xTi45C13zQFAGiE568USS7AZ4eyTpHfw\n"
"uDaHWLDG9tTodGrQgnQslQKBgFvdPwP1Gakmp8pRXPHC2exDbON0aP8pW9ggoLF0\n"
"3zM4z8/Kcc6V5qfzeese2ewaxE2QA6UL4MjldsfMeKBCcOrIBrOPWyAsB41gCKqd\n"
"a4IrBWg75V+lL9xINPSkPprEmC1np0eyl/BUTsmASvzXF0pGVgaIxSQ/2o/Q1+BQ\n"
"eMVpAoGBALiFGVLxSow60Cve7BRaUuKa+pfqPeuCW+bSLD5hy6hQeHInUtRJT7tW\n"
"NFC8y7zUpKRCENCqXbBsYe1x2HEdGtDv9NV4vjcvF63Dj90ZZVXQkSiLXkWvJu76\n"
"7sRX7dX2coR6LlQ+zwwkyDIh2wP2MAWXbYLeG8xbLp8a2ybueSZl\n"
"-----END RSA PRIVATE KEY-----\n"
"";
#endif
+108
View File
@@ -0,0 +1,108 @@
// Copyright (c) 2020 Cesanta Software Limited
// All rights reserved
#include "certs.h"
#include "mongoose.h"
struct mg_mgr mgr;
static const char *s_debug_level = "3";
static time_t s_boot_timestamp = 0;
static struct mg_connection *s_sntp_conn = NULL;
static const char *s_url =
"mqtts://a3nkain3cvvy7l-ats.iot.us-east-1.amazonaws.com";
static const char *s_rx_topic = "d/rx";
static const char *s_tx_topic = "d/tx";
static int s_qos = 1;
static int s_connected = 0;
static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
if (ev == MG_EV_OPEN) {
// c->is_hexdumping = 1;
} else if (ev == MG_EV_ERROR) {
// On error, log error message
MG_ERROR(("%p %s", c->fd, (char *) ev_data));
} else if (ev == MG_EV_CONNECT) {
// Set up 2-way TLS that is required by AWS IoT
struct mg_tls_opts opts = {.ca = s_ca, .cert = s_cert, .certkey = s_key};
mg_tls_init(c, &opts);
} else if (ev == MG_EV_MQTT_OPEN) {
// MQTT connect is successful
struct mg_str topic = mg_str(s_rx_topic);
MG_INFO(("Connected to %s", s_url));
MG_INFO(("Subscribing to %s", s_rx_topic));
mg_mqtt_sub(c, topic, s_qos);
c->label[0] = 'X'; // Set a label that we're logged in
} else if (ev == MG_EV_MQTT_MSG) {
// When we receive MQTT message, print it
struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
MG_INFO(("Received on %.*s : %.*s", (int) mm->topic.len, mm->topic.ptr,
(int) mm->data.len, mm->data.ptr));
} else if (ev == MG_EV_POLL && c->label[0] == 'X') {
static unsigned long prev_second;
unsigned long now_second = (*(unsigned long *) ev_data) / 1000;
if (now_second != prev_second) {
struct mg_str topic = mg_str(s_tx_topic), data = mg_str("{\"a\":123}");
MG_INFO(("Publishing to %s", s_tx_topic));
mg_mqtt_pub(c, topic, data, s_qos, false);
prev_second = now_second;
}
}
}
// We have no valid system time(), and we need it for TLS. Implement it
time_t time(time_t *tp) {
time_t t = s_boot_timestamp + k_uptime_get() / 1000;
if (tp != NULL) *tp = t;
return t;
}
// SNTP callback. Modifies s_boot_timestamp, to make time() correct
static void sfn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
if (ev == MG_EV_SNTP_TIME) {
int64_t t = *(int64_t *) ev_data;
MG_INFO(("Got SNTP time: %lld ms from epoch", t));
s_boot_timestamp = (time_t) ((t - mg_millis()) / 1000);
// We need correct time in order to get HTTPs working, therefore,
// making https request from SMTP callback
if (!s_connected) {
MG_INFO(("Connecting to : [%s]", s_url));
struct mg_mqtt_opts opts = {.clean = true};
mg_mqtt_connect(&mgr, s_url, &opts, fn,
NULL); // Create client connection
s_connected = 1;
}
} else if (ev == MG_EV_CLOSE) {
s_sntp_conn = NULL;
}
}
// Periodic timer syncs time via SNTP
static void timer_fn(void *arg) {
struct mg_mgr *mgr = (struct mg_mgr *) arg;
if (s_sntp_conn == NULL) s_sntp_conn = mg_sntp_connect(mgr, NULL, sfn, NULL);
if (s_boot_timestamp < 9999) mg_sntp_send(s_sntp_conn, time(NULL));
}
// Use Zephyr's printk() for Mongooose MG_* logging
static void logfn(const void *ptr, size_t len, void *userdata) {
printk("%.*s", (int) len, (char *) ptr);
}
int main(int argc, char *argv[]) {
mg_log_set(s_debug_level);
mg_log_set_callback(logfn, NULL);
mg_mgr_init(&mgr);
mg_timer_add(&mgr, 5000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, &mgr);
// Start infinite event loop
MG_INFO(("Mongoose version : v%s", MG_VERSION));
mg_http_connect(&mgr, s_url, fn, NULL); // Create client connection
for (;;) mg_mgr_poll(&mgr, 1000);
mg_mgr_free(&mgr);
return 0;
}