SylixOS 系统 MQTT中间件移植-程序员宅基地

技术标签: 中间件  ssl  

目  录

1. 测试目的

2. 测试工具

3. 测试平台

4. 操作系统

5. 参考资料

6. MQTT简介

6.1 MQTT开源中间件C库构建工程

MQTT开MQTT协议(低带宽)

6.2 适用范围

6.3 特点

7. 测试内容

7.1 构建工程

7.2 安装测试软件

7.2.1 Windows下安装emqx

7.2.2 Windows下安装Openssl

7.2.3 Windows下安装MQTTX

7.3 SSL/TLS 证书准备

7.3.1 生成自签名 CA 证书

7.3.2 生成服务端证书

7.3.3 生成客户端证书

7.4 SSL/TLS 双向连接的启用及验证

7.4.1 EMQX 配置

7.4.2 MQTT 连接测试

7.5 测试提前操作

1. 板子的lib目录文件如图 7-3所示:

7.6 libpaho-mqtt3c测试

7.7 libpaho-mqtt3a测试

7.8 libpaho-mqtt3as测试

7.9 libpaho-mqtt3as测试(SSL双向加密)

7.10 libpaho-mqtt3cs测试

7.11 libpaho-mqtt3cs测试(SSL双向加密)

8. 测试总结

1.测试目的

        通过测试了解SylixOS对开源MQTT协议上的C库客户端当前1.3.10版本的中间件是否完成了设计要求的相关功能,软件的性能和稳定性能否达到设计要求或者用户所需。

2.测试工具

  1. RealEvo-IDE 5.0.2版本
  2. Putty串口工具或SecureCRT远程调试工具
  3. MQTT 客户端工具 - MQTT X
  4. EMQX 服务器

3.测试平台

  1. 服务器:台式机(64 位操作系统)
  2. 客户端:ARM 4377开发板A9(32位)
  3. 客户端:ARM 3568 开发板(64位)

注:每次测试只需要一个服务器和一个客户端即可。

4.操作系统 

  1. 服务器:Windows 10 家庭版
  2. 客户端:SylixOS操作系统

5.参考资料

 6.MQTT简介

6.1MQTT开源中间件C库构建工程

        MQTT开MQTT协议(低带宽)

        MQTT (Message Queuing Telemetry Transport ),消息队列遥测传输,由IBM开发的即时通讯协议,相比来说比较适合物联网场景的通讯协议。

        MQTT协议采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与设备之间消息的转发。

        MQTT在协议设计时就考虑到不同设备的计算性能的差异,所以所有的协议都是采用二进制格式编解码,并且编解码格式都非常易于开发和实现。

        最小的数据包只有2个字节,对于低功耗低速网络也有很好的适应性。

        有非常完善的QOS机制,根据业务场景可以选择最多一次、至少一次、刚好一次三种消息送达模式。

        运行在TCP协议之上,同时支持TLS(TCP+SSL)协议,并且由于所有数据通信都经过云端,安全性得到了较好地保障。

6.2适用范围

        在低带宽、不可靠的网络下提供基于云平台的远程设备的数据传输和监控。

6.3特点

  1. 使用基于代理的发布/订阅消息模式,提供一对多的消息发布。
  2. 使用 TCP/IP 提供网络连接。
  3. 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,降低网络流量。
  4. 支持QoS,有三种消息发布服务质量:“至多一次”, “至少一次”, “只有一次”。

7.测试内容

        使用MQTT应用程序来测试Paho C客户端包含四个库是否正常运行(编译成功后可在lib_paho-mqtt-c/Debug目录下查看)

  1. libpaho-mqtt3a - asynchronous (MQTTAsync)
  2. libpaho-mqtt3as - asynchronous with SSL (MQTTAsync)测试SSL双向加密功能
  3. libpaho-mqtt3c - "classic" / synchronous (MQTTClient)
  4. libpaho-mqtt3cs - "classic" / synchronous with SSL (MQTTClient)测试SSL双向加密功能

        测试中图片会出现地址IP为192.168.1.192和192.168.9.192 ,是因为写文档时分了两次测试。用户在测试中,遇到这两个IP名,都为服务器的IP名。替换即可!!!

