STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云

2023-11-06

STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云

目录

一、硬件及软件准备

完整工程源码下载地址:https://download.csdn.net/download/qq_44062900/18392320

1、硬件:STM32单片机、ESP8266(ESP-12F)、DS18B20

注:ESP8266刷的固件是标准的AT指令固件,当然也可以刷MQTT透传固件,MQTT透传固件不需要我们实现MQTT协议,因为固件已经内置了MQTT协议,操作起来更加简单方便,但我们这里使用的是标准的AT指令固件,需要自己实现MQTT协议或移植MQTT协议库。有人可能会问为什么不直接刷MQTT固件实现连接阿里云呢?这里我们主要还是学习MQTT协议和MQTT协议的移植,这样的话如果设备不支持MQTT协议,但只要设备支持TCP协议就可以实现MQTT通信。

2、软件:Keil5、安信可串口调试助手、wireshark网络抓包工具、paho MQTT协议库

安信可串口调试助手下载:https://docs.ai-thinker.com/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B72
wireshark下载地址:https://www.wireshark.org/download.html
paho MQTT协议库下载:https://github.com/eclipse/paho.mqtt.embedded-c

二、 实现效果

1、 温度上传

在这里插入图片描述

2、手机APP实时查看温度数据

在这里插入图片描述

三、 MQTT协议

有关MQTT协议请查看官方中文PDF文档:http://blog.mcxiaoke.com/mqtt/protocol/MQTT-3.1.1-CN.pdf

四、 paho MQTT协议库移植

1、下载paho库

paho MQTT协议库下载:https://github.com/eclipse/paho.mqtt.embedded-c
下载完成后解压如下:
在这里插入图片描述

2、移植文件

将目录“paho.mqtt.embedded-c-1.1.0\MQTTPacket\src”下的所有.c和.h移植到自己的工程文件夹中(可以只移植部分.c,因为库里面是包含服务器和客户端的实现代码,而我们只需要用到客户端部分的代码即可)
在这里插入图片描述
然后再移植"paho.mqtt.embedded-c-1.1.0\MQTTPacket\samples"目录下的"transport.c"和"transport.h"文件,这个两个文件是用于传输报文的,需要根据自己的硬件做相应的修改
在这里插入图片描述

3、添加进工程

注意还需添加相应的头文件路径
在这里插入图片描述

4、修改transport.c和transport.h

  • transport.c
#include "transport.h"
#include "usart.h"
#include "string.h"
#include "led.h"
#include "delay.h"

void USART3_Send_Buff(unsigned char* buf, int buflen)
{
	
	while(buflen--)//字符串是否发送完成
	{
		USART3->DR = *buf;//发送一个字符
		while(!(USART3->SR & (1<<7)));//等待发送完成
		buf++;
	}
}


int transport_sendPacketBuffer( unsigned char* buf, int buflen)
{
	USART3_RX_FLAG=0;
	USART3_RX_CNT=0;
	memset((char *)USART3_RX_BUFF,0,USART_RX_MAXLEN);//清空接收缓冲区
	USART3_Send_Buff(buf,buflen);//发送数据
	return buflen;
}


int transport_getdata(unsigned char* buf, int count)
{
	u16 rx_cnt=0;
	static u16 read_count=0;
	while(!USART3_RX_FLAG && rx_cnt<=100)//等待接收响应数据报
	{
		Delay_Ms(10);
		rx_cnt++;
	}
	if(rx_cnt>100) return 1;//超时,未接收到数据
	rx_cnt=0;
	memcpy(buf,USART3_RX_BUFF+read_count,count);
	read_count+=count;//USART3_BUFF数据偏移
	if(read_count>=USART3_RX_CNT)//已经读完USART3_BUFF数据
	{
		USART3_RX_FLAG=0;
		USART3_RX_CNT=0;
		read_count=0;
	}	
	return count;
}

int transport_getdatanb(void *sck, unsigned char* buf, int count)
{
	return 0;
}

int transport_open(char* addr, int port)
{
	return 0;
}

int transport_close(int sock)
{
	return 0;
}
  • transport.h
#ifndef _TRANSPORT_H_
#define	_TRANSPORT_H_

#include "stm32f10x.h"

int transport_sendPacketBuffer(unsigned char* buf, int buflen);
int transport_getdata(unsigned char* buf, int count);
int transport_getdatanb(void *sck, unsigned char* buf, int count);
int transport_open(char* host, int port);
int transport_close(int sock);


