Mqtt学习笔记--接入阿里云(2)

news2024/12/23 17:35:15

概述

在阿里云IoT平台中,MQTT协议是一种重要的连接方式,可以用于设备与平台之间的通信。通过配置设备的Topic和订阅规则,设备可以在平台上发布/订阅消息,实现设备状态的监控、控制和数据的传输。同时,阿里云IoT平台还提供了MQTT SDK和API,方便开发者快速接入平台,实现物联网应用的开发和部署。
我们可以基于Mqtt接口,将自己的设备接入阿里云的IOT平台,这里主要记录实现方法,具体阿里云上的产品、设备创建不再记录,阿里云文档上比较详细了。

下载阿里云的LinkSdk


地址:https://help.aliyun.com/zh/iot/user-guide/download-device-sdks

选择C LinkSdk:
选择C LinkSdk
我这里没有使用LinkSdk里的mqtt,而是使用上次移植的mosquito,这里下载这个LinkSdk主要是用里面的认证部分(aiot_mqtt_sign.c)。

示例代码

下面代码中,利用aiotMqttSign函数生成clientId,用户名和密码。

aliy.cpp

#include "mosquittopp.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>

extern int aiotMqttSign(const char *productKey, const char *deviceName, const char *deviceSecret, 
                     	char clientId[150], char username[65], char password[65]);

using namespace std;

#define EXAMPLE_PRODUCT_KEY			"hj1skja****"
#define EXAMPLE_DEVICE_NAME			"FZ00**"
#define EXAMPLE_DEVICE_SECRET       "7bb8c2cfb69***************************"


class MyMqtt : public mosqpp::mosquittopp
{
public:
    MyMqtt(const char *id, const char *host, int port, const char *username, const char *password) : mosquittopp(id)
    {
        mosqpp::lib_init(); // 初始化mosquitto库
        username_pw_set(username, password); // 设置用户名和密码
        connect(host, port, 60); // 连接到MQTT服务器
    }

    ~MyMqtt()
    {
        disconnect(); // 断开连接
        mosqpp::lib_cleanup(); // 清理mosquitto库
    }

    void on_connect(int rc)
    {
        if (rc == 0)
        {
            std::cout << "连接成功" << std::endl;
            subscribe(NULL, "/sys/hj1skj****/FZ00**/thing/event/property/post_reply", 0); // 订阅主题
            subscribe(NULL, "/sys/hj1skj****/FZ00**/thing/event/property/set", 0); // 订阅主题
        }
        else
        {
            std::cout << "连接失败" << std::endl;
        }
    }

    void on_message(const struct mosquitto_message *message)
    {
        std::cout << "收到消息:" << (char *)message->payload << std::endl;
    }
};

int main(int argc, char *argv[])
{
    const char *mqtt_host = "hj1skja****.iot-as-mqtt.cn-shanghai.aliyuncs.com";
    int mqtt_port = 1883;


    char clientId[256] = {0};
	char username[65] = {0};
	char password[65] = {0};

	if (aiotMqttSign(EXAMPLE_PRODUCT_KEY, EXAMPLE_DEVICE_NAME, EXAMPLE_DEVICE_SECRET, clientId, username, password) < 0) {
		printf("aiotMqttSign error\n");
		return -1;
	}

    printf("clientId: %s\n", clientId);
    printf("username: %s\n", username);
    printf("password: %s\n", password);
    MyMqtt mqtt(clientId, mqtt_host, mqtt_port, username, password);
    mqtt.loop_start(); // 开始循环

    string msg="{\"params\":{\"CurrentTemperature\":27.37,\"CurrentHumidity\":56.8,\"version\":\"ver1.0.1\",\"GeoLocation\":{\"Longitude\":113.987817,\"Latitude\":34.987895,\"Altitude\":123.1,\"CoordinateSystem\":1}}}";


    while (1)
    {
        // 发布消息
        mqtt.publish(NULL, "/sys/hj1skj****/FZ00**/thing/event/property/post", msg.size(), msg.c_str());
        sleep(5);
    }
    mqtt.loop_stop(); // 停止循环
    return 0;
}

这个代码中是定时上传一串模拟的温湿度数据,这个Json的字段名称和阿里云IOT平台上的设备模型字段保持一致,这样平台才能够正常解析。

{
    "params":{
        "CurrentTemperature":27.37,
        "CurrentHumidity":56.8,
        "version":"ver1.0.1",
        "GeoLocation":{
            "Longitude":113.987817,
            "Latitude":34.987895,
            "Altitude":123.1,
            "CoordinateSystem":1
        }
    },
    "time":"2022-03-05_00:45:26"
}

