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


    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
    
    • 1

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

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

    资源

    CSDN比较详细介绍

    简单介绍,如下图

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

      cJSON* cjson_test = NULL;
      cjson_test = cJSON_CreateObject();
    
    • 1
    • 2
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    1. 输出JSON数据:
    (char *) cJSON_Print(const cJSON *item);
    
    • 1

    例子:

    #include 
    #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;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    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
    源码的简单编译会出问题,原因是库里同时存在着同步和异步通讯,需要删除一些程序才能编译过去。

    库介绍

    在这里插入图片描述

    实际流程

    在这里插入图片描述

  • 相关阅读:
    交换机和路由器技术-25-OSPF多区域配置
    【计算机网络】子网掩码、子网划分
    相机sd卡照片丢失怎么找回呢?
    Black Friday案例分析
    Linux网络编程- ether_header & iphdr & tcphdr
    Ubuntu22.04.01Desktop桌面版安装记录221109
    基于 HTML5/CSS3 制作漂亮的登录页面
    2024数学建模时间汇总与竞赛攻略
    Web APIs:事件高级--鼠标事件
    外网nat+nat server,内网做路由过滤,以及ppp CHAR认证 企业网搭建
  • 原文地址:https://blog.csdn.net/Viccj/article/details/128031683