#endif

5、编译查看工程是否存在错误

在这里插入图片描述

五、 阿里云物联网产品及设备创建

登录和创建物联网平台请查看官方文档,下面直接从控制台着手,控制台地址:https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fiot.console.aliyun.com%2F%3Fspm%3D5176.cnlinkwan.J_8058803260.641.21022d3aDlclYO&lang=en

登录后选择“公共示例”
在这里插入图片描述
点击“创建产品”
在这里插入图片描述
输入产品信息,点击“确认”即可创建产品
在这里插入图片描述
点击"前往定义物模型"
在这里插入图片描述
点击“编辑草稿”为设备添加物模型
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击“发布上线”
在这里插入图片描述

在这里插入图片描述
创建设备,该设备为ESP8266
在这里插入图片描述
选择产品,输入设备名
在这里插入图片描述
点击“一键复制设备证书”以保存设备信息
在这里插入图片描述
后面激活设备会使用到这三个信息
在这里插入图片描述
因为我们需要手机获取温度信息,所以我们使用同样的方法创建另一个设备,然后保存设备信息。具体实现手机APP如何获取温度信息见后文。
在这里插入图片描述

六、ESP8266配置

由于MQTT协议是基于TCP传输层协议之上的应用层协议,所以在使用MQTT进行通信之前首先要和服务器建立TCP连接,这样我们才能通过MQTT协议连接到阿里云物联网平台。

配置总流程:测试ESP8266>>>配置WIFI工作模式为Station(终端)或AP+Station(接入点+终端)>>>重启模块>>>关闭回显>>>连接WIFI>>>设为透传模式>>>建立TCP连接>>>开启透传>>>使用MQTT协议进行通信

注:ESP-12F的固件是标准的AT指令,在给ESP8266发送指令时,要在指令最后加上"\r\n"结束符

1、测试ESP8266模块

指令:“AT\r\n”
测试成功则返回"OK"

2、配置WIFI工作模式

指令:“AT+CWMODE=1\r\n”
配置成功则返回"OK"

3、重启WIFI模块

指令:“AT+RST\r\n”
发送指令后需等待几秒钟,等ESP8266复位完成

4、关闭回显

指令:“ATE0\r\n”
配置成功返回"OK"

5、连接WIFI

指令:“AT+CWJAP=“ssid”,“pass”\r\n”
其中ssid为WIFI名称,pass为WIFI密码
配置成功返回"OK"

6、设为透传模式

指令:“AT+CIPMODE=1\r\n”
配置成功返回"OK"

7、建立TCP连接

指令:“AT+CIPSTART=“TCP”,“ip”,port\r\n”
其中ip为服务器ip,这里为a1LuysWJE8a.iot-as-mqtt.cn-shanghai.aliyuncs.com
port为固定的1883

格式参考
在这里插入图片描述

配置成功返回"CONNECT OK "
注:当连接成功后必须10S中之内通过MQTT协议登录到阿里云物联网平台,否则服务器会主动断开。

6、开启透传
指令:“AT+CIPSEND\r\n”
当模块返回">“时,此时进入透传模式,发送的所有数据都被视为是数据,当单独发送一包数据中含有”+++"时,模块会退出透传模式

通过以上步骤后,此时可以通过MQTT协议和服务器进行通信

七、核心代码

1、 aliyun_mqtt.c

#include "aliyun_mqtt.h"
#include "MQTTPacket.h"
#include "transport.h"
#include "string.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
u8 mqtt_buf[MQTT_MAX_BUFF];
u16 rx_cnt=0;

u8 MQTT_Connect(char *client_id,char *user_name,char *password,u16 keep_alive)
{
	MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
	data.clientID.cstring =client_id;//客户端ID
	data.keepAliveInterval = keep_alive;//保活时间
	data.cleansession = 1;//清除会话
	data.username.cstring = user_name;//用户名
	data.password.cstring = password;//密码
	
	u16 send_len=MQTTSerialize_connect(mqtt_buf,MQTT_MAX_BUFF,&data);//序列化连接数据报
	transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送连接数据报
	memset(mqtt_buf,0,MQTT_MAX_BUFF);
	if (MQTTPacket_read(mqtt_buf, MQTT_MAX_BUFF, transport_getdata) == CONNACK)
	{
		unsigned char sessionPresent, connack_rc;

		if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, mqtt_buf, MQTT_MAX_BUFF) != 1 || connack_rc != 0)//反序列化CONNACK报文
		{
			return 1;//接收报文类型正确,但连接失败
		}
	}
	else return 1;//接收报文类型错误
	
	return 0;
}

