STM32HAL库-移植mbedtls开源库示例(一)

2023-11-12

目录

 

概述

一、使用方法        

二、STM32CubeMx配置

三、Examples

四、运行结果

五、总结


概述

       本篇文章介绍如何使用STM32HAL库,移植mbedtls开源库支持mqtt证书加密示例。

GitHub:https://github.com/ARMmbed/mbedtls

硬件:STM32F103CBT6最小系统板
软件:Keil 5.29  + STM32CubeMX6.01
 

一、使用方法

什么是mbedtls:
         Mbed TLS是一个C库,实现了密码原语、X.509证书操作以及SSL/TLS和DTLS协议。它的代码占用空间小,因此适合于嵌入式系统。
         Mbed TLS包括PSA加密API的参考实现。这是目前仅用于评估目的的预览。
mbedtls遵循 Apache 2.0 开源许可协议。
详情请移步到官网阅读:https://github.com/ARMmbed/mbedtls
 

mbedtls有什么用处
mbedtls库提供了 TLS / DTLS协议的实现,有了mbedtls库之后意味着:

TCP + TLS = TCP(S)
MQTT + TLS = MQTT(S)
HTTP + TLS = HTTP(S)
COAP + DTLS = COAP(S)
目前的物联网操作系统+各种通信模组方式可以很好的实现TCP/UDP通信,进而提供一些HTTP、MQTT、COAP之类的上层协议,这些协议最大的特点是“明文传输”,一旦有中间人想要截获篡改数据,非常容易。

要想物联网设备和服务器之间具备高安全性,mbedtls库不可或缺。

二、STM32CubeMx配置

三、Examples

1、进入GitHub拉取源码


进入版本页

STM32移植v2.24.0,最新版本进行移植过,很多错误,捣鼓很长时间,最终选择了v2.24.0,验证过的问题少些。
2、打开STM32CubeMx生成的keil工程,新建mbedtls文件夹,按照如下步骤进行。



3、把mbedtls\library所有.c文件添加到Keil中来。

4、添加头文件路径

5、编译工程

解决报错问题
1)、添加宏定义mbedconfig配置文件:
MBEDTLS_CONFIG_FILE=<config-mini-tls1_1.h>,

2)、修改config-mini-tls1_1.h 文件
分别注释掉,无需要功能模块:

  • 注释掉宏定义MBEDTLS_HAVE_TIME,因为我们目前没有用到时间相关的
  • 注释掉宏定义MBEDTLS_NET_C,因为没有用到网络
  • 添加一个宏定义MBEDTLS_NO_PLATFORM_ENTROPY,单片机无系统所以需要添加该宏。
    /**
     * \file config-mini-tls1_1.h
     *
     * \brief Minimal configuration for TLS 1.1 (RFC 4346)
     */
    /*
     *  Copyright The Mbed TLS Contributors
     *  SPDX-License-Identifier: Apache-2.0
     *
     *  Licensed under the Apache License, Version 2.0 (the "License"); you may
     *  not use this file except in compliance with the License.
     *  You may obtain a copy of the License at
     *
     *  http://www.apache.org/licenses/LICENSE-2.0
     *
     *  Unless required by applicable law or agreed to in writing, software
     *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *  See the License for the specific language governing permissions and
     *  limitations under the License.
     */
    /*
     * Minimal configuration for TLS 1.1 (RFC 4346), implementing only the
     * required ciphersuite: MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA
     *
     * See README.txt for usage instructions.
     */
    
    #ifndef MBEDTLS_CONFIG_H
    #define MBEDTLS_CONFIG_H
    
    /* System support */
    #define MBEDTLS_HAVE_ASM
    //#define MBEDTLS_HAVE_TIME
    
    /* mbed TLS feature support */
    #define MBEDTLS_CIPHER_MODE_CBC
    #define MBEDTLS_PKCS1_V15
    #define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
    #define MBEDTLS_SSL_PROTO_TLS1_1
    
    /* mbed TLS modules */
    #define MBEDTLS_AES_C
    #define MBEDTLS_ASN1_PARSE_C
    #define MBEDTLS_ASN1_WRITE_C
    #define MBEDTLS_BIGNUM_C
    #define MBEDTLS_CIPHER_C
    #define MBEDTLS_CTR_DRBG_C
    #define MBEDTLS_DES_C
    #define MBEDTLS_ENTROPY_C
    #define MBEDTLS_MD_C
    #define MBEDTLS_MD5_C
    //#define MBEDTLS_NET_C
    #define MBEDTLS_OID_C
    #define MBEDTLS_PK_C
    #define MBEDTLS_PK_PARSE_C
    #define MBEDTLS_RSA_C
    #define MBEDTLS_SHA1_C
    #define MBEDTLS_SHA256_C
    #define MBEDTLS_SSL_CLI_C
    #define MBEDTLS_SSL_SRV_C
    #define MBEDTLS_SSL_TLS_C
    #define MBEDTLS_X509_CRT_PARSE_C
    #define MBEDTLS_X509_USE_C
    
    /* For test certificates */
    #define MBEDTLS_BASE64_C
    #define MBEDTLS_CERTS_C
    #define MBEDTLS_PEM_PARSE_C
    
    /* For testing with compat.sh */
    //#define MBEDTLS_FS_IO
    
    #define MBEDTLS_NO_PLATFORM_ENTROPY
    
    #include "mbedtls/check_config.h"
    
    #endif /* MBEDTLS_CONFIG_H */
    

     

