学习如何使用电脑客户端和ESP8266客户端来连接MQTT服务端以及订阅主题发送主题操作
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服务端以及订阅主题发送主题操作相关推荐
- 手机端,电脑端,MQTT服务端 连接测试
1.先下载测试软件 手机端:http://m.mdpda.com/app/apk2872929.html 电脑端:https://blog.csdn.net/qq_41204464/article/d ...
- android mqtt服务器搭建,Mqtt从服务端到Android客户端搭建(mqtt服务端搭建)
一.简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议. 此处不再引入官方文字描述,以个人开发认识浅谈一下 本文分为两部分: 1. M ...
- 计算机管理无法连接虚拟磁盘服务,win10系统电脑打开磁盘管理出现“无法连接虚拟磁盘服务”的教程...
有关win10系统电脑打开磁盘管理出现"无法连接虚拟磁盘服务"的操作方法想必大家有所耳闻.但是能够对win10系统电脑打开磁盘管理出现"无法连接虚拟磁盘服务"进 ...
- Ajax 01客户端和服务器 | jQuery中的ajax | 服务端接口
Ajax -网络编程 客户端和服务器的基本概念 上网的目的 获取和消费(使用)资源 客户端和服务器(服务端) 客户端: 使用服务的计算机 如果一台计算机希望成为客户端,必须安装浏览器 服务端: 提供服 ...
- web客户端页面连接MQTT服务
首先搭建好EMQX (MQTT)服务,在前面有说到如何搭建EMQX:MQTT本身就支持WebSocket 访问 MQTT客户端可以后端去开发也可以在页面快速做MQTT客户端 这里先展示页面如何快速做客 ...
- 客户端需求多变,怎么合理设计服务端API版本?
▲ 点击上方"分布式实验室"关注公众号 回复"1"抽取纸质技术书 笔者曾负责vivo应用商店服务器开发,有幸见证应用商店从百万日活到几千万日活的发展历程.应用商 ...
- 5年客户端开发的程序员如何转型服务端开发?
最近一位老哥一直有一个困惑,为啥全网都在劝退客户端开发?作为从事客户端开发5年的老鸟,在过去的一段时间还是享受到了对应的差别福利.正如网上所说的,如果是想在十级之前压人,就选择客户端开发,想在大后期发 ...
- Socket通信 客户端加密数据,传递数据密文到服务端,服务端解密密文 输出明文
server // sdf_cpp_warpper.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // server端#ifndef UNICODE # ...
- linux服务器和客户端配置,Linux基础教程:YUM服务端与客户端配置步骤
服务端配置:(分两种情况,rhce无需掌握,感兴趣的话可以研究): 情况1.yum直接使用光盘(光盘仓库默认做好了)做服务端配置 方式一:直接挂载光驱使用 mkdir /mnt/dvd mount / ...
最新文章
- Nature撤稿!三年前微软在量子计算上的巨大胜利终究是个错误
- WPF 之 调用线程必须为 STA,因为许多 UI 组件都需要
- Hadoop sqoop数据导入导出工具安装
- QML中的JavaScript表达式
- 全系统翻译 macOS Monterey这个新功能简直了
- 断开式绑定ComboBox 关键命令 1201
- 微信今日全面开放接口
- 第十三章 hadoop机架感知
- SQL Server的还原
- 【证明】欧拉公式(泰勒展开)
- 苹果vpn是下一件大事
- 爱你穿越时间,两行来至秋末的眼泪
- C语言基础 龟兔赛跑
- SQLDbx工具连接Oracle数据库
- Esp8266(WIFI模块)刷阿里云固件
- SQL按姓氏笔画排序
- 统计信号处理基础 习题解答1-2
- 设计原则(3)-里氏代换原则
- [其他]lnmp论坛文档
- 基于 KU115+MPSOC 的 6U VPX 高速信号处理板(XCKU115 + ZU9EG +DSP)
热门文章
- php sapi zend,108 内核探索 --php扩展、zend引擎、sapi
- html 未读消息红点,消息未读之点不完的小红点(Node+Websocket)
- 求索NoSQL的现在与未来,第五届 Techo TVP 开发者峰会圆满落幕
- 计算机操作系统学习笔记----进程管理
- 【拜小白的机器学习】2-机器学习的种类与基本术语概念
- 我的世界服务器如何修复报错,我的世界18w30a发布_我的世界1.13版本bug修复
- 最后1天!生信入门转录组和可视化学习捷径
- Android UI 测试指南之 Espresso
- 如何高效使用Micropython看你喜欢看的视频?【下】(生成图片帧和WIFI传输播放)
- 8年测开经验面试28K公司后,吐血整理出1000道高频面试题和答案