void MQTT_Disconnect(void)
{
	u16 send_len=MQTTSerialize_disconnect(mqtt_buf, MQTT_MAX_BUFF);
	transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送断开连接数据报
	memset(mqtt_buf,0,MQTT_MAX_BUFF);
	send_len=MQTTSerialize_disconnect(mqtt_buf, MQTT_MAX_BUFF);
	transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送断开连接数据报
	memset(mqtt_buf,0,MQTT_MAX_BUFF);
}

u8 MQTT_Subscribe_Topic(char *sub_topic,int req_qos,int msgid)
{
	MQTTString topicString = MQTTString_initializer;
	topicString.cstring = sub_topic;
	u16 send_len = MQTTSerialize_subscribe(mqtt_buf, MQTT_MAX_BUFF, 0, msgid, 1, &topicString, &req_qos);//序列化订阅数据报
	transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送订阅数据报
	memset(mqtt_buf,0,MQTT_MAX_BUFF);
	if(MQTTPacket_read(mqtt_buf,MQTT_MAX_BUFF, transport_getdata) == SUBACK)//判断是否是SUBACK报文
	{
		unsigned short submsgid;
		int subcount;
		int granted_qos;
		u8 rc=MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, mqtt_buf, MQTT_MAX_BUFF);//反序列化SUBACK报文
		if(!rc || submsgid!=msgid || granted_qos==0x80)	return 1;接收报文类型正确,但订阅失败
	}
	else return 1;//接收报文类型错误
	
	return 0;
}

u8 MQTT_Unsubscribe_Topic(char *unsub_topic,int msgid)
{
	MQTTString topicString = MQTTString_initializer;
	topicString.cstring = unsub_topic;
	u16 send_len = MQTTSerialize_unsubscribe(mqtt_buf,MQTT_MAX_BUFF, 0, msgid,1, &topicString);//序列化取消订阅数据报
	transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送取消订阅数据报
	memset(mqtt_buf,0,MQTT_MAX_BUFF);
	if(MQTTPacket_read(mqtt_buf,MQTT_MAX_BUFF, transport_getdata) == UNSUBACK)//判断是否是UNSUBACK报文
	{
		unsigned short unsubmsgid;
		u8 rc=MQTTDeserialize_unsuback(&unsubmsgid,mqtt_buf,MQTT_MAX_BUFF);//反序列化UNSUBACK报文
		if(!rc || unsubmsgid!=msgid )	return 1;接收报文类型正确,但取消订阅失败
	}
	else return 1;//接收报文类型错误
	return 0;
}


u8 MQTT_Publish(char *pub_topic, unsigned char* payload)
{
	MQTTString topicString = MQTTString_initializer;
	topicString.cstring = pub_topic;
	u16 send_len = MQTTSerialize_publish(mqtt_buf,MQTT_MAX_BUFF,0,0,0,0,topicString, payload, strlen((const char*)payload));//序列化发布数据报
	transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送发布数据报
	memset(mqtt_buf,0,MQTT_MAX_BUFF);
	return 0;
}

u8 MQTT_Heart_Send(void)
{
	u16 send_len=MQTTSerialize_pingreq(mqtt_buf,MQTT_MAX_BUFF);
	transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送PING数据报
	memset(mqtt_buf,0,MQTT_MAX_BUFF);
	if(MQTTPacket_read(mqtt_buf,MQTT_MAX_BUFF, transport_getdata) != PINGRESP)//判断是否是PINGRESP报文
	{
		return 1;//接收报文类型错误
	}

	return 0;
}

2、aliyun_mqtt.h

#ifndef _ALIYUN_MQTT_H_
#define	_ALIYUN_MQTT_H_

#include "stm32f10x.h"

#define Aliyun_Client_ID "ESP8266|securemode=3,signmethod=hmacsha1|"
#define Aliyun_UserName	"ESP8266&a1LuysWJE8a"
#define Aliyun_password	"853545d20890aa6a55a80a7cccb3d2d41c46dcb9"

