Contoh kode
Program lengkap untuk mengirim data ke INCLUDE, dalam setiap bahasa dan papan yang umum dipakai. Pilih tab bahasanya, salin, ganti nilai yang ditandai, lalu jalankan.
Semua contoh di halaman ini dijalankan apa adanya ke salinan platform INCLUDE sebelum diterbitkan, lewat HTTPS, MQTT di port 1883, dan MQTT dengan TLS di port 8883, dan setiap contoh harus menghasilkan bacaan di database. Sketsa Arduino dikompilasi untuk papannya (ESP32 core 3.3, ESP8266 core 3.1).
Yang perlu diganti
| Di dalam kode | Isi dengan |
|---|---|
YOUR_DEVICE_TOKEN | Device Token dari layar Koneksi & Integrasi |
YOUR_DEVICE_ID | ID perangkat (username MQTT di layar yang sama) |
YOUR_ORG_ID | Bagian kedua Topik telemetri, ID Organisasi Anda |
YOUR_SOLUTION_SLUG | Bagian ketiga Topik telemetri, misalnya custom |
WIFI_SSID, WIFI_PASSWORD | Nama dan kata sandi WiFi (papan saja) |
Lebih cepat: buka Koneksi & Integrasi perangkat Anda, bagian Contoh kode. Kode yang sama ada di sana, dengan token dan ID perangkat itu sudah terisi.

