STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台
STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台
实验使用资源:正点原子F407
USART1:PA9P、A10(串口打印调试)
USART3:PB10、PB11(WiFi模块)
DHT11:PG9(采集数据、上报)
LED0、1:PF9、PF10(根据收到的命令,控制亮灭)
显示屏(可有可无)
0 前置内容准备
以下内容请参考之前写过的博客
- HAL库创建工程【STM32CubeMX安装_stm32cubemx下载-CSDN博客】
- ESP8266固件烧录【ESP8266烧录AT指令】
1 华为云物联网平台创建产品
1.1新建产品
- 在华为云设备接入IoTDA平台,点击左上角的【创建产品】,参考下图填写产品信息。
- 创建完成后进入创建的产品,进行产品模型设置。首先先创建一个服务,服务ID自己根据实际写。
- 点击【新增属性】,根据实际需求,添加需要交互的数据及其类型和访问方式。
- 点击【添加命令】,进行指令的设置,【下发参数】就是下发指令控制设备,【响应参数】就是读取设备上传信息。
1.2 新建设备
在【所有设备】界面,点击的【注册设备】添加设备
1.3 获取MQTT三元素
在新创建的设备中,点击查看MQTT连接参数,即可获取三元素
1.4 获取订阅Topic
在之前创建的产品中,Topic管理里面包含我们需要订阅的Topic
2 usart模块
- 将【stm32f1xx_it.c】里面的
void USART1_IRQHandler(void)
和void USART3_IRQHandler(void)
函数注释掉
- 将下面的代码粘贴到【usart.c】中的最下面的
/* USER CODE BEGIN 1 */
和/* USER CODE END 1 */
之间
/*** @brief ATK-MW8266D UART printf* @param fmt: 待打印的数据* @retval 无*/
void atk_mw8266d_uart_printf(char *fmt, ...)
{va_list ap;uint16_t len;va_start(ap, fmt);vsprintf((char *)g_uart_tx_buf, fmt, ap);va_end(ap);len = strlen((const char *)g_uart_tx_buf);HAL_UART_Transmit(&huart3, g_uart_tx_buf, len, HAL_MAX_DELAY);
}/*** @brief ATK-MW8266D UART重新开始接收数据* @param 无* @retval 无*/
void atk_mw8266d_uart_rx_restart(void)
{g_uart_rx_frame.sta.len = 0;g_uart_rx_frame.sta.finsh = 0;
}/*** @brief 获取ATK-MW8266D UART接收到的一帧数据* @param 无* @retval NULL: 未接收到一帧数据* 其他: 接收到的一帧数据*/
uint8_t *atk_mw8266d_uart_rx_get_frame(void)
{if (g_uart_rx_frame.sta.finsh == 1){g_uart_rx_frame.buf[g_uart_rx_frame.sta.len] = '\0';return g_uart_rx_frame.buf;}else{return NULL;}
}/*** @brief 获取ATK-MW8266D UART接收到的一帧数据的长度* @param 无* @retval 0 : 未接收到一帧数据* 其他: 接收到的一帧数据的长度*/
uint16_t atk_mw8266d_uart_rx_get_frame_len(void)
{if (g_uart_rx_frame.sta.finsh == 1){return g_uart_rx_frame.sta.len;}else{return 0;}
}void USART1_IRQHandler(void)
{
#if SYS_SUPPORT_OS /* 使用OS */OSIntEnter();
#endifHAL_UART_IRQHandler(&huart1); /* 调用HAL库中断处理公用函数 */while (HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE) != HAL_OK) /* 重新开启中断并接收数据 */{/* 如果出错会卡死在这里 */}#if SYS_SUPPORT_OS /* 使用OS */OSIntExit();
#endif
}void USART3_IRQHandler(void)
{/* USER CODE BEGIN USART3_IRQn 0 *//* USER CODE END USART3_IRQn 0 */HAL_UART_IRQHandler(&huart3);/* USER CODE BEGIN USART3_IRQn 1 */uint8_t tmp;if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_ORE) != RESET) /* UART接收过载错误中断 */{__HAL_UART_CLEAR_OREFLAG(&huart3); /* 清除接收过载错误中断标志 */(void)huart3.Instance->SR; /* 先读SR寄存器,再读DR寄存器 */(void)huart3.Instance->DR;}if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) != RESET) /* UART接收中断 */{HAL_UART_Receive(&huart3, &tmp, 1, HAL_MAX_DELAY); /* UART接收数据 */if (g_uart_rx_frame.sta.len < (256 - 1)) /* 判断UART接收缓冲是否溢出* 留出一位给结束符'\0'*/{g_uart_rx_frame.buf[g_uart_rx_frame.sta.len] = tmp; /* 将接收到的数据写入缓冲 */g_uart_rx_frame.sta.len++; /* 更新接收到的数据长度 */}else /* UART接收缓冲溢出 */{g_uart_rx_frame.sta.len = 0; /* 覆盖之前收到的数据 */g_uart_rx_frame.buf[g_uart_rx_frame.sta.len] = tmp; /* 将接收到的数据写入缓冲 */g_uart_rx_frame.sta.len++; /* 更新接收到的数据长度 */}}if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE) != RESET) /* UART总线空闲中断 */{g_uart_rx_frame.sta.finsh = 1; /* 标记帧接收完成 */__HAL_UART_CLEAR_IDLEFLAG(&huart3); /* 清除UART总线空闲中断 */}/* USER CODE END USART3_IRQn 1 */
}
- 在【usart.c】上面的的
/* USER CODE BEGIN 0 */
和/* USER CODE END 0 */
之间加入下面的代码
#include <stdarg.h>
#include <stdio.h>
#include <string.h>#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle; }; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{ while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (uint8_t) ch; return ch;
}
#endif uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL库使用的串口接收缓冲 */
- 在【usart.c】中的
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
函数中调整中断优先级,WiFi的usart3的高于串口的,同时添加usar使能
- 在【usart.h】中的
/* USER CODE BEGIN Private defines */
和/* USER CODE END Private defines */
之间加入下面的代码
static struct
{uint8_t buf[256]; /* 帧接收缓冲 */struct{uint16_t len : 15; /* 帧接收长度,sta[14:0] */uint16_t finsh : 1; /* 帧接收完成标志,sta[15] */} sta; /* 帧状态信息 */
} g_uart_rx_frame = {0}; /* ATK-MW8266D UART接收帧缓冲信息结构体 */
static uint8_t g_uart_tx_buf[1024]; /* ATK-MW8266D UART发送缓冲 */
#define RXBUFFERSIZE 1 /* 缓存大小 */
- 在【usart.h】中的
/* USER CODE BEGIN Prototypes */
和/* USER CODE END Prototypes */
之间加入下面的代码
void atk_mw8266d_uart_printf(char *fmt, ...); /* ATK-MW8266D UART printf */
void atk_mw8266d_uart_rx_restart(void); /* ATK-MW8266D UART重新开始接收数据 */
uint8_t *atk_mw8266d_uart_rx_get_frame(void); /* 获取ATK-MW8266D UART接收到的一帧数据 */
uint16_t atk_mw8266d_uart_rx_get_frame_len(void); /* 获取ATK-MW8266D UART接收到的一帧数据的长度 */
3 WiFi模块
将提前编写好的esp8266.c/.h
文件分别加入Src和Inc文件夹,然后再在keil里将esp8266.c
文件加入工程。
4 CJSON模块移植
移植过程查看之前写的另一篇博客【CJSON模块】
5 WIFI连接华为云
- 创建wifi_HW.c/.h文件。
- 在wifi_HW.h中宏定义连接华为云相关参数。
// Wi-Fi用户名和密码
#define WIFI_User "***" // Wi-Fi网络名称
#define WIFI_Pass "***" // Wi-Fi网络密码// ESP8266设备在华为云IoT平台的认证信息
#define ESP8266_UserName "***" // 用户名,通常为设备ID
#define ESP8266_PassWord "***" // 密码或密钥
#define ESP8266_ClientID "***" // MQTT客户端ID
#define ESP8266_Domain_Name "***" // 华为云IoT平台的域名
#define ESP8266_Port 1883 // MQTT服务端口
#define ESP8266_Reconnect 1 // 是否允许设备在断开连接后尝试重新连接// 华为云MQTT服务相关设置
#define HUAWEI_MQTT_ServiceID "***" // 服务ID
#define HUAWEI_MQTT_DeviceID "***" // 设备ID
#define HUAWEI_MQTT_commands "$oc/devices/***/sys/commands/#" // 命令订阅主题
#define HUAWEI_MQTT_commands_response "$oc/devices/***/sys/commands/response/request_id=" // 命令响应主题
#define HUAWEI_MQTT_report "$oc/devices/***/sys/properties/report" // 属性上报主题
- 编写wifi_HW.c文件,调用esp8266.c中编写的函数连接华为云,然后将该函数名加入wifi_HW.h中。
void wifi_init(void){uint8_t ret = 0;ret = ESP8266_Reset();printf("1: %d\r\n",ret);ret = ESP8266_ATE(0);printf("2: %d\r\n",ret);ret = ESP8066_Mode(1);printf("3: %d\r\n",ret);ret = ESP8266_WiFi(WIFI_User, WIFI_Pass);printf("4: %d\r\n",ret);ret = ESP8266_MQTTUSERCFG(ESP8266_UserName, ESP8266_PassWord);printf("5: %d\r\n",ret);ret = ESP8266_MQTTCLIENTID(ESP8266_ClientID);printf("6: %d\r\n",ret);ret = ESP8266_MQTTCONN(ESP8266_Domain_Name,ESP8266_Port,ESP8266_Reconnect);printf("7: %d\r\n",ret);ret = ESP8266_MQTTSUB(HUAWEI_MQTT_commands);printf("8: %d\r\n",ret);
}
6 数据交互
6.1 设备属性上报
参考华为云官方给出的MQTT属性上报样例,在wifi_HW.c中编写report_Json
函数,使用cJSON模块封装传感器数据,然后将其发送到云平台。
可以看出该消息的JSON格式:
(1) 在根对象中,有一个名为services的键,其值是一个数组。
(2) 在services数组中,有一个服务对象,它包含两个键:service_id和properties
(3) 在properties对象中,存放的键值对就是在产品中创建的属性。
根据这种格式,在report_Json
函数中封装JSON消息
void report_Json(uint8_t temperature, uint8_t humidity,uint8_t adcx){uint8_t cmd[1024]; // 用于存储构建的AT命令char *str = NULL; // 指向JSON字符串的指针int i = 0; // 循环迭代变量uint8_t params_buf[1024]; // 用于存储处理过的JSON字符串uint16_t move_num = 0; // 用于记录字符串处理过程中的移动次数cJSON *json = cJSON_CreateObject(); // 创建一个空的JSON对象cJSON *properties_cjson = cJSON_CreateObject(); // 创建一个空的子JSON对象,用于存储属性cJSON *service = cJSON_CreateObject(); // 创建一个空的子JSON对象,用于存储服务信息cJSON *services_array = cJSON_CreateArray(); // 创建一个空的JSON数组,用于存储服务数组// 向属性对象中添加温度、湿度和光照强度数据cJSON_AddNumberToObject(properties_cjson, "temperature", temperature);cJSON_AddNumberToObject(properties_cjson, "humidity", humidity);cJSON_AddNumberToObject(properties_cjson, "light", adcx);// 向服务对象中添加服务ID和属性cJSON_AddStringToObject(service, "service_id", "yun");cJSON_AddItemToObject(service, "properties", properties_cjson);cJSON_AddItemToObject(json, "services", services_array);// 将服务数组添加到JSON对象中cJSON_AddItemToArray(services_array, service);// 将JSON对象转换为无格式的字符串str = cJSON_PrintUnformatted(json);// 打印JSON格式的字符串//printf("json格式 = %s\r\n", str);// 为MQTT发布添加转义字符for(i = 0; *str != '\0'; i++){params_buf[i] = *str;// 如果下一个字符是引号或逗号,添加转义字符if(*(str + 1) == '"' || *(str + 1) == ','){params_buf[++i] = '\\';}str++;move_num++;}str = str - move_num; // 回退指针到JSON字符串的开始// 打印处理过的JSON字符串//printf("params_buf = %s\r\n", params_buf);// 构建AT命令sprintf((char *)cmd,"AT+MQTTPUB=0,\""HUAWEI_MQTT_report"\",\"%s\",0,0\r\n",params_buf);// 打印即将发送的AT命令//printf("开始发送数据:%s", cmd);// 发送AT命令并通过ESP8266模块ESP8266_Sent_AT(cmd, "OK", 500);// 清理JSON对象占用的内存cJSON_Delete(json);// 如果分配了额外的字符串空间,释放它if(str != NULL){free(str);str = NULL;//printf("释放str空间成功\r\n");}
}
6.2 云端命令下发
参考华为云官方给出的MQTT下行请求样例,在wifi_HW.c中编写rcv_json函数,解析云平台下发的JSON消息字符串,如果成功接收后,需要给云平台返回接收成功的消息命令。
从给出的样例中可以看出,下发的指令在paras键所对应的JSON值中,只需分析其中的键的名字,然后读取相匹配的键的值,即可获取下发的命令。
参考下图响应参数的格式,可知响应参数只需发送订阅的topic和下发命令中的request_id的值即可,后面的JSON消息体均可省略。
void rcv_json(void){uint8_t *ret = NULL; // 用于存储接收到的数据帧cJSON *cjson = NULL; // 用于存储解析后的JSON对象char topic_buff[1024]; // 用于存储MQTT主题int num; // 用于存储接收数据的数量char recv_buffer[1024]; // 用于存储接收到的JSON数据char request_id[37];char device_id[256];uint8_t cmd[1024]; // 用于存储构建的AT命令ret = atk_mw8266d_uart_rx_get_frame(); // 获取UART接收到的数据帧atk_mw8266d_uart_rx_restart(); // 重启UART接收char *ptr_recv = strstr((const char *)ret,"+MQTTSUBRECV"); // 检查是否包含MQTT订阅数据标志if(ptr_recv!=NULL){ // 如果是MQTT订阅数据memset(device_id,0,sizeof(device_id)); memset(request_id,0,sizeof(request_id)); sscanf((char *)ret, "+MQTTSUBRECV:0,\"$oc/devices/%255[^/]/sys/commands/request_id=%36s\",%d,%255s", device_id, request_id, &num, recv_buffer);//printf("判断DeviceID: %s\r\n",device_id);// printf("接收数据成功,开始解析 %s\r\n",recv_buffer);//判断DeviceIDif(strstr(device_id,HUAWEI_MQTT_DeviceID)) {// printf("接收数据成功,开始解析 %s\r\n",recv_buffer);cjson = cJSON_Parse(recv_buffer); // 解析JSON数据}if(cjson==NULL) // 如果JSON解析失败printf("cjson 解析错误\r\n"); // 打印错误信息else{cJSON *json_data = cJSON_GetObjectItem(cjson,"paras"); // 获取JSON对象中的paras项if(json_data==NULL){ printf("cjson 没有数据\r\n"); // 打印错误信息return;}else{// printf("cjson 内存大小为 = %d\r\n",sizeof(cjson)); // 打印JSON对象的内存大小// 解析数据if(cJSON_GetObjectItem(json_data,"led_flag")!=NULL) {LED_Switch = cJSON_GetObjectItem(json_data,"led_flag")->valueint; printf("csjon解析成功 LED_Switch = %d\r\n",LED_Switch); }if(cJSON_GetObjectItem(json_data,"temp_flag")!=NULL) {temp_LED_Switch = cJSON_GetObjectItem(json_data,"temp_flag")->valueint; printf("csjon解析成功 temp_LED_Switch = %d\r\n",temp_LED_Switch);}char full_topic[256]; snprintf(full_topic, sizeof(full_topic), "%s%s", HUAWEI_MQTT_commands_response, request_id);sprintf((char *)cmd, "AT+MQTTPUB=0,\"%s\",\"\",0,0\r\n", full_topic);ESP8266_Sent_AT(cmd, "OK", 500);}cJSON_Delete(cjson); // 删除JSON对象,释放内存//cJSON_Delete(json_data);}}
}
7 微信小程序连接华为云
7.1 开发方式
- 使用微信开发工具创建微信小程序项目
- 微信小程序调用应用侧API,获取云平台数据
- 将获得的数据进行显示
7.2 微信小程序创建
【略…】
7.3 创建IAM账户(云平台)
- 统一身份认证(Identity and Access Management,简称IAM)是华为云提供权限管理的基础服务,可以安全地控制云服务和资源的访问权限。应用侧需要通过IAM服务鉴权,获取token。因此在开发之前需要先创建IAM用户。
- 在【统一身份认证服务】页面,点击【创建用户】,参考下图创建账号,里面填写的自定义密码需要记住,然后将其加入【admin】用户组。
- 创建成功后,退出登录华为云,使用IAM账号登录华为云,验证是否成功。
7.3 获取Token(小程序)
- 参考华为云提供的请求示例,发送获取Token的http请求消息
- 华为云认证通过后向应用服务器返回鉴权令牌
X-Subject-Token
,接口返回的响应消息头中X-Subject-Token
就是需要获取的用户Token。根据上述示例,在微信开发工具中,使用wx.request
发送请求,然后分析响应消息头,获取Token。
gettoken(){var that=this; wx.request({url: 'https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens',data:'{"auth": { "identity": {"methods": ["password"],"password": {"user": {"name": "***","password": "***","domain": {"name": "***"}}}},"scope": {"project": {"name": "cn-north-4"}}}}',method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECTheader: {'content-type': 'application/json' }, // 请求的 header success: function(res){// successvar token='';token=JSON.stringify(res.header['X-Subject-Token']);//解析消息头的tokentoken=token.replaceAll("\"", "");wx.setStorageSync('token',token);},});
}
- 获取Token后,再调用其他接口时,需要在请求消息头中添加
X-Auth-Token
,其值为获取到的Token。例如Token值为“ABCDEFJ…”,则调用接口时将“X-Auth-Token: ABCDEFJ…”加到请求消息头即可,如下所示。
7.4 获取设备影子(小程序)
- 参考请求示例,发送请求获取设备影子数据。
- 查看返回的HTTP响应消息,查看所需要的数据所在位置,如下图所示,可以发现我们需要的数据在data里面的shadow[0]中的reported下的properties里面。
- 根据分析的结果,在微信开发工具中编写代码,获取数据。
getinfo(){var that = thisvar token = wx.getStorageSync('token');//读缓存中保存的tokenwx.request({url: 'https://653a151f50.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/661f377e2ccc1a583881a678/devices/661f377e2ccc1a583881a678_yun_dht11/shadow',data:'',method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECTheader: {'content-type': 'application/json','X-Auth-Token':token },success: function (res) {that.setData({humi:res.data.shadow[0].reported.properties.humidity,temp:res.data.shadow[0].reported.properties.temperature,light:res.data.shadow[0].reported.properties.light})}});
}
7.5 下发设备命令(小程序)
参考请求示例,在微信开发工具中编写代码下发命令。
if(that.data.lset > that.data.light){wx.request({url: 'https://653a151f50.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/661f377e2ccc1a583881a678/devices/661f377e2ccc1a583881a678_yun_dht11/commands',data:'{"service_id": "yun","command_name": "led","paras": {"led_flag": true}}',method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECTheader: {'content-type': 'application/json','X-Auth-Token':token }, //请求的header success: function(res){console.log("下发命令成功");//打印完整消息}, });
}
8 小程序界面设计
8.1 主页数据显示
在wxml中设置布局,在wxss中设置样式,如下图所示。
8.2 Echarts数据可视化
ECharts一个使用JavaScript实现的开源可视化库。ECharts提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还有用于BI的漏斗图,仪表盘,并且支持图与图之间的混搭。
微信小程序使用Echarts进行可视化的步骤如下所示。
- 将Echarts下载到本地,并放入的微信小程序工程文件夹中,如下图所示。
- 在lineset.json中引入ec-canvas组件,如下图所示。
-
参考官网给出的折线图堆叠示例,编写该图像的显示函数function line_set(chart,time_data,hum_data,tem_data,ligh_data)。
-
初始化图表,同时调用line_set函数显示。
init_chart: function (time_data,hum_data,tem_data,ligh_data) { this.oneComponent.init((canvas, width, height, dpr) => {const chart = echarts.init(canvas, null, {width: width,height: height,devicePixelRatio: dpr });line_set(chart,time_data,hum_data,tem_data,ligh_data)this.chart = chart;return chart;});
}
- 将获得的影子设备的数据存入数组中,然后将其传入init_chart(date,humi,temp,ligh)中,进行数据实时可视化显示。
temp = that.data.Temperature;
humi = that.data.Humidity;
ligh = that.data.Light;
date = that.data.Time;
temp.push(res.data.shadow[0].reported.properties.temperature);
humi.push(res.data.shadow[0].reported.properties.humidity);
ligh.push(res.data.shadow[0].reported.properties.light);
date.push(formattedTime);
if (temp.length > 7) {temp.shift(); // 移除数组的第一个元素humi.shift();ligh.shift();date.shift();
}
32工程源码(CSDN):【免费】STM32HAL库+ESP8266+cJSON+微信小程序-连接华为云物联网平台.zip资源-CSDN文库
微信小程序源码(CSDN):【免费】STM32HAL库+ESP8266+cJSON+微信小程序-连接华为云物联网平台(微信小程序侧)资源-CSDN文库
32工程+微信小程序源码(GitHub):STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台
相关文章:
![](https://i-blog.csdnimg.cn/direct/7d4c7c1a25a64c66b13fccf10272a346.png)
STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台
STM32HAL库ESP8266cJSON微信小程序_连接华为云物联网平台 实验使用资源:正点原子F407 USART1:PA9P、A10(串口打印调试) USART3:PB10、PB11(WiFi模块) DHT11:PG9(采集数据…...
![](https://www.ngui.cc/images/no-images.jpg)
debian或Ubuntu中开启ssh允许root远程ssh登录的方法
debian或Ubuntu中开启ssh允许root远程ssh登录的方法 前因: 因开发需要,需要设置开发板的ssh远程连接。 操作步骤如下: 安装openssh-server sudo apt install openssh-server设置root用户密码: sudo passwd root允许root用户…...
![](https://www.ngui.cc/images/no-images.jpg)
C++《日期》实现
C《日期》实现 头文件实现文件 头文件 在该文件中是为了声明函数和定义类成员 using namespace std; class Date {friend ostream& operator<<(ostream& out, const Date& d);//友元friend istream& operator>>(istream& cin, Date& d);//…...
![](https://www.ngui.cc/images/no-images.jpg)
【面试题】MySQL(第三篇)
目录 1. MySQL中如何处理死锁? 2. MySQL中的主从复制是如何实现的? 3. MySQL中的慢查询日志是什么?如何使用它来优化性能? 4.存储过程 一、定义与基本概念 二、特点与优势 三、类型与分类 四、创建与执行 五、示例 六、总…...
![](https://i-blog.csdnimg.cn/direct/a0abdca6f02347d592267bf677e4d522.png)
tensorflow之欠拟合与过拟合,正则化缓解
过拟合泛化性弱 欠拟合解决方法: 增加输入特征项 增加网络参数 减少正则化参数 过拟合的解决方法: 数据清洗 增大训练集 采用正则化 增大正则化参数 正则化缓解过拟合 正则化在损失函数中引入模型复杂度指标,利用给w增加权重,…...
![](https://i-blog.csdnimg.cn/direct/4a6f66c52b01479f8cf2d04083ff0b5b.gif)
vue实现a-model弹窗拖拽移动
通过自定义拖拽指令实现 实现效果 拖动顶部,可对整个弹窗实施拖拽(如果需要拖动底部、中间内容实现拖拽,把下面的ant-modal-header对应改掉就行) 代码实现 编写自定义指令 新建一个ts / js文件,用ts举例 import V…...
![](https://www.ngui.cc/images/no-images.jpg)
速盾:如何加强网站的安全性
随着互联网的快速发展,网站的安全性变得越来越重要。CDN(内容分发网络)是一种常见的网络加速服务,它可以将网站的静态内容分发到全球各地的服务器上,以提供更快的访问速度。然而,CDN 也存在一些安全风险&am…...
![](https://www.ngui.cc/images/no-images.jpg)
【PyTorch单点知识】自动求导机制的原理与实践
文章目录 0. 前言1. 自动求导的基本原理2. PyTorch中的自动求导2.1 创建计算图2.2 反向传播2.3 反向传播详解2.4 梯度清零2.5 定制自动求导 3. 代码实例:线性回归的自动求导4. 结论 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解&…...
![](https://img-blog.csdnimg.cn/direct/137a080d96b54b4dab151751329289fb.png)
【Java】搜索引擎设计:信息搜索怎么避免大海捞针?
一、内容分析 我们准备开发一个针对全网内容的搜索引擎,产品名称为“Bingoo”。 Bingoo的主要技术挑战包括: 针对爬虫获取的海量数据,如何高效地进行数据管理;当用户输入搜索词的时候,如何快速查找包含搜索词的网页…...
![](https://www.ngui.cc/images/no-images.jpg)
【Python】ModuleNotFoundError: No module named ‘distutils.util‘ bug fix
【Python】ModuleNotFoundError: No module named distutils.util bug fix 1. error like this2. how to fix why this error occured , because i remove the origin version python of ubuntu of 20.04. then the system trapped in tty1 , you must make sure the laptop li…...
![](https://www.ngui.cc/images/no-images.jpg)
痉挛性斜颈对生活有哪些影响?
痉挛性斜颈,这个名字听起来可能并不熟悉,但它实际上是一种神经系统疾病,影响着全球数百万人的生活质量。它以一种无法控制的方式,使患者的颈部肌肉发生不自主的收缩,导致头部姿势异常。对于患者来说,痉挛性…...
![](https://www.ngui.cc/images/no-images.jpg)
Javassist 修改 jar 包里的 class 文件
前言 Javassist 是一个用于处理 Java 字节码的类库,可以用以修改 class 文件或 jar 包里的 class 文件。 简单来说我们用Java编写的代码是放在 java 格式的代码文件里,在编译的时候会编译为 class 格式的字节码文件,然后一般所有 class 文件…...
![](https://www.ngui.cc/images/no-images.jpg)
交换机的二三层原理
相同VLAN的交换机交换原理(二层交换原理): 交换机收到数据帧,首先会检查数据帧的VLAN标签和目标MAC,若属于相同VLAN,且该目标MAC在本地MAC表中,则直接根据出接口进行数据转发 不同VLAN的交换机…...
![](https://i-blog.csdnimg.cn/direct/cc1a944905b046d2be0d14092a206dd2.gif)
HarmonyOS ArkUi 字符串<展开/收起>功能
效果图: 官方API: ohos.measure (文本计算) 方式一 measure.measureTextSize 跟方式二使用一样,只是API调用不同,可仔细查看官网方式二 API 12 import { display, promptAction } from kit.ArkUI import { MeasureUtils } fr…...
![](https://www.ngui.cc/images/no-images.jpg)
Lianwei 安全周报|2024.07.09
新的一周又开始了,以下是本周「Lianwei周报」,我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件,保证大家不错过本周的每一个重点! 政策/标准/指南最新动态 01 《数字中国发展报告(2023年)…...
![](https://i-blog.csdnimg.cn/direct/4938c36c89a441f1af27871b694f4124.png)
火遍全网的15个Python的实战项目,你该不会还不知道怎么用吧!
经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游戏来学编程? 今天我想跟大家分享几个Python小游…...
![](https://i-blog.csdnimg.cn/direct/e9d30889e1aa4b84b98b06c48f94e198.png)
快速使用BRTR公式出具的大模型Prompt提示语
Role:文章模仿大师 Background: 你是一位文章模仿大师,擅长分析文章风格并进行模仿创作。老板常让你学习他人文章后进行模仿创作。 Attention: 请专注在文章模仿任务上,提供高质量的输出。 Profile: Author: 一博Version: 1.0Language: 中文Descri…...
![](https://i-blog.csdnimg.cn/direct/9a08a5fe3711436393de6ebd11549afd.png)
Xilinx FPGA DDR4 接口的 PCB 准则
目录 1. 简介 1.1 FPGA-MIG 与 DDR4 介绍 1.2 DDR4 信号介绍 1.2.1 Clock Signals 1.2.2 Address and Command Signals 1.2.3 Control Signals 1.2.4 Data Signals 1.2.5 Other Signals 2. 通用存储器布线准则 3. Xilinx FPGA-MIG 的 PCB 准则 3.1 引脚配置 3.1.1 …...
![](https://i-blog.csdnimg.cn/direct/a6807cd23fe14f3b92d5d78490c2f8a2.png#pic_center)
神经网络 | Transformer 基本原理
目录 1 为什么使用 Transformer?2 Attention 注意力机制2.1 什么是 Q、K、V 矩阵?2.2 Attention Value 计算流程2.3 Self-Attention 自注意力机制2.3 Multi-Head Attention 多头注意力机制 3 Transformer 模型架构3.1 Positional Encoding 位置编…...
![](https://i-blog.csdnimg.cn/direct/9078d90d556c40d6919ad5413c19989c.png)
浅析 VO、DTO、DO、PO 的概念
文章目录 I 浅析 VO、DTO、DO、PO1.1 概念1.2 模型1.3 VO与DTO的区别I 浅析 VO、DTO、DO、PO 1.1 概念 VO(View Object) 视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。DTO(Data Transfer Object): 数据传输对象,这个概念来源于J2EE的设…...
![](https://img-blog.csdnimg.cn/img_convert/9a79ca2bf50a72bc0302fa224ac63022.png)
7.8 CompletableFuture
Future 接口理论知识复习 Future 接口(FutureTask 实现类)定义了操作异步任务执行的一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 比如主线程让一个子线程去执行任务,子线…...
![](https://img-blog.csdnimg.cn/img_convert/44152413e16f6afb64424fe40d31ce62.png)
iPad锁屏密码忘记怎么办?有什么方法可以解锁?
当我们在日常使用iPad时,偶尔可能会遇到忘记锁屏密码的尴尬情况。这时,不必过于担心,因为有多种方法可以帮助您解锁iPad。接下来,小编将为您详细介绍这些解决方案。 一、使用iCloud的“查找我的iPhone”功能 如果你曾经启用了“查…...
![](https://img-blog.csdnimg.cn/img_convert/dd9c1d26082f0970fdabe01947be3a44.png)
了解并缓解 IP 欺骗攻击
欺骗是黑客用来未经授权访问计算机或网络的一种网络攻击,IP 欺骗是其他欺骗方法中最常见的欺骗类型。通过 IP 欺骗,攻击者可以隐藏 IP 数据包的真实来源,使攻击来源难以知晓。一旦访问网络或设备/主机,网络犯罪分子通常会挖掘其中…...
![](https://i-blog.csdnimg.cn/direct/baee6406b8634c229595484d54bb1518.png)
java LogUtil输出日志打日志的class文件内具体方法和行号
最近琢磨怎么把日志打的更清晰,方便查找问题,又不需要在每个class内都创建Logger对象,还带上不同的颜色做区分,简直不要太爽。利用堆栈的方向顺序拿到日志的class问题。看效果,直接上代码。 1、demo test 2、输出效果…...
![](https://i-blog.csdnimg.cn/direct/32660a69c73c4a4a891c76e21f680837.jpeg)
02. Hibernate 初体验之持久化对象
1. 前言 本节课程让我们一起体验 Hibernate 的魅力!编写第一个基于 Hibernate 的实例程序。 在本节课程中,你将学到 : Hibernate 的版本发展史;持久化对象的特点。 为了更好地讲解这个内容,这个初体验案例分上下 2…...
![](https://img-blog.csdnimg.cn/img_convert/b775f90b5b9cfe156e8740ec5fdd5f85.png)
MySQL超详细学习教程,2023年硬核学习路线
文章目录 前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL 2. MySQL数据库2.1 MySQL安装2.2 MySQL配置2.2.1 添加环境变量2.2.2 新建配置文件2.2.3 初始化MySQL2.2.4 注册MySQL服务2.2.5 启动MySQL服务 2.3 MySQL登录和退出2.4 MySQL卸载2.…...
![](https://i-blog.csdnimg.cn/direct/c99c5d76f18d486a92380bf39d1b6a4c.png)
初识SpringBoot
1.Maven Maven是⼀个项⽬管理⼯具, 通过pom.xml⽂件的配置获取jar包,⽽不⽤⼿动去添加jar包 主要功能 项⽬构建管理依赖 构建Maven项目 1.1项目构建 Maven 提供了标准的,跨平台(Linux, Windows, MacOS等)的⾃动化项⽬构建⽅式 当我们开发了⼀个项⽬之后, 代…...
![](https://img-blog.csdnimg.cn/direct/f74dd51eb2b74c04bb8b6e602db8dee8.jpeg)
Qt之元对象系统
Qt的元对象系统提供了信号和槽机制(用于对象间的通信)、运行时类型信息和动态属性系统。 元对象系统基于三个要素: 1、QObject类为那些可以利用元对象系统的对象提供了一个基类。 2、在类声明中使用Q_OBJECT宏用于启用元对象特性,…...
![](https://i-blog.csdnimg.cn/direct/9544a8447de34a04aad3e5cec9fe96bc.png#pic_center)
Provider(1)- 什么是AudioBufferProvider
什么是AudioBufferProvider? 顾名思义,Audio音频数据缓冲提供,就是提供音频数据的缓冲类,而且这个AudioBufferProvider派生出许多子类,每个子类有不同的用途,至关重要;那它在Android哪个地方使…...
![](https://i-blog.csdnimg.cn/direct/54f931c849da4bdb9e711f31099098b8.png)
加密与安全_密钥体系的三个核心目标之完整性解决方案
文章目录 Pre机密性完整性1. 哈希函数(Hash Function)定义特征常见算法应用散列函数常用场景散列函数无法解决的问题 2. 消息认证码(MAC)概述定义常见算法工作原理如何使用 MACMAC 的问题 不可否认性数字签名(Digital …...
![](/images/no-images.jpg)
做外语网站的公司/郑州seo推广
一、无卡支付 交易时需录入四要素完成支付,四要素包括:卡号、户名、身份证号、手机号,如果是信用卡还需要录入有效期和CVN,无卡支付平台一般的银行渠道还需要签约三方支付协议,具体取决于对接的银行或支付通道。 二、…...
![](/images/no-images.jpg)
网站做代理服务器/提高百度搜索排名工具
Java 8 中,你可以使用 Stream API 对 List 进行去重操作。 下面是代码示例: List<Integer> numbers Arrays.asList(1, 2, 3, 4, 5, 1, 2, 3, 4, 5);List<Integer> distinctNumbers numbers.stream().distinct().collect(Collectors.toList(…...
![](/images/no-images.jpg)
wordpress 4.5.2改语言/江门seo网站推广
单选框、复选框、文本框和密码框的元素标签都是input,此时单靠tagName无法准确地得到我们想要的元素,需要结合type属性才能过滤出我们要的元素。示例代码如下: public class SearchElementsByTagName{public static void main(String[] args)…...
![](/images/no-images.jpg)
微山做网站/百度推广软件
1: 安卓教程 第一:安卓模拟器 。 第二:真机安卓系统。 2: 安卓脚本 第一: 就是外部EXE程序来控制模拟器。 第二: 就是直接用APP脚本安装到模拟器中 转载于:https://www.cnblogs.com/bubaoyuan/p/8480312…...
![](https://img-blog.csdnimg.cn/img_convert/90d54e4a5d09491ecd97c7aa947e4b9f.png)
nas可以做网站下载服务器吗/营业推广的方式有哪些
这篇文章主要介绍了基于Python爬取股票数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下基本环境配置python 3.6pycharmrequestscsvtime相关模块pip安装即可目标网页分析网页一切的一切都在图里找到数…...
![](https://img-blog.csdnimg.cn/img_convert/4de5fa5070d4096dc53cb6fb02418f50.png)
wordpress伪静态linux/今日新闻国际最新消息
中国建筑业在国民经济和社会发展中的作用日益增强,建筑行业发展速度一直在不断加快,为了进一步推动中国建筑业行业的快速平稳发展,完善中国建筑业行业产业链,政府颁布一系列措施推动中国该行业的发展,同时市场发展对建…...