#define Aliyun_Pub_Topic "/sys/a1LuysWJE8a/ESP8266/thing/event/property/post"
#define Aliyun_Sub_Topic "/sys/a1LuysWJE8a/ESP8266/thing/service/property/set"

#define Aliyun_Server_IP "a1LuysWJE8a.iot-as-mqtt.cn-shanghai.aliyuncs.com"
#define Aliyun_Server_Port 1883

#define MQTT_MAX_BUFF 512

enum REQ_QoS
{
	REQ_QoS_0=0,
	REQ_QoS_1,
	REQ_QoS_2
};


u8 MQTT_Connect(char *client_id,char *user_name,char *password,u16 keep_alive);
void MQTT_Disconnect(void);
u8 MQTT_Subscribe_Topic(char *topic,int req_qos,int msgid);
u8 MQTT_Unsubscribe_Topic(char *topic,int msgid); 
u8 MQTT_Publish(char *pub_topic, unsigned char* payload);
u8 MQTT_Heart_Send(void);


#endif

3、main.c

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "esp8266.h"
#include <stdlib.h>
#include "oled.h"
#include "rtc.h"
#include "ds18b20.h"
#include "aliyun_mqtt.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "usart.h"

char Pub_buff[512];
u16 cnt=0;
RTC_Time SetTime;
int main(void)
{
	u8 key=0;
	Delay_Ms(1000);
	BEEP_Init();//蜂鸣器初始化
	LED_Init();//LED初始化
	KEY_Init();//按键初始化
	USARTx_Init(USART1,72,115200);//串口1初始化
	USARTx_Init(USART3,36,115200);//串口3初始化
	TIMERx_Init(TIM2,72,2000*10);//设置分频系数为72,定时10ms.分频系数7200-->100us,72-->1us
	TIMERx_Init(TIM4,72,2000*10);//设置分频系数为72,定时10ms.分频系数7200-->100us,72-->1us
	DS18B20_Init();
	ESP_UnvarnishedMode_Init("test123","12344321",Aliyun_Server_IP,Aliyun_Server_Port);
	if(MQTT_Connect(Aliyun_Client_ID,Aliyun_UserName,Aliyun_password,300))
		printf("connect failure\n");
	else printf("connect success\n");	
	
	while(1)
	{
		Delay_Ms(10);
        cnt++;
        if(cnt==300)
        {
           snprintf(Pub_buff,sizeof(Pub_buff),"{\"method\":\"thing.event.property.post\",\"id\":\"0000000002\",\"params\":{\"CurrentTemperature\":%0.2f},\"version\":\"1.0.0\"}",DS18B20_Read_Temp()*0.0625);
			MQTT_Publish(Aliyun_Pub_Topic,(unsigned char*)Pub_buff);
            cnt=0;
        }

		key=KEY_GetVal();
		if(key==2)
		{
			if(MQTT_Subscribe_Topic(Aliyun_Sub_Topic,REQ_QoS_0,1))
			{
				printf("subscribe failure\n");
			}
			else printf("subscribe success\n");
		}
		else if(key==3)
		{
			if(MQTT_Unsubscribe_Topic(Aliyun_Sub_Topic,1))
			{
				printf("unsubscribe failure\n");
			}
			else printf("unsubscribe success\n");				
		}
		else if(key==4)
		{
			snprintf(Pub_buff,sizeof(Pub_buff),"{\"method\":\"thing.event.property.post\",\"id\":\"0000000002\",\"params\":{\"CurrentTemperature\":%0.2f},\"version\":\"1.0.0\"}",DS18B20_Read_Temp()*0.0625);
			if(MQTT_Publish(Aliyun_Pub_Topic,(unsigned char*)Pub_buff))
			{
				printf("publish failure\n");
			}
			else printf("publish success\n");
		}
		else if(key==5)
		{
			if(MQTT_Heart_Send())
			{
				printf("ping failure\n");
			}
			else printf("ping success\n");	
		}

	}
}

注意:需要在aliyun_mqtt.h中替换Aliyun_Client_ID、Aliyun_UserName、Aliyun_password三个宏以及订阅和发布的Topic

  • 替换aliyun_mqtt.h中的Aliyun_Client_ID宏的值,格式如下

在这里插入图片描述

  • 替换aliyun_mqtt.h中的Aliyun_UserName宏的值,格式如下