HTTP
Satu permintaan POST per bacaan. Cocok untuk perangkat yang mengirim sesekali, dan paling mudah dicoba. Rincian: Mengirim data lewat HTTP.
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* URL = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry";
// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char* ROOT_CA = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";
WiFiClientSecure tls;
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
tls.setCACert(ROOT_CA);
}
void loop() {
float temperature = 25.4; // replace with your sensor reading
float humidity = 61;
String body = "{\"temperature\": " + String(temperature, 1) +
", \"humidity\": " + String(humidity, 0) + "}";
HTTPClient http;
http.begin(tls, URL);
http.addHeader("Content-Type", "application/json");
int status = http.POST(body);
Serial.printf("HTTP %d %s\n", status, http.getString().c_str());
http.end();
delay(10000);
}#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <time.h>
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* URL = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry";
// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char ROOT_CA[] PROGMEM = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";
BearSSL::X509List roots(ROOT_CA);
BearSSL::WiFiClientSecure tls;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
// Certificate checks need the real time.
configTime(0, 0, "pool.ntp.org", "time.google.com");
while (time(nullptr) < 1700000000) delay(500);
tls.setTrustAnchors(&roots);
}
void loop() {
float temperature = 25.4; // replace with your sensor reading
float humidity = 61;
String body = "{\"temperature\": " + String(temperature, 1) +
", \"humidity\": " + String(humidity, 0) + "}";
HTTPClient http;
http.begin(tls, URL);
http.addHeader("Content-Type", "application/json");
int status = http.POST(body);
Serial.printf("HTTP %d %s\n", status, http.getString().c_str());
http.end();
delay(10000);
}import time
import network
import requests
WIFI_SSID = "your-wifi"
WIFI_PASSWORD = "your-password"
URL = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry"
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
time.sleep(0.5)
print("WiFi connected")
def read_sensor():
# Replace with your sensor reading.
return {"temperature": 25.4, "humidity": 61}
while True:
try:
r = requests.post(URL, json=read_sensor())
print(r.status_code, r.text)
r.close()
except OSError as e:
print("send failed:", e)
time.sleep(10)import time
import requests
URL = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry"
def read_sensor():
# Replace with your sensor reading.
return {"temperature": 25.4, "humidity": 61}
while True:
try:
r = requests.post(URL, json=read_sensor(), timeout=10)
print(r.status_code, r.text)
except requests.RequestException as e:
print("send failed:", e)
time.sleep(10)const URL = 'https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry';
function readSensor() {
// Replace with your sensor reading.
return { temperature: 25.4, humidity: 61 };
}
async function send() {
try {
const res = await fetch(URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(readSensor()),
});
console.log(res.status, await res.text());
} catch (err) {
console.error('send failed:', err.message);
}
}
send();
setInterval(send, 10_000);package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"time"
)
const url = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry"
func readSensor() map[string]any {
// Replace with your sensor reading.
return map[string]any{"temperature": 25.4, "humidity": 61}
}
func main() {
client := &http.Client{Timeout: 10 * time.Second}
for {
body, _ := json.Marshal(readSensor())
res, err := client.Post(url, "application/json", bytes.NewReader(body))
if err != nil {
fmt.Println("send failed:", err)
} else {
reply, _ := io.ReadAll(res.Body)
res.Body.Close()
fmt.Println(res.StatusCode, string(reply))
}
time.Sleep(10 * time.Second)
}
}#include <stdio.h>
#include <unistd.h>
#include <curl/curl.h>
#define URL "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry"
int main(void) {
curl_global_init(CURL_GLOBAL_DEFAULT);
struct curl_slist *headers = curl_slist_append(NULL, "Content-Type: application/json");
for (;;) {
double temperature = 25.4; /* replace with your sensor reading */
double humidity = 61;
char body[128];
snprintf(body, sizeof body, "{\"temperature\": %.1f, \"humidity\": %.0f}", temperature, humidity);
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, URL);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
CURLcode rc = curl_easy_perform(curl);
if (rc == CURLE_OK) {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
printf("\nHTTP %ld\n", status);
} else {
fprintf(stderr, "send failed: %s\n", curl_easy_strerror(rc));
}
curl_easy_cleanup(curl);
fflush(stdout);
sleep(10);
}
}curl -X POST https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry \
-H "Content-Type: application/json" \
-d '{"temperature": 25.4, "humidity": 61}'MQTT
Satu koneksi yang tetap terbuka. Cocok untuk perangkat yang mengirim sering, dan untuk menerima perintah dari platform. Contoh di bawah memakai port 1883, cara paling mudah. Rincian: Mengirim data lewat MQTT.
#include <WiFi.h>
#include <PubSubClient.h>
// MQTT on port 1883, the simplest way: no certificate needed.
// For an encrypted connection, choose port 8883 (TLS) instead.
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 1883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";
WiFiClient net;
PubSubClient mqtt(net);
void connectMqtt() {
while (!mqtt.connected()) {
if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
Serial.println("MQTT connected");
} else {
Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
mqtt.setServer(HOST, PORT);
mqtt.setBufferSize(512);
}
void loop() {
connectMqtt();
mqtt.loop();
float temperature = 25.4; // replace with your sensor reading
float humidity = 61;
String payload = "{\"temperature\": " + String(temperature, 1) +
", \"humidity\": " + String(humidity, 0) + "}";
bool sent = mqtt.publish(TOPIC, payload.c_str());
Serial.println(sent ? "sent" : "send failed");
delay(10000);
}#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// MQTT on port 1883, the simplest way: no certificate needed.
// For an encrypted connection, choose port 8883 (TLS) instead.
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 1883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";
WiFiClient net;
PubSubClient mqtt(net);
void connectMqtt() {
while (!mqtt.connected()) {
if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
Serial.println("MQTT connected");
} else {
Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
mqtt.setServer(HOST, PORT);
mqtt.setBufferSize(512);
}
void loop() {
connectMqtt();
mqtt.loop();
float temperature = 25.4; // replace with your sensor reading
float humidity = 61;
String payload = "{\"temperature\": " + String(temperature, 1) +
", \"humidity\": " + String(humidity, 0) + "}";
bool sent = mqtt.publish(TOPIC, payload.c_str());
Serial.println(sent ? "sent" : "send failed");
delay(10000);
}import json
import time
import network
from umqtt.simple import MQTTClient
WIFI_SSID = "your-wifi"
WIFI_PASSWORD = "your-password"
HOST = "app.include.co.id"
DEVICE_ID = "YOUR_DEVICE_ID"
DEVICE_TOKEN = "YOUR_DEVICE_TOKEN"
TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
time.sleep(0.5)
print("WiFi connected")
client = MQTTClient(DEVICE_ID, HOST, port=1883, user=DEVICE_ID, password=DEVICE_TOKEN,
keepalive=60)
client.connect()
print("connected")
def read_sensor():
# Replace with your sensor reading.
return {"temperature": 25.4, "humidity": 61}
while True:
client.publish(TOPIC, json.dumps(read_sensor()))
print("sent")
time.sleep(10)import json
import time
import paho.mqtt.client as mqtt
HOST = "app.include.co.id"
PORT = 1883
DEVICE_ID = "YOUR_DEVICE_ID"
DEVICE_TOKEN = "YOUR_DEVICE_TOKEN"
TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
def read_sensor():
# Replace with your sensor reading.
return {"temperature": 25.4, "humidity": 61}
def on_connect(client, userdata, flags, reason_code, properties):
print("connected:", reason_code)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=DEVICE_ID)
client.username_pw_set(DEVICE_ID, DEVICE_TOKEN)
client.on_connect = on_connect
client.connect(HOST, PORT)
client.loop_start()
while True:
info = client.publish(TOPIC, json.dumps(read_sensor()), qos=1)
info.wait_for_publish(timeout=10)
print("sent:", info.is_published())
time.sleep(10)import mqtt from 'mqtt';
const DEVICE_ID = 'YOUR_DEVICE_ID';
const DEVICE_TOKEN = 'YOUR_DEVICE_TOKEN';
const TOPIC = 'includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry';
function readSensor() {
// Replace with your sensor reading.
return { temperature: 25.4, humidity: 61 };
}
const client = mqtt.connect('mqtt://app.include.co.id:1883', {
clientId: DEVICE_ID,
username: DEVICE_ID,
password: DEVICE_TOKEN,
});
client.on('connect', () => {
console.log('connected');
const send = () =>
client.publish(TOPIC, JSON.stringify(readSensor()), { qos: 1 }, err =>
console.log(err ? `send failed: ${err.message}` : 'sent')
);
send();
setInterval(send, 10_000);
});
client.on('error', err => console.error('mqtt error:', err.message));package main
import (
"encoding/json"
"fmt"
"time"
mqtt "github.com/eclipse/paho.mqtt.golang"
)
const (
broker = "tcp://app.include.co.id:1883"
deviceID = "YOUR_DEVICE_ID"
deviceToken = "YOUR_DEVICE_TOKEN"
topic = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
)
func readSensor() map[string]any {
// Replace with your sensor reading.
return map[string]any{"temperature": 25.4, "humidity": 61}
}
func main() {
opts := mqtt.NewClientOptions().
AddBroker(broker).
SetClientID(deviceID).
SetUsername(deviceID).
SetPassword(deviceToken).
SetAutoReconnect(true)
client := mqtt.NewClient(opts)
if t := client.Connect(); t.Wait() && t.Error() != nil {
panic(t.Error())
}
fmt.Println("connected")
for {
payload, _ := json.Marshal(readSensor())
t := client.Publish(topic, 1, false, payload)
t.Wait()
if t.Error() != nil {
fmt.Println("send failed:", t.Error())
} else {
fmt.Println("sent")
}
time.Sleep(10 * time.Second)
}
}#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <mosquitto.h>
#define HOST "app.include.co.id"
#define PORT 1883
#define DEVICE_ID "YOUR_DEVICE_ID"
#define DEVICE_TOKEN "YOUR_DEVICE_TOKEN"
#define TOPIC "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
int main(void) {
mosquitto_lib_init();
struct mosquitto *mosq = mosquitto_new(DEVICE_ID, true, NULL);
mosquitto_username_pw_set(mosq, DEVICE_ID, DEVICE_TOKEN);
int rc = mosquitto_connect(mosq, HOST, PORT, 60);
if (rc != MOSQ_ERR_SUCCESS) {
fprintf(stderr, "connect failed: %s\n", mosquitto_strerror(rc));
return 1;
}
mosquitto_loop_start(mosq);
printf("connected\n");
for (;;) {
double temperature = 25.4; /* replace with your sensor reading */
double humidity = 61;
char payload[128];
snprintf(payload, sizeof payload, "{\"temperature\": %.1f, \"humidity\": %.0f}", temperature, humidity);
rc = mosquitto_publish(mosq, NULL, TOPIC, (int)strlen(payload), payload, 1, false);
printf(rc == MOSQ_ERR_SUCCESS ? "sent\n" : "send failed\n");
fflush(stdout);
sleep(10);
}
}mosquitto_pub -h app.include.co.id -p 1883 \
-i YOUR_DEVICE_ID -u YOUR_DEVICE_ID -P YOUR_DEVICE_TOKEN \
-t includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry \
-m '{"temperature": 25.4, "humidity": 61}'Dengan TLS (port 8883)
Koneksi dan token dienkripsi. Sketsa ESP32 dan ESP8266 membawa sertifikat akar server, dan ESP8266 mengambil jam dari NTP dulu.
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 8883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";
// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char* ROOT_CA = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";
WiFiClientSecure tls;
PubSubClient mqtt(tls);
void connectMqtt() {
while (!mqtt.connected()) {
if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
Serial.println("MQTT connected");
} else {
Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
tls.setCACert(ROOT_CA);
mqtt.setServer(HOST, PORT);
mqtt.setBufferSize(512);
}
void loop() {
connectMqtt();
mqtt.loop();
float temperature = 25.4; // replace with your sensor reading
float humidity = 61;
String payload = "{\"temperature\": " + String(temperature, 1) +
", \"humidity\": " + String(humidity, 0) + "}";
bool sent = mqtt.publish(TOPIC, payload.c_str());
Serial.println(sent ? "sent" : "send failed");
delay(10000);
}#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <time.h>
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 8883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";
// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char ROOT_CA[] PROGMEM = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";
BearSSL::X509List roots(ROOT_CA);
BearSSL::WiFiClientSecure tls;
PubSubClient mqtt(tls);
void connectMqtt() {
while (!mqtt.connected()) {
if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
Serial.println("MQTT connected");
} else {
Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
// Certificate checks need the real time.
configTime(0, 0, "pool.ntp.org", "time.google.com");
while (time(nullptr) < 1700000000) delay(500);
tls.setTrustAnchors(&roots);
mqtt.setServer(HOST, PORT);
mqtt.setBufferSize(512);
}
void loop() {
connectMqtt();
mqtt.loop();
float temperature = 25.4; // replace with your sensor reading
float humidity = 61;
String payload = "{\"temperature\": " + String(temperature, 1) +
", \"humidity\": " + String(humidity, 0) + "}";
bool sent = mqtt.publish(TOPIC, payload.c_str());
Serial.println(sent ? "sent" : "send failed");
delay(10000);
}import json
import ssl
import time
import network
from umqtt.simple import MQTTClient
WIFI_SSID = "your-wifi"
WIFI_PASSWORD = "your-password"
HOST = "app.include.co.id"
DEVICE_ID = "YOUR_DEVICE_ID"
DEVICE_TOKEN = "YOUR_DEVICE_TOKEN"
TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
time.sleep(0.5)
print("WiFi connected")
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.verify_mode = ssl.CERT_NONE
client = MQTTClient(DEVICE_ID, HOST, port=8883, user=DEVICE_ID, password=DEVICE_TOKEN,
keepalive=60, ssl=context)
client.connect()
print("connected")
def read_sensor():
# Replace with your sensor reading.
return {"temperature": 25.4, "humidity": 61}
while True:
client.publish(TOPIC, json.dumps(read_sensor()))
print("sent")
time.sleep(10)import json
import time
import paho.mqtt.client as mqtt
HOST = "app.include.co.id"
PORT = 8883
DEVICE_ID = "YOUR_DEVICE_ID"
DEVICE_TOKEN = "YOUR_DEVICE_TOKEN"
TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
def read_sensor():
# Replace with your sensor reading.
return {"temperature": 25.4, "humidity": 61}
def on_connect(client, userdata, flags, reason_code, properties):
print("connected:", reason_code)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=DEVICE_ID)
client.username_pw_set(DEVICE_ID, DEVICE_TOKEN)
client.tls_set()
client.on_connect = on_connect
client.connect(HOST, PORT)
client.loop_start()
while True:
info = client.publish(TOPIC, json.dumps(read_sensor()), qos=1)
info.wait_for_publish(timeout=10)
print("sent:", info.is_published())
time.sleep(10)import mqtt from 'mqtt';
const DEVICE_ID = 'YOUR_DEVICE_ID';
const DEVICE_TOKEN = 'YOUR_DEVICE_TOKEN';
const TOPIC = 'includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry';
function readSensor() {
// Replace with your sensor reading.
return { temperature: 25.4, humidity: 61 };
}
const client = mqtt.connect('mqtts://app.include.co.id:8883', {
clientId: DEVICE_ID,
username: DEVICE_ID,
password: DEVICE_TOKEN,
});
client.on('connect', () => {
console.log('connected');
const send = () =>
client.publish(TOPIC, JSON.stringify(readSensor()), { qos: 1 }, err =>
console.log(err ? `send failed: ${err.message}` : 'sent')
);
send();
setInterval(send, 10_000);
});
client.on('error', err => console.error('mqtt error:', err.message));package main
import (
"encoding/json"
"fmt"
"time"
mqtt "github.com/eclipse/paho.mqtt.golang"
)
const (
broker = "ssl://app.include.co.id:8883"
deviceID = "YOUR_DEVICE_ID"
deviceToken = "YOUR_DEVICE_TOKEN"
topic = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
)
func readSensor() map[string]any {
// Replace with your sensor reading.
return map[string]any{"temperature": 25.4, "humidity": 61}
}
func main() {
opts := mqtt.NewClientOptions().
AddBroker(broker).
SetClientID(deviceID).
SetUsername(deviceID).
SetPassword(deviceToken).
SetAutoReconnect(true)
client := mqtt.NewClient(opts)
if t := client.Connect(); t.Wait() && t.Error() != nil {
panic(t.Error())
}
fmt.Println("connected")
for {
payload, _ := json.Marshal(readSensor())
t := client.Publish(topic, 1, false, payload)
t.Wait()
if t.Error() != nil {
fmt.Println("send failed:", t.Error())
} else {
fmt.Println("sent")
}
time.Sleep(10 * time.Second)
}
}#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <mosquitto.h>
#define HOST "app.include.co.id"
#define PORT 8883
#define DEVICE_ID "YOUR_DEVICE_ID"
#define DEVICE_TOKEN "YOUR_DEVICE_TOKEN"
#define TOPIC "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
int main(void) {
mosquitto_lib_init();
struct mosquitto *mosq = mosquitto_new(DEVICE_ID, true, NULL);
mosquitto_username_pw_set(mosq, DEVICE_ID, DEVICE_TOKEN);
mosquitto_tls_set(mosq, NULL, "/etc/ssl/certs", NULL, NULL, NULL);
int rc = mosquitto_connect(mosq, HOST, PORT, 60);
if (rc != MOSQ_ERR_SUCCESS) {
fprintf(stderr, "connect failed: %s\n", mosquitto_strerror(rc));
return 1;
}
mosquitto_loop_start(mosq);
printf("connected\n");
for (;;) {
double temperature = 25.4; /* replace with your sensor reading */
double humidity = 61;
char payload[128];
snprintf(payload, sizeof payload, "{\"temperature\": %.1f, \"humidity\": %.0f}", temperature, humidity);
rc = mosquitto_publish(mosq, NULL, TOPIC, (int)strlen(payload), payload, 1, false);
printf(rc == MOSQ_ERR_SUCCESS ? "sent\n" : "send failed\n");
fflush(stdout);
sleep(10);
}
}mosquitto_pub -h app.include.co.id -p 8883 --capath /etc/ssl/certs \
-i YOUR_DEVICE_ID -u YOUR_DEVICE_ID -P YOUR_DEVICE_TOKEN \
-t includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry \
-m '{"temperature": 25.4, "humidity": 61}'Menjalankan setiap contoh
| Bahasa | Pasang dulu | Jalankan |
|---|---|---|
| ESP32 | board ESP32 di Arduino IDE; MQTT: PubSubClient | unggah dari Arduino IDE. Panduan |
| ESP8266 | board ESP8266; MQTT: PubSubClient | unggah dari Arduino IDE. Panduan |
| MicroPython | firmware MicroPython di papan | simpan sebagai main.py. Panduan |
| Python | pip install requests paho-mqtt | python3 send.py |
| JavaScript | Node.js 18+; MQTT: npm install mqtt | node send.mjs |
| Go | MQTT: go get github.com/eclipse/paho.mqtt.golang | go run main.go |
| C | libcurl atau libmosquitto (paket -dev) | cc send.c -lcurl -o send && ./send |
| curl | sudah ada di Linux, macOS, Windows 10+ | tempel ke terminal |
Program Python, JavaScript, Go, dan C mengirim satu bacaan tiap 10 detik sampai dihentikan dengan Ctrl+C. Tanda berhasil di layar:
- HTTP:
202 {"ok":true} - MQTT:
connected, lalusentsetiap kali mengirim
Lihat Komputer, server, dan gateway untuk menyiapkan Python, Node.js, Go, atau C di Linux, macOS, dan Windows.
Mengganti data yang dikirim
Setiap contoh membaca nilainya dari satu tempat, read_sensor() atau baris yang diberi komentar replace with your sensor reading. Ganti isinya dengan bacaan sensor Anda. Setiap kunci menjadi satu parameter perangkat:
{ "temperature": 25.4, "humidity": 61, "pump_on": true }Aturan isinya ada di Mengirim data lewat HTTP.

