开发者中心

Hello MQTT C

概述

在本教程中,您将了解如何配合立子云预定义的消息(称为"静态模板")来使用C语言版本的MQTT客户端。

前提条件

为了更好的使用本教程,请检查以下必备条件:

  • 您需要有一个有效的租户,用户名和密码,以访问立子云平台。
  • 确认您已经安装了gcc编译器:
  • 
        gcc --version
        gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
        Copyright (C) 2015 Free Software Foundation, Inc.
        This is free software; see the source for copying conditions.  There is NO
        warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
                            
  • 下载、编译和安装MQTT C Paho Client,您可以在这个网站上查看更多关于Paho的详细说明(http://www.eclipse.org/paho/clients/c/)。

开发"Hello, MQTT world!" 客户端

开发一个非常简单的“Hello,world !“quarkioe MQTT客户端,您需要:

  • 创建应用程序。
  • 编译和运行应用程序。
创建应用程序

创建一个源文件,例如“hello_mqtt.c”:


#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include "MQTTClient.h"

#define ADDRESS     "<<serverUrl>>"
#define CLIENTID    "<<clientId>>"

void publish(MQTTClient client, char* topic, char* payload) {
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    pubmsg.payload = payload;
    pubmsg.payloadlen = strlen(pubmsg.payload);
    pubmsg.qos = 2;
    pubmsg.retained = 0;
    MQTTClient_deliveryToken token;
    MQTTClient_publishMessage(client, topic, &pubmsg, &token);
    MQTTClient_waitForCompletion(client, token, 1000L);
    printf("Message '%s' with delivery token %d delivered\n", payload, token);
}

int on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
    char* payload = message->payload;
    printf("Received operation %s\n", payload);
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;
}

int main(int argc, char* argv[]) {
    MQTTClient client;
    MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    conn_opts.username = "<<tenant>>/<<username>>";
    conn_opts.password = "<<password>>";

    MQTTClient_setCallbacks(client, NULL, NULL, on_message, NULL);

    int rc;
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
        printf("Failed to connect, return code %d\n", rc);
        exit(-1);
    }
    //create device
    publish(client, "s/us", "100,C MQTT,c8y_MQTTDevice");
    //set hardware information
    publish(client, "s/us", "110,S123456789,MQTT test model,Rev0.1");
    //listen for operation
    MQTTClient_subscribe(client, "s/ds", 0);

    for (;;) {
        //send temperature measurement
        publish(client, "s/us", "211,25");
        sleep(3);
    }
    MQTTClient_disconnect(client, 1000);
    MQTTClient_destroy(&client);
    return rc;
}
                        

根据您的需要替换"<<clientId>>", "<<serverUrl>>", "<<tenant>>", "<<username>>", "<<password>>"。

Quarkioe MQTT协议支持非安全的TCP和安全的SSL两种连接(如 tcp://mqtt.quarkioe.com:1883或ssl://mqtt.quarkioe.com:8883),你可以选择一个适合你的“< < serverUrl > >”。当使用SSL时,您需要配置MQTTClient_SSLOptions和设置MQTTClient_connectOptions。

"main"函数中的代码在做什么?

  • 配置MQTT连接。
  • 注册一个 on_message回调函数,并打印传入的messages。
  • 通过MQTT协议连接Quarkioe。
  • 创建一个名称为C MQTT,类型为c8y_MQTTDevice的新设备。
  • 更新设备硬件信息。如序列号: S123456789  型号:MQTT test model 修订版本:Rev0.1。
  • 客户端为设备订阅静态操作模板,每产生新操作便会触发on_message回调函数。
  • 每3秒发送一次温度测量。

“publish”中的代码在做什么?

  • 创建一个新的MQTT消息并设定一个有效载荷。
  • 通过MQTT协议发布消息。
  • 对于服务器返回的ACk消息最多等待1秒钟。

注意,设备创建后才能订阅,否则如果没有创建设备,服务器将不接受订阅。

编译和运行

编译:


  gcc hello_mqtt.c -o hello_mqtt -lpaho-mqtt3c
                    

运行:


./hello_mqtt
Message '100,C MQTT,c8y_MQTTDevice' with delivery token 1 delivered
...
                    

启动应用程序后,您会在立子云平台应用程序的设备管理中的设备清单里面看到一个新的设备。

另外,如果新创建一个设备操作(例如 c8y_Restart),该设备操作信息将会显示在控制列表。

改进agent

现在您已经完成了第一步,接下来您可以查看Hello MQTT章节,学习更多的Quarkioe MQTT相关知识,改进您的应用程序。