在这里插入图片描述

  • 替换aliyun_mqtt.h中的Aliyun_password宏的值,格式如下
    clientId{DeviceName}deviceName{DeviceName}productKey{ProductKey}
    其中{DeviceName}、{ProductKey}为创建设备时生成的三元组信息
    {DeviceName}为设备名,{ProductKey}为产品秘钥

最终的Aliyun_password的值还需将上述文本进行一次hmacsha1加密
在线加密网站:http://encode.chahuo.com/
加密的密钥为设备秘钥: {DeviceSecret}

加密后的密码如下
在这里插入图片描述

复制加密后的密码到工程
在这里插入图片描述
在这里也可以使用官方的生成工具:阿里云MQTT Password生成工具,实测有效。

  • 订阅和发布的Topic查找

在这里插入图片描述
替换aliyun_mqtt.h中对应的Topic
在这里插入图片描述

八、设备上线

烧录代码后可以在控制台中看到设备已经上线
在这里插入图片描述

  • 点击“查看”,再点击“物模型数据”即可看到ESP8266上传的温度数据

在这里插入图片描述

九、手机APP获取温度数据

手机APP获取温度数据的方式是通过物联网平台中的数据流转功能,手机APP中也是采用MQTT协议连接到阿里云物联网平台的

1、数据流转

数据流转是指当前有两个设备,需要实现一个设备(手机)和另一个设备(ESP8266)之间的数据共享。则手机需要订阅“/sys/a1LuysWJE8a/Android /thing/service/property/set”这个主题,而ESP8266将温度数据发布到“/sys/a1LuysWJE8a/ESP8266/thing/event/property/post”这个主题下,然后通过数据流转功能转将ESP8266发布到主题的数据流转到手机订阅的Topic下,这样就可以实现手机获取ESP8266上传的温度数据。

2、数据流转实现

首先打开物联网控制台,操作如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
填写需要流转的数据,这里进行一下过滤,这里只要是物模型上报的数据都会被流转,而我们只需要温度物模型数据。或者不进行过滤,在手机端进行数据解析时抛弃不需要的数据即可。
在这里插入图片描述

添加要流转的操作
在这里插入图片描述
设置如下
在这里插入图片描述
点击确定后返回主界面
在这里插入图片描述
启动数据流转规则
在这里插入图片描述
启动成功后如下
在这里插入图片描述
手机客户端接收流转数据
在这里插入图片描述

十、代码调试注意事项及方法

1、设备保活

在MQTT协议中,在连接MQTT服务器时会设置一个保活时间,如果在这个保活时间内客户端没有给MQTT服务器发送数据,则MQTT服务器会主动断开连接,所以在给定的保活时间内必须发送至少一条消息到MQTT服务器,以保证持续连接。阿里云官方给出的文档中保活时间的取值范围为30~1200s,如果保活时间不在这个范围内,则MQTT服务器会拒绝连接,这个非常重要,保活时间必须在这个范围内。

2、关于串口助手无法打印接收数据中含有"0x00"数据的解决办法

在串口接收MQTT服务器返回的响应报文中会含有"0x00"的数据,而由于‘\0’对应的ASCII值为0x00,故不能使用字符串辅助函数(如printf()、strlen())对接收的数据进行处理,因为这些函数都是检测到’\0’时会结束操作,所以会造成’0x00’后面的数据都无法打印出来

建议采用wireshark抓包查看原始数据进行代码调试

如下图所示:
例如:服务器返回SUBACK报文时,通过wireshark抓包工具查看到MQTT服务器返回的SUBACK报文数据是"0x90 0x03 0x00 0x01 0x01"
在这里插入图片描述
而通过printf(“%s”)方法打印mqtt_buff里面数据时不能完全打印出来
在这里插入图片描述
如果需要打印出“0x00”及之后的数据,则可以使用以下方法打印

for(u8 i=0;i<rec_len;i++)
{
	printf("%c",mqtt_buff[i]);
}

此时可以打印出服务器返回的完整数据报文
在这里插入图片描述

3、通过wireshark网络抓包工具调试代码

通过网络抓包工具可以很清楚的看到客户端和服务器通过MQTT通信的数据报,比串口调试助手更加可靠直观,也便于学习MQTT协议。

这里我是用笔记本开热点,然后ESP8266连接这个热点,这样我们就可以抓取数据报了

