MQTT,JSON,VSCODE(C语言编程环境)心得

news2025/7/18 10:13:02

VSCODE(C语言编程环境)心得

心得基于linux虚拟机和SSH方式,编辑基于VSCODE,编译基于GCC或G++,调试基于GDB的插件,代码管理基于git。

  1. 安装GIT:sudo apt-get install git

  2. 配置GIT:
    git config --global user.name “xxx”
    git config --global user.email “xxx@163.com”
    ssh-keygen -t rsa -C “xxx@163.com”

  3. 拷贝到网站
    根据提示进入目录 cd ~/.ssh
    查看复制文件内容 gedit id_rsa.pub
    登录到您的GitLab帐户,然后点击右上角的账号,选择【Preferences】–>【SSH Keys】
    在这里插入图片描述
    在这里插入图片描述

  4. 检出 git clone git@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

  5. 切换分支
    5.1 git branch -a 查看所有分支
    5.2 git checkout -b dev origin/dev 新建本地分支并切换分支。

  6. 安装调试环境
    6.0 VScode安装插件
    安装c/c++、remote-ssh插件
    安装GDB Debug插件
    新建GDB脚本
    {
    “version”: “0.2.0”,
    “configurations”: [
    {
    “name”: “(gdb) 启动”,
    “type”: “cppdbg”,
    “request”: “launch”,
    “program”: “ w o r k s p a c e F o l d e r / b i n / t e s t " , " a r g s " : [ ] , " s t o p A t E n t r y " : f a l s e , " c w d " : " {workspaceFolder}/bin/test", "args": [], "stopAtEntry": false, "cwd": " workspaceFolder/bin/test","args":[],"stopAtEntry":false,"cwd":"{workspaceFolder}”,
    “environment”: [],
    “externalConsole”: false,
    “MIMode”: “gdb”,
    “setupCommands”: [
    {
    “description”: “为 gdb 启用整齐打印”,
    “text”: “-enable-pretty-printing”,
    “ignoreFailures”: true
    }
    ]
    }
    ]
    }

CJSON

JSON 简介

JSON全称 JavaScript Object Notation,即 JS对象简谱,是一种轻量级的数据格式。
它采用完全独立于编程语言的文本格式来存储和表示数据,语法简洁、层次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提升了网络传输效率。

JSON 语法
JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。

JSON对象是一个无序的"key(关键字)/value(值)"键值对的集合:

以"{“开始,以”}“结束,允许嵌套使用
每个key(关键字)和value(值)成对出现,关键字和值之间使用”:“分隔
键/值对之间用”,"分隔
在这些字符前后允许存在无意义的空白符
其中关键字只能是字符串(使用双引号“”表示),值可以有如下表示:

数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组 (在中括号中)
对象 (在大括号中)
null

GIT库

GIT库链接
使用Git命令将其拉取到本地:

git clone https://github.com/DaveGamble/cJSON.git

Github拉取cJSON源码后,文件非常多,但是其中cJSON的源码文件只有两个:

cJSON.h
cJSON.c
使用的时候,只需要将这两个文件复制到工程目录,然后包含头文件cJSON.h即可。

资源

CSDN比较详细介绍

简单介绍,如下图

在这里插入图片描述
1.创建头指针:

  cJSON* cjson_test = NULL;
  cjson_test = cJSON_CreateObject();
  1. 向链表中添加节点:
cJSON_AddNullToObject(cJSON * const object, const char * const name);

cJSON_AddTrueToObject(cJSON * const object, const char * const name);

cJSON_AddFalseToObject(cJSON * const object, const char * const name);

cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);

cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);

cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);

cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);

cJSON_AddObjectToObject(cJSON * const object, const char * const name);

cJSON_AddArrayToObject(cJSON * const object, const char * const name);

  1. 输出JSON数据:
(char *) cJSON_Print(const cJSON *item);

例子:

#include <stdio.h>
#include "cJSON.h"

int main(void)
{
    cJSON* cjson_test = NULL;
    cJSON* cjson_address = NULL;
    cJSON* cjson_skill = NULL;
    char* str = NULL;

    /* 创建一个JSON数据对象(链表头结点) */
    cjson_test = cJSON_CreateObject();

    /* 添加一条字符串类型的JSON数据(添加一个链表节点) */
    cJSON_AddStringToObject(cjson_test, "name", "mculover666");

    /* 添加一条整数类型的JSON数据(添加一个链表节点) */
    cJSON_AddNumberToObject(cjson_test, "age", 22);

    /* 添加一条浮点类型的JSON数据(添加一个链表节点) */
    cJSON_AddNumberToObject(cjson_test, "weight", 55.5);

    /* 添加一个嵌套的JSON数据(添加一个链表节点) */
    cjson_address = cJSON_CreateObject();
    cJSON_AddStringToObject(cjson_address, "country", "China");
    cJSON_AddNumberToObject(cjson_address, "zip-code", 111111);
    cJSON_AddItemToObject(cjson_test, "address", cjson_address);

    /* 添加一个数组类型的JSON数据(添加一个链表节点) */
    cjson_skill = cJSON_CreateArray();
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C" ));
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Java" ));
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Python" ));
    cJSON_AddItemToObject(cjson_test, "skill", cjson_skill);

    /* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */
    cJSON_AddFalseToObject(cjson_test, "student");

    /* 打印JSON对象(整条链表)的所有数据 */
    str = cJSON_Print(cjson_test);
    printf("%s\n", str);

    return 0;
}


