做不做生意都要知道的网站,学生个人简历,有没有专业做汽车坐垫网站,青岛优化网站诊断GIT简介#xff1a;Git是什么#xff1f;Git是目前世界上最先进的分布式版本控制系统作用#xff1a;版本控制#xff08;版本的备份---版本的回溯和前进#xff09;多人协作优势#xff1a;SVN(集中式)劣势#xff1a;过度依赖服务器和网络#xff0c;容灾性差Git…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工作区如果没有修改---工作区是干净的工作区如果修改了---工作区是脏的提交是以修改为前提的工作区如果没有修改是干净的是无法触发提交动作的
JSONJSON是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 *rootcJSON_CreateObject();// //然后依次建立其他分支并插入主分支
// cJSON *namecJSON_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 *heightcJSON_CreateNumber(1.65);
// cJSON_AddItemToObject(root,height,height);// cJSON *gradecJSON_CreateNull();
// cJSON_AddItemToObject(root,grade,grade);// cJSON *arrcJSON_CreateArray();
// char* buf[]{ JavaScript,Java,Python,Lisp};
// for (int i 0; i 4; i)
// {
// cJSON *temcJSON_CreateString(buf[i]);
// cJSON_AddItemToArray(arr,tem);
// }
// cJSON_AddItemToObject(root,skills,arr);// //序列化
// char *buffercJSON_Print(root);
// printf(%s,buffer);// free(buffer);
反序列化示例对以下的JSON文件进行反序列化
#include stdio.h
#include cJSON.hint 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;
}如何看该使用哪个接口反序列化的过程就像吗喽爬树
MQTT1.介绍
是一种基于发布/订阅publish/subscribe模式的轻量级通讯协议该协议构建于TCP/IP协议上是基于TCP协议实现的一种应用层协议。同时兼具TCP的可靠性和UDP的分包特性适合高频次小数据量的通信基于C/S客户端-服务器模式在物联网、小型设备、移动应用等方面有较广泛的应用适用范围机器与机器M2M通信和物联网IoT
补充常见应用层协议httpWEB领域、modbusTCP工业通信领域、MQTT
实现MQTT协议需要客户端和服务器端通讯完成在通讯过程中MQTT协议中有三种身份发布者Publish、代理Broker服务器、订阅者Subscribe。其中消息的发布者和订阅者都是客户端消息代理是服务器消息发布者可以同时是订阅者。MQTT传输的消息分为主题Topic和负载payload两部分1Topic可以理解为消息的类型订阅者订阅Subscribe后就会收到该主题的消息内容payload2payload可以理解为消息的内容是指订阅者具体要使用的内容。
客户端
一个使用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命令即可运行。端口默认是1883PC客户端测试推荐使用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\nPress QEnter 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\non 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;
}