7.1构建工程

  1. 打开RealEvo-IDE软件,创建SylixOS Base:SylixOS Base 工程包含 SylixOS 所有内核组件源码,其包含哪些组件可在向导中配置。SylixOS Base 工程是所有项目开发的第一步,也是必须的一个步骤,后续所有工程的创建都需要指定 SylixOS Base 工程的位置。

SylixOS Base勾选组件:

libsylixosSylixOS 内核组件,SylixOS Base 工程必选;

libcexternSylixOS c 库,可选组件,一般也推荐包含在 SylixOS Base 工程中

openssl:开源 SSL 加密实现库;(MQTT库需要依赖openssl库)

创建好Base工程后,工程信息如图 7-1所示:

7-1 Base工程信息

  1. 导入MQTT库:lib_paho-mqtt-c工程,选中所创建的Base,进行编译。编译成功后在/lib_paho-mqtt-c/Debug目录下可生成一下文件如图 7-2所示

7-2 MQTT的库文件

打开虚拟机或开发板系统,直接Upload上传即可。

 7.2安装测试软件

7.2.1Windows下安装emqx

  1. 下载emqx进入官网:下载 EMQX

或者

        2.把下载的EMQX解压,得到一个emqx文件夹(解压名字不一样,可自行改为emqx。注意:解压的目录不应有中文字符,解压的目录最好是目标磁盘下的第一级文件)。

        3.Win10 系统的 【开始】 【右键】 进入win10 系统的 【Windows PowerShell(管理员)】

        4.进入 命令: cd H:\emqx\bin

cd H:\emqx\bin

  1. 在emqx目录下的bin目录中,执行命令./emqx install

./emqx install

  1. 接着启动服务器执行命令 ./emqx start (或者.\emqx start都可)

./emqx start

  1. 停止启动服务器执行命令 ./emqx stop (或者.\emqx stop都可)

./emqx stop

如果停止服务器出现下图问题,无法停止

Node '[email protected]' not responding to pings.

解决办法:移至官网下载对应版本的LICENSE

 

 

 

 

 下载后解压放进目录emqx/etc下,然后重新启动EMQ服务器。

 

 因为此时EMQX服务器正在windows电脑运行,无法关闭。所以请重启电脑,再次从第三步:进入win10 系统的 【Windows PowerShell(管理员)】对emqx服务器进行开启和关闭。

 启动后即可访问 localhost:18083 进入登入页面 默认用户名:admin,密码:public

进入

 

 此时可以用MQTTX来创建一个客户端。(注:当前网络适配器配置的ip都可当作服务端使用,包括虚拟网卡ip)。

 

连接成功可在服务器查看详细情况

7.2.2Windows下安装Openssl

  1. 下载Openssl进入官网:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

 

有4种安装包:

Win64 OpenSSL v1.1.1i Light,安装Win64 OpenSSL v1.1.1i最常用的软件包

Win64 OpenSSL v1.1.1i,安装Win64 OpenSSL v1.1.1i完整软件包

Win32 OpenSSL v1.1.1i Light,安装Win32 OpenSSL v1.1.1i最常用的软件包

Win32 OpenSSL v1.1.1i,安装Win32 OpenSSL v1.1.1i完整软件包

对下载的Win64OpenSSL-1_1_1i.exe,进行安装。

 

 一般默认安装,但安装步骤中有一步,“Select Additional Tasks”,让选择OpenSSL的dll拷贝到什么地方,如下:

 建议,不要拷贝到系统目录下,如果其他软件使用的OpenSSL版本与你安装这个版本不同,可能导致该软件无法使用。所以让这些dll待在OpenSSL安装目录下即可。

最后一步,是否捐款,如下:

 看个人情况,全取消就是不捐。

安装完毕。

安装目录下内容:

验证安装是否正确

直接在cmd中,输入命令,查看OpenSSL版本

openssl version

