where can I find the sample codes to publish/subscribe using SSL/TLS(mosquitto) in C language for omega2?
-
I want to make the code that publish/subscribe using SSL/TLS(mosquitto).
anyone know that, please let me know.
thanks.
-
@jongrock-chun Here is some code you can use, it is based upon some code by IBM, some is mine but I can't recall how much of it so I left the copyright at the top.
/******************************************************************************* * Copyright (c) 2012, 2020 IBM Corp. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * https://www.eclipse.org/legal/epl-2.0/ * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Ian Craggs - initial contribution *******************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <string.h> #include <syslog.h> #include <signal.h> #include <MQTTAsync.h> #include <json-c/json.h> #include "datadb.h" #include "shared.h" #include "utils.h" #define ADDRESS "ssl://mqtt.myapp.com:8883" #define CLIENTID "myapp" #define TOPIC "myapp/rpt" #define PAYLOAD "myapp Data" #define QOS 1 #define TIMEOUT 10000L #define CA_PATH "/opt/myapp/certs/ca/ca.crt" #define CLIENT_CERT_PATH "/opt/myapp/certs/client/client.crt" #define CLIENT_KEY_PATH "/opt/myapp/certs/client/client.key" int disc_finished = 0; int subscribed = 0; int finished = 0; pid_t process_id = 0; void brag() { syslog(LOG_INFO, "%s v%s\n", PRODUCT_NAME, VERSION); syslog(LOG_INFO, "%s %s\n", COPYRIGHT, COMPANY); } void connlost(void *context, char *cause) { MQTTAsync client = (MQTTAsync) context; MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; int rc; syslog(LOG_INFO, "Connection lost"); if (cause) syslog(LOG_INFO, " cause: %s", cause); syslog(LOG_INFO, "Reconnecting"); conn_opts.keepAliveInterval = 20; conn_opts.cleansession = 1; if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) { syslog(LOG_INFO, "Failed to start connect, return code %d", rc); finished = 1; } } int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_message *message) { ***************** Cut Some Code ************************* parsed_json = json_tokener_parse((char*) message->payload); json_object_object_get_ex(parsed_json, "v", &version); json_object_object_get_ex(parsed_json, "h", &host); syslog(LOG_INFO, "------------------------------------------\n"); syslog(LOG_INFO, "Host: %12s", json_object_get_string(host)); syslog(LOG_INFO, "Version: %12s", json_object_get_string(version)); ***************** Cut Some Code ************************* MQTTAsync_freeMessage(&message); MQTTAsync_free(topicName); return 1; } void onDisconnectFailure(void* context, MQTTAsync_failureData* response) { syslog(LOG_INFO, "Disconnect failed, rc %d\n", response->code); disc_finished = 1; } void onDisconnect(void* context, MQTTAsync_successData* response) { syslog(LOG_INFO, "Successful disconnection"); disc_finished = 1; } void onSubscribe(void* context, MQTTAsync_successData* response) { syslog(LOG_INFO, "Subscribe succeeded"); subscribed = 1; } void onSubscribeFailure(void* context, MQTTAsync_failureData* response) { syslog(LOG_INFO, "Subscribe failed, rc %d, %s", response->code, response->message); finished = 1; } void onConnectFailure(void* context, MQTTAsync_failureData* response) { syslog(LOG_INFO, "Connect failed, rc %d, %s", response->code, response->message); //raise(SIGABRT); finished = 1; } void onConnect(void* context, MQTTAsync_successData* response) { MQTTAsync client = (MQTTAsync) context; MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer; int rc; syslog(LOG_INFO, "Successful connection"); syslog(LOG_INFO, "Subscribing to topic %s for client %s using QoS%d", TOPIC, CLIENTID, QOS); opts.onSuccess = onSubscribe; opts.onFailure = onSubscribeFailure; opts.context = client; if ((rc = MQTTAsync_subscribe(client, TOPIC, QOS, &opts)) != MQTTASYNC_SUCCESS) { syslog(LOG_INFO, "Failed to start subscribe, return code %d", rc); finished = 1; } } int main(int argc, char* argv[]) { MQTTAsync client; MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; MQTTAsync_disconnectOptions disc_opts = MQTTAsync_disconnectOptions_initializer; MQTTAsync_SSLOptions ssl_opts = MQTTAsync_SSLOptions_initializer; ssl_opts.enableServerCertAuth = 1; conn_opts.ssl = &ssl_opts; conn_opts.ssl->trustStore = CA_PATH; conn_opts.ssl->privateKey = CLIENT_KEY_PATH; conn_opts.ssl->keyStore = CLIENT_CERT_PATH; conn_opts.ssl->sslVersion = MQTT_SSL_VERSION_TLS_1_2; int rc; int ch; setlogmask(LOG_UPTO(LOG_DEBUG)); openlog(LOG_NAME, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); ***************** Cut Some Code ************************* pid_t sid = 0; // Create child process process_id = fork(); // Indication of fork() failure if (process_id < 0) { syslog(LOG_INFO, "Fork Failed"); exit(EXIT_FAILURE); } // PARENT PROCESS. Need to kill it. if (process_id > 0) { syslog(LOG_INFO, "process_id of child process %d \n", process_id); exit(EXIT_SUCCESS); } //set new session sid = setsid(); if (sid < 0) { exit(SIGABRT); } // Change the current working directory to root. int r = chdir("/"); // Close stdin. stdout and stderr close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); syslog(LOG_INFO, "Done closing standard files"); syslog(LOG_INFO,"Creating Async Client at URL %s", ADDRESS); if ((rc = MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTASYNC_SUCCESS) { syslog(LOG_INFO, "Failed to create client, return code %d\n", rc); rc = EXIT_FAILURE; goto exit; } syslog(LOG_INFO,"Client done"); if ((rc = MQTTAsync_setCallbacks(client, client, connlost, msgarrvd, NULL)) != MQTTASYNC_SUCCESS) { syslog(LOG_INFO, "Failed to set callbacks, return code %d\n", rc); rc = EXIT_FAILURE; goto destroy_exit; } syslog(LOG_INFO,"Callbacks done"); conn_opts.keepAliveInterval = 20; conn_opts.cleansession = 1; conn_opts.onSuccess = onConnect; conn_opts.onFailure = onConnectFailure; conn_opts.context = client; if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) { syslog(LOG_INFO, "Failed to start connect, return code %d\n", rc); rc = EXIT_FAILURE; goto destroy_exit; } syslog(LOG_INFO,"Connection done"); while (!subscribed && !finished) usleep(30000L); if (finished) goto exit; syslog(LOG_INFO, "About to start the loop\n"); do { //ch = getchar(); usleep(2500L); } while (1==1 && !finished); disc_opts.onSuccess = onDisconnect; disc_opts.onFailure = onDisconnectFailure; if ((rc = MQTTAsync_disconnect(client, &disc_opts)) != MQTTASYNC_SUCCESS) { syslog(LOG_INFO, "Failed to start disconnect, return code %d\n", rc); rc = EXIT_FAILURE; goto destroy_exit; } while (!disc_finished) { usleep(10000L); } destroy_exit: syslog(LOG_INFO, "Destroy_Exit"); MQTTAsync_destroy(&client); exit: syslog(LOG_INFO, "Exiting"); close_db(); closelog(); return rc; }
-
@crispyoz thanks a lot again.
I'll post the result here after executing the above code.