win7安装使用mosquitto,vs2010中使用libmosquittopp

这里写代码片网上看了很多windows系统安装mosquitto的,都提到装cygwin,不知道为什么,我是直接下载mosquitto-1.4.10-install-win32.exe 安装的,具体过程如下:

1 下载、安装、使用

1.1 下载

mosquitto最新版下载:http://mosquitto.org/download/ 
windows安装选择: 
mosquitto-1.4.10-install-win32.exe (~200 kB) (Native build, Windows Vista and up, built with Visual Studio Community 2013) 
mosquitto-1.4.10-install-cygwin.exe (~200 kB) (Cygwin build, Windows XP and up) 
两者区别已经说明了,只是编译方式不同,第二个应该是多了cygwin相关的库,我两个都试了,都可以,真正要注意的问题是,openssl、pthreads相关的动态库,下面会提到 
(源码编译的话,需要下载源码:http://mosquitto.org/files/source/

1.2 安装

双击“mosquitto-1.4.10-install-win32.exe”,按提示下一步安装好即可

1.3 使用

进入mosquitto安装目录,双击“mosquitto.exe”,出现几个问题: 
1)缺少ssleay32.dll 
解决方法:下载64位ssleay32.dll、libeay32.dll,另外还有个pthreadVC2.dll,三个dll放到安装目录 
2)双击“mosquitto.exe”一闪而过 
解决方法:win+R键,输入services.msc回车(或者右键计算机属性–>管理–>服务),打开窗口后在服务里找到Mosquitto Broker,若为启动状态,点击“停止”,右键属性设置为手动启动。 
上述问题解决后,双击“mosquitto.exe”,即手动启动了mosquitto服务,即在本机开启了mqtt代理,下面可以进行发布和订阅测试。

3 发布订阅测试

3.1 用提供的mosquitto.exe、mosquitto_sub.exe、mosquitto_pub.exe测试

3.1.1启动mosquitto服务

参考:http://www.th7.cn/system/win/201607/170516.shtml 
进入安装目录,双击双击“mosquitto.exe”即可,因为上面已经设置了手动启动mosquitto服务,所以该窗口不要关闭,测试过程重要一直启动该服务

3.1.2 订阅

win+R键,输入cmd,即打开命令行,进入mosquitto目录,输入:mosquitto_sub -v -t MqttTest 
-v表示打印更多调试信息,-t表示指定主题,MqttTest即为主题名

3.1.3 发布

win+R键,输入cmd,即打开命令行,进入mosquitto目录,输入: mosquitto_pub -t MqttTest -m HelloMqtt 
-t表示指定主题,MqttTest即为主题名, 
-m表示指定消息内容,HelloMqtt即为消息内容

3.2 VS2010项目中测试

参考:http://blog.csdn.net/akof1314/article/details/7494572 
1. 创建Win32控制台程序; 
2. 将mosquitto安装目录下的devel文件夹中的mosquitto.h、mosquittopp.h、mosquittopp.lib拷贝到工程目录下(建议新建文件夹,专门放mqtt相关的,然后在项目属性中,对应添加引用和包含目录); 
3. 修改mosquittopp.h文件:

#include <mosquitto.h>
  • 1

改成:

#include "mosquitto.h"
  • 1
  1. 代码
#include "stdafx.h" 
#include <iostream> 
#include "mosquitto.h"
#include "mosquittopp.h" 
#pragma comment(lib, "mosquittopp.lib")
#include "stdafx.h" 
class mqtt_test:public mosqpp::mosquittopp 
{ 
public: 
    mqtt_test(const char *id):mosquittopp(id){} 
    void on_connect(int rc) {std::cout<<"on_connect"<<std::endl;} 
    void on_disconnect() {std::cout<<"on_disconnect"<<std::endl;} 
    void on_publish(int mid) {std::cout<<"on_publish"<<std::endl;} 
    void on_subscribe(int mid, int qos_count, const int *granted_qos);//订阅回调函数
    void on_message(const struct mosquitto_message *message);//订阅主题接收到消息
}; 
std::string g_subTopic="subTopic";
void mqtt_test::on_subscribe(int mid, int qos_count, const int *granted_qos)
{
    std::cout<<"订阅 mid: %d "<<mid<<std::endl;
}
void mqtt_test::on_message(const struct mosquitto_message *message) 
{
    bool res=false;
    mosqpp::topic_matches_sub(g_subTopic.c_str(),message->topic,&res);
    if(res)
    {
        std::string strRcv=(char *)message->payload;
        std::cout<<"来自<"<<message->topic<<">的消息:"<<strRcv<<std::endl;
    }
}
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    mosqpp::lib_init(); 
    mqtt_test test("client6"); 

    int rc; 
    char buf[1024] = "This is test"; 
    test.username_pw_set("wmy","mqtt");
    rc = test.connect("127.0.0.1");//本地IP 
    char err[1024];
    if(rc == MOSQ_ERR_ERRNO)
        std::cout<<"连接错误:"<< mosqpp::strerror(rc)<<std::endl;//连接出错
    else if (MOSQ_ERR_SUCCESS == rc) 
    { 
        //发布测试
        rc = test.loop(); 
        if (MOSQ_ERR_SUCCESS == rc) 
        { 
            rc = test.publish(NULL, "topic/test", strlen(buf), (const void *)buf); 
            rc = test.loop(); 
        } 
        rc = test.disconnect(); //订阅测试时注释该行
        rc = test.loop(); //订阅测试时注释该行

        //test.subscribe(NULL,g_subTopic.c_str());//订阅测试取消注释该行
        //rc = test.loop_forever();//订阅测试取消注释该行
    }         
    mosqpp::lib_cleanup(); 
    system("pause");
    return 0; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

5 build 
build上述代码,应该没问题,然后将mosquitto安装目录下的mosquitto.dll、mosquittopp.dll以及ssleay32.dll、libeay32.dll、pthreadVC2.dll,一共5个dll,一起拷贝到工程输出目录下,即exe所在目录; 
6 运行 
上面代码为发布主题的测试(对应注释,可以作订阅测试),运行前按之前的方式先用命令行开启订阅主题,运行代码后,可接收到订阅主题的消息。 
libmosquitto、libmosquittocpp函数说明: 
http://mosquitto.org/api/files/mosquitto-h.html

猜你喜欢

转载自blog.csdn.net/enlaihe/article/details/78358206