如果看到的并不是自己安装的1.1.1版本

 原因: 如果电脑上已经安装过其他软件,比如Git、VMware、Strawberry等,那么他们都自带了openssl,如下:

所以,当你在cmd中使用openssl命令时,可能会调用到其他版本的openssl。

解决办法: 将openssl 1.1.1i版本命令行工具路径添加到,系统变量Path第一条,以保证它首先被找到。

 

 再次验证,查看OpenSSL版本正确。

7.2.3Windows下安装MQTTX 

无脑安装即可

 

 安装完毕后可用120.25.213.14来测试MQTTX是否正常。

7.3SSL/TLS 证书准备

        在双向认证中,一般都使用自签名证书的方式来生成服务端和客户端证书,因此本文就以自签名证书为例。

        通常来说,我们需要数字证书来保证 TLS 通讯的强认证。数字证书的使用本身是一个三方协议,除了通讯双方,还有一个颁发证书的受信第三方,有时候这个受信第三方就是一个 CA。和 CA 的通讯,一般是以预先发行证书的方式进行的。也就是在开始 TLS 通讯的时候,我们需要至少有 2 个证书,一个 CA 的,一个 EMQX 的,EMQX 的证书由 CA 颁发,并用 CA 的证书验证。

        在这里,我们假设您的系统已经安装了 OpenSSL。使用 OpenSSL 附带的工具集就可以生成我们需要的证书了。

7.3.1生成自签名 CA 证书

        进入OpenSSL-Win64\bin目录中,输入cmd。

        首先,我们需要一个自签名的 CA 证书。生成这个证书需要有一个私钥为它签名,可以执行以下命令来生成私钥:

openssl genrsa -out ca.key 2048

        这个命令将生成一个密钥长度为 2048 的密钥并保存在 ca.key 中。有了这个密钥,就可以用它来生成 EMQX 的根证书了:

openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem

        根证书是整个信任链的起点,如果一个证书的每一级签发者向上一直到根证书都是可信的,那个我们就可以认为这个证书也是可信的。有了这个根证书,我们就可以用它来给其他实体签发实体证书了。

7.3.2生成服务端证书

        实体(在这里指的是 EMQX)也需要一个自己的私钥对来保证它对自己证书的控制权。生成这个密钥的过程和上面类似:

openssl genrsa -out emqx.key 2048

新建 openssl.cnf 文件,

req_distinguished_name :根据情况进行修改,

alt_names: BROKER_ADDRESS 修改为 EMQX 服务器实际的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com

        注意:IP 和 DNS 二者保留其一即可,如果已购买域名,只需保留 DNS 并修改为你所使用的域名地址。

[req]

default_bits  = 2048

distinguished_name = req_distinguished_name

req_extensions = req_ext

x509_extensions = v3_req

prompt = no

[req_distinguished_name]

countryName = CN

stateOrProvinceName = Zhejiang

localityName = Hangzhou

organizationName = EMQX

commonName = CA

[req_ext]

subjectAltName = @alt_names

[v3_req]

subjectAltName = @alt_names

[alt_names]

IP.1 = BROKER_ADDRESS

DNS.1 = BROKER_ADDRESS

        

        下图是我改的配置文件,可做参考模板。(我只用了IP地址)。

        然后以这个密钥和配置签发一个证书请求:

openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr

        然后以根证书来签发 EMQX 的实体证书:

openssl x509 -req -in ./emqx.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf

7.3.3生成客户端证书

        双向连接认证还需要创建客户端证书,首先需要创建客户端密钥:

openssl genrsa -out client.key 2048

        

        使用生成的客户端密钥来创建一个客户端请求文件:

openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=JiangSu/L=NanJing/O=EMQX/CN=client"

        最后使用先前生成好的服务端 CA 证书来给客户端签名,生成一个客户端证书:

openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem

        准备好服务端和客户端证书后,我们就可以在 EMQX 中启用 TLS/SSL 双向认证功能。

7.4SSL/TLS 双向连接的启用及验证

        在 EMQX 中 mqtt:ssl 的默认监听端口为 8883。