使用方法:
双击活动的网卡
在这里插入图片描述
在过滤规则栏中输入"mqtt",即可过滤出使用MQTT协议通信的数据报
在这里插入图片描述
这里可以看到客户端向MQTT服务器发送的连接报文
在这里插入图片描述
服务器返回的CONNACK报文
在这里插入图片描述

十一、说明

说明:所发布工程只完成了基本的MQTT通信部分,可能会存在一些bug,如有发现可以评论或私信告诉我,其他应用功能还需要自己根据实际需要进行更改。
如教程中存在错误,欢迎在评论区指正!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云 的相关文章

  • 如何防护零日攻击

    零日攻击是什么 零日攻击 也称为零时差攻击 通常是指利用还没有被补丁的安全漏洞进行的攻击 这些漏洞在被发现后 由于各种原因 软件供应商未能及时发布补丁 使得黑客有机会利用这些漏洞进行攻击 零日攻击通常由技术高超的黑客发起 他们在对目标系统或
  • PDH光端机技术与应用:稳定可靠的数据传输解决方案

    在当今数字化 网络化日益加速的世界中 数据传输的稳定性和可靠性至关重要 PDH Plesiochronous Digital Hierarchy 准同步数字系列 光端机技术 作为早期的数字传输系统之一 虽然已被更先进的SDH Synchro
  • Metasploit安装及使用教程(非常详细)从零基础入门到精通,看完这一篇就够了。

    通过本篇文章 我们将会学习以下内容 1 在Windows上安装Metasploit 2 在Linux和MacOS上安装Metasploit 3 在Kali Linux中使用 Metasploit 4 升级Kali Linux 5 使用虚拟化
  • 我当年自学黑客(网络安全)的一些心得!(内附学习笔记)

    前 言 写这篇教程的初衷是很多朋友都想了解如何入门 转行网络安全 实现自己的 黑客梦 文章的宗旨是 1 指出一些自学的误区 2 提供客观可行的学习表 3 推荐我认为适合小白学习的资源 大佬绕道哈 文末有福利 一 自学网络安全学习的误区和陷阱
  • 一个网工(网络工程师)七年的职业血泪史....

    前言 一个工作了七年的老网工 上家公司待了五年 现在这家公司也快三年了 分享一些我自己学习网络安全路上的一些经历 也算是帮大家少走些弯路 一 如何学习网络安全 1 不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全 一般
  • 学习STM32正点原子好吗?

    今日话题 学习STM32正点原子好吗 正点原子的教程内容简单明了 代码也清晰直接 使初学者能够轻松理解其功能和使用方法 尤其对于需要快速完成大学作业等任务的大学生来说 可以直接借鉴并稍作修改 便可满足需求 正点原子提供的资料通俗易懂 适合用
  • 阿里巴巴大神发布的Java零基础笔记,实战教程多到手软,跪了

    前言 现值金九银十之际 是面试高峰季 很多学校开始校招 也是跳槽转行的最佳时机 根据数据显示 程序员是金九银十里最热门的行业 也是需求量最大的行业 但是程序员是个门槛低 但金字塔顶峰比较高的行业 意味着你的付出要比别人多才能拔尖 我们都知道
  • 物联网项目分享 Stm32单片机的音乐播放器设计 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉
  • 如何使用内网穿透实现iStoreOS软路由公网远程访问局域网电脑桌面

    文章目录 简介 一 配置远程桌面公网地址 二 家中使用永久固定地址 访问公司电脑 具体操作方法是 简介 软路由 是PC的硬件加上路由系统来实现路由器
  • 【一份老网工珍藏多年的网络配置笔记,很重要!】

    01 交换机 路由器的几种配置模式及模式转换 1 用户模式 登录到交换机 路由器 时会自动进入用户模式 提示符为 switchname gt 在该模式下只能够查看相关信息 对 IOS的运行不产生任何影响 2 特权模式 用户模式下 键入 en
  • 成为一个黑客,就按照这个路线来!

    前几天一个同学在聊天中提到毕业后想要从事网络安全方向的工作 虽然他本身也是学计算机的 但是又怕心有余而力不足 因为 从事网络安全方面的工作向来起点都比较高 大学里少有开设这类课程的 在学校能够学到的知识比较有限 网上的关于这方面课程的质量又
  • 2020年认证杯SPSSPRO杯数学建模C题(第二阶段)抗击疫情,我们能做什么全过程文档及程序

    2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情 我们能做什么 原题再现 2020 年 3 月 12 日 世界卫生组织 WHO 宣布 席卷全球的冠状病毒引发的病毒性肺炎 COVID 19 是一种大流行病 世卫组织上一次宣布大流行是在
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字 在java同步代码快中 synchronized的使用方式无非有两个 通过对一个对象进行加锁来实现同步 如下面代码 synchronized lockObject 代码 对
  • python基础语法看一篇就够了,全网最全python语法笔记汇总

    前言 Python 是一种代表简单思想的语言 其语法相对简单 很容易上手 不过 如果就此小视 Python 语法的精妙和深邃 那就大错特错了 如能在实战中融会贯通 灵活使用 必将使代码更为精炼 高效 同时也会极大提升代码B格 使之看上去更老
  • 网络安全(黑客)自学

    1 网络安全是什么 网络安全可以基于攻击和防御视角来分类 我们经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 2 网络安全市场 一 是市场需求量高 二 则是发展相对成熟入门比较容易 3 所需要的
  • 国外拨号VPS指南:开启你的全球网络之旅

    在当今数字化时代 互联网已经成为了我们生活的一部分 而要在全球范围内畅通无阻地访问互联网 拥有一个可靠的国外拨号VPS是非常重要的 无论您是为了工作 学习还是娱乐 国外拨号VPS都可以为您提供更广泛的网络体验 本文将为您提供国外拨号VPS的
  • 短信系统搭建主要因素|网页短信平台开发源码

    短信系统搭建主要因素 网页短信平台开发源码 随着移动互联网的快速发展 短信系统已成为企业和个人进行信息传递的重要工具 建立一个高效可靠的短信系统对于企业来说非常重要 下面我们将介绍一些影响短信系统搭建的主要因素 1 平台选择 在搭建短信系统
  • windows 杀死占用端口的程序

    在Windows上 你可以使用以下命令来查找并杀死占用某个端口 如9200 的程序 打开命令提示符 Command Prompt 或者PowerShell 运行以下命令来查找占用9200端口的程序的进程ID PID netstat ano
  • 静态综合实验

    1 IP地址划分 192 168 1 0 27 用于主干拆分 192 168 1 32 27 用于用户拆分 192 168 1 64 27 用于用户拆分 192 168 1 96 27 用于用户拆分 192 168 1 128 27 用于用

