1. 安装mosquitto
- 首先安装mosquitto库,openwrt内核自带有,可以使用内核带的mosquitto库。
- 执行make menuconfig,在Network —>目录下,这里只使用到客户端,不打算做服务器,而且不打算用ssl,所以只选择mosquitto-client-nossl,上面的broker是做mqtt服务器用的。
- make V=s编译。
2. 提取so库和头文件
cd /home/openwrt-hiwooya-master/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/mosquitto-nossl/mosquitto-1.4.10/lib/cpp
sudo cp libmosquittopp.so.1 mosquittopp.h /mnt/hgfs/Share/
cd ..
sudo cp libmosquitto.so.1 mosquitto.h /mnt/hgfs/Share/
放入到源码路径的需要把libmosquittopp.so.1改名为libmosquittopp.so,libmosquitto.so.1改名为libmosquitto.so。
放入到开发板的动态库不需要改名,放在/usr/lib/路径下。
mosquittopp是支持C++程序。
mosquitto是支持C程序,如果不使用C++开发的话,可以不提取libmosquittopp.so.1和mosquittopp.h。
3. 编译mqtt客户端代码
编译代码发现报了异常错误
经过搜索,发现是mosquitto库支持了WITH_SRV,因为我不需要这个功能,想着尽量减少库大小,想把这功能取消了,需要的可以安装srv这个库。
4. 修改mosquitto的配置
最开始我在/home/openwrt-hiwooya-master/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/mosquitto-nossl/mosquitto-1.4.10这个目录下,修改CMakeLists.txt,改为OFF
修改了config.mk,改为no
执行make V=s编译,但是发现了它不编译这个库。
研究了一下,发现它这个编译是,从dl里面解压,然后再编译的,也就是说修改build_dir目录下的文件,最后还会被解压后覆盖。所以需要改源头dl下面。
进入dl目录,解压mosquitto-1.4.10.tar.gz,根据上面步骤修改配置,重新压缩。
再次执行编译,最后生成的so和头文件根据第2步提取。
5. 客户端代码
//mosquitto_client.hpp
class MosquittoClient : public mosqpp::mosquittopp
{
public:
MosquittoClient();
virtual ~MosquittoClient();
bool connect(std::string server_addr, std::string client_id, std::string user_name, std::string password, int qos, int keep_alive, bool clean_session);
void publish_message(const struct mosquitto_message *message);
private:
void on_connect(int rc);
void on_disconnect();
void on_publish(int mid);
void on_subscribe(int mid, int qos_count, const int *granted_qos);
void on_message(const struct mosquitto_message *message);
};
//mosquitto_client。cpp
/*
* 描述 :构造函数
* 参数 :
* 无
* 返回 :
* 无
*/
MosquittoClient::MosquittoClient()
{
//初始化mosquitto库
lib_init();
}
/*
* 描述 :析构函数
* 参数 :
* 无
* 返回 :
* 无
*/
MosquittoClient::~MosquittoClient()
{
//断开连接
mosquittopp::disconnect();
//清除mosquitto库
mosqpp::lib_cleanup();
}
/*
* 描述 :连接mqtt服务器
* 参数 :
* 无
* 返回 :
* 无
*/
bool MosquittoClient::connect(std::string server_addr, std::string client_id, std::string user_name, std::string password, int qos, int keep_alive, bool clean_session)
{
//重新初始化
reinitialise(client_id.c_str(), clean_session);
//设置用于名和密码
username_pw_set(user_name.c_str(), password.c_str());
//连接mqtt服务器
int ret = mosquittopp::connect(server_addr.c_str(), 1883, keep_alive);
if (ret == MOSQ_ERR_ERRNO)
{
//连接出错
std::cout << "connect error:" << mosqpp::strerror(ret) << std::endl;
}
}
/*
* 描述 :发布主题消息
* 参数 :
* [in] message 发送的消息
* 返回 :
* 无
*/
void MosquittoClient::publish_message(const struct mosquitto_message *message)
{
publish(&message->mid, message->topic, message->payloadlen, message->payload, message->qos, message->retain);
}
/*
* 描述 :连接mqtt服务器成功回调
* 参数 :
* [in] rc
* 返回 :
* 无
*/
void MosquittoClient::on_connect(int rc)
{
}
/*
* 描述 :已断开mqtt服务器连接
* 参数 :
* 无
* 返回 :
* 无
*/
void MosquittoClient::on_disconnect()
{
}
/*
* 描述 :已发布主题成功回调函数
* 参数 :
* [in] mid mqtt数据包id号
* 返回 :
* 无
*/
void MosquittoClient::on_publish(int mid)
{
}
/*
* 描述 :已发布主题成功回调函数
* 参数 :
* [in] mid mqtt数据包id号
* [in] qos_count
* [out] granted_qos
* 返回 :
* 无
*/
void MosquittoClient::on_subscribe(int mid, int qos_count, const int *granted_qos)
{
}
/*
* 描述 :已接收到订阅到的消息
* 参数 :
* [in] message 接收到mqtt订阅的信息
* 返回 :
* 无
*/
void MosquittoClient::on_message(const struct mosquitto_message *message)
{
}