GIT

简介:

Git是什么?

Git是目前世界上最先进的分布式版本控制系统

作用:

  • 版本控制(版本的备份--->版本的回溯和前进)
  • 多人协作

优势:

SVN(集中式)劣势:

过度依赖服务器和网络,容灾性差

Git(分布式)优势:

  • 弱化服务器的重要性,仅作为中间人转发各自之间的差异,
  • 不依赖网络,速度快
  • 容灾性好

命令:

初始化仓库:

git init

提交工作区内容到版本库:

git add <文件名>             (*代表所有文件,git add *)

git commit -m "提交的内容"

查看版本记录:

git log

查看工作区状态:

git ststus

版本回退:

git log     ---->查看版本记录

git reset --hard <版本ID>

版本前进:

git reflog     ---->显示引用记录

git reset --hard <版本ID>

工作区如果没有修改--->工作区是干净的

工作区如果修改了--->工作区是脏的

提交是以修改为前提的,工作区如果没有修改(是干净的),是无法触发提交动作的;

JSON

JSON是JavaScript Object Notation的缩写,它是一种数据交换格式

应用场景:

通信、配置文件

json数据类型

  • number:数字型,和JavaScript的number完全一致;包括整型和浮点
  • boolean:就是JavaScript的true或false;相当于c++中的bool类型
  • string:就是JavaScript的string;相当于c++的string类型
  • null:就是JavaScript的null;相当于C的NULL类型
  • array:就是JavaScript的Array表示方式——[];相当于C的数组
  • object:就是JavaScript的{ ... }表示方式。相当于C++的类或者C的结构体

注意:json的数据类型在源码实现中和具体的编程语言有关,比如boolean在C中并没有相应的类型,C相关的实现库可能会用0和1表示。

JSON格式规范

  • json以大括号起始和结尾(最常见)本质上就是一个object,因此6种基本类型其实都会被认为成是JSON的格式
  • 内容都是以键值对的形式存在
  • 所有的键都是字符串
  • 值的类型不一定,属于JavaScript 的基本数据类型
  • 每个键值对以,分割
  • 最后一个键值对不加逗号

cJSON

(使用C语言实现JSON格式的序列化和反序列化)

序列化

示例:

将以下数据进行序列化

 //先建出树的根节点(主分支)
//     cJSON *root=cJSON_CreateObject();//     //然后依次建立其他分支并插入主分支
//     cJSON *name=cJSON_CreateString("小明");  
//     cJSON_AddItemToObject(root,"name",name);//     cJSON *age =cJSON_CreateNumber(14);
//     cJSON_AddItemToObject(root,"age",age);//    cJSON *gender= cJSON_CreateTrue();
//    cJSON_AddItemToObject(root,"gender",gender);//    cJSON *height=cJSON_CreateNumber(1.65); 
//    cJSON_AddItemToObject(root,"height",height);//    cJSON *grade=cJSON_CreateNull();
//    cJSON_AddItemToObject(root,"grade",grade);//    cJSON *arr=cJSON_CreateArray();
//    char* buf[]={ "JavaScript","Java","Python","Lisp"};
//    for (int i = 0; i < 4; i++)
//    {
//         cJSON *tem=cJSON_CreateString(buf[i]);
//         cJSON_AddItemToArray(arr,tem);
//    }
//     cJSON_AddItemToObject(root,"skills",arr);//     //序列化
//     char *buffer=cJSON_Print(root);
//     printf("%s",buffer);//     free(buffer);

反序列化

示例:

对以下的JSON文件进行反序列化:

