配置MQTT参数Kconfig文件

config MQTT_PUB_TOPICstring "MQTT publish topic"default "tp2/test"config MQTT_SUB_TOPICstring "MQTT subscribe topic"default "tp1/test"config MQTT_BROKER_HOSTNAMEstring "MQTT broker hostname"default "xxxx-mqtt.xxxxxx.cn"

MQTT的API

订阅

/**@brief Function to subscribe to the configured topic*/
static int subscribe(void)
{struct mqtt_topic subscribe_topic = {.topic = {.utf8 = CONFIG_MQTT_SUB_TOPIC,.size = strlen(CONFIG_MQTT_SUB_TOPIC)},.qos = MQTT_QOS_1_AT_LEAST_ONCE};const struct mqtt_subscription_list subscription_list = {.list = &subscribe_topic,.list_count = 1,.message_id = 1234};LOG_INF("Subscribing to: %s len %u", CONFIG_MQTT_SUB_TOPIC,(unsigned int)strlen(CONFIG_MQTT_SUB_TOPIC));return mqtt_subscribe(&client, &subscription_list);
}

推送

/**@brief Function to publish data on the configured topic*/
static int data_publish(struct mqtt_client *c, enum mqtt_qos qos,uint8_t *data, size_t len)
{struct mqtt_publish_param param;param.message.topic.qos = qos;param.message.topic.topic.utf8 = CONFIG_MQTT_PUB_TOPIC;param.message.topic.topic.size = strlen(CONFIG_MQTT_PUB_TOPIC);param.message.payload.data = data;param.message.payload.len = len;param.message_id = sys_rand32_get();param.dup_flag = 0;param.retain_flag = 0;data_print("Publishing: ", data, len);LOG_INF("to topic: %s len: %u",CONFIG_MQTT_PUB_TOPIC,(unsigned int)strlen(CONFIG_MQTT_PUB_TOPIC));return mqtt_publish(c, &param);
}

MQTT事件处理

/**@brief MQTT client event handler*/
void mqtt_evt_handler(struct mqtt_client *const c,const struct mqtt_evt *evt)
{int err;switch (evt->type) {case MQTT_EVT_CONNACK:if (evt->result != 0) {LOG_ERR("MQTT connect failed: %d", evt->result);break;}LOG_INF("MQTT client connected");subscribe();break;case MQTT_EVT_DISCONNECT:LOG_INF("MQTT client disconnected: %d", evt->result);break;case MQTT_EVT_PUBLISH: {const struct mqtt_publish_param *p = &evt->param.publish;LOG_INF("MQTT PUBLISH result=%d len=%d",evt->result, p->message.payload.len);err = publish_get_payload(c, p->message.payload.len);if (p->message.topic.qos == MQTT_QOS_1_AT_LEAST_ONCE) {const struct mqtt_puback_param ack = {.message_id = p->message_id};/* Send acknowledgment. */mqtt_publish_qos1_ack(&client, &ack);}if (err >= 0) {data_print("Received: ", payload_buf,p->message.payload.len);/* Echo back received data */data_publish(&client, MQTT_QOS_1_AT_LEAST_ONCE,payload_buf, p->message.payload.len);} else if (err == -EMSGSIZE) {LOG_ERR("Received payload (%d bytes) is larger than the payload buffer ""size (%d bytes).",p->message.payload.len, sizeof(payload_buf));} else {LOG_ERR("publish_get_payload failed: %d", err);LOG_INF("Disconnecting MQTT client...");err = mqtt_disconnect(c);if (err) {LOG_ERR("Could not disconnect: %d", err);}}} break;case MQTT_EVT_PUBACK:if (evt->result != 0) {LOG_ERR("MQTT PUBACK error: %d", evt->result);break;}LOG_INF("PUBACK packet id: %u", evt->param.puback.message_id);break;case MQTT_EVT_SUBACK:if (evt->result != 0) {LOG_ERR("MQTT SUBACK error: %d", evt->result);break;}LOG_INF("SUBACK packet id: %u", evt->param.suback.message_id);break;case MQTT_EVT_PINGRESP:if (evt->result != 0) {LOG_ERR("MQTT PINGRESP error: %d", evt->result);}break;default:LOG_INF("Unhandled MQTT event type: %d", evt->type);break;}
}

配置MQTT服务器

/**@brief Resolves the configured hostname and* initializes the MQTT broker structure*/
static int broker_init(void)
{int err;struct addrinfo *result;struct addrinfo *addr;struct addrinfo hints = {.ai_family = AF_INET,.ai_socktype = SOCK_STREAM};err = getaddrinfo(CONFIG_MQTT_BROKER_HOSTNAME, NULL, &hints, &result);if (err) {LOG_ERR("getaddrinfo failed: %d", err);return -ECHILD;}addr = result;/* Look for address of the broker. */while (addr != NULL) {/* IPv4 Address. */if (addr->ai_addrlen == sizeof(struct sockaddr_in)) {struct sockaddr_in *broker4 =((struct sockaddr_in *)&broker);char ipv4_addr[NET_IPV4_ADDR_LEN];broker4->sin_addr.s_addr =((struct sockaddr_in *)addr->ai_addr)->sin_addr.s_addr;broker4->sin_family = AF_INET;broker4->sin_port = htons(CONFIG_MQTT_BROKER_PORT);inet_ntop(AF_INET, &broker4->sin_addr.s_addr,ipv4_addr, sizeof(ipv4_addr));LOG_INF("IPv4 Address found %s", log_strdup(ipv4_addr));break;} else {LOG_ERR("ai_addrlen = %u should be %u or %u",(unsigned int)addr->ai_addrlen,(unsigned int)sizeof(struct sockaddr_in),(unsigned int)sizeof(struct sockaddr_in6));}addr = addr->ai_next;}/* Free the address. */freeaddrinfo(result);return err;
}

