openwrt--配置mqtt服务器

选择软件

打开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");
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值