7.4.1EMQX 配置

        将前文中通过 OpenSSL 工具生成的 emqx.pem、emqx.key 及 ca.pem 文件拷贝到 EMQX 的 etc/certs/ 目录下,并参考如下配置修改 emqx.conf:

## listener.ssl.$name is the IP address and port that the MQTT/SSL

## Value: IP:Port | Port

listener.ssl.external = 8883

## Path to the file containing the user's private PEM-encoded key.

## Value: File

listener.ssl.external.keyfile = etc/certs/emqx.key

## 注意:如果 emqx.pem 是证书链,请确保第一个证书是服务器的证书,而不是 CA 证书。

## Path to a file containing the user certificate.

## Value: File

listener.ssl.external.certfile = etc/certs/emqx.pem

## 注意:ca.pem 用于保存服务器的中间 CA 证书和根 CA 证书。可以附加其他受信任的 CA,用来进行客户端证书验证。

## Path to the file containing PEM-encoded CA certificates. The CA certificates

## Value: File

listener.ssl.external.cacertfile = etc/certs/ca.pem

## A server only does x509-path validation in mode verify_peer,

## as it then sends a certificate request to the client (this

## message is not sent if the verify option is verify_none).

##

## Value: verify_peer | verify_none

listener.ssl.external.verify = verify_peer

## Used together with {verify, verify_peer} by an SSL server. If set to true,

## the server fails if the client does not have a certificate to send, that is,

## sends an empty certificate.

##

## Value: true | false

listener.ssl.external.fail_if_no_peer_cert = true

原本的emqx.conf文件:

 改过之后的emqx.conf文件:

         生成的所需ca.pem、emqx.key、emqx.pem在OpenSSL-Win64/bin中,将这三个文本拷贝进emqt/etc/certs中。

7.4.2MQTT 连接测试

        当配置完成并重启 EMQX 后,我们使用 MQTT 客户端工具 - MQTT X(该工具跨平台且支持 MQTT 5.0),来验证 TLS 双向认证服务是否正常运行。(MQTT X 版本要求:v1.3.2 及以上版本)。

        先将OpenSSL-Win64\bin目录中的(自签名证书中生成的) ca.pem 文件,(客户端证书)client.pem文件 和(客户端密钥 )client.key 文件拷贝到emqt/etc/certs中。

 

        参照下图在 MQTT X 中创建 MQTT 客户端(Host 输入框里的 192.168.7.192 需替换为实际的 EMQX 服务器 IP)。

 

        此时 Certificate 一栏需要选择 Self signed ,并携带自签名证书中生成的 ca.pem 文件, 客户端证书 client.pem 和客户端密钥 client.key 文件。

        点击 Connect 按钮,连接成功后,如果能正常执行 MQTT 发布/订阅 操作,则 SSL 双向连接认证配置成功。

7.5测试提前操作

开发板中所上传的库,每个动态库的名字需要另外用shell命令来cp成后缀加.1.(如cp libpaho-mqtt3a.so libpaho-mqtt3a.so.1)。移植Linux中这几个库带有软链接,在SylixOS中需要手动添加。

  1. 板子的lib目录文件如图 7-3所示:

图 7-3 板子的lib目录mqtt库

        2.如要测MQTTS的SSL双向加密功能,App应用程序文件,将OpenSSL-Win64\bin目录中的(自签名证书中生成的) ca.pem 文件,(客户端证书)client.pem文件 和(客户端密钥 )client.key 文件也上传到apps目录下。如图 7-4所示:

7-4 板子的apps目录 mqtt 测试程序

        3.在每个测试应用程序中需要手动根据自己的电脑进行配置服务器IP,端口号。服务器IP和端口号需要与MQTTX桌面客户端工具中的服务器IP,端口号一致。(测试电脑IP为192.168.1.192),测试代码中的服务器IP宏和MQTTX软件配置信息如图 7-5 所示:

 图 7-5 测试代码中的服务器IP宏和MQTTX软件配置信息

