๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[BSS ์์ ํ๊ณ ๊นจ๋ํ ์งํ์ฒ ํ์น ๋ฐ ์ดํ 7] MQTT์ SUB ์ ์ด์ฉํด Sqlite3์ผ๋ก DB ์ ์ฅํ๊ธฐ ๋ณธ๋ฌธ
๐ฉ๐ป IoT (Embedded)/Arduino
[BSS ์์ ํ๊ณ ๊นจ๋ํ ์งํ์ฒ ํ์น ๋ฐ ์ดํ 7] MQTT์ SUB ์ ์ด์ฉํด Sqlite3์ผ๋ก DB ์ ์ฅํ๊ธฐ
์ง์ง์ํ์นด 2023. 12. 22. 09:56728x90
๋ฐ์ํ
โญ Sqlite3
sqlite3 dbํ์ผ๋ช
.db
>> .mode table
>> .tables
>> select * from ํ
์ด๋ธ๋ช
;
โญ db ํ์ผ (main.c) ์คํํ๊ธฐ
// gcc -g -o main main.c -lpaho-mqtt3c -lsqlite3
โ Ultrasonic + button
// main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
// C์ธ์ด๋ก ๊ตฌํ๋ SQL ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์์ง
#include <sqlite3.h>
#include <time.h>
#include <unistd.h>
// MQ Telemetry Transport ๋ฒ์ 3.1 ํ๋กํ ์ฝ์ ๋ํ
// C ๊ตฌํ์ ํด๋ผ์ด์ธํธ ๊ธฐ๋ฅ์ด ํฌํจ๋ 32๋นํธ Windows ๋ผ์ด๋ธ๋ฌ๋ฆฌ
#include <MQTTClient.h>
#define MQTT_HOST "192.168.0.154"
#define MQTT_PORT 1883
#define MQTT_CLIENT_ID1 "sqlClient1"
#define MQTT_CLIENT_ID2 "sqlClient2"
#define MQTT_CLIENT_ID3 "sqlClient3"
#define MQTT_CLIENT_ID4 "sqlClient4"
#define TOPIC_ultra_1 "sensor/ultrasonic_1"
#define TOPIC_ultra_2 "sensor/ultrasonic_2"
#define TOPIC_button_1 "sensor/button_1"
#define TOPIC_button_2 "sensor/button_2"
#define DATABASE_FILE "statin_mqtt.db"
// SQLite3 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๊ฐ์ฒด
sqlite3 *db;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for (i = 0; i < argc; i++)
{
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
char ultrasonic_1[5];
char ultrasonic_2[5];
char button_1[5];
char button_2[5];
int sql_message() {
// printf("%s", ultrasonic_1);
// printf("%s", ultrasonic_2);
// printf("%s", button_1);
// printf("%s", button_2);
char insertSql[200];
// message->payload : payloadptr
snprintf(insertSql, sizeof(insertSql), "INSERT INTO station_data (ultrasonic_1, ultrasonic_2, button_1, button_2) VALUES ('%s', '%s', '%s', '%s');", ultrasonic_1, ultrasonic_2, button_1, button_2);
char *zErrMsg = 0;
pthread_mutex_lock(&mutex);
// SQL ๋ช
๋ น์ ์คํ
// (open ํ DB, SQL ๋ฌธ์ฅ, ์ฝ๋ฐฑํจ์ ์ด๋ฆ, ์ฝ๋ฐฑํจ์ ์ฒซ ๋ฒ์งธ ์ธ์, ERROR ๋ณ์)
int sql_rc = sqlite3_exec(db, insertSql, callback, 0, &zErrMsg);
pthread_mutex_unlock(&mutex);
// SQLITE_OK : ์ฝ๋๋ ์์
์ด ์ฑ๊ณตํ๊ณ ์ค๋ฅ๊ฐ ์์์
if (sql_rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
putchar('\n');
fprintf(stdout, "Record inserted successfully\n");
}
return 1;
}
int on_message_ultra_1(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(ultrasonic_1, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_ultra_2(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(ultrasonic_2, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_button_1(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(button_1, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_button_2(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(button_2, message->payload);
sql_message();
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int main()
{
int sql_rc, mqtt_ultra_1, mqtt_ultra_2, mqtt_button_1, mqtt_button_2 ;
MQTTClient client1, client2, client3, client4;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
// ------------------------------------------ SQLite ------------------------------------------
// DB ํ์ผ์ ์ฐ๊ฒฐํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํ
sql_rc = sqlite3_open(DATABASE_FILE, &db);
// ์ฐ๊ฒฐ ์คํจ์ ์ค๋ฅ ๋ฉ์์ง ์ถ๋ ฅ
if (sql_rc)
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return 0;
}
else
{
fprintf(stdout, "Opened database successfully\n");
}
char *sql = "CREATE TABLE IF NOT EXISTS station_data("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"ultrasonic_1 TEXT NOT NULL,"
"ultrasonic_2 TEXT NOT NULL,"
"button_1 TEXT NOT NULL,"
"button_2 TEXT NOT NULL,"
"created_at DATETIME DEFAULT (DATETIME('now', 'localtime')));";
pthread_mutex_lock(&mutex);
// SQL ๋ช
๋ น์ ์คํ
// (open ํ DB, SQL ๋ฌธ์ฅ, ์ฝ๋ฐฑํจ์ ์ด๋ฆ, ์ฝ๋ฐฑํจ์ ์ฒซ ๋ฒ์งธ ์ธ์, ERROR ๋ณ์)
sql_rc = sqlite3_exec(db, sql, callback, 0, 0);
pthread_mutex_unlock(&mutex);
// SQLITE_OK : ์ฝ๋๋ ์์
์ด ์ฑ๊ณตํ๊ณ ์ค๋ฅ๊ฐ ์์์
if (sql_rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
return 0;
}
else
{
fprintf(stdout, "Table created successfully\n");
}
// ------------------------------------------ MQTT ------------------------------------------
// (์๋ก ์์ฑํ ํด๋ผ์ด์ธํธ์ ํธ๋ค์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ, ์์ ๋๋ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์์ฒญ์ ๋ชจ๋ํฐํ๋ MQTT ํฌํธ์ URI,
// ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด๋ฆ, ํด๋ผ์ด์ธํธ ์ํ๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณด๋ฅ ์ค์ผ๋ก ์์คํ
์ฅ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์์ค)
mqtt_ultra_1 = MQTTClient_create(&client1, MQTT_HOST, MQTT_CLIENT_ID1, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_ultra_2 = MQTTClient_create(&client2, MQTT_HOST, MQTT_CLIENT_ID2, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_button_1 = MQTTClient_create(&client3, MQTT_HOST, MQTT_CLIENT_ID3, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_button_2 = MQTTClient_create(&client4, MQTT_HOST, MQTT_CLIENT_ID4, MQTTCLIENT_PERSISTENCE_NONE, NULL);
// TCP/IP ์ฐ๊ฒฐ์ด ๋ซํ์ง ์๋๋ก ์์ "ํ์ฑ ์ ์ง(keepalive)" ๋ฉ์์ง๋ฅผ 20์ด๋ง๋ค ๋ณด๋ด๊ธฐ
conn_opts.keepAliveInterval = 10;
// true๋ก ์ค์ ๋์๊ธฐ ๋๋ฌธ์ ์ด์ ์ฐ๊ฒฐ์์ ๋จ์ ์๋ ์์ฑ ์ค์ด๋ ๋ฉ์์ง๊ฐ ์๋ฃ๋์๋์ง ๊ฒ์ฌํ์ง ์๊ณ ์ธ์
์ด ์์
conn_opts.cleansession = 1;
// ํด๋ผ์ด์ธํธ๋ฅผ ์๋ฒ์ ์ฐ๊ฒฐํ๊ธฐ ์ ์ ์ฝ๋ฐฑ์ ์ค์
mqtt_ultra_1 = MQTTClient_setCallbacks(client1, NULL, NULL, on_message_ultra_1, NULL);
mqtt_ultra_2 = MQTTClient_setCallbacks(client2, NULL, NULL, on_message_ultra_2, NULL);
mqtt_button_1 = MQTTClient_setCallbacks(client3, NULL, NULL, on_message_button_1, NULL);
mqtt_button_2 = MQTTClient_setCallbacks(client4, NULL, NULL, on_message_button_2, NULL);
// ํด๋ผ์ด์ธํธ ํธ๋ค ๋ฐ ํฌ์ธํฐ๋ฅผ ์ฐ๊ฒฐ ์ต์
์ ์ธ์๋ก ์ ๋ฌ
if (((mqtt_ultra_1 = MQTTClient_connect(client1, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_ultra_2 = MQTTClient_connect(client2, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_button_1 = MQTTClient_connect(client3, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_button_2 = MQTTClient_connect(client4, &conn_opts)) != MQTTCLIENT_SUCCESS))
{
fprintf(stderr, "Failed to connect, return code \n");
return 0;
}
// ์ ํํ ํ ํฝ์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ๋
(client, TOPIC, QOS);
// QoS ์ค์ ์ ์ด ๊ตฌ๋
์์๊ฒ ์ก์ ๋ ๋ฉ์์ง์ ์ ์ฉ๋๋ ์ต๋ ์๋น์ค ํ์ง(QoS)์ ํ๋ณ
// ์๋ฒ๋ ์ด ์ค์ ์ ๋ฎ์ ๊ฐ ๋ฐ ์๋ ๋ฉ์์ง์ QoS์์ ๋ฉ์์ง๋ฅผ ์ก์
mqtt_ultra_1 = MQTTClient_subscribe(client1, TOPIC_ultra_1, 0);
mqtt_ultra_2 = MQTTClient_subscribe(client2, TOPIC_ultra_2, 0);
mqtt_button_1 = MQTTClient_subscribe(client3, TOPIC_button_1, 0);
mqtt_button_2 = MQTTClient_subscribe(client4, TOPIC_button_2, 0);
// ์ฐ๊ฒฐ ํธ์ถ์ด ์คํจํ๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ ์ฝ๋ -1๋ก ์ข
๋ฃ
// ์ฐ๊ฒฐ ํธ์ถ์ด ์คํจํ๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ ์ฝ๋ -1๋ก ์ข
๋ฃ
if ((mqtt_ultra_1 != MQTTCLIENT_SUCCESS) || (mqtt_ultra_2 != MQTTCLIENT_SUCCESS) ||
(mqtt_button_1 != MQTTCLIENT_SUCCESS) || (mqtt_button_1 != MQTTCLIENT_SUCCESS))
{
fprintf(stderr, "Failed to subscribe, return code \n");
return 0;
}
printf("Subscribed to topic: %s\n", TOPIC_ultra_1);
printf("Subscribed to topic: %s\n", TOPIC_ultra_2);
printf("Subscribed to topic: %s\n", TOPIC_button_1);
printf("Subscribed to topic: %s\n", TOPIC_button_2);
for (;;)
{
usleep(1000000); // Sleep for 1 second
}
// ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ๋๊ธฐ (client, ์ ํ์๊ฐ)
// ํด๋ผ์ด์ธํธ๋ ์๋ฒ์์ ์ฐ๊ฒฐ์ ๋๊ณ ์ฝ๋ฐฑ ํจ์์์ ์์ฑ ์ค์ธ ๋ฉ์์ง๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆผ
// ์ ํ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ง์ (์ฐ๊ฒฐ์ ๋๊ธฐ ์ ์ ์ํํด์ผ ํ๋ ๋ค๋ฅธ ์์
์ด ์๋ฃ๋ ๋๊น์ง ์ต๋ 10์ด ๋์ ๊ธฐ๋ค๋ฆผ)
MQTTClient_disconnect(client1, 10000);
MQTTClient_disconnect(client2, 10000);
MQTTClient_disconnect(client3, 10000);
MQTTClient_disconnect(client4, 10000);
// ํด๋ผ์ด์ธํธ์ ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น์ฐ๊ณ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ
MQTTClient_destroy(&client1);
MQTTClient_destroy(&client2);
MQTTClient_destroy(&client3);
MQTTClient_destroy(&client4);
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ซ๊ธฐ
sqlite3_close(db);
return 0;
}
โ MQ135 * 3
// main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
// C์ธ์ด๋ก ๊ตฌํ๋ SQL ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์์ง
#include <sqlite3.h>
#include <time.h>
#include <unistd.h>
// MQ Telemetry Transport ๋ฒ์ 3.1 ํ๋กํ ์ฝ์ ๋ํ
// C ๊ตฌํ์ ํด๋ผ์ด์ธํธ ๊ธฐ๋ฅ์ด ํฌํจ๋ 32๋นํธ Windows ๋ผ์ด๋ธ๋ฌ๋ฆฌ
#include <MQTTClient.h>
#define MQTT_HOST "192.168.0.154"
#define MQTT_PORT 1883
#define MQTT_CLIENT_ID1 "sqlClient1"
#define MQTT_CLIENT_ID2 "sqlClient2"
#define MQTT_CLIENT_ID3 "sqlClient3"
#define TOPIC_mq135_1 "sensor/mq135/_1"
#define TOPIC_mq135_2 "sensor/mq135/_2"
#define TOPIC_mq135_3 "sensor/mq135/_3"
#define DATABASE_FILE "subway_mqtt.db"
// SQLite3 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๊ฐ์ฒด
sqlite3 *db;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for (i = 0; i < argc; i++)
{
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
char mq135_1[5];
char mq135_2[5];
char mq135_3[5];
int sql_message() {
// printf("%s", ultrasonic_1);
// printf("%s", ultrasonic_2);
// printf("%s", button_1);
// printf("%s", button_2);
char insertSql[200];
// message->payload : payloadptr
snprintf(insertSql, sizeof(insertSql), "INSERT INTO subway_data (mq135_1, mq135_2, mq135_3) VALUES ('%s', '%s', '%s');", mq135_1, mq135_2, mq135_3);
char *zErrMsg = 0;
printf("%s", insertSql);
pthread_mutex_lock(&mutex);
// SQL ๋ช
๋ น์ ์คํ
// (open ํ DB, SQL ๋ฌธ์ฅ, ์ฝ๋ฐฑํจ์ ์ด๋ฆ, ์ฝ๋ฐฑํจ์ ์ฒซ ๋ฒ์งธ ์ธ์, ERROR ๋ณ์)
int sql_rc = sqlite3_exec(db, insertSql, callback, 0, &zErrMsg);
pthread_mutex_unlock(&mutex);
// SQLITE_OK : ์ฝ๋๋ ์์
์ด ์ฑ๊ณตํ๊ณ ์ค๋ฅ๊ฐ ์์์
if (sql_rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
putchar('\n');
fprintf(stdout, "Record inserted successfully\n");
}
return 1;
}
int on_message_mq135_1(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(mq135_1, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_mq135_2(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(mq135_2, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_mq135_3(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(mq135_3, message->payload);
sql_message();
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int main()
{
int sql_rc, mqtt_mq135_1, mqtt_mq135_2, mqtt_mq135_3 ;
MQTTClient client1, client2, client3;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
// ------------------------------------------ SQLite ------------------------------------------
// DB ํ์ผ์ ์ฐ๊ฒฐํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํ
sql_rc = sqlite3_open(DATABASE_FILE, &db);
// ์ฐ๊ฒฐ ์คํจ์ ์ค๋ฅ ๋ฉ์์ง ์ถ๋ ฅ
if (sql_rc)
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return 0;
}
else
{
fprintf(stdout, "Opened database successfully\n");
}
char *sql = "CREATE TABLE IF NOT EXISTS subway_data("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"mq135_1 TEXT NOT NULL,"
"mq135_2 TEXT NOT NULL,"
"mq135_3 TEXT NOT NULL,"
"created_at DATETIME DEFAULT (DATETIME('now', 'localtime')));";
pthread_mutex_lock(&mutex);
// SQL ๋ช
๋ น์ ์คํ
// (open ํ DB, SQL ๋ฌธ์ฅ, ์ฝ๋ฐฑํจ์ ์ด๋ฆ, ์ฝ๋ฐฑํจ์ ์ฒซ ๋ฒ์งธ ์ธ์, ERROR ๋ณ์)
sql_rc = sqlite3_exec(db, sql, callback, 0, 0);
pthread_mutex_unlock(&mutex);
// SQLITE_OK : ์ฝ๋๋ ์์
์ด ์ฑ๊ณตํ๊ณ ์ค๋ฅ๊ฐ ์์์
if (sql_rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
return 0;
}
else
{
fprintf(stdout, "Table created successfully\n");
}
// ------------------------------------------ MQTT ------------------------------------------
// (์๋ก ์์ฑํ ํด๋ผ์ด์ธํธ์ ํธ๋ค์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ, ์์ ๋๋ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์์ฒญ์ ๋ชจ๋ํฐํ๋ MQTT ํฌํธ์ URI,
// ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด๋ฆ, ํด๋ผ์ด์ธํธ ์ํ๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณด๋ฅ ์ค์ผ๋ก ์์คํ
์ฅ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์์ค)
mqtt_mq135_1 = MQTTClient_create(&client1, MQTT_HOST, MQTT_CLIENT_ID1, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_mq135_2 = MQTTClient_create(&client2, MQTT_HOST, MQTT_CLIENT_ID2, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_mq135_3 = MQTTClient_create(&client3, MQTT_HOST, MQTT_CLIENT_ID3, MQTTCLIENT_PERSISTENCE_NONE, NULL);
// TCP/IP ์ฐ๊ฒฐ์ด ๋ซํ์ง ์๋๋ก ์์ "ํ์ฑ ์ ์ง(keepalive)" ๋ฉ์์ง๋ฅผ 20์ด๋ง๋ค ๋ณด๋ด๊ธฐ
conn_opts.keepAliveInterval = 10;
// true๋ก ์ค์ ๋์๊ธฐ ๋๋ฌธ์ ์ด์ ์ฐ๊ฒฐ์์ ๋จ์ ์๋ ์์ฑ ์ค์ด๋ ๋ฉ์์ง๊ฐ ์๋ฃ๋์๋์ง ๊ฒ์ฌํ์ง ์๊ณ ์ธ์
์ด ์์
conn_opts.cleansession = 1;
// ํด๋ผ์ด์ธํธ๋ฅผ ์๋ฒ์ ์ฐ๊ฒฐํ๊ธฐ ์ ์ ์ฝ๋ฐฑ์ ์ค์
mqtt_mq135_1 = MQTTClient_setCallbacks(client1, NULL, NULL, on_message_mq135_1, NULL);
mqtt_mq135_2 = MQTTClient_setCallbacks(client2, NULL, NULL, on_message_mq135_2, NULL);
mqtt_mq135_3 = MQTTClient_setCallbacks(client3, NULL, NULL, on_message_mq135_3, NULL);
// ํด๋ผ์ด์ธํธ ํธ๋ค ๋ฐ ํฌ์ธํฐ๋ฅผ ์ฐ๊ฒฐ ์ต์
์ ์ธ์๋ก ์ ๋ฌ
if (((mqtt_mq135_1 = MQTTClient_connect(client1, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_mq135_2 = MQTTClient_connect(client2, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_mq135_3 = MQTTClient_connect(client3, &conn_opts)) != MQTTCLIENT_SUCCESS))
{
fprintf(stderr, "Failed to connect, return code \n");
return 0;
}
// ์ ํํ ํ ํฝ์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ๋
(client, TOPIC, QOS);
// QoS ์ค์ ์ ์ด ๊ตฌ๋
์์๊ฒ ์ก์ ๋ ๋ฉ์์ง์ ์ ์ฉ๋๋ ์ต๋ ์๋น์ค ํ์ง(QoS)์ ํ๋ณ
// ์๋ฒ๋ ์ด ์ค์ ์ ๋ฎ์ ๊ฐ ๋ฐ ์๋ ๋ฉ์์ง์ QoS์์ ๋ฉ์์ง๋ฅผ ์ก์
mqtt_mq135_1 = MQTTClient_subscribe(client1, TOPIC_mq135_1, 0);
mqtt_mq135_2 = MQTTClient_subscribe(client2, TOPIC_mq135_2, 0);
mqtt_mq135_3 = MQTTClient_subscribe(client3, TOPIC_mq135_3, 0);
// ์ฐ๊ฒฐ ํธ์ถ์ด ์คํจํ๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ ์ฝ๋ -1๋ก ์ข
๋ฃ
// ์ฐ๊ฒฐ ํธ์ถ์ด ์คํจํ๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ ์ฝ๋ -1๋ก ์ข
๋ฃ
if ((mqtt_mq135_1 != MQTTCLIENT_SUCCESS) || (mqtt_mq135_2 != MQTTCLIENT_SUCCESS) ||
(mqtt_mq135_3 != MQTTCLIENT_SUCCESS))
{
fprintf(stderr, "Failed to subscribe, return code \n");
return 0;
}
printf("Subscribed to topic: %s\n", TOPIC_mq135_1);
printf("Subscribed to topic: %s\n", TOPIC_mq135_2);
printf("Subscribed to topic: %s\n", TOPIC_mq135_3);
for (;;)
{
usleep(1000000); // Sleep for 1 second
}
// ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ๋๊ธฐ (client, ์ ํ์๊ฐ)
// ํด๋ผ์ด์ธํธ๋ ์๋ฒ์์ ์ฐ๊ฒฐ์ ๋๊ณ ์ฝ๋ฐฑ ํจ์์์ ์์ฑ ์ค์ธ ๋ฉ์์ง๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆผ
// ์ ํ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ง์ (์ฐ๊ฒฐ์ ๋๊ธฐ ์ ์ ์ํํด์ผ ํ๋ ๋ค๋ฅธ ์์
์ด ์๋ฃ๋ ๋๊น์ง ์ต๋ 10์ด ๋์ ๊ธฐ๋ค๋ฆผ)
MQTTClient_disconnect(client1, 10000);
MQTTClient_disconnect(client2, 10000);
MQTTClient_disconnect(client3, 10000);
// ํด๋ผ์ด์ธํธ์ ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น์ฐ๊ณ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ
MQTTClient_destroy(&client1);
MQTTClient_destroy(&client2);
MQTTClient_destroy(&client3);
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ซ๊ธฐ
sqlite3_close(db);
return 0;
}
โ Ultrasonic + button + MQ135 * 3 ๊ฐ ์ดํฉ
// main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
// C์ธ์ด๋ก ๊ตฌํ๋ SQL ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์์ง
#include <sqlite3.h>
#include <time.h>
#include <unistd.h>
// MQ Telemetry Transport ๋ฒ์ 3.1 ํ๋กํ ์ฝ์ ๋ํ
// C ๊ตฌํ์ ํด๋ผ์ด์ธํธ ๊ธฐ๋ฅ์ด ํฌํจ๋ 32๋นํธ Windows ๋ผ์ด๋ธ๋ฌ๋ฆฌ
#include <MQTTClient.h>
#define MQTT_HOST "192.168.0.154"
#define MQTT_PORT 1883
#define MQTT_CLIENT_ID1 "sqlClient1"
#define MQTT_CLIENT_ID2 "sqlClient2"
#define MQTT_CLIENT_ID3 "sqlClient3"
#define MQTT_CLIENT_ID4 "sqlClient4"
#define MQTT_CLIENT_ID5 "sqlClient5"
#define MQTT_CLIENT_ID6 "sqlClient6"
#define MQTT_CLIENT_ID7 "sqlClient7"
#define TOPIC_ultra_1 "sensor/ultrasonic_1"
#define TOPIC_ultra_2 "sensor/ultrasonic_2"
#define TOPIC_button_1 "sensor/button_1"
#define TOPIC_button_2 "sensor/button_2"
#define TOPIC_mq135_1 "sensor/mq135/_1"
#define TOPIC_mq135_2 "sensor/mq135/_2"
#define TOPIC_mq135_3 "sensor/mq135/_3"
#define DATABASE_FILE "mqtt.db"
// SQLite3 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๊ฐ์ฒด
sqlite3 *db;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for (i = 0; i < argc; i++)
{
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
char ultrasonic_1[5];
char ultrasonic_2[5];
char button_1[5];
char button_2[5];
char mq135_1[5];
char mq135_2[5];
char mq135_3[5];
int sql_message_subway() {
char insertSql[200];
// message->payload : payloadptr
snprintf(insertSql, sizeof(insertSql), "INSERT INTO subway_data (mq135_1, mq135_2, mq135_3) VALUES ('%s', '%s', '%s');", mq135_1, mq135_2, mq135_3);
char *zErrMsg = 0;
printf("%s", insertSql);
pthread_mutex_lock(&mutex);
// SQL ๋ช
๋ น์ ์คํ
// (open ํ DB, SQL ๋ฌธ์ฅ, ์ฝ๋ฐฑํจ์ ์ด๋ฆ, ์ฝ๋ฐฑํจ์ ์ฒซ ๋ฒ์งธ ์ธ์, ERROR ๋ณ์)
int sql_rc_subway = sqlite3_exec(db, insertSql, callback, 0, &zErrMsg);
pthread_mutex_unlock(&mutex);
// SQLITE_OK : ์ฝ๋๋ ์์
์ด ์ฑ๊ณตํ๊ณ ์ค๋ฅ๊ฐ ์์์
if (sql_rc_subway != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
putchar('\n');
fprintf(stdout, "Record inserted successfully\n");
}
return 1;
}
int on_message_mq135_1(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(mq135_1, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_mq135_2(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(mq135_2, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_mq135_3(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(mq135_3, message->payload);
sql_message_subway();
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int sql_message_station() {
// printf("%s", ultrasonic_1);
// printf("%s", ultrasonic_2);
// printf("%s", button_1);
// printf("%s", button_2);
char insertSql[200];
// message->payload : payloadptr
snprintf(insertSql, sizeof(insertSql), "INSERT INTO station_data (ultrasonic_1, ultrasonic_2, button_1, button_2) VALUES ('%s', '%s', '%s', '%s');", ultrasonic_1, ultrasonic_2, button_1, button_2);
char *zErrMsg = 0;
printf("%s", insertSql);
pthread_mutex_lock(&mutex);
// SQL ๋ช
๋ น์ ์คํ
// (open ํ DB, SQL ๋ฌธ์ฅ, ์ฝ๋ฐฑํจ์ ์ด๋ฆ, ์ฝ๋ฐฑํจ์ ์ฒซ ๋ฒ์งธ ์ธ์, ERROR ๋ณ์)
int sql_rc_station = sqlite3_exec(db, insertSql, callback, 0, &zErrMsg);
pthread_mutex_unlock(&mutex);
// SQLITE_OK : ์ฝ๋๋ ์์
์ด ์ฑ๊ณตํ๊ณ ์ค๋ฅ๊ฐ ์์์
if (sql_rc_station != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
putchar('\n');
fprintf(stdout, "Record inserted successfully\n");
}
return 1;
}
int on_message_ultra_1(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(ultrasonic_1, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_ultra_2(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(ultrasonic_2, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_button_1(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(button_1, message->payload);
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int on_message_button_2(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
printf("%s", message->payload);
strcpy(button_2, message->payload);
sql_message_station();
// ๋ฉ์์ง ํ์ด๋ก๋์ ํ ๋น๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํจํ์ฌ MQTT ๋ฉ์์ง์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
MQTTClient_freeMessage(&message);
// MQTT C ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ, ํนํ topic ์ด๋ฆ์ ํด์
MQTTClient_free(topicName);
return 1;
}
int main()
{
int sql_rc_station, sql_rc_subway, mqtt_ultra_1, mqtt_ultra_2, mqtt_button_1, mqtt_button_2, mqtt_mq135_1, mqtt_mq135_2, mqtt_mq135_3 ;
MQTTClient client1, client2, client3, client4, client5, client6, client7;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
// ------------------------------------------ SQLite ------------------------------------------
// DB ํ์ผ์ ์ฐ๊ฒฐํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํ
sql_rc_station = sqlite3_open(DATABASE_FILE, &db);
sql_rc_subway = sqlite3_open(DATABASE_FILE, &db);
// ์ฐ๊ฒฐ ์คํจ์ ์ค๋ฅ ๋ฉ์์ง ์ถ๋ ฅ
if (sql_rc_station)
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return 0;
} else if (sql_rc_subway)
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return 0;
}
else
{
fprintf(stdout, "Opened database successfully\n");
}
char *sql_station = "CREATE TABLE IF NOT EXISTS station_data("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"ultrasonic_1 TEXT NOT NULL,"
"ultrasonic_2 TEXT NOT NULL,"
"button_1 TEXT NOT NULL,"
"button_2 TEXT NOT NULL,"
"created_at DATETIME DEFAULT (DATETIME('now', 'localtime')));";
char *sql_subway = "CREATE TABLE IF NOT EXISTS subway_data("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"mq135_1 TEXT NOT NULL,"
"mq135_2 TEXT NOT NULL,"
"mq135_3 TEXT NOT NULL,"
"created_at DATETIME DEFAULT (DATETIME('now', 'localtime')));";
pthread_mutex_lock(&mutex);
// SQL ๋ช
๋ น์ ์คํ
// (open ํ DB, SQL ๋ฌธ์ฅ, ์ฝ๋ฐฑํจ์ ์ด๋ฆ, ์ฝ๋ฐฑํจ์ ์ฒซ ๋ฒ์งธ ์ธ์, ERROR ๋ณ์)
sql_rc_station = sqlite3_exec(db, sql_station, callback, 0, 0);
pthread_mutex_unlock(&mutex);
pthread_mutex_lock(&mutex);
// SQL ๋ช
๋ น์ ์คํ
// (open ํ DB, SQL ๋ฌธ์ฅ, ์ฝ๋ฐฑํจ์ ์ด๋ฆ, ์ฝ๋ฐฑํจ์ ์ฒซ ๋ฒ์งธ ์ธ์, ERROR ๋ณ์)
sql_rc_subway = sqlite3_exec(db, sql_subway, callback, 0, 0);
pthread_mutex_unlock(&mutex);
// SQLITE_OK : ์ฝ๋๋ ์์
์ด ์ฑ๊ณตํ๊ณ ์ค๋ฅ๊ฐ ์์์
if (sql_rc_station != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
return 0;
} else if (sql_rc_subway != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
return 0;
}
else
{
fprintf(stdout, "Table created successfully\n");
}
// ------------------------------------------ MQTT ------------------------------------------
// (์๋ก ์์ฑํ ํด๋ผ์ด์ธํธ์ ํธ๋ค์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ, ์์ ๋๋ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์์ฒญ์ ๋ชจ๋ํฐํ๋ MQTT ํฌํธ์ URI,
// ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด๋ฆ, ํด๋ผ์ด์ธํธ ์ํ๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณด๋ฅ ์ค์ผ๋ก ์์คํ
์ฅ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์์ค)
mqtt_ultra_1 = MQTTClient_create(&client1, MQTT_HOST, MQTT_CLIENT_ID1, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_ultra_2 = MQTTClient_create(&client2, MQTT_HOST, MQTT_CLIENT_ID2, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_button_1 = MQTTClient_create(&client3, MQTT_HOST, MQTT_CLIENT_ID3, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_button_2 = MQTTClient_create(&client4, MQTT_HOST, MQTT_CLIENT_ID4, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_mq135_1 = MQTTClient_create(&client5, MQTT_HOST, MQTT_CLIENT_ID5, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_mq135_2 = MQTTClient_create(&client6, MQTT_HOST, MQTT_CLIENT_ID6, MQTTCLIENT_PERSISTENCE_NONE, NULL);
mqtt_mq135_3 = MQTTClient_create(&client7, MQTT_HOST, MQTT_CLIENT_ID7, MQTTCLIENT_PERSISTENCE_NONE, NULL);
// TCP/IP ์ฐ๊ฒฐ์ด ๋ซํ์ง ์๋๋ก ์์ "ํ์ฑ ์ ์ง(keepalive)" ๋ฉ์์ง๋ฅผ 20์ด๋ง๋ค ๋ณด๋ด๊ธฐ
conn_opts.keepAliveInterval = 10;
// true๋ก ์ค์ ๋์๊ธฐ ๋๋ฌธ์ ์ด์ ์ฐ๊ฒฐ์์ ๋จ์ ์๋ ์์ฑ ์ค์ด๋ ๋ฉ์์ง๊ฐ ์๋ฃ๋์๋์ง ๊ฒ์ฌํ์ง ์๊ณ ์ธ์
์ด ์์
conn_opts.cleansession = 1;
// ํด๋ผ์ด์ธํธ๋ฅผ ์๋ฒ์ ์ฐ๊ฒฐํ๊ธฐ ์ ์ ์ฝ๋ฐฑ์ ์ค์
mqtt_ultra_1 = MQTTClient_setCallbacks(client1, NULL, NULL, on_message_ultra_1, NULL);
mqtt_ultra_2 = MQTTClient_setCallbacks(client2, NULL, NULL, on_message_ultra_2, NULL);
mqtt_button_1 = MQTTClient_setCallbacks(client3, NULL, NULL, on_message_button_1, NULL);
mqtt_button_2 = MQTTClient_setCallbacks(client4, NULL, NULL, on_message_button_2, NULL);
mqtt_mq135_1 = MQTTClient_setCallbacks(client5, NULL, NULL, on_message_mq135_1, NULL);
mqtt_mq135_2 = MQTTClient_setCallbacks(client6, NULL, NULL, on_message_mq135_2, NULL);
mqtt_mq135_3 = MQTTClient_setCallbacks(client7, NULL, NULL, on_message_mq135_3, NULL);
// ํด๋ผ์ด์ธํธ ํธ๋ค ๋ฐ ํฌ์ธํฐ๋ฅผ ์ฐ๊ฒฐ ์ต์
์ ์ธ์๋ก ์ ๋ฌ
if (((mqtt_ultra_1 = MQTTClient_connect(client1, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_ultra_2 = MQTTClient_connect(client2, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_button_1 = MQTTClient_connect(client3, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_button_2 = MQTTClient_connect(client4, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
(((mqtt_mq135_1 = MQTTClient_connect(client5, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_mq135_2 = MQTTClient_connect(client6, &conn_opts)) != MQTTCLIENT_SUCCESS) ||
((mqtt_mq135_3 = MQTTClient_connect(client7, &conn_opts)) != MQTTCLIENT_SUCCESS)))
{
fprintf(stderr, "Failed to connect, return code \n");
return 0;
}
// ์ ํํ ํ ํฝ์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ๋
(client, TOPIC, QOS);
// QoS ์ค์ ์ ์ด ๊ตฌ๋
์์๊ฒ ์ก์ ๋ ๋ฉ์์ง์ ์ ์ฉ๋๋ ์ต๋ ์๋น์ค ํ์ง(QoS)์ ํ๋ณ
// ์๋ฒ๋ ์ด ์ค์ ์ ๋ฎ์ ๊ฐ ๋ฐ ์๋ ๋ฉ์์ง์ QoS์์ ๋ฉ์์ง๋ฅผ ์ก์
mqtt_ultra_1 = MQTTClient_subscribe(client1, TOPIC_ultra_1, 0);
mqtt_ultra_2 = MQTTClient_subscribe(client2, TOPIC_ultra_2, 0);
mqtt_button_1 = MQTTClient_subscribe(client3, TOPIC_button_1, 0);
mqtt_button_2 = MQTTClient_subscribe(client4, TOPIC_button_2, 0);
mqtt_mq135_1 = MQTTClient_subscribe(client5, TOPIC_mq135_1, 0);
mqtt_mq135_2 = MQTTClient_subscribe(client6, TOPIC_mq135_2, 0);
mqtt_mq135_3 = MQTTClient_subscribe(client7, TOPIC_mq135_3, 0);
// ์ฐ๊ฒฐ ํธ์ถ์ด ์คํจํ๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ ์ฝ๋ -1๋ก ์ข
๋ฃ
// ์ฐ๊ฒฐ ํธ์ถ์ด ์คํจํ๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ค๋ฅ ์ฝ๋ -1๋ก ์ข
๋ฃ
if ((mqtt_ultra_1 != MQTTCLIENT_SUCCESS) || (mqtt_ultra_2 != MQTTCLIENT_SUCCESS) ||
(mqtt_button_1 != MQTTCLIENT_SUCCESS) || (mqtt_button_1 != MQTTCLIENT_SUCCESS) ||
(mqtt_mq135_1 != MQTTCLIENT_SUCCESS) || (mqtt_mq135_2 != MQTTCLIENT_SUCCESS) ||
(mqtt_mq135_3 != MQTTCLIENT_SUCCESS))
{
fprintf(stderr, "Failed to subscribe, return code \n");
return 0;
}
printf("Subscribed to topic: %s\n", TOPIC_ultra_1);
printf("Subscribed to topic: %s\n", TOPIC_ultra_2);
printf("Subscribed to topic: %s\n", TOPIC_button_1);
printf("Subscribed to topic: %s\n", TOPIC_button_2);
printf("Subscribed to topic: %s\n", TOPIC_mq135_1);
printf("Subscribed to topic: %s\n", TOPIC_mq135_2);
printf("Subscribed to topic: %s\n", TOPIC_mq135_3);
for (;;)
{
usleep(1000000); // Sleep for 1 second
}
// ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ๋๊ธฐ (client, ์ ํ์๊ฐ)
// ํด๋ผ์ด์ธํธ๋ ์๋ฒ์์ ์ฐ๊ฒฐ์ ๋๊ณ ์ฝ๋ฐฑ ํจ์์์ ์์ฑ ์ค์ธ ๋ฉ์์ง๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆผ
// ์ ํ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ง์ (์ฐ๊ฒฐ์ ๋๊ธฐ ์ ์ ์ํํด์ผ ํ๋ ๋ค๋ฅธ ์์
์ด ์๋ฃ๋ ๋๊น์ง ์ต๋ 10์ด ๋์ ๊ธฐ๋ค๋ฆผ)
MQTTClient_disconnect(client1, 10000);
MQTTClient_disconnect(client2, 10000);
MQTTClient_disconnect(client3, 10000);
MQTTClient_disconnect(client4, 10000);
MQTTClient_disconnect(client5, 10000);
MQTTClient_disconnect(client6, 10000);
MQTTClient_disconnect(client7, 10000);
// ํด๋ผ์ด์ธํธ์ ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น์ฐ๊ณ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ
MQTTClient_destroy(&client1);
MQTTClient_destroy(&client2);
MQTTClient_destroy(&client3);
MQTTClient_destroy(&client4);
MQTTClient_destroy(&client5);
MQTTClient_destroy(&client6);
MQTTClient_destroy(&client7);
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ซ๊ธฐ
sqlite3_close(db);
return 0;
}
728x90
๋ฐ์ํ
'๐ฉโ๐ป IoT (Embedded) > Arduino' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Comments