目前使用的是nanonng中的mqtt demo进行的连接测试,在进行大数据长度(10MB)的测试中发现数据在订阅中总是出来接收的数据负载错误然后就与nanomq断开连接的问题。
nng_recvmsg: Connection shutdown
disconnect_cb: disconnected!
connect_cb: connected!
nng_mqtt_msg_get_packet_type(msg): 2
nanomq的配置
system {
num_taskq_thread = 0 # 任务队列
max_taskq_thread = 0 # 任务队列最大
parallel = 0 # 最大并行
}
sqlite {
disk_cache_size = 0 # 最大缓存
mounted_file_path=“/tmp/” # 数据库文件存
flush_mem_threshold = 100 # 内存缓存消息
resend_interval = 5000 # 故障恢复后的重发时
}
mqtt = {
max_packet_size = 40960KB # NanoMQ 可接收和发送的最
max_mqueue_len = 20 # 等待确认窗口队列
retry_interval = 10s # QoS 1/2 消息投递的重
keepalive_multiplier = 1.25 # MQTT keepalive 超时的
property_size = 64 # MQTT 用户最大属
}
listeners.tcp.tcp_listener_1 = {
bind = “0.0.0.0:1883” # 绑定 1883
}
listeners.ws. = {
bind = “0.0.0.0:8083/mqtt” # 绑定 8083 端口
}
启动后会打印
./nanomq start
Unrecognized <
error: syntax error
Unrecognized >
NanoMQ Broker is started successfully!
这很明显没有读取到正确的配置文件。
也许就会因为消息过大超过默认配置被踢掉
2024-03-28 14:36:49 [931] ERROR /mnt/Data-Disk/yinjz/nanomq_20240328/nanomq/nanomq/nng/src/sp/transport/mqtt/broker_tcp.c:713 tcptran_pipe_recv_cb: Size of packet exceeds limitation: 0x95, len: 10485767, max_packet_size: 10485760
2024-03-28 14:36:49 [931] WARN /mnt/Data-Disk/yinjz/nanomq_20240328/nanomq/nanomq/nng/src/sp/transport/mqtt/broker_tcp.c:907 tcptran_pipe_recv_cb: tcptran_pipe_recv_cb: parse error rv: 149
在nanomq的打印中添加了长度的打印,即使我配置数据长度大于10MB,打印的最大限制也是10MB,配置文件是从手册上复制的,不清楚哪边的配置有问题,麻烦指点下
static void
connect_cb(nng_pipe p, nng_pipe_ev ev, void *arg)
{
int reason;
// get connect reason
nng_pipe_get_int(p, NNG_OPT_MQTT_CONNECT_REASON, &reason);
// get property for MQTT V5
// property *prop;
// nng_pipe_get_ptr(p, NNG_OPT_MQTT_CONNECT_PROPERTY, &prop);
printf(“%s: connected!\n”, FUNCTION);
}
订阅方断线后这个会重新连接是吗,需要重新订阅数据吗
看你启动的命令咯 用 --conf 去指定配置文件呀 文档有写
自动重连是底层实现的 你复制的这部分是连上的回调
没有找到具体原因,加个这两个配置就是的出错的提示listeners.tcp.tcp_listener_1、listeners.tcp.tcp_listener_1,现在先把这两个配置去掉了,已经可以正常启动没有报错。
还有一个问题,sub模式启动的测试demo,在断连重新连接后需要重新订阅的主题吗,在这个重连的回调里面订阅吗,还是需要什么别的操作,或者其他的什么操作啊。pub向nanomq发送数据一直没问题,订阅的数据在跑一段时间后会出现断开连接报错,sub端自动重连后打印了%s: connected!\n,但是订阅的数据没有接收到。
如果没使用会话保持的话 , 那是需要再重新订阅的,可以在connect_cb里做。