7.6libpaho-mqtt3c测试

  1. 测试目的 

        测试libpaho-mqtt3c的功能是否正常。

  1. 测试方法

        使用MQTTClient_publish.c、MQTTClient_subscribe.c 和 MQTTClient_publish_async.c:MQTT客户端简单代码示例,测试libpaho-mqtt3c的功能是否正常。

  1. 测试步骤
  1. 使用编译出的libpaho-mqtt3c 库文件和自带的测试程序MQTTClient_publish.c、MQTTClient_subscribe.c 和 MQTTClient_publish_async.c上传到开发板的 SylixOS 系统上,进行测试
  2. 打开电脑端的MQTTX服务器,如果开发板的网卡地址为:192.168.1.236,在Win10电脑上分配一个同网段的IP地址为:192.168.1.192。保持能够互相ping通,如图 7-6所示:

ifconfig en1 inet 192.168.1.236    //设置 IP 地址

ifconfig en1 gateway 192.168.1.1  //设置网关

 图 7-6 开发板和电脑同网段

        3.此时测试代码的服务器地址应该配置为:#define ADDRESS  "tcp://192.168.1.192:1883",服务器地址为192.168.1.192,端口号为1883,最后点击Connect即可,配置服务器信息如图 7-7所示。

 

7-7 MQTTX服务器配置

        4. 执行测试指令,先执行MQTTClient_subscribe订阅,再执行MQTTClient_publish和MQTTClient_publish_async发布,此时需要打开两个终端,观察分析输出测试结果图 7-8所示。

终端1输入shell命令:./MQTTClient_subscribe  //订阅

终端2输入shell命令:./MQTTClient_publish    //发布

 图 7-8 输出测试结果

        5.测试结果

        测试MQTTClient_publish和 MQTTClient_publish_async发布,MQTTClient_subscribe订阅都能够收到消息,测试成功,libpaho-mqtt3c的功能正常。

7.7 libpaho-mqtt3a测试

  1. 测试目的 

测试libpaho-mqtt3a的功能是否正常。

        2.测试方法

使用MQTTAsync_publish.c、MQTTAsync_subscribe.c :MQTT异步简单代码示例,测试libpaho-mqtt3a的功能是否正常。

        3.测试步骤

        1 )  使用编译出的libpaho-mqtt3a库文件和自带的测试程序MQTTAsync_publish.c、MQTTAsync_subscribe.c 上传到开发板的 SylixOS 系统上,进行测试

        2 )  执行测试指令,先执行MQTTAsync_subscribe订阅,再执行MQTTAsync_publish发布,观察分析输出测试结果图 7-9所示。

终端1输入shell命令:./MQTTAsync_subscribe  //订阅

终端2输入shell命令:./MQTTAsync_publish    //发布

7-9 输出测试结果

        4.测试结果

        测试MQTTAsync_publish发布,MQTTAsync_subscribe订阅都能够收到消息,测试成功,libpaho-mqtt3a的功能正常。

7.8libpaho-mqtt3as测试

  1. 测试目的 

        测试libpaho-mqtt3as的功能是否正常。

        2.测试方法

        使用paho_c_pub.c、paho_c_sub.c和pubsub_opts.c :MQTT异步简单代码示例,测试libpaho-mqtt3as的功能是否正常。

        3.测试步骤

        1 )  使用编译出的libpaho-mqtt3as库文件和自带的测试程序paho_c_pub.c、paho_c_sub.c上传到开发板的 SylixOS 系统上,进行测试

        2 )  执行测试指令,先执行paho_c_sub订阅,再执行paho_c_pub发布,在发布端可随意输入想要发布的信息。观察分析输出测试结果图 7-10所示。

终端1输入shell命令:./paho_c_sub -t topic -c "tcp://192.168.7.192:8883"  //订阅

终端2输入shell命令:./paho_c_pub -t topic -c "tcp://192.168.7.192:8883"  //发布

7-10 输出测试结果

        4.测试结果

        测试paho_c_pub连续发布,paho_c_sub订阅能够连续接收消息,测试成功,libpaho-mqtt3as的功能正常。

