- Print
- PDF
Cloud IoT Core example codes
- Print
- PDF
Available in Classic and VPC
This page provides example codes for publishing messages and subscribing to the Cloud IoT Core server based on the MQTT protocol, using certificates downloaded from the Cloud IoT Core console.
Java
An example code to access Cloud IoT Core, repeat publish and subscribe messages 5 times, and end the program. The messages are published on the factory/room1/temperature
topic, and the alert topic, which is republished through Cloud IoT core, is subscribed.
Settings
MQTT and TLS libraries are required to run example file.
- maven
<dependencies>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>${version}</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>${version}</version>
</dependency>
</dependencies>
- gradle
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:${version}'
implementation 'org.bouncycastle:bcpkix-jdk15on:${version}'
Example code
The Java example code is as follows:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
public class MqttExample {
public static void main(String[] args) throws Exception {
String clientId = "myClientTest";
/*
*** Modify file path and server ***
*/
// MQTT server hostname
String iotServer = "ssl://msg01.cloudiot.ntruss.com";
String rootCaCertFilePath = "/<Your>/<file>/<path>/rootCaCert.pem";
String clientCaChainFilePath = "/<Your>/<file>/<path>/caChain.pem";
String clientCertFilePath = "/<Your>/<file>/<path>/cert.pem";
String clientKeyFilePath = "/<Your>/<file>/<path>/private.pem";
String password = "";
/*
Make Root CA TrustManager and Client Keystore
*/
MqttExample mqttExample = new MqttExample();
// CA certificate is used to **authenticate server**
TrustManagerFactory tmf = mqttExample.getTrustManagerFactory(rootCaCertFilePath);
// client key, certificates and cachain are sent to server to authenticate client
KeyManagerFactory kmf = mqttExample.getKeyManagerFactory(clientCaChainFilePath, clientCertFilePath, clientKeyFilePath, password);
/*
MQTT Connection
*/
// Set MQTT Client
MqttClient mqttClient = new MqttClient(iotServer, clientId, new MemoryPersistence());
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
connOpts.setConnectionTimeout(60);
connOpts.setKeepAliveInterval(60);
connOpts.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1);
// create SSL socket factory
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
connOpts.setSocketFactory(context.getSocketFactory());
mqttClient.connect(connOpts);
System.out.println("=== Successfully Connected");
/*
Subscribe & Publish Message
Publish message on the device ---> IoT Platform(alert republish action) ---> Subscribe message on the device
*/
mqttClient.setCallback(new MqttCallback() {
public void connectionLost(Throwable throwable) {
System.out.println("=== Connection lost.");
}
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
System.out.println("<<< Subscribe from IoT server. topic : " + s + ", message : " + mqttMessage.toString());
}
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
System.out.println(">>> Publish to IoT server.");
}
});
/*
Topic & Message Example
*/
String sendTopic = "factory/room1/temperature";
// Test for MQTT republish
// In order to receive alert topic message, alert republish action must be set in Rule engine.
String alertTopic = "alert";
// Console guide example message
String message = "{ \"deviceId\": \"device_1\", \"deviceType\": \"temperature\", \"value\": 35, \"battery\": 9, \"date\": \"2016-12-15\", \"time\": \"15:12:00\"}";
/*
Subscribe message
*/
boolean isConnected = mqttClient.isConnected();
if (isConnected) {
mqttClient.subscribe(alertTopic);
// You can check whether the message is being delivered normally.
// mqttClient.subscribe(sendTopic);
}
/*
Publish message
*/
if (isConnected) {
for (int i=0; i < 5; i++) {
MqttMessage mqttMessage = new MqttMessage(message.getBytes());
mqttMessage.setQos(0);
mqttMessage.setRetained(false);
try {
MqttTopic topic = mqttClient.getTopic(sendTopic);
MqttDeliveryToken token = topic.publish(mqttMessage);
token.waitForCompletion();
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
Enable disconnect() and close() if you needed
*/
// mqttClient.disconnect();
// mqttClient.close();
}
/*
Code for Certificate Access
*/
private MqttExample() {
init();
}
private KeyManagerFactory getKeyManagerFactory(String clientCaChainFilePath, String clientCertFilePath, String clientKeyFilePath, String password) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException {
// load client private key
KeyPair key = getClientKey(clientKeyFilePath);
// load client Cert
Certificate clientCert = getClientCert(clientCertFilePath);
// load client CA Chain
List<Certificate> caChain = getClientCaChain(clientCaChainFilePath, clientCert);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
int caChainSize = caChain.size();
Certificate[] caChainArray = caChain.toArray(new Certificate[caChainSize]);
ks.setKeyEntry("private-key", key.getPrivate(), password.toCharArray(), caChainArray);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, password.toCharArray());
return kmf;
}
private TrustManagerFactory getTrustManagerFactory(String rootCaCertFilePath) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
// load CA certificate
X509Certificate rootCaCert = getRootCaCert(rootCaCertFilePath);
KeyStore rootCaKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
rootCaKeyStore.load(null, null);
rootCaKeyStore.setCertificateEntry("ca-certificate", rootCaCert);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(rootCaKeyStore);
return tmf;
}
private void init() {
Security.addProvider(new BouncyCastleProvider());
}
private KeyPair getClientKey(String clientKeyFilePath) throws IOException {
PEMParser pemParser = new PEMParser(new FileReader(clientKeyFilePath));
Object object = pemParser.readObject();
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
KeyPair key = converter.getKeyPair((PEMKeyPair) object);
pemParser.close();
return key;
}
private List<Certificate> getClientCaChain(String clientCaChainFilePath, Certificate clientCert) throws CertificateException, IOException {
X509Certificate cert;
List<Certificate> caChain = new ArrayList<Certificate>();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(clientCaChainFilePath));
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
cert = (X509Certificate) cf.generateCertificate(bis);
caChain.add(cert);
}
caChain.add(0, clientCert);
return caChain;
}
private X509Certificate getClientCert(String clientCertFilePath) throws CertificateException, IOException {
return getX509Certificate(clientCertFilePath);
}
private X509Certificate getRootCaCert(String rootCaCertFilePath) throws CertificateException, IOException {
return getX509Certificate(rootCaCertFilePath);
}
private X509Certificate getX509Certificate(String rootCaCertFilePath) throws CertificateException, IOException {
X509Certificate caCert = null;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(rootCaCertFilePath));
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
caCert = (X509Certificate) cf.generateCertificate(bis);
}
return caCert;
}
}
Execution result
The following is the execution result of the Java example code.
=== Successfully Connected
>>> Publish to IoT server.
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
Python
An example code to access Cloud IoT Core, repeat publish and subscribe messages 5 times, and end the program. The messages are published on the factory/room1/temperature
topic, and the alert topic, which is republished through Cloud IoT core, is subscribed.
Settings
To run the example file, the paho-mqtt library must be installed.
pip install paho-mqtt //python 2.x
python -m pip install paho-mqtt // python 2.7.9+
python3 -m pip install paho-mqtt //python 3.x
The full certificate chain value in the example file refers to the path where the full certificate chain file will be saved, connecting certificates with a chain certificate. When you run this Python code, the full certificate chain file is automatically saved in the specified path.
Example code
mqttTLSClient.py
# coding=utf-8 import argparse import logging import paho.mqtt.client as mqttClient import ssl import time import json def main(): # init initLogger() initParameter() appendCert() # Connect MQTT Broker client = mqttClient.Client() if not connectTls(client, hostname, port, rootCa, fullCertChain, private): client.loop_stop() exit(1) attempts = 0 while attempts < 5: # Subscribe message client.subscribe("alert",0) # Publish Message to Message broker publish(client, topic, payload) time.sleep(publishDelay) attempts += 1 time.sleep(5) def initLogger(): global log log = logging.getLogger(__name__) log.setLevel(logging.ERROR) # stream handler (print to console) streamHandler = logging.StreamHandler() # file formatter formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] (%(filename)s:%(funcName)s:%(lineno)d) : %(message)s') streamHandler.setFormatter(formatter) log.addHandler(streamHandler) def initParameter(): global rootCa global caChain global cert global private global fullCertChain global hostname global port global publishDelay global topic global payload global connected rootCa = '/<Your>/<file>/<path>/rootCaCert.pem' caChain = '/<Your>/<file>/<path>/caChain.pem' cert = '/<Your>/<file>/<path>/cert.pem' private = '/<Your>/<file>/<path>/private.pem' hostname = 'msg01.cloudiot.ntruss.com' port = 8883 publishDelay = 1 # sec topic = "factory/room1/temperature" payload = "{ \"deviceId\": \"device_1\", \"deviceType\": \"temperature\", \"value\": 35, \"battery\": 9, \"date\": \"2016-12-15\", \"time\": \"15:12:00\"}" connected = False #fullCertChain is automatically generated by cert and caChain fullCertChain = './fullCertChain.pem' def appendCert(): filenames = [cert, caChain] with open(fullCertChain,'w') as outfile: for fname in filenames : with open(fname) as infile: outfile.write(infile.read()+"\n") def connectTls(client, hostname, port, rootCa, fullCertChain, clientKey): client.on_connect = on_connect client.on_message = on_message client.on_publish = on_publish client.tls_set(ca_certs=rootCa, certfile=fullCertChain, keyfile=clientKey, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None) ssl.match_hostname = lambda cert, hostname: True client.tls_insecure_set(False) client.connect(hostname, port=port) client.loop_start() attempts = 0 while not connected and attempts < 5: # Wait for connection time.sleep(1) attempts += 1 if not connected: return False return True def on_connect(client, userdata, flags, rc): if rc == 0: log.info("=== Successfully Connected") global connected # Use global variable connected = True # Signal connection else: log.error("=== Connection lost") def on_publish(client, userdata, result): print(">>> Publish to IoT server.") def publish(client, topic, payload): try: client.publish(topic, payload) except Exception as e: print("[ERROR] Could not publish data, error: {}".format(e)) def on_message(client, userdata, message): print("<<< Subscribe from IoT server. topic : "+ message.topic + ", message : " + str(message.payload.decode("utf-8"))) if __name__ == "__main__": main()
Execution result
The following is the execution result of mqttTLSClient.py.
>>> Publish to IoT server.
>>> Publish to IoT server.
>>> Publish to IoT server.
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
<<< Subscribe from IoT server. topic : alert, message : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
Node JS(JavaScript)
An example code to access Cloud IoT Core, repeat publish and subscribe messages 5 times, and end the program. The messages are published on the factory/room1/temperature
topic, and the alert topic, which is republished through Cloud IoT core, is subscribed.
Settings
The Node JS (JavaScript) example needs the mqtt library to be installed, and before installing the library, the node package manager (npm) must be installed. Place package.json and MqttClient.js files in the same folder, and then use npm install
command to download and run the node library package.
- package.json
{
"name": "cloud-iot-mqtt-sample",
"version": "0.1.0",
"dependencies": { "mqtt": "^1.14.1" }
}
Example code
- MqttClient.js
const mqtt = require('mqtt'); const fs = require('fs'); const path = require('path'); const HOST = "msg01.cloudiot.ntruss.com"; const PORT = 8883; const PUBLISH_TOPIC = `factory/room1/temperature`; const SUBSCRIBE_TOPIC = `alert`; const QOS = 0; const certFolderPath = "/<Your>/<file>/<path>/"; const KEY = fs.readFileSync(certFolderPath + `private.pem`); const CERT = fs.readFileSync(certFolderPath + `cert.pem`); const CA_CHAIN = fs.readFileSync(certFolderPath + `caChain.pem`); const TRUSTED_CA_LIST = fs.readFileSync(certFolderPath + `rootCaCert.pem`); const FULL_CERTIFICATION = CERT+"\n"+CA_CHAIN; let receivedIndex = 0; const connectionInfo = { port: PORT, host: HOST, key: KEY, cert: FULL_CERTIFICATION, ca: TRUSTED_CA_LIST, rejectUnauthorized: true, protocol: 'mqtts', connectTimeout: 60 * 1000, keepalive: 1000, } const client = mqtt.connect(connectionInfo); // Connetion to mqtt message broker // client.on('connect', async function () { console.log('=== Successfully Connected'); for (let i = 0; i < 5; i++) { await sleep(1000); sendMessage(); } }) // Subscribe to Message // function sendMessage() { console.log(">>> Publish to IoT server.") client.publish(PUBLISH_TOPIC, getMsg()) } // Subscribe to Message // client.subscribe(SUBSCRIBE_TOPIC, {qos:QOS}); // Receiving Message // client.on('message', async function (topic, message) { console.log(`<<< Subscribe from IoT server. topic : "${topic}", message(${receivedIndex}) : ${message.toString()}`); receivedIndex++; if (receivedIndex == 5) { client.end(); console.log("=== Complete.") } }) client.on('close', function () { console.log("connection Close"); }) client.on('error', function (err) { console.log(err.toString()); }) function getMsg () { const timeStamp = Math.floor(new Date() / 1000); const msg = `{"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}`; return msg; } const sleep = (ms) => { return new Promise(resolve=>{ setTimeout(resolve,ms); }) }
Execution result
The following is the execution result of the Node JS (JavaScript) example code.
=== Successfully Connected
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : "factory/room1/temperature", message(0) : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : "factory/room1/temperature", message(1) : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : "factory/room1/temperature", message(2) : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : "factory/room1/temperature", message(3) : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : "factory/room1/temperature", message(4) : {"battery":9,"date":"2016-12-15","deviceId":"device_1","deviceType":"temperature","time":"15:12:00","value":35}
=== Complete.
connection Close
C
An example code to access Cloud IoT Core, repeat publish and subscribe messages 5 times, and end the program. The messages are published on the factory/room1/temperature
topic, and the alert topic, which is republished through Cloud IoT core, is subscribed.
Settings
To run this example file, you need to install the Paho MQTT library.
CentOS
$ sudo yum install build-essential gcc make cmake cmake-gui cmake-curses-gui $ sudo yum install openssl-devel $ git clone https://github.com/eclipse/paho.mqtt.c $ cd paho.mqtt.c $ git checkout v1.3.8 $ make $ sudo make install
Ubuntu
$ sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui $ sudo apt-get install libssl-dev $ git clone https://github.com/eclipse/paho.mqtt.c.git $ cd paho.mqtt.c $ git checkout v1.3.8 $ cmake -Bbuild -H. -DPAHO_ENABLE_TESTING=OFF -DPAHO_BUILD_STATIC=ON \ -DPAHO_WITH_SSL=ON -DPAHO_HIGH_PERFORMANCE=ON $ sudo cmake --build build/ --target install $ sudo ldconfig
The full certificate chain path value in the example file refers to the path where the full certificate chain file will be saved, connecting certificates with a chain certificate. When you run the example, the full certificate chain file is automatically saved in the path you set.
Example code
mqttClient.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "MQTTClient.h" #define QOS 1 #define TIMEOUT 10000L volatile MQTTClient_deliveryToken deliveredtoken; // Generate fullCertChain by cert and caChain void appendCert(char* cert, char* caChain, char* fullCertChain) { FILE* fpw = fopen(fullCertChain,"w"); FILE* fpr = fopen(cert,"r"); int size; char* buffer; fseek(fpr, 0, SEEK_END); size = ftell(fpr); buffer = (char*)malloc(size + 1); memset(buffer, 0, size + 1); fseek(fpr, 0, SEEK_SET); fread(buffer, size, 1, fpr); fputs(buffer, fpw); fclose(fpr); free(buffer); fputs("\n", fpw); fpr = fopen(caChain,"r"); fseek(fpr, 0, SEEK_END); size = ftell(fpr); buffer = (char*)malloc(size + 1); memset(buffer, 0, size + 1); fseek(fpr, 0, SEEK_SET); fread(buffer, size, 1, fpr); fputs(buffer, fpw); fputs("\n", fpw); free(buffer); fclose(fpr); fclose(fpw); } void delivered( void *context, MQTTClient_deliveryToken dt ) { printf(">>> Publish to IoT server.\n"); deliveredtoken = dt; } int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) { char* payload = (char*)message->payload; printf("<<< Subscribe from IoT server. topic : %s , message : %s\n", topicName, payload); MQTTClient_freeMessage(&message); MQTTClient_free(topicName); return 1; } void connlost( void *context, char *cause ) { printf("\nConnection lost\n"); printf(" cause: %s\n", cause); } int main(int argc, char *argv[]) { char clientId[] = "myClientTest"; // Modify file path and server // MQTT server hostname char iotServer[] = "ssl://msg01.cloudiot.ntruss.com:8883"; char rootCaCertFilePath[] = "/<Your>/<file>/<path>/rootCaCert.pem"; char clientCaChainFilePath[] = "/<Your>/<file>/<path>/caChain.pem"; char clientCertFilePath[] = "/<Your>/<file>/<path>/cert.pem"; char clientKeyFilePath[] = "/<Your>/<file>/<path>/private.pem"; // fullCertChain is automatically generated by cert and caChain char fullCertChainPath[] = "./fullCertChain.pem"; char password[] = ""; // Topic & Message Example char sendTopic[] = "factory/room1/temperature"; char alertTopic[] = "alert"; char payload[] = "{ \"deviceId\": \"device_1\", \"deviceType\": \"temperature\", \"value\": 35, \"battery\": 9, \"date\": \"2016-12-15\", \"time\": \"15:12:00\"}"; MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer; MQTTClient_message pubmsg = MQTTClient_message_initializer; MQTTClient_deliveryToken token; int rc; int setCallBack; int attempts; MQTTClient_create(&client, iotServer, clientId, MQTTCLIENT_PERSISTENCE_NONE, NULL); // Generate fullCertChain by cert and caChain appendCert(clientCertFilePath, clientCaChainFilePath, fullCertChainPath); // MQTT Connection parameters ssl_opts.verify = 1; ssl_opts.trustStore = rootCaCertFilePath; ssl_opts.keyStore = fullCertChainPath; ssl_opts.privateKey = clientKeyFilePath; conn_opts.ssl = &ssl_opts; conn_opts.keepAliveInterval = 20; conn_opts.cleansession = 1; conn_opts.serverURIcount = 0; conn_opts.serverURIs = NULL; // Set call back if((setCallBack = MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered)) != MQTTCLIENT_SUCCESS) { printf("ERROR : MQTTClient_setCallbacks, setCallBack = %d\n", setCallBack); return setCallBack; } // Connect MQTT Broker if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { printf("ERROR : Failed to connect, return code : %d\n", rc); exit(-1); } // Subscribe message rc = MQTTClient_subscribe(client, alertTopic, 0); pubmsg.payload = payload; pubmsg.payloadlen = strlen(payload); pubmsg.qos = QOS; pubmsg.retained = 0; for(attempts=0; attempts<5; attempts++){ // Publish message MQTTClient_publishMessage(client, sendTopic, &pubmsg, &token); rc = MQTTClient_waitForCompletion(client, token, TIMEOUT); sleep(2); //sec } sleep(2); //sec // Disconnect MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; }
Run example code
The following shows how to run the C example code.
$ gcc -o {executable file name} {source file name}.c -l paho-mqtt3cs
$ ./{executable file name}
Execution result
The following is the execution result of the C example code.
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}
C++
An example code to access Cloud IoT Core, repeat publish and subscribe messages 5 times, and end the program. The messages are published on the factory/room1/temperature
topic, and the alert topic, which is republished through Cloud IoT core, is subscribed.
Settings
To run this example file, you need to install the Paho MQTT library.
CentOS
$ sudo yum install build-essential gcc make cmake cmake-gui cmake-curses-gui $ sudo yum install openssl-devel $ git clone https://github.com/eclipse/paho.mqtt.c $ cd paho.mqtt.c $ git checkout v1.3.8 $ make $ sudo make install
Ubuntu
$ sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui $ sudo apt-get install libssl-dev $ git clone https://github.com/eclipse/paho.mqtt.c.git $ cd paho.mqtt.c $ git checkout v1.3.8 $ cmake -Bbuild -H. -DPAHO_ENABLE_TESTING=OFF -DPAHO_BUILD_STATIC=ON \ -DPAHO_WITH_SSL=ON -DPAHO_HIGH_PERFORMANCE=ON $ sudo cmake --build build/ --target install $ sudo ldconfig
The full certificate chain path value in the example file refers to the path where the full certificate chain file will be saved, connecting certificates with a chain certificate. When you run the example, the full certificate chain file is automatically saved in the path you set.
Example code
- mqttClient.cpp
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <iostream> #include <fstream> #include "MQTTClient.h" #define QOS 1 #define TIMEOUT 10000L volatile MQTTClient_deliveryToken deliveredtoken; // Generate fullCertChain by cert and caChain void appendCert(char* cert, char* caChain, char* fullCertChain) { std::ifstream fin; std::ofstream fout; int size; char* buffer; fin.open(cert); fout.open(fullCertChain); fin.seekg(0,std::ios::end); size = fin.tellg(); fin.seekg(0, std::ios::beg); buffer = (char*)malloc(size + 1); memset(buffer, 0, size + 1); fin.read(&buffer[0], size); fout << buffer << std::endl; free(buffer); fin.close(); fin.open(caChain); fin.seekg(0,std::ios::end); size = fin.tellg(); fin.seekg(0, std::ios::beg); buffer = (char*)malloc(size + 1); memset(buffer, 0, size + 1); fin.read(&buffer[0], size); fout << buffer << std::endl; free(buffer); fin.close(); fout.close(); } void delivered( void *context, MQTTClient_deliveryToken dt ) { std::cout << ">>> Publish to IoT server." << std::endl; deliveredtoken = dt; } int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) { char* payload = (char*)message->payload; std::cout << "<<< Subscribe from IoT server. topic : " << topicName << " , message : " << payload << std::endl; MQTTClient_freeMessage(&message); MQTTClient_free(topicName); return 1; } void connlost( void *context, char *cause ) { std::cout << std::endl << "Connection lost" << std::endl; std::cout << " cause: " << cause << std::endl; } int main(int argc, char *argv[]) { char clientId[] = "myClientTest"; // Modify file path and server // MQTT server hostname char iotServer[] = "ssl://msg01.cloudiot.ntruss.com:8883"; char rootCaCertFilePath[] = "/<Your>/<file>/<path>/rootCaCert.pem"; char clientCaChainFilePath[] = "/<Your>/<file>/<path>/caChain.pem"; char clientCertFilePath[] = "/<Your>/<file>/<path>/cert.pem"; char clientKeyFilePath[] = "/<Your>/<file>/<path>/private.pem"; // fullCertChain is automatically generated by cert and caChain char fullCertChainPath[] = "./fullCertChain.pem"; char password[] = ""; // Topic & Message Example char sendTopic[] = "factory/room1/temperature"; char alertTopic[] = "alert"; char payload[] = "{ \"deviceId\": \"device_1\", \"deviceType\": \"temperature\", \"value\": 35, \"battery\": 9, \"date\": \"2016-12-15\", \"time\": \"15:12:00\"}"; MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer; MQTTClient_message pubmsg = MQTTClient_message_initializer; MQTTClient_deliveryToken token; int rc; int setCallBack; int attempts; MQTTClient_create(&client, iotServer, clientId, MQTTCLIENT_PERSISTENCE_NONE, NULL); // Generate fullCertChain by cert and caChain appendCert(clientCertFilePath, clientCaChainFilePath, fullCertChainPath); // MQTT Connection parameters ssl_opts.verify = 1; ssl_opts.trustStore = rootCaCertFilePath; ssl_opts.keyStore = fullCertChainPath; ssl_opts.privateKey = clientKeyFilePath; conn_opts.ssl = &ssl_opts; conn_opts.keepAliveInterval = 20; conn_opts.cleansession = 1; conn_opts.serverURIcount = 0; conn_opts.serverURIs = NULL; // Set call back if((setCallBack = MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered)) != MQTTCLIENT_SUCCESS) { std::cout << "ERROR : MQTTClient_setCallbacks, setCallBack = " << setCallBack << std::endl; return setCallBack; } // Connect MQTT Broker if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { std::cout << "ERROR : Failed to connect, return code : " << rc << std::endl; exit(-1); } // Subscribe message rc = MQTTClient_subscribe(client, alertTopic, 0); pubmsg.payload = payload; pubmsg.payloadlen = strlen(payload); pubmsg.qos = QOS; pubmsg.retained = 0; for(attempts=0; attempts<5; attempts++){ // Publish message MQTTClient_publishMessage(client, sendTopic, &pubmsg, &token); rc = MQTTClient_waitForCompletion(client, token, TIMEOUT); sleep(2); //sec } sleep(2); //sec // Disconnect MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; }
Run example code
The following shows how to run the C ++ example code.
$ g++ -o {executable file name} {source file name}.cpp -l paho-mqtt3cs
$ ./{executable file name}
Execution result
The following is the creation result of the C++ example code.
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}
>>> Publish to IoT server.
<<< Subscribe from IoT server. topic : alert , message : {"deviceType":"temperature","date":"2016-12-15","time":"15:12:00","battery":9,"deviceId":"device_1","value":35}