随机推荐

  • neo4j学习笔记

    文章目录 neo4j note 一 概述 1 链接 2 介绍 数据模型 二 使用 1 环境搭建 2 CQL 1 创建 Create 2 查询Match 3 Return 4 关系基础 创建 1 现有节点之间创建无属性的关系 2 现有节点之间
  • 哈夫曼树构造哈夫曼编码

    在传输文字时 经常要将文字转换成二进制字符串 所以我们希望编码最短 但是又想保证它的唯一性 哈夫曼树具有最小带权路径长度 用来实现编码就可以编码最短 所以用哈夫曼树来构造编码 而前缀编码就可以保证在解码的时候不会出现多种可能 就实现了唯一性
  • 第二章。c#变量和数据输入

    1 C 中常见的数据类型 1 整型 整数类型 表示整数 比如年 月 日 年龄等都是整数 整型的关键字 int 最常用的 short long 2浮点型 带小数点的数 比如身高 米 体重 100 5kg 等都是浮点数 浮点型分成两种 1 单精
  • quartz对于定时任务Misfire的处理

    使用quartz过程中 产生了很多问题 遇到就记录一下 虽然用的比较少了 但还是有一些项目在使用 问题描述 创建一个每天执行的任务test1 创建自动运行状态 然后停止任务 一直等到当天定时时间过去 然后再启动 发现定时任务还是先执行了一次
  • 在Bios中开启虚拟化设置

    1 进入BIOS 开机时按baiF2或F12或DEL或ESC等键 各电脑有所不同 2 进入duBIOS后 找到Configuration选项 选zhi择Intel Virtual Technology并回车 将光标dao移至Enabled
  • C++使用模板实现元素的反序

    实现任意类型序列中元素的反序 所涉知识点 示例代码 开发环境 运行结果 注意 所涉知识点 阅读此文需要掌握的知识点 回调函数 模板类 类模板 栈 示例代码 这里直接上代码 pragma once include
  • Qt中的并发

    QThread是一个低级 low level 类 适合用于显式地构建长期运行的线程 QtConcurrent是一个命名空间 提供了用于编写并发软件的更高层次的类和算法 该命名空间中有一个重要的类 QThreadPool 这是一个管理线程池的
  • [第四届-强网杯]:Funhash

  • C#的基本知识

    1 static修饰符 本页介绍 static 修饰符关键字 static 关键字也是 using static 指令的一部分 使用 static 修饰符可声明属于类型本身而不是属于特定对象的静态成员 static 修饰符可用于声明 sta
  • Spring中事务几个常见的问题

    首先 事务这个概念是数据库层面的 Spring只是基于数据库中的事务进行扩展 以及提供了一些能让程序员更新方便操作事务的方式 Spring如何处理事务 Spring中支持编程式事务和声明式事务管理两种方式 1 编程式事务 可以使用Trans
  • 一天内Boss转发5k次,「高性能Java:核心原理案例实战」已被封杀

    前言 市面上讲Java框架的书很多 包括SpingBoot SpringCloud Kafka等 但这些书通常只会让你技术的 量 增长 而 质 仍处于SSM的阶段 而且互联网上并没有体系化 结构化的提升技术的 质 的教材 于是团长行动了起来
  • ubuntu环境下编译内核详解

    一 下载源代码和编译软件的准备 下载内核源代码 http www kernel org 注意 点击2 6 25内核的F版 即完整版 如果你懒得去网站点联接 运行下列命令 代码 cd wget http www kernel org pub
  • c语言代码中调用系统命令行.sh shell脚本,linux shell system传参

    C语言代码中调用命令行 1 使用system 命令行 执行完命令行后 会返回原先C代码的位置 继续执行 2 如果命令行中需要传参 使用 sprintf 先处理好命令行的内容 再 system system echo 123 int a 3
  • C/C++基本数据类型所占字节数

    关于这个基本的问题 很早以前就很清楚了 C标准中并没有具体给出规定那个基本类型应该是多少字节数 而且这个也与机器 OS 编译器有关 比如同样是在32bits的操作系统系 VC 的编译器下int类型为占4个字节 而tuborC下则是2个字节
  • 文件的结构及存取方法

    文件的组织形式是文件的结构 从不同的角度分析文件有不同的结构形式 逻辑结构和物理结构 从用户角度出发 研究文件的抽象组织方式而定义的文件组织形式为文件的逻辑结构 从系统的角度出发 研究文件的物理组织方式而定义的文件组织形式为文件的物理结构
  • 【虚拟机】VMware16保姆级安装教程

    大家好 我是雷工 工作中需要用到各种各样的工控软件 有时候甚至需要不同版本的软件 但频繁装卸软件比较麻烦 而且像WinCC和博图软件对系统要求比较严格 卸载重装可能就出问题 此时就不得不重装系统 重装系统各种软件都需要重装一遍 费时费力 这
  • 七、Python基础(异常、模块、文件操作)

    七 Python基础 异常 模块 文件操作 目录 七 Python基础 异常 模块 文件操作 一 异常 1 抛出异常 2 简单的捕获异常语法 3 错误类型的捕获 4 异常捕获的完整语法 5 异常的传递 6 raise 主动抛出异常 二 模块
  • 关于面向对象中的get 和set方法的总结,为什么不用public的详解,详解。

    我们都知道去构造一个实体类的时候 标准都是去 private 一个私有变量 然后再给这个私有 变量加上 公开 get 和 set 我总是会忍不住去想一下 为什么不直接去public 变量 是为了什么 是一种标准 还是说有什么好处 发现网上确
  • 行为驱动开发(BDD)你准备好了吗?

    GitChat 作者 冰尘 原文 行为驱动开发 BDD 你准备好了吗 关注微信公众号 GitChat 技术杂谈 一本正经的讲技术 不要错过文末彩蛋 这个Chat笔者将会和大家一起探讨下面的主题 什么是行为驱动开发 BDD 为什么使用行为驱动
  • STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云

    STM32 ESP8266 ESP 12F 物联网温度计 移植paho MQTT协议连接阿里云 目录 STM32 ESP8266 ESP 12F 物联网温度计 移植paho MQTT协议连接阿里云 一 硬件及软件准备 1 硬件 STM32单