选择软件
打开menuconfig以后选择以下选项
Network --->
<*> mosquitto-client-ssl......... mosquitto - client tools (With SSL support)
<*> mosquitto-ssl...... mosquitto - an MQTT message broker (with SSL support)
[*] libwebsockets support (NEW)
[*] Include mosquitto_ctrl utility (NEW)
[*] Install mosquitto_dynamic_security.so (NEW)
[*] Include mosquitto_passwd utility (NEW)
Utilities --->
<*> openssl-util........................... Open source SSL toolkit (utility)
配置软件
配置软件需要两个文件,一个是初始化文件mosquitto.conf,另一个是账号密码文件pwfile。在package/feeds/packages/mosquitto/files/etc下创建一个文件夹mosquitto存放这两个文件。
mosquitto/
|-- mosquitto.conf
`-- pwfile
两个文件内容如下
####### mosquitto.conf
listener 1883
# 设置监听端口
allow_anonymous false
# 关闭匿名登录
password_file /etc/mosquitto/pwfile
# 连接mqtt服务器的账号密码
####### pwfile
# 这里的账号是root,密码是12345678
root:$7$101$yr0sFgahpDRCJvXO$NsrHzWgZ/HVhvJrt+SYpDk/gI4lnoY35+lnsDkTJokZcn2JNHTzFN9XAV22oAwc9Etw9rWK9Nlee2UsGX+jNzA==
如下想要自己创建账号密码,可以在openwr设备的命令行输入以下指令(必须已经安装了mosquitto)。
mosquitto_passwd -c /etc/mosquitto/pwfile admin
该指令会删掉以前的用户然后重新创建一个admin用户,如果希望创建多个用户可以用以下指令。
mosquitto_passwd /etc/mosquitto/pwfile admin
配置完软件以后,重新编译一次源码就可以正常使用mqtt服务器了。
调用mosquitto的库
我自己编写了一个基于c语言的程序,调用mosquitto的库去使用mqtt。
#include <stdio.h>
#include <stdlib.h>
#include <mosquitto.h>
#include <string.h>
#define HOST "localhost"
// MQTT服务器地址
#define PORT 1883
// MQTT端口号
#define KEEP_ALIVE 5
// 心跳包保持时间
#define MQTT_WILLTOPIC "will_topic"
#define DEV_ONLINEMESSAGE "online"
#define DEV_OFFLINEMESSAGE "offline"
void MQTT_MessageCallback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message);
void MQTT_ConnectCallback(struct mosquitto *mosq, void *userdata, int result);
void MQTT_SubscribeCallback(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos);
void MQTT_LogCallback(struct mosquitto *mosq, void *userdata, int level, const char *str);
int main(int argc, char *argv[])
{
struct mosquitto *mosq = NULL;
//libmosquitto 库初始化
mosquitto_lib_init();
//创建mosquitto客户端
//设置用户信息
mosq = mosquitto_new(NULL, true, NULL);
// 申请一个内存
mosquitto_will_set(mosq, MQTT_WILLTOPIC, strlen(DEV_OFFLINEMESSAGE), DEV_OFFLINEMESSAGE, 0, true);
// 设置遗嘱信息
mosquitto_connect_callback_set(mosq, MQTT_ConnectCallback);
// 连接到MQTT服务器时,会调用MQTT_ConnectCallback函数
mosquitto_message_callback_set(mosq, MQTT_MessageCallback);
// 接收到订阅事件的信息时,会调用MQTT_MessageCallback
mosquitto_username_pw_set(mosq, "root", "12345678");
if (!mosq)
{
printf("create client failed..\n");
mosquitto_lib_cleanup();
return 1;
}
//客户端连接服务器
if (mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE))
{
fprintf(stderr, "Unable to connect.\n");
return 1;
}
//循环处理网络消息
mosquitto_loop_forever(mosq, -1, 1);
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return 0;
}
void MQTT_MessageCallback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message)
{
if (message->payloadlen)
{
printf("%s %s", message->topic, message->payload);
}
else
{
printf("%s (null)\n", message->topic);
}
fflush(stdout);
}
void MQTT_ConnectCallback(struct mosquitto *mosq, void *userdata, int result)
{
int i;
if (!result)
{
/* Subscribe to broker information topics on successful connect. */
mosquitto_publish(mosq, NULL, MQTT_WILLTOPIC, sizeof(DEV_ONLINEMESSAGE), DEV_ONLINEMESSAGE, 0, true);
// mosquitto_subscribe(mosq, NULL, "Sent:", 2);
// 订阅事件
fprintf(stderr, "Connect success\n");
}
else
{
fprintf(stderr, "Connect failed\n");
}
}