# Paho MQTT test
###### tags: `programming` `python` `C`
## Docker Compose
```yaml=
version: '3'
services:
mosquitto:
image: eclipse-mosquitto:latest
ports:
- 1883:1883
volumes:
- "./.mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf"
- "./.mosquitto/log:/mosquitto/log"
server:
image: rust:latest
restart: always
tty: true
volumes:
- "./mqtt-server:/root/mqtt-server"
python-app:
image: python:latest
restart: always
tty: true
volumes:
- "./python-app:/root/app"
c-app:
image: gcc:latest
restart: always
tty: true
volumes:
- "./c-app:/root/app"
```
## Paho MQTT Python
```python=
import paho.mqtt.client as mqtt
from time import sleep
# ブローカーに接続できたときの処理
def on_connect(client, userdata, flag, rc):
print("Connected with result code " + str(rc))
# ブローカーが切断したときの処理
def on_disconnect(client, userdata, flag, rc):
if rc != 0:
print("Unexpected disconnection.")
# publishが完了したときの処理
def on_publish(client, userdata, mid):
print("publish: {0}".format(mid))
# メイン関数
def main():
# クラスのインスタンス(実体)の作成
client = mqtt.Client()
# 接続時のコールバック関数を登録
client.on_connect = on_connect
# 切断時のコールバックを登録
client.on_disconnect = on_disconnect
# メッセージ送信時のコールバック
client.on_publish = on_publish
# 接続先
client.connect("localhost", 1883, 60)
# 通信処理スタート
client.loop_start()
sleep(1)
# 10回繰り返す
for _ in range(3):
# トピック名とメッセージを決めて送信
mid = client.publish("/farms/uranum", "Hello World!")
print(f"result : {mid}")
sleep(3)
# 後処理
client.loop_stop()
if __name__ == "__main__":
main()
```
## Paho MQTT C
```c=
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
struct mqtt_client_t {
MQTTClient handle;
uint8_t qos;
uint32_t timeout;
};
struct mqtt_client_t* initialize(const char* address, const char* id) {
struct mqtt_client_t* client = (struct mqtt_client_t*)calloc(1, sizeof(struct mqtt_client_t));
client->qos = 1;
client->timeout = 10000L;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
int rc;
if ((rc = MQTTClient_create(&client->handle, address, id,
MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS) {
printf("Failed to create client, return code %d\n", rc);
exit(EXIT_FAILURE);
}
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client->handle, &conn_opts)) != MQTTCLIENT_SUCCESS) {
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
return client;
}
void finalize(struct mqtt_client_t* client) {
int rc;
if ((rc = MQTTClient_disconnect(client->handle, 10000)) != MQTTCLIENT_SUCCESS) {
printf("Failed to disconnect, return code %d\n", rc);
}
MQTTClient_destroy(&client->handle);
}
void publish(struct mqtt_client_t* client, const char* topic, const char* message) {
MQTTResponse res;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int rc;
pubmsg.payload = (void*)message;
pubmsg.payloadlen = (int)strlen(message);
pubmsg.qos = client->qos;
pubmsg.retained = 0;
if ((rc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS) {
printf("Failed to publish message, return code %d\n", rc);
exit(EXIT_FAILURE);
}
rc = MQTTClient_waitForCompletion(client, token, client->timeout);
}
int main(int argc, char* argv[])
{
struct mqtt_client_t* client = initialize("tcp://mosquitto:1883", "uranum");;
client->qos = 1;
client->timeout = 10000;
publish(client, "/farms/uranum", "Hello World!");
finalize(client);
return 0;
}
```
## Reference
[Eclipse](https://www.eclipse.org/paho/files/mqttdoc/MQTTClient/html/pubsync.html)