测试效果

将代码编译测试后,放在板子上运行,需要注意的时候,板子上的系统要支持域名解析,配置好DNS。订阅与发布的消息主题与平台上也要保持一致。
运行:

./aliy_mqtt 
macSrc: clientIdFZ0***&hj1skja****deviceNameFZ0001productKeyhj1s****timestamp2524608000000
clientId: FZ00***&hj1skja****|timestamp=2524608000000,_v=paho-c-1.0.0,securemode=3,signmethod=hmacsha256,lan=C|
username: FZ0***&hj1skjaDSpk
password: 6CC4F399F59A1CDB2D355DB449BB741AF5C3713C9F9B**************
连接成功
收到消息:{"params":{"CurrentTemperature":27.37,"CurrentHumidity":56.8,"version":"ver1.0.1","GeoLocation":{"Longitude":113.987817,"Latitude":34.987895,"Altitude":123.1,"CoordinateSystem":1}},"time":"2022-03-05_00:45:26"}
收到消息:{"code":200,"data":{},"id":"null","message":"success","method":"thing.event.property.post","version":"1.0"}
收到消息:{"params":{"CurrentTemperature":27.37,"CurrentHumidity":56.8,"version":"ver1.0.1","GeoLocation":{"Longitude":113.987817,"Latitude":34.987895,"Altitude":123.1,"CoordinateSystem":1}},"time":"2022-03-05_00:45:26"}
收到消息:{"code":200,"data":{},"id":"null","message":"success","method":"thing.event.property.post","version":"1.0"}

平台上显示设备已经在线:
在线
查看一下设备数据日志:
设备日志
设备物理模型数据:
设备物理模型数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/972947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法笔记 二叉搜索树

二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种数据结构&#xff0c;用于存储具有可比较键&#xff08;通常是数字或字符串&#xff09;的元素 1 结构特点 节点结构&#xff1a;每个节点都有一个键和两个子节点&#xff08;左子节点和右子…

JavaWeb | 常用的HTML(JavaWeb)标签

目录&#xff1a; HTML简介HTML的基本结构HTML的常用标签&#xff1a;“标题” 标签“换行” 标签“段落” 标签“水平线” 标签“文字” 标签“粗体” 标签“下划线” 标签“斜体” 标签“上标” 标签“下标” 标签“闪烁” 标签表示 “空格”“列表” 标签&#xff1a;无序列…

VGA OUT 的PCB设计注意事项

VGA(Video Graphics Array)即视频图形阵列&#xff0c;具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口&#xff0c;同样也是LcD液晶显示设备的标准接口&#xff0c;具有广泛的应用范围。 VGA OUT PCB设计注意事项&#xff1a; 1、整体布局时&…

PCIe 配置空间:Command 寄存器

在 type 0 header 中,command 寄存器的位置如下图所示: 在 type 1 header 中,command 寄存器的位置如下图所示: Command 寄存器的结构如下图: 对于 PCIe,只有 Bit 0/1/2/6/8/10 是有效的,其他必须配置为 0 。 IO Space Enable 该位用于控制设别如何响应 I/O 空间的访…

土著刷题Plus专业版对外开放入驻|在线组卷刷题学习平台|纯净无广|独立小程序|VIP功能全面开放|支持自定义品牌名称和Logo

专业版对外开放入驻 土著刷题Plus专业版&#xff0c;以【录题-分组-刷题-考试】为中心打造一套完备的在线组卷刷题学习平台&#xff0c;自定义品牌名称和Logo&#xff0c;入驻后&#xff0c;您将拥有自己独立的企业级专业运营管理平台。 土著刷题Plus专业版对比个人版优势&…

QT实现TCP通信(服务器与客户端搭建)

一、TCP通信框架 二、QT中的服务器操作 创建一个QTcpServer类对象&#xff0c;该类对象就是一个服务器调用listen函数将该对象设置为被动监听状态&#xff0c;监听时&#xff0c;可以监听指定的ip地址&#xff0c;也可以监听所有主机地址&#xff0c;可以通过指定端口号&#x…

软件上线测评报告怎么做?

软件上线测试 软件上线前必须经过一个整体的测评&#xff0c;从而帮助企业了解软件的运行情况。软件上线测评检测报告&#xff08;软件产品测试报告&#xff09;也通常被称为&#xff1a;科技项目验收测试报告、&#xff08;软件类&#xff09;科技成果鉴定测试、软件检测报告…

MySql学习笔记04——DDL