#include <stdio.h>
#include "cJSON.h"int main(int argc, char const *argv[])
{// 打开data.json文件FILE *file = fopen("data.json", "r");if (NULL == file){perror("read err\n");return -1;}//buf用来存放读出来的文件的内容char buf[1024] = {0};//读取data.json文件的内容size_t len = fread(buf, 1, 1024, file);if (len <= 0){perror("read err");return -1;}// json的反序列化cJSON *root = cJSON_Parse(buf);// 一定要判断if (NULL == root){printf("parse err\n");return -1;}// 获取root上名字叫ver的节点cJSON *ver = cJSON_GetObjectItem(root, "ver");printf("ver = %s\n", ver->valuestring);// 获取root上名字叫login的节点cJSON *login = cJSON_GetObjectItem(root, "login");cJSON *pwd = cJSON_GetObjectItem(login, "pwd");cJSON *user = cJSON_GetObjectItem(login, "user");printf("%s = %d\n", pwd->string, pwd->valueint);printf("%s = %s\n", user->string, user->valuestring);// 获取根节点上名字叫data的子节点//(注意:data是一个数组,他里面的各个数组元素在进行反序列化时有特殊接口cJSON *data = cJSON_GetObjectItem(root, "data");// 获取数组的大小int count = cJSON_GetArraySize(data);cJSON *tmp;// 遍历获取每个数组节点for (int i = 0; i < count; i++){tmp = cJSON_GetArrayItem(data, i);cJSON *key = cJSON_GetObjectItem(tmp, "key");cJSON *type = cJSON_GetObjectItem(tmp, "type");cJSON *val = cJSON_GetObjectItem(tmp, "val");printf("key = %d\n", key->valueint);printf("type = %d\n", type->valueint);printf("val = %s\n", val->valuestring);}fclose(file);return 0;
}

如何看该使用哪个接口?

反序列化的过程就像吗喽爬树,

MQTT

1.介绍

  • 是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,是基于TCP协议实现的一种应用层协议。同时兼具TCP的可靠性和UDP的分包特性,适合高频次小数据量的通信
  • 基于C/S(客户端-服务器)模式
  • 在物联网、小型设备、移动应用等方面有较广泛的应用
  • 适用范围:机器与机器(M2M)通信和物联网(IoT)

补充:常见应用层协议:http(WEB领域)、modbusTCP(工业通信领域)、MQTT

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)

其中,消息的发布者和订阅者都是客户端,消息代理是服务器消息发布者可以同时是订阅者