MQTT

遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此:

网络代价昂贵,带宽低、不可靠。
在嵌入设备中运行,处理器和内存资源有限。
该协议的特点有:

使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
对负载内容屏蔽的消息传输。
使用 TCP/IP 提供网络连接。
有三种消息发布服务质量:
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
因为MQTT是轻量级的发布/订阅的消息传输协议, 因此很多应用都可以借用MQTT的思想,比如Facebook的的Messager据说就是按照MQTT的协议编写的。如果需要了解这个协议,简单的读一下其协议的主要内容其实是不能深刻理解其中的意思的,就像你看了XMPP的协议之后,不读smack很快就会遗忘掉这个协议的样子一样,程序员对代码的热爱程度会远远大多文档(初级码农),于是乎读了一下MQTT的实现Eclipse Paho,一下是一些简单的总结。

发布和订阅

MQTT使用的发布/订阅消息模式,它提供了一对多的消息分发机制,从而实现与应用程序的解耦。

这是一种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),而是由MQTT server(或称为 MQTT Broker)分发的
在这里插入图片描述

QoS(Quality of Service levels)

服务质量是 MQTT 的一个重要特性。当我们使用 TCP/IP 时,连接已经在一定程度上受到保护。但是在无线网络中,中断和干扰很频繁,MQTT 在这里帮助避免信息丢失及其服务质量水平。这些级别在发布时使用。如果客户端发布到 MQTT 服务器,则客户端将是发送者,MQTT 服务器将是接收者。当MQTT服务器向客户端发布消息时,服务器是发送者,客户端是接收者。
QoS 0

这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=
在这里插入图片描述
QoS 1

QoS 1 承诺消息将至少传送一次给订阅者。
在这里插入图片描述
QoS 2

使用 QoS 2,我们保证消息仅传送到目的地一次。为此,带有唯一消息 ID 的消息会存储两次,首先来自发送者,然后是接收者。QoS 级别 2 在网络中具有最高的开销,因为在发送方和接收方之间需要两个流。
在这里插入图片描述

GIT库

PAHO.MQTT
源码的简单编译会出问题,原因是库里同时存在着同步和异步通讯,需要删除一些程序才能编译过去。

库介绍

在这里插入图片描述

实际流程

在这里插入图片描述

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

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

相关文章

Mysql时间类型

多个timestamp 默认只对第一个timestamp自动更新时间

element-ui在项目当中的引入以及按需引入使用

目录 1.项目当中引入element-ui A.先使用npm安装 B.在main.js当中引入文件 C.在App.vue当中可以引用button相关的UI组件 2.element-ui配合脚手架按需引入 A.首先安装按需引入的插件 B.修改 .babelrc C.按需引入的好处 1.项目当中引入element-ui A.先使用npm安装 npm i …

【强化学习论文合集】ICML-2021 强化学习论文

强化学习&#xff08;Reinforcement Learning, RL&#xff09;&#xff0c;又称再励学习、评价学习或增强学习&#xff0c;是机器学习的范式和方法论之一&#xff0c;用于描述和解决智能体&#xff08;agent&#xff09;在与环境的交互过程中通过学习策略以达成回报最大化或实现…

[附源码]Python计算机毕业设计电子工厂进销存管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

哲学讨论:未来的语言模型有没有可能具备意识和主观感受?

文&#xff5c;付奶茶编&#xff5c;ZenMoore问题背景近期&#xff0c;纽约大学心智、大脑和意识研究中心的主任 David Chalmers 汇报了一场非常有思考价值的研究成果,主要是从神经科学的角度讨论了大规模语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff0…

刘强东这波操作秀

近日&#xff0c;刘强东发布京东全员信&#xff0c;信中提到&#xff1a;自2023年1月1日起&#xff0c;逐步为十几万德邦的兄弟们缴齐五险一金&#xff0c;确保每个德邦兄弟都能“老有所养&#xff0c;病有所医”&#xff0c;为兄弟们提供基础保障&#xff1b;集团拿出100亿元人…

教程四 在Go中使用Energy创建跨平台GUI - 开发者工具

介绍 本文介绍在Energy中如何使用开发者工具(dev tools) 开发者工具(dev tools) 是前端开发人员常用的&#xff0c;在开发时调式代码、接口、资源加载、CSS调整等等&#xff0c;大多数场景都会使用。 energy封装了部分繁琐的chromium使用&#xff0c;其中之一包含开发者工具…

致敬最美抗击疫情的逆行者 DIV布局大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

PD仿真算法中变形梯度矩阵的极分解

