【rt-thread网络】第0篇:使用paho-mqtt软件包连接腾讯云mqtt服务器
创始人
2024-05-10 21:36:05
0

文章目录

  • 一、mqtt介绍
  • 二、paho mqtt介绍
  • 三、连接腾讯云的步骤
    • 3.1 在腾讯云控制台的IOT HUB创建产品和设备(略)
    • 3.2 根据产品信息填充MQTTClient的连接参数
    • 3.3 编译和下载到开发板(略)
  • 四、测试
  • 五、参考

一、mqtt介绍

  MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。
  MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

二、paho mqtt介绍

eclipse paho项目以各种编程语言提供了MQTT和MQTT-SN的开源(主要是客户端)实现。
项目地址:https://github.com/eclipse/paho.mqtt.embedded-c

三、连接腾讯云的步骤

3.1 在腾讯云控制台的IOT HUB创建产品和设备(略)

3.2 根据产品信息填充MQTTClient的连接参数

关注文件开头的连接配置信息的宏,参考https://cloud.tencent.com/document/product/634/14630填冲相应的宏

  • MQTT_URI :服务器uri,如tcp://E822xxxxxx.iotcloud.tencentdevices.com:1883
    在这里插入图片描述
  • MQTT_USERNAME|MQTT_PASSWORD :mqtt的用户名和密码,在设备列表找到设备,可以获取这两项。
    在这里插入图片描述
/** Copyright (c) 2006-2019, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-06-03     ZeroFree     first implementation*/#include 
#include 
#include 
#include 
#include 
#include 
#include "paho_mqtt.h"
#include "wifi_config.h"#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include /*** MQTT URI farmat:* domain mode* tcp://iot.eclipse.org:1883** ipv4 mode* tcp://192.168.10.1:1883* ssl://192.168.10.1:1884** ipv6 mode* tcp://[fe80::20c:29ff:fe9a:a07e]:1883* ssl://[fe80::20c:29ff:fe9a:a07e]:1884*/
#define MQTT_URI "tcp://E822xxxxxx.iotcloud.tencentdevices.com:1883"
#define MQTT_USERNAME "E822Zxxxxxxtest;12010126;ccxxx;168114xxxx"
#define MQTT_PASSWORD "xxxxxxxxxx"
#define MQTT_SUBTOPIC "E822xxxxxx/test/control"
#define MQTT_PUBTOPIC "E822xxxxxx/test/event"/* define MQTT client context */
static MQTTClient client;
static void mq_start(void);
static void mq_publish(const char *send_str);char pub_topic[48] = {0};
char sub_topic[48] = {0};int main(void)
{/* 配置 wifi 工作模式 */rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);/* 注册 MQTT 启动函数为 WiFi 连接成功的回调函数 */rt_wlan_register_event_handler(RT_WLAN_EVT_READY, (void (*)(int, struct rt_wlan_buff *, void *))mq_start, RT_NULL);/* 初始化自动连接功能 */wlan_autoconnect_init();/* 使能 wlan 自动连接 */rt_wlan_config_autoreconnect(RT_TRUE);
}static void mqtt_sub_callback(MQTTClient *c, MessageData *msg_data)
{*((char *)msg_data->message->payload + msg_data->message->payloadlen) = '\0';LOG_D("Topic: %.*s receive a message: %.*s",msg_data->topicName->lenstring.len,msg_data->topicName->lenstring.data,msg_data->message->payloadlen,(char *)msg_data->message->payload);return;
}static void mqtt_sub_default_callback(MQTTClient *c, MessageData *msg_data)
{*((char *)msg_data->message->payload + msg_data->message->payloadlen) = '\0';LOG_D("mqtt sub default callback: %.*s %.*s",msg_data->topicName->lenstring.len,msg_data->topicName->lenstring.data,msg_data->message->payloadlen,(char *)msg_data->message->payload);return;
}static void mqtt_connect_callback(MQTTClient *c)
{LOG_I("Start to connect mqtt server");
}static void mqtt_online_callback(MQTTClient *c)
{LOG_D("Connect mqtt server success");LOG_D("Publish message: Hello,RT-Thread! to topic: %s", pub_topic);mq_publish("Hello,RT-Thread!");
}static void mqtt_offline_callback(MQTTClient *c)
{LOG_I("Disconnect from mqtt server");
}/* 创建与配置 mqtt 客户端 */
static void mq_start(void)
{/* 初始 condata 参数 */MQTTPacket_connectData condata = MQTTPacket_connectData_initializer;static char cid[20] = {0};static int is_started = 0;if (is_started){return;}/* 配置 MQTT 文本参数 */{client.isconnected = 0;client.uri = MQTT_URI;/* 生成随机客户端 ID */rt_snprintf(cid, sizeof(cid), "rtthread%d", rt_tick_get());rt_snprintf(pub_topic, sizeof(pub_topic), "%s", MQTT_PUBTOPIC);rt_snprintf(sub_topic, sizeof(sub_topic), "%s", MQTT_SUBTOPIC);/* 配置连接参数 */memcpy(&client.condata, &condata, sizeof(condata));client.condata.clientID.cstring = cid;client.condata.keepAliveInterval = 60;client.condata.cleansession = 1;client.condata.username.cstring = MQTT_USERNAME;client.condata.password.cstring = MQTT_PASSWORD;/* 配置 mqtt 参数 */client.condata.willFlag = 0;client.condata.will.qos = 1;client.condata.will.retained = 0;client.condata.will.topicName.cstring = pub_topic;client.buf_size = client.readbuf_size = 1024;client.buf = malloc(client.buf_size);client.readbuf = malloc(client.readbuf_size);if (!(client.buf && client.readbuf)){LOG_E("no memory for MQTT client buffer!");goto _exit;}/* 设置事件回调 */client.connect_callback = mqtt_connect_callback;client.online_callback = mqtt_online_callback;client.offline_callback = mqtt_offline_callback;/* 设置要订阅的 topic 和 topic 对应的回调函数 */client.messageHandlers[0].topicFilter = sub_topic;client.messageHandlers[0].callback = mqtt_sub_callback;client.messageHandlers[0].qos = QOS1;/* 设置默认订阅回调函数 */client.defaultMessageHandler = mqtt_sub_default_callback;}/* 启动 MQTT 客户端 */LOG_D("Start mqtt client and subscribe topic:%s", pub_topic);paho_mqtt_start(&client);is_started = 1;_exit:return;
}/* MQTT 消息发布函数 */
static void mq_publish(const char *send_str)
{MQTTMessage message;const char *msg_str = send_str;const char *topic = pub_topic;message.qos = QOS1;message.retained = 0;message.payload = (void *)msg_str;message.payloadlen = strlen(message.payload);MQTTPublish(&client, topic, &message);return;
}

