MQTT原理与应用

学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端

本文章学习借鉴于太极创客团队,以表感谢。官网[http://www.taichi-maker.com/]


文章目录

  • MQTT原理与应用
  • 一、使用电脑客户端和ESP8266客户端来连接MQTT服务端
    • 电脑客户端连接MQTT服务端
      • MQTT 客户端工具 (MQTT X 桌面客户端)
      • MQTT X 下载地址
      • MQTTfx 下载地址
      • ESP8266连接MQTT服务端
    • 示例程序
  • 二、 MQTTfx 使用教程
    • 公用MQTT服务器列表
  • 三、学习客户端如何实现发布消息、订阅主题以及取消订阅主题
    • PUBLISH – 发布信息
    • SUBSCRIBE – 订阅主题
    • SUBACK – 订阅确认
    • UNSUBSCRIBE – 取消订阅
  • ESP8266发布MQTT消息
    • 发布MQTT消息示例
  • MQTT 主题介绍
    • 主题基本形式
    • 主题分级
    • 主题通配符
    • 主题应用注意事项
  • ESP8266订阅MQTT主题
  • 总结

一、使用电脑客户端和ESP8266客户端来连接MQTT服务端

电脑客户端连接MQTT服务端

MQTT 客户端工具 (MQTT X 桌面客户端)

MQTT X 是 EMQ 开源的一款跨平台 MQTT 5.0 客户端工具,它支持 macOS, Linux, Windows,并且支持 MQTT 消息格式转换。

MQTT X 的用户界面借助聊天软件的形式简化了页面的操作逻辑,用户可以快速创建连接保存并同时建立多个连接客户端,方便用户快速测试 MQTT/TCP、MQTT/TLS、MQTT/WebSocket 的 连接/发布/订阅 功能及其他特性。

MQTT X 致力于打造优雅、易用的全平台 MQTT 客户端,并在最近发布了 MQTT X CLI 及 MQTT X Web 两个版本,目前在 GitHub Star 数已达到 2K,已成为使用场景最完整的 MQTT 测试客户端。

MQTT X 下载地址

官网下载:https://mqttx.app/zh
GitHub 下载:https://github.com/emqx/MQTTX/releases

MQTTfx 下载地址

百度网盘:https://pan.baidu.com/s/13v0ROf1dOzu2tXqmw3iBMg 提取码:r9f7

ESP8266连接MQTT服务端

ESP8266的Arduino开发环境里有多个MQTT库,我们将使用最为流行的PubSubClient库来作为本教程的主要介绍对象,我们将通过一系列课程教您如何使用ESP8266通过PubSubClient库来实现MQTT物联网应用。

ArduinoIDE 安装库

ArduinoIDE 导入下载的库

示例程序

/**********************************************************************
本程序旨在演示如何使用PubSubClient库使用ESP8266向连接MQTT服务器。
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "wifi";
const char* password = "12345678";
const char* mqttServer = "test.ranye-iot.net";// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);void setup() {Serial.begin(9600);//设置ESP8266工作模式为无线终端模式WiFi.mode(WIFI_STA);// 连接WiFiconnectWifi();// 设置MQTT服务器和端口号mqttClient.setServer(mqttServer, 1883);// 连接MQTT服务器connectMQTTServer();
}void loop() { if (mqttClient.connected()) { // 如果开发板成功连接服务器    mqttClient.loop();          // 保持客户端心跳} else {                  // 如果开发板未能成功连接服务器connectMQTTServer();    // 则尝试连接服务器}
}void connectMQTTServer(){// 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)String clientId = "esp8266-" + WiFi.macAddress();// 连接MQTT服务器if (mqttClient.connect(clientId.c_str())) { Serial.println("MQTT Server Connected.");Serial.println("Server Address: ");Serial.println(mqttServer);Serial.println("ClientId:");Serial.println(clientId);} else {Serial.print("MQTT Server Connect Failed. Client State:");Serial.println(mqttClient.state());delay(3000);}
}// ESP8266连接wifi
void connectWifi(){WiFi.begin(ssid, password);//等待WiFi连接,成功连接后输出成功信息while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.print(".");}Serial.println("");Serial.println("WiFi Connected!");  Serial.println("");
}

二、 MQTTfx 使用教程

下载完,安装后,打开软件 如下图,第一步骤,点击设置图标

创建MQTT服务

connect 开始连接,右侧 ,绿色说明连接成功

创建订阅主题

订阅主题发布信息
选择主题,下面输入发送的内容,点击publish 发送,


发送记录查看


同步太极创客教程 连接 https://www.bilibili.com/video/BV1T54y1k7MQ/?spm_id_from=333.999.0.0&vd_source=04d3b5e0230b02edb1f84360e21ab826

公用MQTT服务器列表

然也物联 (国内)
官网地址:http://www.ranye-iot.net
MQTT服务器地址:test.ranye-iot.net
TCP 端口:1883
TCP/TLS 端口:8883

三、学习客户端如何实现发布消息、订阅主题以及取消订阅主题

PUBLISH – 发布信息

MQTT客户端一旦连接到服务端,便可以发布消息。 每条发布的MQTT消息必须包含一个主题。MQTT服务器可以通过主题确定将消息转发给哪些客户端


以下是PUBLISH报文的详细信息。

topicName – 主题名

主题名用于识别此信息应发布到哪一个主题。关于MQTT主题的应用,我们在之前的课程中已经做了详细介绍,在后续课程中我们还会对主题的高级应用进行更加详细的讲解。

QoS – 服务质量等级
QoS(Quality of Service)表示MQTT消息的服务质量等级。QoS有三个级别:0、1和2。QoS决定MQTT通讯有什么样的服务保证。有关QoS的详细信息我们会在后续课程中详细讲解。

packetId – 报文标识符

报文标识符可用于对MQTT报文进行标识。不同的MQTT报文所拥有的标识符不同。MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。请注意:报文标识符的内容与QoS级别有密不可分的关系。只有QoS级别大于0时,报文标识符才是非零数值。如果QoS等于0,报文标识符为0。

retainFlag – 保留标志

在默认情况下,当客户端订阅了某一主题后,并不会马上接收到该主题的信息。只有在客户端订阅该主题后,服务端接收到该主题的新信息时,服务端才会将最新接收到的该主题信息推送给客户端。
但是在有些情况下,我们需要客户端在订阅了某一主题后马上接收到一条该主题的信息。这时候就需要用到保留标志这一信息。关于保留标志的具体使用方法,我们将在本教程的后续部分进行详细讲解。

Payload – 有效载荷
有效載荷是我们希望通过MQTT所发送的实际内容。我们可以使用MQTT协议发送文本,图像等格式的内容。这些内容都是通过有效載荷所发送的。

dupFlag – 重发标志
当MQTT报文的接收方没有及时确认收到报文时,发送方会重复发送MQTT报文。在重复发送MQTT报文时,发送方会将此“重发标志”设置为true。请注意,重发标志只在QoS级别大于0时使用。有关QoS的详细信息,我们将会在后续教程中为您做详细介绍。

SUBSCRIBE – 订阅主题

当客户端连接到服务端后,除了可以发布消息,也可以接收消息。我们在之前的课程讲过,所有MQTT消息都有主题。客户端要想接收消息,首先要订阅该消息的主题。这样,当有客户端向该主题发布消息后,订阅了该主题的客户端就能接收到消息了。

客户端要想订阅主题,首先要向服务端发送主题订阅请求。客户端是通过向服务端发送SUBSCRIBE报文来实现这一请求的。该报文包含有一系列“订阅主题名”。请留意,一个SUBSCRIBE报文可以包含有单个或者多个订阅主题名。也就是说,一个SUBSCRIBE报文可以用于订阅一个或者多个主题。

在以上PUBLISH报文讲解中,我们曾经提到过QoS(服务质量等级)这一概念。同样的,客户端在订阅主题时也可以明确QoS。服务端会根据SUBSCRIBE中的QoS来提供相应的服务保证。

另外每一个SUBSCRIBE报文还包含有“报文标识符”。报文标识符可用于对MQTT报文进行标识。不同的MQTT报文所拥有的标识符不同。MQTT设备可以通过该标识符对MQTT报文进行甄别和管理。

SUBACK – 订阅确认

服务端接收到客户端的订阅报文后,会向客户端发送SUBACK报文确认订阅。

SUBACK报文包含有“订阅返回码”和“报文标识符”这两个信息。

returnCode – 订阅返回码

UNSUBSCRIBE – 取消订阅

顾名思义,当客户端要取消订阅某主题时,可通过向服务端发送UNSUBSCRIBE – 取消订阅报文来实现。


以上示意图显示,UNSUBSCRIBE报文包含两个重要信息,第一个是取消订阅的主题名称。同一个UNSUBSCRIBE报文可以同时包含多个取消订阅的主题名称。另外,UNSUBSCRIBE报文也包含“报文标识符”,MQTT设备可以通过该标识符对报文进行管理。

当服务端接收到UNSUBSCRIBE报文后,会向客户端发送取消订阅确认报文 – UNSUBACK报文。该报文含有客户端所发送的“取消订阅报文标识符”。

客户端接收到UNSUBACK报文后就可以确认取消主题订阅已经成功完成了。

ESP8266发布MQTT消息

ESP8266的Arduino开发环境里有多个MQTT库,我们将使用最为流行的PubSubClient库来作为本教程的主要介绍对象,我们将通过一系列课程教您如何使用ESP8266通过PubSubClient库来实现MQTT物联网应用。关于PubSubClient库,以下是其基本信息:

发布MQTT消息示例

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : publish_ranye_url
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200813
程序目的/Purpose          :
本程序旨在演示如何使用PubSubClient库使用ESP8266向MQTT服务器发布信息。
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "taichi-maker";
const char* password = "12345678";
const char* mqttServer = "test.ranye-iot.net";// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/Ticker ticker;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);int count;    // Ticker计数用变量void setup() {Serial.begin(9600);//设置ESP8266工作模式为无线终端模式WiFi.mode(WIFI_STA);// 连接WiFiconnectWifi();// 设置MQTT服务器和端口号mqttClient.setServer(mqttServer, 1883);// 连接MQTT服务器connectMQTTServer();// Ticker定时对象ticker.attach(1, tickerCount);
}void loop() { if (mqttClient.connected()) { // 如果开发板成功连接服务器// 每隔3秒钟发布一次信息if (count >= 3){pubMQTTmsg();count = 0;}    // 保持心跳mqttClient.loop();} else {                  // 如果开发板未能成功连接服务器connectMQTTServer();    // 则尝试连接服务器}
}void tickerCount(){count++;
}void connectMQTTServer(){// 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)String clientId = "esp8266-" + WiFi.macAddress();// 连接MQTT服务器if (mqttClient.connect(clientId.c_str())) { Serial.println("MQTT Server Connected.");Serial.println("Server Address: ");Serial.println(mqttServer);Serial.println("ClientId:");Serial.println(clientId);} else {Serial.print("MQTT Server Connect Failed. Client State:");Serial.println(mqttClient.state());delay(3000);}
}// 发布信息
void pubMQTTmsg(){static int value; // 客户端发布信息用数字// 建立发布主题。主题名称以Taichi-Maker-为前缀,后面添加设备的MAC地址。// 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同,String topicString = "Taichi-Maker-Pub-" + WiFi.macAddress();char publishTopic[topicString.length() + 1];  strcpy(publishTopic, topicString.c_str());// 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。String messageString = "Hello World " + String(value++); char publishMsg[messageString.length() + 1];   strcpy(publishMsg, messageString.c_str());// 实现ESP8266向主题发布信息if(mqttClient.publish(publishTopic, publishMsg)){Serial.println("Publish Topic:");Serial.println(publishTopic);Serial.println("Publish message:");Serial.println(publishMsg);    } else {Serial.println("Message Publish Failed."); }
}// ESP8266连接wifi
void connectWifi(){WiFi.begin(ssid, password);//等待WiFi连接,成功连接后输出成功信息while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.print(".");}Serial.println("");Serial.println("WiFi Connected!");  Serial.println("");
}

MQTT 主题介绍

主题基本形式

主题是区分大小写的,不建议使用中文,不建议使用空格

示例
myTopic
motorSpeed
MotorSpeed
current time

主题分级

MQTT主题各个级别之间可以使用”/”来分隔。如下例所示:
home/sensor/kitchen/temperature 四级主题
home/sensor/kitchen 三级主题

主题通配符

单级通配符: +

单级通配符可以代替一个主题级别。 以下为含有单极通配符的主题示例。
同时订阅多个主题,前后必须一致才可以
home/sensor/+/temperature

  • 可以替代中间任何的主题,
    home/sensor/kitchen/temperature
    home/sensor/bedroom/temperature

多级通配符 # (类似于匹配查询like home/senso%)
home/sensor/#
home/sensor/kitchen/temperature
home/sensor/bedroom/brightness
home/sensor/data

主题应用注意事项

以$开始的主题是MQTT服务端系统保留的特殊主题,我们不能随意订阅或者向其发布信息。

$SYS/broker/clients/connected
$SYS/broker/clients/disconnected
$SYS/broker/clients/total
$SYS/broker/messages/sent
$SYS/broker/uptime

– 不要用 “/” 作为主题开头
– 主题中不要使用空格
– 保持主题简洁明了
– 主题中尽量使用ASCII字符

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符 [1] 。
了解一下ASCII字符即可

在主题中嵌入客户端ID

ESP8266订阅MQTT主题

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : subscribe_ranye_url
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200708
程序目的/Purpose          :
本程序旨在演示如何使用PubSubClient库使用ESP8266向MQTT服务器订阅信息。
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "dajiating";
const char* password = "xxxx";
const char* mqttServer = "test.ranye-iot.net";
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);void setup() {pinMode(D4, OUTPUT);     // 设置板上LED引脚为输出模式digitalWrite(D4, HIGH);  // 启动后关闭板上LEDSerial.begin(9600);               // 启动串口通讯//设置ESP8266工作模式为无线终端模式WiFi.mode(WIFI_STA);// 连接WiFiconnectWifi();// 设置MQTT服务器和端口号mqttClient.setServer(mqttServer, 1883);// 设置MQTT订阅回调函数mqttClient.setCallback(receiveCallback);// 连接MQTT服务器connectMQTTserver();
}void loop() {if (mqttClient.connected()) { // 如果开发板成功连接服务器mqttClient.loop();          // 处理信息以及心跳} else {                      // 如果开发板未能成功连接服务器connectMQTTserver();        // 则尝试连接服务器}
}// 连接MQTT服务器并订阅信息
void connectMQTTserver(){// 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)String clientId = "esp8266-" + WiFi.macAddress();// 连接MQTT服务器if (mqttClient.connect(clientId.c_str())) { Serial.println("MQTT Server Connected.");Serial.println("Server Address:");Serial.println(mqttServer);Serial.println("ClientId: ");Serial.println(clientId);// subscribeTopic(); // 订阅指定主题subscribeTopicList();//} else {Serial.print("MQTT Server Connect Failed. Client State:");Serial.println(mqttClient.state());delay(5000);}
}// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {Serial.print("Message Received [");Serial.print(topic);Serial.print("] ");for (int i = 0; i < length; i++) {Serial.print((char)payload[i]);}Serial.println("");Serial.print("Message Length(Bytes) ");Serial.println(length);if ((char)payload[0] == '1') {     // 如果收到的信息以“1”为开始digitalWrite(D4, LOW);  // 则点亮LED。Serial.println("LED ON");} else {                           digitalWrite(D4, HIGH); // 否则熄灭LED。Serial.println("LED OFF");}
}// 订阅指定主题
void subscribeTopic(){// 建立订阅主题。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。// 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress();char subTopic[topicString.length() + 1];  strcpy(subTopic, topicString.c_str());// 通过串口监视器输出是否成功订阅主题以及订阅的主题名称if(mqttClient.subscribe(subTopic)){Serial.println("Subscrib Topic:");Serial.println(subTopic);} else {Serial.print("Subscribe Fail...");}
}// 订阅多个指定主题
void subscribeTopicList(){//单级通配符: +//String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress()+"/+/data";//多级通配符 #//String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress()+"/#";// 建立订阅主题1。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。// 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress();char subTopic[topicString.length() + 1];  strcpy(subTopic, topicString.c_str());// 建立订阅主题2String topicString2 = "Taichi-Maker-Sub2-" + WiFi.macAddress();char subTopic2[topicString2.length() + 1];  strcpy(subTopic2, topicString2.c_str());// 通过串口监视器输出是否成功订阅主题1以及订阅的主题1名称if(mqttClient.subscribe(subTopic)){Serial.println("Subscrib Topic:");Serial.println(subTopic);} else {Serial.print("Subscribe Fail...");}  // 通过串口监视器输出是否成功订阅主题2以及订阅的主题2名称if(mqttClient.subscribe(subTopic2)){Serial.println("Subscrib Topic:");Serial.println(subTopic2);} else {Serial.print("Subscribe Fail...");}
}// ESP8266连接wifi
void connectWifi(){WiFi.begin(ssid, password);//等待WiFi连接,成功连接后输出成功信息while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.print(".");}Serial.println("");Serial.println("WiFi Connected!");  Serial.println("");
}

总结

 // 建立发布主题。主题名称以Taichi-Maker-为前缀,后面添加设备的MAC地址。// 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同,String topicString = "Taichi-Maker-Pub-" + WiFi.macAddress();char publishTopic[topicString.length() + 1];  strcpy(publishTopic, topicString.c_str()); //主题必须字符转化字符数组// 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。String messageString = "Hello World " + String(value++); char publishMsg[messageString.length() + 1];   strcpy(publishMsg, messageString.c_str());// 实现ESP8266向主题发布信息mqttClient.publish(publishTopic, publishMsg) //发布函数// 保持心跳,保持mqtt 正常链接。保持在线mqttClient.loop();subscribeTopic(); // 订阅指定主题
// 收到信息后的回调函数
//char* topic 主题,
//byte* payload, 信息内容
//unsigned int length 信息长度
void receiveCallback(char* topic, byte* payload, unsigned int length) //单级通配符: +//String topicString = "Taichi-Maker-Sub-" +  WiFi.macAddress()+"/+/data";//多级通配符 #//String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress()+"/#";// 建立订阅主题1。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。// 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同//订阅指定主题String topicString = "Taichi-Maker-Sub-" + WiFi.macAddress();char subTopic[topicString.length() + 1];  strcpy(subTopic, topicString.c_str());// 建立订阅主题2String topicString2 = "Taichi-Maker-Sub2-" + WiFi.macAddress();char subTopic2[topicString2.length() + 1];  strcpy(subTopic2, topicString2.c_str());// 通过串口监视器输出是否成功订阅主题1以及订阅的主题1名称if(mqttClient.subscribe(subTopic)){Serial.println("Subscrib Topic:");Serial.println(subTopic);} else {Serial.print("Subscribe Fail...");}  // 通过串口监视器输出是否成功订阅主题2以及订阅的主题2名称if(mqttClient.subscribe(subTopic2)){Serial.println("Subscrib Topic:");Serial.println(subTopic2);} else {Serial.print("Subscribe Fail...");}    

最后 还是感谢太极创客团队。官网[http://www.taichi-maker.com/]

学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端以及订阅主题发送主题操作相关推荐

  1. 手机端,电脑端,MQTT服务端 连接测试

    1.先下载测试软件 手机端:http://m.mdpda.com/app/apk2872929.html 电脑端:https://blog.csdn.net/qq_41204464/article/d ...

  2. android mqtt服务器搭建,Mqtt从服务端到Android客户端搭建(mqtt服务端搭建)

    一.简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议. 此处不再引入官方文字描述,以个人开发认识浅谈一下 本文分为两部分: 1. M ...

  3. 计算机管理无法连接虚拟磁盘服务,win10系统电脑打开磁盘管理出现“无法连接虚拟磁盘服务”的教程...

    有关win10系统电脑打开磁盘管理出现"无法连接虚拟磁盘服务"的操作方法想必大家有所耳闻.但是能够对win10系统电脑打开磁盘管理出现"无法连接虚拟磁盘服务"进 ...

  4. Ajax 01客户端和服务器 | jQuery中的ajax | 服务端接口

    Ajax -网络编程 客户端和服务器的基本概念 上网的目的 获取和消费(使用)资源 客户端和服务器(服务端) 客户端: 使用服务的计算机 如果一台计算机希望成为客户端,必须安装浏览器 服务端: 提供服 ...

  5. web客户端页面连接MQTT服务

    首先搭建好EMQX (MQTT)服务,在前面有说到如何搭建EMQX:MQTT本身就支持WebSocket 访问 MQTT客户端可以后端去开发也可以在页面快速做MQTT客户端 这里先展示页面如何快速做客 ...

  6. 客户端需求多变,怎么合理设计服务端API版本?

    ▲ 点击上方"分布式实验室"关注公众号 回复"1"抽取纸质技术书 笔者曾负责vivo应用商店服务器开发,有幸见证应用商店从百万日活到几千万日活的发展历程.应用商 ...

  7. 5年客户端开发的程序员如何转型服务端开发?

    最近一位老哥一直有一个困惑,为啥全网都在劝退客户端开发?作为从事客户端开发5年的老鸟,在过去的一段时间还是享受到了对应的差别福利.正如网上所说的,如果是想在十级之前压人,就选择客户端开发,想在大后期发 ...

  8. Socket通信 客户端加密数据,传递数据密文到服务端,服务端解密密文 输出明文

    server // sdf_cpp_warpper.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // server端#ifndef UNICODE # ...

  9. linux服务器和客户端配置,Linux基础教程:YUM服务端与客户端配置步骤

    服务端配置:(分两种情况,rhce无需掌握,感兴趣的话可以研究): 情况1.yum直接使用光盘(光盘仓库默认做好了)做服务端配置 方式一:直接挂载光驱使用 mkdir /mnt/dvd mount / ...

最新文章

  1. Nature撤稿!三年前微软在量子计算上的巨大胜利终究是个错误
  2. WPF 之 调用线程必须为 STA,因为许多 UI 组件都需要
  3. Hadoop sqoop数据导入导出工具安装
  4. QML中的JavaScript表达式
  5. 全系统翻译 macOS Monterey这个新功能简直了
  6. 断开式绑定ComboBox 关键命令 1201
  7. 微信今日全面开放接口
  8. 第十三章 hadoop机架感知
  9. SQL Server的还原
  10. 【证明】欧拉公式(泰勒展开)
  11. 苹果vpn是下一件大事
  12. 爱你穿越时间,两行来至秋末的眼泪
  13. C语言基础 龟兔赛跑
  14. SQLDbx工具连接Oracle数据库
  15. Esp8266(WIFI模块)刷阿里云固件
  16. SQL按姓氏笔画排序
  17. 统计信号处理基础 习题解答1-2
  18. 设计原则(3)-里氏代换原则
  19. [其他]lnmp论坛文档
  20. 基于 KU115+MPSOC 的 6U VPX 高速信号处理板(XCKU115 + ZU9EG +DSP)

热门文章

  1. php sapi zend,108 内核探索 --php扩展、zend引擎、sapi
  2. html 未读消息红点,消息未读之点不完的小红点(Node+Websocket)
  3. 求索NoSQL的现在与未来,第五届 Techo TVP 开发者峰会圆满落幕
  4. 计算机操作系统学习笔记----进程管理
  5. 【拜小白的机器学习】2-机器学习的种类与基本术语概念
  6. 我的世界服务器如何修复报错,我的世界18w30a发布_我的世界1.13版本bug修复
  7. 最后1天!生信入门转录组和可视化学习捷径
  8. Android UI 测试指南之 Espresso
  9. 如何高效使用Micropython看你喜欢看的视频?【下】(生成图片帧和WIFI传输播放)
  10. 8年测开经验面试28K公司后,吐血整理出1000道高频面试题和答案