1.背景 PD&#xff08;Projective Dynamics&#xff09;仿真算法是一种“可并行化计算的”高效的软体形变模拟&#xff08;或成为仿真、动画&#xff09;算法&#xff0c;与传统的基于力的有限元方法不同的是&#xff0c;PD算法直接作用于顶点位置&#xff0c;通过最小化能量函…

Wireshark Lab: Ethernet and ARP v7.0

Wireshark Lab: Ethernet and ARP v7.0 实验内容戳这里 介绍部分转自乌漆WhiteMoon Ethernet 以太网 以太网在现在的有线局域网中有着支配者的地位&#xff0c;就像是因特网使得全球互联那样。其实局域网技术还有令牌环、FDDI 和 ATM 等&#xff0c;但是以太网仍然具有很多…

第十三届蓝桥杯 C++ B 组省赛 G 题———积木画(AC)

目录1.积木画1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.样例说明7.数据范围8.原题链接2.解题思路AC_code1.积木画 1.题目描述 小明最近迷上了积木画, 有这么两种类型的积木, 分别为 III 型&#xff08;大小为 2 个单位面积) 和 LLL 型 (大小为 3 个单位面积): 同…

java面试强基(12)

什么是泛型&#xff1f;有什么作用&#xff1f; Java 泛型&#xff08;Generics&#xff09; 是 JDK 5 中引入的一个新特性。使用泛型参数&#xff0c;可以增强代码的可读性以及稳定性。 编译器可以对泛型参数进行检测&#xff0c;并且通过泛型参数可以指定传入的对象类型。…

多媒体技术论文研读报告

多媒体技术论文研读报告 一、论文基本信息 论文题目为&#xff1a;基于多模态特征融合嵌入的相似广告检索方法&#xff0c;作者信息&#xff1a;南京大学计算机软件新技术国家重点实验室&#xff0c;南京大学软件学院冯奕、周晓松、李传艺、葛季栋、骆斌&#xff0c;深圳市腾…

2022最新JUC+多线程面试题

Java中实现多线程有几种方法 创建线程的常用的几种方式&#xff1a; 继承Thread类 实现Runnable接口 &#xff08;重写run方法&#xff0c;无返回值&#xff09; 实现Callable接口&#xff08; JDK1.5>,重写call方法&#xff0c;可以自定义返回值 &#xff09; 线程池方…

带式输送机的传动装置设计

目 录 摘 要 I Abstract II 1 绪论 1 1.1设计概述 1 1.2研究内容及参数 1 1.3 带传动 2 1.4圆锥-圆柱齿轮传动减速器 2 2结构设计 4 2.1V带传动 4 2.2减速器内部的传动零件 4 2.3联轴器的选择 4 3 设计计算过程及说明 6 3.1选择电动机 6 3.1.1电动机类型和结构型式选择 6 3.1.2…

android源码-ContentProvider实现原理分析

前言&#xff1a; 最初的目的是想研究下ContentProvider产生ANR原因的&#xff0c;但是如果要讲ANR的原因&#xff0c;那么必须要了解ContentProvider的完整实现原理&#xff0c;所以本篇就先讲一下ContentProvider的实现原理&#xff0c;下一篇再去讲ANR的原因。 本篇主要会讲…

估值破千亿,被资本疯抢的广汽埃安会是广汽的未来吗?

最近&#xff0c;广汽埃安在新能源市场上捷报频传&#xff0c;先是宣布完成了182.94亿元的A轮融资&#xff0c;成近年国内新能源整车最大的单笔私募融资。品牌估值更是达到了震撼人心的1032.39亿&#xff0c;基本等于广汽集团AH总市值&#xff0c;也远超港股小鹏、零跑汽车的市…

就两秒?这说出去谁信啊!

文 | xiaoyi&#xff08;转载请后台联系&#xff09;关注公众号&#xff1a;小一的学习笔记截止发文&#xff0c;北上广深一共有6510条公交线路为了获取上面的这些线路信息&#xff0c;我写了一个爬虫&#xff0c;大概用了2秒左右就搞定&#xff0c;真爽&#xff01;说出来你们…

Maven环境搭建

目录一、安装及环境配置1.1、下载1.2、Maven目录结构介绍1.3、环境配置二、关于Maven仓库的说明2.1、仓库基本分类&#xff08;私服仓库和中央仓库均为远程仓库&#xff09;2.2、本地仓库的默认位置&#xff08;在setting.xml中配置&#xff09;2.3、中央仓库连接位置的体现&am…

K8S部署后的使用:dashboard启动、使用+docker镜像拉取、容器部署(ubuntu环境+gpu3080+3主机+部署深度学习模型)

0、k8s安装、docker安装 参考&#xff1a;前两步Ubuntu云原生环境安装&#xff0c;dockerk8skubeedge&#xff08;亲测好用&#xff09;_爱吃关东煮的博客-CSDN博客_ubantu部署kubeedge 配置节点gpu&#xff1a; K8S调用GPU资源配置指南_思影影思的博客-CSDN博客_k8s 使用gpu…