前言:
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.deb2.安装
sudo apt install ./emqx-4.4.19-otp24.3.4.2-1-ubuntu16.04-amd64.deb3.运行
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客户端发送消息。