当前位置:首页 » 《休闲阅读》 » 正文

linux下MQTT服务器(EMQX)搭建及paho.mqtt.c客户端开发

7 人参与  2024年04月04日 14:40  分类 : 《休闲阅读》  评论

点击全文阅读


前言:

MQTT 是一种基于客户端服务端架构的发布 / 订阅模式的消息传输协议。它的设计思想是轻巧、开放、 简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与 机器的通信( M2M )以及物联网环境( IoT )。        ----MQTT 协议中文版

一.linux下EMQX服务器搭建

下载安装包 免费下载、试用 EMQ 产品 找对自己开发环境版本
1.下载deb包
wget https://www.emqx.com/zh/downloads/broker/4.4.19/emqx-4.4.19-otp24.3.4.2-1-ubuntu16.04-amd64.deb
2.安装
sudo apt install ./emqx-4.4.19-otp24.3.4.2-1-ubuntu16.04-amd64.deb
3.运行
sudo systemctl start emqx 此时在浏览器登录服务器IP   http://(server_ip):18083/#/

即可验证自己服务器安装的是否成功,用户名是 admin,初始密码 public

二.客户端工具MQTTX的安装

下载地址 免费下载、试用 EMQ 产品

 我用的是windows下的,接着安装运行直接下一步走下去就行了。

name:客户端的名字 client ID:客户端ID host:第一步里面服务器的IP地址 创建好了之后连接服务器,然后再创建一个客户端,相互收发验证。

三.linux下paho.mqtt.c的开发

1. paho.mqtt.c下载
git clone https://github.com/eclipse/paho.mqtt.c.gitcd paho.mqtt.cmkdir buildcd buildcmake ..make make install

安装完成会在/usr/local/include和/usr/local/lib下看见mqtt的头文件和动态库。

 2.mqtt代码开发
#include <MQTTAsync.h>  //换成你自己的安装路径,不然回报错#include <stdio.h>#include <unistd.h>#include <string.h>#define  SERVERIP "xxx"  //换成你自己的服务器#define Clientid "sza123"    //这个随便写int isConnected=0;//消息回调函数int onMessrecv(void* context,char*topicName,int topicLen,MQTTAsync_message*message){            printf("recv name:\ntopic:%s,payload:%s\n",topicName,(char*)message->payload);            MQTTAsync_free(topicName);            MQTTAsync_free(message);            return 1;         }void onSubscribe(void* context,MQTTAsync_successData* response){    printf("sub success!");}//连接mqtt服务器void onConnect(void *context,MQTTAsync_successData* response){    MQTTAsync client =(MQTTAsync)context;    int ret;    MQTTAsync_responseOptions response_opt=MQTTAsync_responseOptions_initializer;    printf("Succeed in connecting to mqtt-server!\n");    response_opt.onSuccess=onSubscribe;    ret=MQTTAsync_subscribe(client,"/pub",1,&response_opt);//订阅/pub主题消息    if(ret!=MQTTASYNC_SUCCESS){        printf("fail to sub!\n");    }    isConnected=1;}void disConnect(void *context,MQTTAsync_failureData* response){    printf("Failed to connect  mqtt-server!\n");}void onSend(void* context,MQTTAsync_successData* response){    printf("send message to mqtt server success!\n");}int main(){    MQTTAsync client;    int ret;    MQTTAsync_connectOptions conn_opt = MQTTAsync_connectOptions_initializer;//初始化连接选项    ret=MQTTAsync_create(&client,SERVERIP,Clientid,MQTTCLIENT_PERSISTENCE_NONE,NULL);    if(ret!=MQTTASYNC_SUCCESS)    {        printf("Cannot create mqtt client!\n");        return -1;    }    //初始化接收消息回调    ret=MQTTAsync_setCallbacks(client,NULL,NULL,onMessrecv,NULL);    if(ret!=MQTTASYNC_SUCCESS){        printf("cannnot set call back function!\n");        return  -1;    }    conn_opt.onSuccess=onConnect;    conn_opt.onFailure=disConnect;    conn_opt.automaticReconnect=1;    conn_opt.context=client;    conn_opt.cleansession=0;    //conn_opt.username="xxx";//设置用户名密码换成自己的    //conn_opt.password="xxx";    ret=MQTTAsync_connect(client,&conn_opt);    //因为是异步的,当MQTTAsync_connect返回的时候只是代表底层代码对参数进行了检查    //当正确返回时,表示底层代码接收了该connect连接命令    if(ret!=MQTTASYNC_SUCCESS)    {        printf("Cannot start a mqttt server connect!\n");        return -1;    }    while (1){        //1表示成功连接到我们的服务器        if(isConnected==1){            MQTTAsync_message message=MQTTAsync_message_initializer;            MQTTAsync_responseOptions res_option=MQTTAsync_responseOptions_initializer;            char buffer[200];            static int temp=16;            static int humid=58;            sprintf(buffer," temp:%d,humid:%d ",temp++,humid++);            message.payload=buffer;            message.payloadlen=strlen(buffer);            message.qos=1;            res_option.onSuccess=onSend;            printf("read the message is :");            //发布消息            ret=MQTTAsync_sendMessage(client,"/sensor/dht11/0",&message,&res_option);//发送消息            if(ret!=MQTTASYNC_SUCCESS){                printf("参数错误!");            }                   sleep(10);                     if(temp>30|humid>90){                       temp=16;                       humid=58;                   }        }    }    return 0;}

 然后编译

gcc mqtt.c -o mqtt -I /usr/local/include/ -lpaho-mqtt3a

运行mqtt

 

 此时windows上的客户端工具就会接收相应的内容,也可以向linux客户端发送消息。


点击全文阅读


本文链接:http://zhangshiyu.com/post/90499.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1