6、再次编译

7、main.c文件
 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "mbedtls/sha1.h"		//使用sha1相关加密函数
#include "string.h"				  //使用到了strlen函数
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void sha1_test(void)
{
	printf("mbedtls port on STM32F103 core board by champion666\r\n");

	/* sha1 test */
	char *source_cxt = "champion666";
	char encrypt_cxt[64];

	printf("source context is:%s\r\n", source_cxt);

	mbedtls_sha1_context sha1_ctx;
	mbedtls_sha1_init(&sha1_ctx);
	mbedtls_sha1_starts(&sha1_ctx);
	mbedtls_sha1_update(&sha1_ctx, (unsigned char *)source_cxt, strlen(source_cxt));
	mbedtls_sha1_finish(&sha1_ctx, (unsigned char *)encrypt_cxt);
	mbedtls_sha1_free(&sha1_ctx);

	int i = 0;
	printf("sha1 encrypt context is:[");
	while (encrypt_cxt[i]) {
		printf("%02x", encrypt_cxt[i]);
		i++;
	}
	printf("]\r\n");
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	sha1_test();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
 
int fgetc(FILE * f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

四、运行结果



在线验证Hash在线计算、md5计算、sha1计算、sha256计算、sha512计算。网址1:https://1024tools.com/hash;    网址2:http://encode.chahuo.com/

传送门->代码  (内含有:mbedtls-2.24.0.zip 源码)

参考文章:

1、https://www.it610.com/article/1297797408901636096.htm
2、https://mculover666.blog.csdn.net/article/details/108680779
3、https://blog.csdn.net/qq153471503/article/details/109461794

 

五、总结

      好了,就介绍到此。

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

STM32HAL库-移植mbedtls开源库示例(一) 的相关文章

  • 【沧海拾昧】Proteus8仿真stm32:ADC转换程序

    C0102 沧海茫茫千钟粟 且拾吾昧一微尘 沧海拾昧集 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 切勿深究 目录 一 原理图绘制 二 多位七段数码管 三 ADC引脚
  • 基于STM32HAL库编写状态机模式

    概述 本篇文章介绍如何使用STM32HAL库 以马达转动的状态示例 来说明 项目中使用的状态模式 参考该文章链接 比较懒 基本都是照搬框架 这种写法确实在项目后续新增功能时 方便不少 还是值得学习 这样的思路 加油 技术同仁们 硬件 STM
  • STM32H7串口查询方式接收串口接收溢出导致死机问题

    串口溢出后 因为接收移位寄存器不会把接收到的数据放到接收寄存器中 则RXNE RXFNE不会再置位 不能再接收 表现为串口死机 STATIC INLINE uint32 t LL USART IsActiveFlag RXNE RXFNE
  • STM32读写内部Flash(介绍+附代码)

    概述 内部Flash读写详解 一 介绍 首先我们需要了解一个内存映射 stm32的flash地址起始于0x0800 0000 结束地址是0x0800 0000加上芯片实际的flash大小 不同的芯片flash大小不同 RAM起始地址是0x2
  • STM32HAL库-移植Unity针对微控制器编写测试框架

    概述 本篇文章介绍如何使用STM32HAL库 移植Unity 是一个为C语言构建的单元测试框架 侧重于使用嵌入式工具链 GitHub https github com ThrowTheSwitch Unity 硬件 STM32F103CBT
  • STM32L4-RS485+DMA中断通信实验+字节丢失处理[寄存器版]

    基本设置 MCU采用 STM32L431RCT6 485芯片采用 ADM3485 采用串口经由RS485 使用DMA向串口调试助手传送数据 相关配置与前文基本相同 STM32L4 双路RS485自收发通信实验 寄存器版 staypt的博客
  • 【STM32 学习】电源解析(VCC、VDD、VREF+、VBAT)

    VCC 电源电压 GND 电源供电负电压 通常接地 VDD 模块工作正电压 VSS 模块工作负电压 VREF ADC参考正电压 VREF ADC参考负电压 VBAT 电池或其他电源供电 VDDA 模拟供电正电压 VSSA 模拟供电负电压 一
  • OLED显示小数

    OLED显示小数并不是很难的 在通用的OLED库中是没有显示小数的 需要自己去写 写的方法大致是这样的 写出0到9的ACSLL值 只需要将小数点后面的位数 一位一位的写数字对应的ACSLL值即可 其中小数点 也是写同样对应的ACSLL值 只
  • STM32HAL库-移植mbedtls开源库示例(二)

    概述 本篇文章介绍如何使用STM32HAL库 这篇文章只要是讲如何使用mbedtls开源库 实现 1 base64编码 2 AES加解密示例 怎么样移植mbedtls开源库 请阅读我写的一篇文章 STM32HAL库 移植mbedtls开源库
  • MQTT服务器搭建及客户端通信实例

    MQTT服务器 EMQX v3 客户端1 PC Windows10操作系统 客户端2 IOT BOARD RT Thread与正点原子联合开发的STM32L475核心芯片的开发板 1 搭建服务器 在EMQ官网https www emqx i
  • 【STM32】

    失败了也挺可爱 成功了就超帅 文章目录 前言 1 JTAG SWD引脚 2 禁用JTAG功能 2 1 标准库 2 2 HAL库 3 禁用SWD JTAG功能 3 1 标准库 3 2 HAL库 总结 前言 最近在画板子耍 我LED灯选用的 P
  • STM32L051C8T6 HAL库 + nRF24L01 收发案例(硬件SPI通讯)

    目录 概述 1 硬件平台 STM32L051C8T6 NRF24L01 1 原理图 2 STM32CubeMx工具配置如下 2 代码部分 1 nrf24L01 c文件 2 nrf24L01 h文件 3 usart c文件 2 1发送部分如下
  • stm32cubemx使用mpu6050

    文章目录 接线图 代码 常见问题 接线图 一般情况下 大家买的 mpu 6050 有两种 1 就是 单个的 mpu6050 芯片 2 就是 mpu6050 模块 如果 是第一种情况的话 大家可以参考 下图所示 如果是第二种情况的话 一般来说
  • STM32的PWM相关函数TIM_SetCompare1的一定理解

    void TIM SetCompare1 TIM TypeDef TIMx uint16 t Compare1 Check the parameters assert param IS TIM LIST8 PERIPH TIMx Set t
  • STM32-ADC电压采样实验(寄存器版)

    STM32F10X系列支持三路ADC 其ADC通道及对应IO口如下表所示 其能接受的电压输入范围一般为0 3 3V VREF VIN VREF 因此 如果需要测量超出0 3 3v量程范围的电压数据 需要在外围硬件增加分压电阻 将电路转换到0
  • #STM32 GPIO编程详解

    硬件环境 stm32f407zet6 软件环境 mdk5 1 GPIO概述 GPIO 翻译为通用输入输出 也就是软件可编程引脚 也就是MCU通过控制GPIO来完成一系列的功能 GPIO属于引脚 但引脚还包含电源 晶振 下载 boot 复位等
  • 001--STM32使用--TIM8的PWM输出

    void TIM8 PWM Init u16 arr u16 psc GPIO InitTypeDef GPIO InitStructure TIM TimeBaseInitTypeDef TIM TimeBaseStructure TIM
  • STM32 ADC 多通道16路电压采集

    下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序 采用USB接口与电脑连接 实则USB转串口方式 所以上位机可以用串口作为接口 电路图中利用LM324作为电压跟随器 起到保护单片机引脚的作用 直接在电脑USB取点
  • USART串口协议和USART串口外设(USART串口发送&串口发送和接收)

    1 通信接口 A 基本概念 通信的目的 将一个设备的数据传送到另一个设备 扩展硬件系统 通信协议 制定通信的规则 通信双方按照协议规则进行数据收发 异步 需要双方约定一个频率 B 数据通信方式 按数据通信方式分类 可分为串行通信和并行通信两
  • 在MDK5中新建STM32F4XX工程模板(基于固件库)

    0 库函数和寄存器的区别 本质上是一样的 可以在库函数模板里面 直接操作寄存器 因为官方库相关头文件有寄存器定义 但是不能在寄存器模板调用库函数 因为没有引入库函数相关定义 了解寄存器基本原理的目的是为了让我们对STM32相关知识有比较深入

随机推荐

  • java session id 生成_Java通过sessionId获取Session

    Servlet2 1之后不支持SessionContext里面getSession String id 方法 但是 我们可以通过HttpSessionListener监听器和全局静态map自己实现一个SessionContext MySes
  • 我说CMMI

    一 我说CMMI之二 CMMI里有什么 CMMI划分为三个分支 适用于供方 乙方的模型 CMMI DEV 主要是针对开发类组织的 CMMI SVC 主要是针对服务类组织的 适用于需方 甲方的模型 CMMI ACQ 主要是针对采购类组织的 C
  • 排查 Linux cup 飙升问题

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 Java 执行过程 一 使用 top 命令 二 使用ps命令查看cpu占比高的PID 三 将对应的TID转换为16进制 四 使用jdk自带的命令jstack
  • 使用ffmpeg解析H265视频编码

    使用 ffmpeg 解析 H265 视频编码的方法如下 下载并安装 ffmpeg 如果您的计算机上已经安装了 ffmpeg 则可以跳过此步骤 打开命令行窗口 Windows 用户可以在开始菜单中搜索 命令提示符 输入以下命令来解析 H265
  • it项目管理(6)

    1 教材练习题6 a b 路径1 A B E H K 长度 2 2 2 2 2 10 天 路径2 A B E I J K 长度 2 2 2 5 1 2 14 天 路径3 A C F H K 长度 2 3 3 2 2 12 天 路径4 A C
  • 如何用Python获取网页指定内容

    文章目录 1 抓取网页源代码 2 抓取一个网页源代码中的某标签内容 3 抓取多个网页子标签的内容 Python用做数据处理还是相当不错的 如果你想要做爬虫 Python是很好的选择 它有很多已经写好的类包 只要调用 即可完成很多复杂的功能
  • 服务器性能问题排查

    服务器性能问题一般有两种 高内存占用 高CPU占用 比如应用程序高内存占用 可能是因为文件读写 频繁的IO 内存频繁GC 进一步占用了内存和CPU 比如应用程序高CPU占用 可能是因为大任务计算 死循环 卡死 不断超时或者重试 所以需要具体
  • 基于SpringBoot开发的疫情信息管理系统

    文章目录 项目介绍 主要功能截图 部分代码展示 设计总结 项目获取方式 作者主页 超级无敌暴龙战士塔塔开 简介 Java领域优质创作者 简历模板 学习资料 面试题库 关注我 都给你 文末获取源码联系 项目介绍 疫情信息管理系统 java项目
  • 学习网络编程No.6【将服务器日志和守护进程化】

    引言 北京时间 2023 9 1 21 15 下午刚更新完博客 同理再接再厉 这样整天不需要干什么 除了玩手机的日子不多了 马上就要开学 每天需要签到签退的日子就要来临 烦躁 照我预料下学期我们学校应该会开一门Java的专业课 现在这种线下
  • ESP32-CAM摄像头开发

    1 硬件接线 参考博客 https blog csdn net wangyilong153 article details 124366728 ops request misc 257B 2522request 255Fid 2522 25
  • ply文件格式详细说明

    典型的 PLY 文件结构 头部 顶点列表 面片列表 其他元素列表 头部是一系列以回车结尾的文本行 用来描述文件的剩余部分 头部包含一个对每个元素类型的描述 包括元素名 如 边 这个元素在工程里有多少 以及一 个与这个元素关联的不同属性的列表
  • 假设检验2

    为研究东 中 西部各省市规模以上的企业发展状况 我们收集了各城市企业的主要经济指标 包括 总资产贡献率 资产负债率 流动资产周转次数 工业成本费用利润率 产品销售率 我们用变量 类别 定义了各类城市 其中1为东部城市 2为中部城市 3为西部
  • IV转换电路 IV放大 跨阻放大器 光电信号放大器 原理图及PCB设计分析

    IV转换电路 IV放大 跨阻放大器 光电信号放大器 原理图及PCB设计分析 目录 IV转换电路 IV放大 跨阻放大器 光电信号放大器 原理图及PCB设计分析 基本原理 芯片选型 原理图 3D PCB 具体讲解 模块原理图 PDF 原理图库
  • C# winform流程图项目(功能完整,中文注释,附下载链接)绘制各种流程图形,保存,步骤记录,删除,连接断开,直线折线,属性调节

    C winform流程图项目 功能完整 中文注释 附下载链接 绘制各种流程图形 保存 步骤记录 删除 连接断开 直线折线 属性调节 点我下载项目源码 主要功能如下 1 鼠标点击工具箱后在画布点击拖出图形 2 选中直线节点靠近图形节点自动连接
  • 14年macmini装双硬盘_廉颇老矣,还能战否?2014 Mac Mini Late 加装HP EX920固态硬盘

    廉颇老矣 还能战否 2014 Mac Mini Late 加装HP EX920固态硬盘 2019 03 13 13 49 17 15点赞 53收藏 25评论 小编注 此篇文章来自即可瓜分10万金币 周边好礼达标就有 邀新任务奖励无上限 点击
  • (七)Mybatis当中#{}和${}的区别详解

    这篇文章主要讲述Mybatis当中 和 的区别 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来一起学习学习吧 和 的区别 key 获取参数的值 预编译到SQL中 安全 key 获取参数的值 拼接到SQL中 有SQL注
  • 【FPGA】十三、Vivado MIG IP核实现DDR3控制器(1)

    文章目录 前言 一 DDR3基础知识 二 MIG IP核的配置 三 DDR3 IP核用户端接口时序 1 DDR3 IP核接口说明 2 DDR3 IP核读写时序 写命令时序 写数据时序 读数据时序 总结 前言 我们在进行FPGA开发应用当中
  • 利用Opencv提供的imencode和imdecode进行图像视频传输(发送端支持Linux和Windows双系统)

    关于网络图像传输 网上大多数都是基于像素访问进行传输 传输的大小是图像的分辨率以及他的通道数 一般普通摄像头拍摄到图像大小的分辨率是640480 也就是说单通道灰度图像 一次要传输的数据量大小是640480 307200个字节 如果是彩色3
  • k8s服务无法访问

    无法访问k8s服务问题分析过程 1 查看pod是否正常 2 查看service是否正常 3 查看endpoints是否绑定 4 检查配置文件 从过程3可以看出问题出在endpoints的绑定上面 通过仔细检测配置文件发现是pod的配置中ap
  • STM32HAL库-移植mbedtls开源库示例(一)

    目录 概述 一 使用方法 二 STM32CubeMx配置 三 Examples 四 运行结果 五 总结 概述 本篇文章介绍如何使用STM32HAL库 移植mbedtls开源库支持mqtt证书加密示例 GitHub https github