Git、JSON、MQTT

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…