MQTT传输的消息分为:主题(Topic)负载(payload)两部分:

  • (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
  • (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

客户端:

一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:

  • (1)发布其他客户端可能会订阅的信息;
  • (2)订阅其它客户端发布的消息;
  • (3)退订或删除应用程序的消息;
  • (4)断开与服务器连接。

服务器端:

MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:

  • (1)接受来自客户的网络连接;
  • (2)接受客户发布的应用信息;
  • (3)处理来自客户端的订阅和退订请求;
  • (4)向订阅的客户转发应用程序消息。

2.通信过程

在Linux上搭建mosquitto服务器(MQTT官方提供的Broker)

tar xf mosquitto-1.6.3.tar.gz
cd mosquitto-1.6.3/
make
sudo make install

安装完成后,终端输入mosquitto命令即可运行。端口默认是1883

PC客户端测试推荐使用MQTT.fx客户端软件

连接成功的话,服务器端会显示

客户端也会显示

接下来选择订阅者还是发布者,进行消息的收发即可

使用官方库(paho库读作派和)搭客户端(既是订阅者也是发布者)

/******************************************************************************** Copyright (c) 2012, 2017 IBM Corp.** All rights reserved. This program and the accompanying materials* are made available under the terms of the Eclipse Public License v1.0* and Eclipse Distribution License v1.0 which accompany this distribution.** The Eclipse Public License is available at*   http://www.eclipse.org/legal/epl-v10.html* and the Eclipse Distribution License is available at*   http://www.eclipse.org/org/documents/edl-v10.php.** Contributors:*    Ian Craggs - initial contribution*******************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#include "cJSON.h"
#define ADDRESS "tcp://192.168.51.131:1883"
#define CLIENTIDS "ClientSub"#define TOPICS "Down"
#define TOPICP "Up"#define PAYLOAD "Hello World!"
#define QOS 1
#define TIMEOUT 10000Lvolatile MQTTClient_deliveryToken deliveredtoken;void delivered(void *context, MQTTClient_deliveryToken dt)
{printf("Message with token value %d delivery confirmed\n", dt);deliveredtoken = dt;
}int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{int i;char *payloadptr;printf("Message arrived\n");printf("     topic: %s\n", topicName);printf("   message: \n");payloadptr = message->payload;// json的反序列化cJSON *root = cJSON_Parse(payloadptr);// 一定要判断是否是标准的JSON格式(即object类型,排除掉那些因为是JSON其他的基本数据类型而被认为成是JSON的情况)if ((NULL == root) || (root->type != cJSON_Object)){printf("parse err\n");cJSON_Delete(root);return 1;}// 逐个打印解析出来的节点信息cJSON *name = cJSON_GetObjectItem(root, "name");printf("name = %s\n", name->valuestring);cJSON *age = cJSON_GetObjectItem(root, "age");printf("age = %d\n", age->valueint);cJSON *msg = cJSON_GetObjectItem(root, "msg");printf("msg = %s\n", msg->valuestring);MQTTClient_freeMessage(&message);MQTTClient_free(topicName);// 释放rootcJSON_Delete(root);return 1;
}void connlost(void *context, char *cause)
{printf("\nConnection lost\n");printf("     cause: %s\n", cause);
}int main(int argc, char *argv[])
{MQTTClient clients;MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;MQTTClient_message pubmsg = MQTTClient_message_initializer;MQTTClient_deliveryToken token;int rc;char buf[1024]; // 要发送的msgchar *buffer;// 创建客户端,并且指定客户端连接的mqtt服务器地址和客户端IDMQTTClient_create(&clients, ADDRESS, CLIENTIDS,MQTTCLIENT_PERSISTENCE_NONE, NULL);conn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;//设置回调接口,只需要关注msgarrvd:消息到达后,会自动调用这个接口(相当于开了个线程负责接收消息)MQTTClient_setCallbacks(clients, NULL, connlost, msgarrvd, delivered);if ((rc = MQTTClient_connect(clients, &conn_opts)) != MQTTCLIENT_SUCCESS){printf("Failed to connect, return code %d\n", rc);exit(EXIT_FAILURE);}printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n""Press Q<Enter> to quit\n\n",TOPICS, CLIENTIDS, QOS);MQTTClient_subscribe(clients, TOPICS, QOS);while (1){memset(buf, 0, sizeof(buf));scanf("%s", buf);if (strcmp(buf, "Q") == 0 || strcmp(buf, "q") == 0){break;}else{// 先建出树的根节点(主分支)cJSON *root = cJSON_CreateObject();// 然后依次建立其他分支并插入主分支cJSON *name = cJSON_CreateString("小明");cJSON_AddItemToObject(root, "name", name);cJSON *age = cJSON_CreateNumber(14);cJSON_AddItemToObject(root, "age", age);cJSON *msg = cJSON_CreateString(buf);cJSON_AddItemToObject(root, "msg", msg);// JSON格式的要发布的消息buffer = cJSON_Print(root);// 设置要发布的消息pubmsg.payload = buffer;pubmsg.payloadlen = (int)strlen(buffer);pubmsg.qos = QOS;pubmsg.retained = 0;MQTTClient_publishMessage(clients, TOPICP, &pubmsg, &token);printf("Waiting for up to %d seconds for publication of %s\n""on topic %s for client with ClientID: %s\n",(int)(TIMEOUT / 1000), buffer, TOPICP, CLIENTIDS);rc = MQTTClient_waitForCompletion(clients, token, TIMEOUT);printf("Message with delivery token %d delivered\n", token);cJSON_Delete(root);}}free(buffer);buffer = NULL;MQTTClient_unsubscribe(clients, TOPICS);MQTTClient_unsubscribe(clients, TOPICP);MQTTClient_disconnect(clients, 10000);MQTTClient_destroy(&clients);return rc;
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolo目标检测技术之yolov11项目实战(三)

yolo目标检测技术之yolov11项目实战&#xff08;三&#xff09; 文章目录yolo目标检测技术之yolov11项目实战&#xff08;三&#xff09;一、 基于 YOLO11 的火焰与烟雾检测系统&#xff08;实战代码&#xff09;项目目标环境搭建创建虚拟环境安装依赖1.1 数据集准备1. 下载地址…

CF思维小训练(二)

清晰的缤纷的都可以 脏兮兮的甜的也都有转机 不想太小心 错过第一百零一场美丽 CF思维小训练&#xff08;二&#xff09; 书接上回CF思维小训练-CSDN博客 虽然代码很短&#xff0c;都是每一道题的背后都思维满满&#xff1b; 目录CF思维小训练&#xff08;二&#xff09;Arbo…

分布式锁:从理论到实战的深度指南

1. 分布式锁是啥&#xff1f;为什么它比单机锁更“硬核”&#xff1f;分布式锁&#xff0c;听起来高大上&#xff0c;其实核心问题很简单&#xff1a;在多个机器、进程或服务同时抢夺资源时&#xff0c;怎么保证不打架&#xff1f; 想象一下&#xff0c;你在双十一抢购限量款球…

基于UniApp的智能在线客服系统前端设计与实现

了解更多&#xff0c;搜索“程序员老狼”一、引言在当今数字化时代&#xff0c;客户服务已成为企业竞争力的重要组成部分。本文将详细介绍一款基于UniApp框架开发的跨平台智能客服系统前端实现方案&#xff0c;该系统不仅具备传统客服功能&#xff0c;还融入了现代即时通讯和人…

react与vue的对比,来实现标签内部类似v-for循环,v-if等功能

前言&#xff1a;在vue中我们提供了很多标签方法&#xff0c;比如用的比较多的v-for循环内容&#xff0c;v-if/v-show等判断&#xff0c;可以直接写在标签中&#xff0c;大大提高了我们的开发效率&#xff0c;那么在react中有没有类似的方法呢&#xff1f;我们这里来说一说。re…

PCB工艺-四层板制作流程(简单了解下)

一&#xff09;流程&#xff1a;四层板的内层芯板&#xff0c;是由一张双面覆铜板PP*2铜箔*2覆铜板蚀刻好线路&#xff0c;就是我们的芯板了PP全名叫半固化片&#xff0c;主体是玻璃纤维布环氧树脂&#xff0c;是绝缘介质铜箔片&#xff0c;是单独一张铜箔&#xff0c;很薄&…

无人机三维路径规划

文章目录 1、引言 2、背景知识 3、核心算法 4、挑战与优化 5、初始效果 6、需要改进地方 7、水平方向优化路线 8、垂直方向优化路线 9、与经过路线相交的网格都绘制出来 1、引言 介绍三维路径规划的定义和重要性:在无人机、机器人导航、虚拟现实等领域的应用。 概述文章目标和…

Spring-解决项目依赖异常问题

一.检查项目的Maven路径是否正确在确保新项目中的依赖在自己的电脑中已经存在的情况下&#xff1a;可以检查项目的Maven路径是否正确在拿到一个新项目时&#xff0c;要检查这个项目的Maven路径是自己电脑上设置好的Maven路径吗&#xff1f;如果不是&#xff0c;项目依赖会出问题…

系统设计——DDD领域模型驱动实践

摘要本文主要介绍了DDD&#xff08;领域驱动设计&#xff09;在系统设计中的实践应用&#xff0c;包括其在编码规范、分层架构设计等方面的具体要求和建议。重点强调了应用层的命名规范&#xff0c;如避免使用模糊的Handler、Processor等命名&#xff0c;推荐使用动词加业务动作…

开源卫星软件平台LibreCube技术深度解析

LibreCube技术深度解析&#xff1a;开源卫星软件平台的完整指南 LibreCube是一个专为CubeSat设计的模块化开源卫星软件平台&#xff0c;它通过整合姿态控制、通信管理和任务调度等核心功能&#xff0c;为立方星开发者提供了完整的解决方案。本文将全面剖析LibreCube的技术架构…

React(四):事件总线、setState的细节、PureComponent、ref

React(四) 一、事件总线 二、关于setState的原理 1. setState的三种使用方式 (1)基本使用 (2)传入一个回调 (3)第一个参数是对象,第二个参数是回调 2. 为什么setState要设置成异步 (1)提升性能,减少render次数 (2)避免state和props数据不同步 3. 获取异步修改完数…

CPUcores-【硬核优化】CPU增强解锁全部内核!可优化游戏性能、提升帧数!启用CPU全内核+超线程,以更高优先级运行游戏!支持各种游戏和应用优化~

软件介绍&#xff08;文末获取&#xff09;CPUCores&#xff1a;游戏性能优化利器‌这款工具&#xff0c;专为优化提升中低配电脑的帧数而生。其独创的CPU资源调度技术&#xff0c;能让老旧硬件焕发新生核心技术原理‌采用「内核级隔离」方案&#xff0c;通过&#xff1a;系统进…

HQA-Attack: Toward High Quality Black-Box Hard-Label Adversarial Attack on Text

文本对抗性攻击分为白盒攻击和黑盒攻击&#xff0c;其中黑盒攻击更贴近现实&#xff0c;又可分为软标签和硬标签设置&#xff0c;。这些名词分别是什么意思 在文本对抗性攻击中&#xff0c;“白盒攻击”“黑盒攻击”以及黑盒攻击下的“软标签”“硬标签”设置&#xff0c;核心差…

PyCharm性能优化与大型项目管理指南

1. PyCharm性能深度调优 1.1 内存与JVM配置优化 PyCharm基于JVM运行,合理配置JVM参数可显著提升性能: # 自定义VM选项文件位置 # Windows: %USERPROFILE%\AppData\Roaming\JetBrains\<product><version>\pycharm64.exe.vmoptions # macOS: ~/Library/Applicat…

基于Java飞算AI的Spring Boot聊天室系统全流程实战

在当今数字化时代&#xff0c;实时通讯已成为现代应用不可或缺的核心功能。从社交平台到企业协作&#xff0c;从在线客服到游戏互动&#xff0c;实时聊天功能正以前所未有的速度渗透到各行各业。然而&#xff0c;开发一个功能完善的聊天室系统绝非易事——传统开发模式下&#…

在 Conda 环境下编译 C++ 程序时报错:version `GLIBCXX_3.4.30‘ not found

报错信息如下 ERROR:/root/SVF/llvm-16.0.4.obj/bin/clang: /opt/miniconda3/envs/py38/lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /root/SVF/llvm-16.0.4.obj/bin/clang)根据错误信息&#xff0c;问题是由于 Conda 环境中的libstdc.so.6缺少GLIBCXX_3…

vue+flask基于Apriori算法规则的求职推荐系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01;编号&#xff1a;F069 基于Apriori关联规则职位相似度的推荐算法进行职位推荐 基于决策树、随机森林的预测薪资 vueflaskmysql爬虫 设计求…

机器学习第九课之DBSCAN算法

目录 简介 一、dbscan相关概念 二、dbscan的API 三、案例分析 1. 导入所需库 2. 数据读取与预处理 3. 数据准备 4. DBSCAN 参数调优 5. 确定最佳参数并应用 总结 简介 本次我们将聚焦于一款极具特色的聚类算法 ——DBSCAN。相较于 K-means 等需要预先指定簇数量的算法…

给AI开一副“健忘药”:Dropout如何治愈神经网络的死记硬背症

**——解读《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》**想象一位学生备考时&#xff0c;只反复背诵三套模拟题答案&#xff0c;却在真正的考场上面对新题型束手无策——这种**死记硬背不会举一反三**的问题&#xff0c;正是神经网络中的“过拟合”…

【框架】跨平台开发框架自用整理

Tauri 2.0 | Tauri https://github.com/tauri-apps/tauri 创建小型、快速、安全、跨平台的应用程序 独立于前端 将你现有的网络技术栈带到 Tauri 或开始新的项目。 Tauri 支持任何前端框架&#xff0c;所以你不需要改变你的技术栈。 跨平台 使用单个代码库为 Linux、macOS、W…