openwrt mqtt客户端(五)

1. 安装mosquitto

  1. 首先安装mosquitto库,openwrt内核自带有,可以使用内核带的mosquitto库。
  2. 执行make menuconfig,在Network —>目录下,这里只使用到客户端,不打算做服务器,而且不打算用ssl,所以只选择mosquitto-client-nossl,上面的broker是做mqtt服务器用的。
    在这里插入图片描述
  3. 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)
{

}

6. mosquitto库官方详解

官方详解路径

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值