当前位置:   article > 正文

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

linux emqx

前言:

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

一.linux下EMQX服务器搭建

找对自己开发环境版本
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的安装

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

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

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

1. paho.mqtt.c下载
  1. git clone https://github.com/eclipse/paho.mqtt.c.git
  2. cd paho.mqtt.c
  3. mkdir build
  4. cd build
  5. cmake ..
  6. make
  7. make install

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

 2.mqtt代码开发
  1. #include <MQTTAsync.h> //换成你自己的安装路径,不然回报错
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #define SERVERIP "xxx" //换成你自己的服务器
  6. #define Clientid "sza123" //这个随便写
  7. int isConnected=0;
  8. //消息回调函数
  9. int onMessrecv(void* context,char*topicName,int topicLen,MQTTAsync_message*message){
  10. printf("recv name:\ntopic:%s,payload:%s\n",topicName,(char*)message->payload);
  11. MQTTAsync_free(topicName);
  12. MQTTAsync_free(message);
  13. return 1;
  14. }
  15. void onSubscribe(void* context,MQTTAsync_successData* response){
  16. printf("sub success!");
  17. }
  18. //连接mqtt服务器
  19. void onConnect(void *context,MQTTAsync_successData* response)
  20. {
  21. MQTTAsync client =(MQTTAsync)context;
  22. int ret;
  23. MQTTAsync_responseOptions response_opt=MQTTAsync_responseOptions_initializer;
  24. printf("Succeed in connecting to mqtt-server!\n");
  25. response_opt.onSuccess=onSubscribe;
  26. ret=MQTTAsync_subscribe(client,"/pub",1,&response_opt);//订阅/pub主题消息
  27. if(ret!=MQTTASYNC_SUCCESS){
  28. printf("fail to sub!\n");
  29. }
  30. isConnected=1;
  31. }
  32. void disConnect(void *context,MQTTAsync_failureData* response)
  33. {
  34. printf("Failed to connect mqtt-server!\n");
  35. }
  36. void onSend(void* context,MQTTAsync_successData* response){
  37. printf("send message to mqtt server success!\n");
  38. }
  39. int main()
  40. {
  41. MQTTAsync client;
  42. int ret;
  43. MQTTAsync_connectOptions conn_opt = MQTTAsync_connectOptions_initializer;//初始化连接选项
  44. ret=MQTTAsync_create(&client,SERVERIP,Clientid,MQTTCLIENT_PERSISTENCE_NONE,NULL);
  45. if(ret!=MQTTASYNC_SUCCESS)
  46. {
  47. printf("Cannot create mqtt client!\n");
  48. return -1;
  49. }
  50. //初始化接收消息回调
  51. ret=MQTTAsync_setCallbacks(client,NULL,NULL,onMessrecv,NULL);
  52. if(ret!=MQTTASYNC_SUCCESS){
  53. printf("cannnot set call back function!\n");
  54. return -1;
  55. }
  56. conn_opt.onSuccess=onConnect;
  57. conn_opt.onFailure=disConnect;
  58. conn_opt.automaticReconnect=1;
  59. conn_opt.context=client;
  60. conn_opt.cleansession=0;
  61. //conn_opt.username="xxx";//设置用户名密码换成自己的
  62. //conn_opt.password="xxx";
  63. ret=MQTTAsync_connect(client,&conn_opt);
  64. //因为是异步的,当MQTTAsync_connect返回的时候只是代表底层代码对参数进行了检查
  65. //当正确返回时,表示底层代码接收了该connect连接命令
  66. if(ret!=MQTTASYNC_SUCCESS)
  67. {
  68. printf("Cannot start a mqttt server connect!\n");
  69. return -1;
  70. }
  71. while (1){
  72. //1表示成功连接到我们的服务器
  73. if(isConnected==1){
  74. MQTTAsync_message message=MQTTAsync_message_initializer;
  75. MQTTAsync_responseOptions res_option=MQTTAsync_responseOptions_initializer;
  76. char buffer[200];
  77. static int temp=16;
  78. static int humid=58;
  79. sprintf(buffer," temp:%d,humid:%d ",temp++,humid++);
  80. message.payload=buffer;
  81. message.payloadlen=strlen(buffer);
  82. message.qos=1;
  83. res_option.onSuccess=onSend;
  84. printf("read the message is :");
  85. //发布消息
  86. ret=MQTTAsync_sendMessage(client,"/sensor/dht11/0",&message,&res_option);//发送消息
  87. if(ret!=MQTTASYNC_SUCCESS){
  88. printf("参数错误!");
  89. }
  90. sleep(10);
  91. if(temp>30|humid>90){
  92. temp=16;
  93. humid=58;
  94. }
  95. }
  96. }
  97. return 0;
  98. }

 然后编译

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

运行mqtt

 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/722373
推荐阅读
相关标签
  

闽ICP备14008679号