DDL 建表语法 建表属于DDL语句&#xff0c;DDL语句包括create drop alter create table 表名(字段名1 数据类型,字段名2 数据类型,字段名3 数据类型,.. );表名一般建议使用t_开头&#xff0c;可读性更强。 Mysql数据类型 varchar 可变长度的字符串&#xff0c;最长为255&…

Promise常用方法笔记

mixin.methods.getList(xxx) 是axios的二次封装 是通过Promise进行基本封装 let a mixin.methods.getList(toosSet.gettype);let b mixin.methods.getList(toosSet.gettypes);let c mixin.methods.getList(toosSet.gettypess);Promise.all([a, b, c]).then((res) > {aler…

【图解RabbitMQ-2】图解JMS规范与AMQP协议是什么

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

基于卡尔曼滤波的锂电池状态估计MATLAB仿真及程序

完整资源请查看主页置顶博客&#xff08;专享优惠&#xff09; 该项目的目的是估计锂电池的荷电状态(SOC)。主要完成了扩展卡尔曼滤波(EKF)的实验、参数辨识和仿真。 项目中包括锂电池模型建立、参数辨识与验证、SOC估计采用扩展卡尔曼滤波(EKF)&#xff0c;使用了两种方式实…

CSS中如何实现一个自适应正方形(宽高相等)的元素?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐利用padding百分比⭐2. 利用::before伪元素⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对W…

Linux(基础IO)

Linux&#xff08;基础IO&#xff09; 前言C语言文件IO什么叫当前路径stdin/stdout/stderr 系统文件IOopenclosewriteread 文件描述符文件描述符的分配规则 重定向输出重定向原理追加重定向原理输入重定向原理dup2添加重定向功能到minishell 缓冲区模拟实现一个缓冲区 理解文件…

BCSP-玄子Share-Java框基础_解析XML

二、XML 2.1 XML 简介 XML&#xff08;Extensible Markup Language&#xff09;&#xff0c;可扩展标记语言 2.1.1 特点 XML 与操作系统、编程语言的开发平台无关规范统一&#xff0c;实现不同系统之间的数据交换 2.1.2 作用 数据存储数据交换数据配置 2.1.3 XML 文档结…

专业课130+上岸哈尔滨工业大学803信号与系统和数字逻辑电路考研大纲真题参考书哈工大

​专业课130上岸哈尔滨工业大学803信号与系统和数字逻辑电路考研大纲真题参考书哈工大 政治&#xff1a; 9月开始&#xff0c;用肖秀荣的精讲精练&#xff0c;做1000题&#xff0c;一章视频做一章题&#xff0c;错题标记。以后会不定时看&#xff0c;每天大概2个小时。时间可…

navicat访问orcal数据库

1&#xff09;因为不能直接访问服务器&#xff0c;所以通过中介进行了端口转发&#xff1b; 2&#xff09;依然不能访问&#xff0c;提示netadmin权限什么错误&#xff1b; 3&#xff09;下载了一个 PLSQL Developer 13.0.0.1883 版本&#xff0c;自带的instantclient 好像不…

C语言:选择+编程(每日一练Day15)

目录 选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;寻找奇数 思路一&#xff1a; 题二&#xff1a;寻找峰值 思路一&#xff1a; 本人实力有限可能对一些地方解…

Compression Bypass Logic

默认,EDT逻辑中包含bypass逻辑,bypass电路可以bypass EDT逻辑,访问设计core中未压缩的扫描链。 bypass EDT逻辑可以应用未压缩test patterns到设计中 Debug 压缩test patterns。应用附加自定义未压缩扫描链。应用来自其他ATPG工具的test patterns。在扫描插入时,bypass可以…

SpringBoot运维实用篇、打包、运行、高级配置、多环境开发、日志

文章目录 SpringBoot运维实用篇YW-1.SpringBoot程序的打包与运行程序打包程序运行SpringBoot程序打包失败处理命令行启动常见问题及解决方案SpringBoot项目快速启动&#xff08;Linux版&#xff09; YW-2.配置高级YW-2-1.临时属性设置YW-2-2.配置文件分类YW-2-3.自定义配置文件…

精益创业就是想控制:到底浪费在哪里?

精益创业就是想控制&#xff1a;到底浪费在哪里&#xff1f;【安志强趣讲278期】 趣讲大白话&#xff1a;创业的浪费是惊人的 **************************** 现代社会的问题不是能不能制造出来&#xff1f; 而是该不该制造 产能过剩是社会的核心矛盾 精益创业就是预见浪费 系统…