3.3 编译和下载到开发板(略)

四、测试

下图为开发板的日志。
在这里插入图片描述
下图为云端的日志,接收到来自开发板的mqtt发布和订阅消息。
在这里插入图片描述

五、参考

paho-mqtt介绍
腾讯云连接mqtt教程

相关内容

热门资讯

findx耍原生安卓系统,深度... 亲爱的读者们,你是否厌倦了那些花里胡哨的定制系统,渴望回到那个纯净的安卓世界?今天,我要带你一起探索...
一加系统属于安卓系统吗,引领智... 你有没有想过,手机里的那个神奇的“一加系统”到底是不是安卓系统的一员呢?这可是个让人好奇不已的问题哦...
小米2刷安卓系统吗,探索安卓系... 亲爱的读者,你是否曾经对小米2这款手机刷安卓系统的事情感到好奇呢?今天,就让我带你一探究竟,揭开小米...
安卓7.0系统线刷包,深度解析... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你揭秘如何让你的安卓手机重焕生...
白菜系统和安卓拍照,开启智能生... 你知道吗?最近我在用手机拍照的时候,发现了一个超级酷的功能,简直让我爱不释手!那就是——白菜系统和安...
安卓系统查杀病毒,全方位守护您... 手机里的安卓系统是不是有时候会突然弹出一个查杀病毒的提示?别慌,这可不是什么大问题,今天就来给你详细...
iso系统与安卓各系统哪个好,... 你有没有想过,手机操作系统就像是我们生活中的不同交通工具,各有各的特色和优势。今天,咱们就来聊聊这个...
中柏怎么换安卓系统,解锁更多可... 你有没有发现,中柏的安卓系统有时候用起来还挺不顺手的?别急,今天就来手把手教你如何给中柏手机升级安卓...
安卓热点绕过系统验证,揭秘操作... 你是不是也遇到过这种情况?手机里的安卓热点突然不灵光了,系统验证总是跳出来,让人头疼不已。别急,今天...
安卓系统怎么关闭小艺,安卓系统... 亲爱的安卓用户们,你是否也和我一样,对手机里的小艺助手有些爱恨交加呢?有时候,它贴心得让人感动,有时...
安卓系统计划软件推荐,精选计划... 你有没有发现,手机里的安卓系统越来越智能了?这不,最近我可是挖到了一些超棒的安卓计划软件,它们不仅能...
收钱吧安卓系统插件,便捷支付新... 你有没有发现,现在的生活越来越离不开手机了?手机里装满了各种应用,而今天我要跟你聊聊一个特别实用的工...
鸿蒙系统是否还属于安卓,独立于... 你有没有想过,那个在我们手机上默默无闻的鸿蒙系统,它到底是不是安卓的“亲戚”呢?这个问题,估计不少手...
安卓系统手机用什么钱包,轻松管... 你有没有想过,你的安卓系统手机里装了那么多应用,但最离不开的,可能就是那个小小的钱包了。没错,就是那...
安卓系统能玩部落冲突吗,部落冲... 你有没有想过,安卓系统上的手机,是不是也能玩那款风靡全球的《部落冲突》呢?这款游戏自从推出以来,就吸...
智能机器人安卓系统,引领未来智... 你知道吗?在科技飞速发展的今天,智能机器人已经不再是科幻电影里的专属了。它们正悄悄地走进我们的生活,...
华为win10系统改装安卓系统... 你有没有想过,你的华为笔记本电脑里的Windows 10系统,能不能来个华丽变身,变成安卓系统呢?这...
旧电脑上安什么安卓系统,适配不... 你那台旧电脑是不是已经闲置好久了?别让它默默无闻地躺在角落里,给它来个华丽变身吧!今天,就让我来告诉...
安卓app语言跟随系统,随系统... 你知道吗?在手机世界里,有一个神奇的小功能,它就像你的贴身翻译官,无论你走到哪里,都能帮你轻松应对各...
惠城安卓系统降级在哪,揭秘降级... 你有没有遇到过手机系统升级后,发现新系统让你头疼不已,想回到那个熟悉的安卓系统呢?别急,今天就来告诉...