测试结果

服务器自行搭建

可以参考我的另一篇文章

(43条消息) mosquitto设置外网访问_mayiQX的博客-CSDN博客https://blog.csdn.net/liujie49992/article/details/123721490?spm=1001.2014.3001.5502

nrf91 mqtt测试以及API调用相关推荐

  1. 好饭不怕晚,Google基于人工智能AI大语言对话模型Bard测试和API调用(Python3.10)

    谷歌(Google)作为开源过著名深度学习框架Tensorflow的超级大厂,是人工智能领域一股不可忽视的中坚力量,旗下新产品Bard已经公布测试了一段时间,毁誉参半,很多人把Google的Bard和 ...

  2. SAM(segment anything model)分割一切 Demo测试及API调用

    SAM 分割一切 一,SAM介绍 1.1 介绍 1.2 项目链接 二,Demo-Test: 2.1 Demo功能介绍 2.1.1,首页就是这个SAM,点击try demo,可以选择它的自带图片,也可以 ...

  3. 3月19日,30秒知全网,精选7个热点///申请百度智能云文心一言企业版API调用服务测试的企业用户达9万

    ///上海近期将发布国企加快建设世界一流企业意见 上海国有资本运营研究院院长助理龙武表示,在新时期做强做优做大国有资本和国有企业新背景下,以数字技术与财务管理深度融合为抓手,加快构建世界一流财务管理体 ...

  4. larvel 中的api.php_Laravel API 系列教程(一): 基于 Laravel 5.5 构建 测试 RESTful API...

    Laravel API 系列教程(一): 基于 Laravel 5.5 构建 & 测试 RESTful API 由 学院君 创建于2年前, 最后更新于 9个月前 版本号 #3 171702 v ...

  5. php篮球比赛,篮球数据API接口 - 【篮球比赛动画直播变化数据】API调用示例代码...

    篮球比赛动画直播变化数据API调用示例,详细请查看在线文档,需注册下 package com.huaying.demo.basketball; import javax.xml.bind.JAXBCo ...

  6. 4.1 多层感知机从0开始 4.2 多层感知机简洁实现(API调用)

    文章目录 从0开始 数据导入 模型定义 模型测试 API调用 数据导入 模型选择 & 测试 从0开始 数据导入 模型定义 模型测试 API调用 数据导入 模型选择 & 测试

  7. zap安装提示java_使用API调用进行ZAP身份验证

    我正在使用ZAP API调用来使用命令行测试站点 . 但即使我遵循正确的步骤,我的用户身份验证也有问题 . 但是当蜘蛛作为用户时,我仍然无法设法通过登录页面 . 以下是我要介绍的步骤 . 1.包含在上 ...

  8. mysql8.0 密码认证插件_只需使用VS Code的REST客户端插件即可进行API调用

    为什么要离开IDE去测试新的API?现在你不必这样做了. 我们如何获取数据 如果你已经做了很长时间的Web开发,你可能知道我们的很多工作都是围绕着数据展开的:读取数据.写入数据.操作数据,并以合理的方 ...

  9. 阿里云物联网平台python开发手册_阿里云物联网平台之云端API调用(即云端开发教程)...

    本文介绍如何调用物联网平台的云端API,很多时候控制台上操作不太方便,需要通过API调用来完成或者通过调用API封装接口,以做到二次开发等.如产品管理,设备管理,规则创建等.分别介绍通过common ...

最新文章

  1. 跨界 | 土木工程也开始AI化了:用卷积神经网络实现结构损伤视觉识别
  2. 深度探索javascript的call和apply面向对象应用
  3. 使用JSP/SERVLET实现在校学生管理系统
  4. python基础知识点大全-【python基础学习】基础重点难点知识汇总
  5. python之路day5_Python语言之python之路笔记day19
  6. Bootstrap按钮下拉菜单的尺寸
  7. Sharding-Proxy分库配置_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记020
  8. printf打印数组_(45)C++面试之把数组排成最小的数
  9. 15-1 并发版爬虫架构
  10. UUID 查看linux的UUID 与 SVN 工程的 UUID。(两者之间没有联系)
  11. 傅里叶变换复数形式的实部代表什么_二维傅里叶变换与逆变换基于Unity的实现...
  12. HTML网页标签代码基本教学(1)基本标签学习
  13. C语言从键盘输入1605,山东理工大学ACM平台题答案关于C语言 1605 Balloon Comes!
  14. 为什么说龙妈能活到最后?
  15. ggplot2_coor_xxx()坐标系变换
  16. 如何计算两个日期之间的工作天数
  17. DialogFragment 白边去除
  18. easyexcel 在 设置标题_七. EasyExcel标题加批注和标题字体填充红色
  19. C语言——for循环
  20. Python基础之Linux基础入门(Ubuntu)——其他命令

热门文章

  1. css强制换行无效的终极解决方案
  2. php fwrite 数组,浅析php fwrite写入txt文件的时...-发现一个诡异的bug,不知何解...-php折线图 布局图 - 侯志凯_169IT.COM...
  3. Acwing4261. 孤独的照片
  4. if else if else的执行顺序
  5. 高效压缩位图RoaringBitmap的原理与应用
  6. 2009年中国电脑病毒疫情及互联网安全报告(图)
  7. Icepak 电池包热分析_51CAE_新浪博客
  8. 爬虫-中国招标投标公共服务平台数据下载(2019-08-07)
  9. 安卓三维展示源码_【复古传奇三维版】176、3D版复古打金传奇特色结拜、结婚、铭文等系统,玩法丰富...
  10. pandoc讲html转换为pdf,使用pandoc将.docx转换为.pdf