7.9libpaho-mqtt3as测试(SSL双向加密)

  1. 测试目的 

        测试libpaho-mqtt3as的ssl加密功能是否正常。

        2.测试方法

        使用paho_c_pub.c、paho_c_sub.c和pubsub_opts.c :MQTT异步简单代码示例,测试libpaho-mqtt3as的功能是否正常。

        3.测试步骤

        1 )  使用编译出的libpaho-mqtt3as库文件和自带的测试程序paho_c_pub.c、paho_c_sub.c上传到开发板的 SylixOS 系统上,进行测试

        2 )  执行测试指令,先执行paho_c_sub订阅,再执行paho_c_pub发布,在发布端可随意输入想要发布的信息。观察分析输出测试结果图 7-10所示。

终端1输入shell命令:./paho_cs_sub -t topic -c "ssl://192.168.7.192:8883"  //订阅

终端2输入shell命令:./paho_cs_pub -t topic -c "ssl://192.168.7.192:8883"  //发布

 

 

7-10 输出测试结果

        4.测试结果

        测试paho_c_pub连续发布,paho_c_sub订阅能够连续接收消息,测试成功,libpaho-mqtt3as的SSL加密功能正常。

7.10libpaho-mqtt3cs测试

  1. 测试目的 

        测试libpaho-mqtt3cs的功能是否正常。

        2.测试方法

        使用paho_cs_pub.c、paho_cs_sub.c和pubsub_opts.c :MQTT异步简单代码示例,测试libpaho-mqtt3cs的功能是否正常。

        3.测试步骤

        1 )  使用编译出的libpaho-mqtt3cs库文件和自带的测试程序paho_cs_pub.c、paho_cs_sub.c上传到开发板的 SylixOS 系统上,进行测试

        2 )  执行测试指令,先执行paho_cs_sub订阅,再执行paho_cs_pub发布,在发布端可随意输入想要发布的信息。观察分析输出测试结果图 7-11所示。

终端1输入shell命令:./paho_cs_sub -t topic -c "ssl://192.168.7.192:8883"  //订阅

终端2输入shell命令:./paho_cs_pub -t topic -c "ssl://192.168.7.192:8883"  //发布

7-11 输出测试结果

        4.测试结果

        测试paho_cs_pub连续发布,paho_cs_sub订阅能够连续接收消息,测试成功,libpaho-mqtt3cs的功能正常。

7.11libpaho-mqtt3cs测试SSL双向加密

  1. 测试目的 

        测试libpaho-mqtt3cs的ssl加密功能是否正常。

        2.测试方法

        使用paho_cs_pub.c、paho_cs_sub.c和pubsub_opts.c :MQTT异步简单代码示例,测试libpaho-mqtt3cs的功能是否正常。

        3.测试步骤

        1 )  使用编译出的libpaho-mqtt3cs库文件和自带的测试程序paho_cs_pub.c、paho_cs_sub.c上传到开发板的 SylixOS 系统上,进行测试

        2 )  执行测试指令,先执行paho_cs_sub订阅,再执行paho_cs_pub发布,在发布端可随意输入想要发布的信息。观察分析输出测试结果图 7-11所示。

终端1输入shell命令:./paho_cs_sub -t topic -c "ssl://192.168.7.192:8883"  //订阅

终端2输入shell命令:./paho_cs_pub -t topic -c "ssl://192.168.7.192:8883"  //发布

 

 

7-11 输出测试结果

        4.测试结果

        测试paho_cs_pub连续发布,paho_cs_sub订阅能够连续接收消息,测试成功,libpaho-mqtt3cs的ssl加密功能正常。

8.测试总结

        1. lib_paho-mqtt-c 在翼辉信息的  RealEvo-IDE 5.0.2 软件中可以编译成功生成库工程。

        2. 在 SylixOS 32/64位操作系统中,均可以完成消息传递的且正确无误。

        3.本次测试是在32位虚拟机和64位虚拟机测试的。详情配置可参考《RealEvo-Simulator使用手册》。

 

注意在a9的板子上需要加上这段代码:

否则会出现

 的问题。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Win_czl/article/details/130885445

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签