毕设开源 深度学习异常流量检测系统(算法+论文)

OpenCV 算法梳理分析 本文系统梳理了OpenCV的核心算法体系,从模块架构到具体函数实现。OpenCV采用分层设计,包含基础I/O、图像处理、特征检测、视频分析和智能算法五大层次,所有模块基于统一的Mat数据结构。重点分析了imgproc模块的8类图像处理算法(滤波、形态学、阈值化等),features2d模块的特征检测与匹配流程(SIFT/ORB等算法对比),以及objdetect、video、calib3d等模块的核心功能。针对不同场景提供了算法选型建议,如高斯噪声推荐GaussianBlur,特征匹配推荐ORB+Flann 阅读详情

0 前言

🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 深度学习异常流量检测系统(算法+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

难度系数:3分
工作量:3分
创新点:4分

🧿 项目分享:见文末!

1 项目运行效果

在这里插入图片描述
在这里插入图片描述

视频效果:

毕业设计 深度学习异常流量检测系统

2 设计原理

下面构建一个简单的demo简要的说明项目原理,实际工程要更为复杂,但原理相似。

3 背景

近年来随着HTTPS的全面普及,为了确保通信安全和隐私,越来越多的网络流量开始采用HTTPS加密,截止今日,超过65%的网络流量已使用https加密。

HTTPS的的推出,主要是为了应对各种窃听和中间人攻击,以在不安全的网络上建立唯一安全的信道,并加入数据包加密和服务器证书验证。但是随着所有互联网中加密网络流量的增加,恶意软件也开始使用HTTPS来保护自己的通信。

这种情况对安全分析人员构成了挑战,因为流量是加密的,而且大多数情况下看起来像正常的流量。 检测企业内部HTTPS流量的一种常见的解决方案是安装HTTPS拦截代理。 这些硬件服务器可以通过在其计算机中安装特殊证书来打开和检查员工的HTTPS流量。 HTTPS拦截器位于客户端和服务器之间,其中加密流量被解密,扫描恶意软件后,再次加密并发送到目标IP。 此方法允许使用经典检测方法来检测未加密的恶意软件流量。 使用拦截器的问题在于它昂贵,计算要求高,同时造成网络性能下降,而且它不尊重HTTPS的原始想法,即拥有私密和安全的通信。

学长将为大家介绍一种在不解密流量的情况,可以高精度地检测恶意软件HTTPS流量的技术。

4 恶意软件加密流量介绍

4.1 恶意软件分类

目前使用加密通信的恶意软件家族超过200种,使用加密通信的恶意软件占比超过40%,使用加密通信的恶意软件几乎覆盖了所有常见类型,如:特洛伊木马、勒索软件、感染式、蠕虫病毒、下载器等,其中特洛伊木马和下载器类的恶意软件家族占比较高。

在这里插入图片描述

4.2 恶意软件加密通信方式

恶意软件产生的加密流量,根据用途可以分为以下六类:C&C直连、检测主机联网环境、母体正常通信、白站隐蔽中转、蠕虫传播通信、其它。

在这里插入图片描述

C&C直连 – 恶意软件在受害主机执行后,通过TLS等加密协议连接C&C(攻击者控制端),这是最常见的直连通讯方式。

检测主机联网环境 – 部分恶意软件在连接C&C服务器之前,会通过直接访问互联网网站的方式来检测主机联网情况,这些操作也会产生TLS加密流量。通过统计发现:使用查询IP类的站点最多,约占39%;使用访问搜索引擎站点约占30%,其它类型站点约占31%。

母体程序正常通信 – 感染式病毒是将恶意代码嵌入在可执行文件中,恶意代码在运行母体程序时被触发。母体被感染后产生的流量有母体应用本身联网流量和恶意软件产生的流量两类。由于可被感染的母体程序类别较多,其加密通信流量与恶意样本本身特性基本无关,本文就不做详细阐述。

白站隐蔽中转 – 白站是指相对于C&C服务器,可信度较高的站点。攻击者将控制命令或攻击载荷隐藏在白站中,恶意软件运行后,通过SSL协议访问白站获取相关恶意代码或信息。通过统计发现,最常利用的白站包括Amazonaws、Github、Twitter等。

蠕虫传播通信 – 蠕虫具有自我复制、自我传播的功能,一般利用漏洞、电子邮件等途径进行传播。监测显示近几年活跃的邮件蠕虫已经开始采用TLS协议发送邮件传播,如Dridex家族就含基于TLS协议的邮件蠕虫模块。

其他通信 – 除以上几类、还有一些如广告软件、漏洞利用等产生的恶意加密流量。

5 加密HTTPS流量解析

5.1 Https简介

HTTPS协议也称为SSL上的HTTP安全或超文本传输协议,是以安全为目标的 HTTP 通道,通过传输加密和身份认证保证了传输过程的安全性 。 如果没有加密,任何设法查看客户端和服务器之间的数据包的人都可以读取通信。

Http:在通讯的过程中,以明文的形式进行传输,采用wireshark抓包的效果如下:

在这里插入图片描述

Https:所有的请求信息都采用了TLS加密,采用wireshark抓包的效果如下:

在这里插入图片描述

6 流量解析

6.1 流量解析日志生成

使用流量包深度解析方式提取HTTPS流量中的足够信息日志,包括连接通信日志、SSL协议日志、证书日志三部分。

从3个日志中可以获得以下信息:

(1)连接记录
每一行聚合一组数据包,并描述两个端点之间的连接。连接记录包含IP地址、端口、协议、连接状态、数据包数量、标签等信息。

(2)SSL记录
它们描述了SSL/TLS握手和加密连接建立过程。有SSL/TLS版本、使用的密码、服务器名称、证书路径、主题、证书发行者等等。

(3)证书记录
在日志中的每一行都是一个证书记录,描述证书信息,如证书序列号、常用名称、时间有效性、主题、签名算法、以位为单位的密钥长度等。

6.2 流量解析日志中的数据关联

流量包深度解析后生成日志数据,任何日志中的每一行都有唯一的键,用于链接其他日志中的行。

– 通过连接日志记录中的唯一键,可以和SSL协议日志中的唯一键进行2个记录的关联。

– 通过协议日志中一列使用逗号拼接成的id键值,可以在证书日志中找到每个id对应的证书记录。

在这里插入图片描述

6.3 流量解析的证书日志

在这里插入图片描述

7 机器学习特征分类

基于构建4元组进行特征提取,通过来自连接日志、SSL协议日志、证书日志中的数据创建连接4元组,并提取特征用于机器学习模型训练。

7.1 构建4元组

根据连接日志中的id、SSL协议日志中的id进行连接,再根据得到的conn_ssl.log中的证书路径,取第一个key,和证书日志中的id进行再次关联,在得到的关联结果中,根据连接4元组(源IP、目标IP、目标端口和协议)相同的数据,进行group聚合操作,然后对于得到的每个连接4元组,根据聚合结果进行特征提取。

在这里插入图片描述

7.2 特征提取

对于每个连接4元组,我们提取了37个特征,大部分是基于我们对该领域的专业知识和对我们的恶意软件数据的彻底分析而创建的。对于这些特征,我们将它们分为3组:连接特征、SSL特征、证书特征。
– 连接特征是来自连接记录的特征,描述与证书和加密无关的通信流的常见行为。
– SSL特征是来自SSL记录的特征,描述了SSL握手和加密通信的信息。
– 证书特征是来自证书记录的特性,描述了web服务人员在SSL握手期间提供给我们的证书的信息。每个特性都是某个浮点值,如果由于缺少信息而无法计算该特征,则值为-1。

7.2.1 连接特征

连接特征共包含12个,部分举例如下:
(1)聚合和连接记录的数量。每个连接4元组包含的SSL聚合和连接记录数量和。
(2)持续时间均值。每个连接4元组的连接参数duration的均值。
(3)持续时间标准差。每个连接4元组的连接参数duration的标准差。
(4)超出标准差范围的持续时间占比。每个连接4元组的所有持续时间值中有多少百分比超出了范围。这个范围有两个极限,上限是均值+标准偏差,下限是均值-标准偏差。
(5)总发送包大小。每个连接4元组的所有连接记录发送的有效负载字节数。

7.2.2 SSL特征

SSL特征共包含10个,部分举例如下:
(1)连接记录中ssl连接的占比。连接4元组中非ssl连接和ssl连接的个数比值。
(2)TLS与SSL的比值。连接4元组中tls版本分布占比。
(3)SNI占比。连接4元组中server_name不为空的比例。
(4)SNI is IP。连接4元组中server_name为ip地址的比例。

5.2.3 证书特征

证书特征共包含15个,部分举例如下:
(1)公钥均值。连接4元组中全部证书exponent的均值。
(2)证书有效期的平均值。连接4元组中全部证书的有效天数的均值。
(3)证书有效期的标准差。连接4元组中全部证书的有效天数的标准差。
(4)捕获期间证书周期的有效性。连接4元组的全部证书中没有过期的占比。

8 分类及预测效果

数据集选择,对于负样本,使用https://www.stratosphereips.org/datasets-malware 网站下公开的恶意软件捕获结果集,目前已有349个恶意样本集。同时,使用一批最新的恶意软件10w个,通过沙箱捕获恶意软件产生的流量。对于正样本,一部分使用日常办公网中正常流量,同时使用爬虫爬取alexa中访问最多的top10000网站,采集产生的流量作为另一部分数据集。

经过数据清洗和过滤后,最终得到正样本46949条,负样本45121条。

使用多种机器学习模型,进行训练,选择其中效果较好的模型,随机森林模型和XGBOOST,准确率如下:

在这里插入图片描述

最后,为了便于测试模型效果,使用Flask开发了一个web在线检测页面,可以上传pcap进行检测恶意流量,收集20个最新的恶意软件进行测试,最后检出20个。

在这里插入图片描述

9 构建实时系统

技术选型选择Spark,因为每日流量数据很大,如果采用使用Spark Streaming在线实时检测会特别消耗机器性能,所以采用离线检测方式,流量深度包解析后的数据存储到Hive中,定时从Hive中读取数据,加载模型,进行检测。

在这里插入图片描述

10 关键代码

Deep Log分类识别方法

import torch
import math
import torch.optim as optim
import pandas as pd
from torch import nn
from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score
from collections import defaultdict

class DeepLog(nn.Module):
    def __init__(self, num_labels, hidden_size=100, num_directions=2, topk=9, device="cpu"):
        super(DeepLog, self).__init__()
        self.hidden_size = hidden_size
        self.num_directions = num_directions
        self.topk = topk
        self.device = self.set_device(device)
        self.rnn = nn.LSTM(input_size=1, hidden_size=self.hidden_size, batch_first=True, bidirectional=(self.num_directions==2))
        self.criterion = nn.CrossEntropyLoss()
        self.prediction_layer = nn.Linear(self.hidden_size * self.num_directions, num_labels + 1)

    def forward(self, input_dict):
        y = input_dict["window_y"].long().view(-1).to(self.device)
        self.batch_size = y.size()[0]
        x = input_dict["x"].view(self.batch_size, -1, 1).to(self.device)
        outputs, hidden = self.rnn(x.float(), self.init_hidden())
        logits = self.prediction_layer(outputs[:,-1,:])
        y_pred = logits.softmax(dim=-1)
        loss = self.criterion(logits, y)
        return_dict = {'loss': loss, 'y_pred': y_pred}
        return return_dict

    def set_device(self, gpu=-1):
        if gpu != -1 and torch.cuda.is_available():
            device = torch.device('cuda: ' + str(gpu))
        else:
            device = torch.device('cpu')   
        return device

    def init_hidden(self):
        h0 = torch.zeros(self.num_directions, self.batch_size, self.hidden_size).to(self.device)
        c0 = torch.zeros(self.num_directions, self.batch_size, self.hidden_size).to(self.device)
        return (h0, c0)

    def fit(self, train_loader, epoches=10):
        self.to(self.device)
        model = self.train()
        optimizer = optim.Adam(model.parameters())
        for epoch in range(epoches):
            batch_cnt = 0
            epoch_loss = 0
            for batch_input in train_loader:
                loss = model.forward(batch_input)["loss"]
                loss.backward()
                optimizer.step()
                optimizer.zero_grad()
                epoch_loss += loss.item()
                batch_cnt += 1
            epoch_loss = epoch_loss / batch_cnt
            print("Epoch {}/{}, training loss: {:.5f}".format(epoch+1, epoches, epoch_loss))
    
    def evaluate(self, test_loader):
        self.eval()  # set to evaluation mode
        with torch.no_grad():
            y_pred = []
            store_dict = defaultdict(list)
            for batch_input in test_loader:
                return_dict = self.forward(batch_input)
                y_pred = return_dict["y_pred"]

                store_dict["SessionId"].extend(batch_input["SessionId"].data.cpu().numpy().reshape(-1))
                store_dict["y"].extend(batch_input["y"].data.cpu().numpy().reshape(-1))
                store_dict["window_y"].extend(batch_input["window_y"].data.cpu().numpy().reshape(-1))
                window_prob, window_pred = torch.max(y_pred, 1)
                store_dict["window_pred"].extend(window_pred.data.cpu().numpy().reshape(-1))
                store_dict["window_prob"].extend(window_prob.data.cpu().numpy().reshape(-1))
                top_indice = torch.topk(y_pred, self.topk)[1] # b x topk
                store_dict["topk_indice"].extend(top_indice.data.cpu().numpy())

            window_pred = store_dict["window_pred"]
            window_y = store_dict["window_y"]
            
            store_df = pd.DataFrame(store_dict)
            store_df["anomaly"] = store_df.apply(lambda x: x["window_y"] not in x["topk_indice"], axis=1).astype(int)

            store_df.drop(["window_pred", "window_y"], axis=1)
            store_df = store_df.groupby('SessionId', as_index=False).sum()
            store_df["anomaly"] = (store_df["anomaly"] > 0).astype(int)
            store_df["y"] = (store_df["y"] > 0).astype(int)
            y_pred = store_df["anomaly"]
            y_true = store_df["y"]

            metrics = {"window_acc" : accuracy_score(window_y, window_pred),
            "session_acc" : accuracy_score(y_true, y_pred),
            "f1" : f1_score(y_true, y_pred),
            "recall" : recall_score(y_true, y_pred),
            "precision" : precision_score(y_true, y_pred)}
            print([(k, round(v, 5))for k,v in metrics.items()])
            return metrics

决策树分类方法

import numpy as np
from sklearn import tree
from ..utils import metrics

class DecisionTree(object):

    def __init__(self, criterion='gini', max_depth=None, max_features=None, class_weight=None):
        """ The Invariants Mining model for anomaly detection
        Arguments
        ---------
        See DecisionTreeClassifier API: https://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html

        Attributes
        ----------
            classifier: object, the classifier for anomaly detection

        """
        self.classifier = tree.DecisionTreeClassifier(criterion=criterion, max_depth=max_depth,
                          max_features=max_features, class_weight=class_weight)

    def fit(self, X, y):
        """
        Arguments
        ---------
            X: ndarray, the event count matrix of shape num_instances-by-num_events
        """
        print('====== Model summary ======')
        self.classifier.fit(X, y)

    def predict(self, X):
        """ Predict anomalies with mined invariants

        Arguments
        ---------
            X: the input event count matrix

        Returns
        -------
            y_pred: ndarray, the predicted label vector of shape (num_instances,)
        """
        
        y_pred = self.classifier.predict(X)
        return y_pred

    def evaluate(self, X, y_true):
        print('====== Evaluation summary ======')
        y_pred = self.predict(X)
        precision, recall, f1 = metrics(y_pred, y_true)
        print('Precision: {:.3f}, recall: {:.3f}, F1-measure: {:.3f}\n'.format(precision, recall, f1))
        return precision, recall, f1

篇幅有限,更多详细设计见设计论文

11 最后

项目包含内容

在这里插入图片描述

一万五千字 完整详细设计论文
在这里插入图片描述

🧿 项目分享:见文末!

Linux Component概述和高通component的使用 为了让subsystem按照一定顺序初始化设备才提出来的。subsystem中由很多设备模块,内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video device),这时就要用到component框架。例如v4l2 subdev和v4l2 video device中,谁依赖谁先创建? 阅读详情

相关推荐

SAP ABAP BADI_FINS_ACDOC_POSTING_EVENTS 深度应用:KO88工单结算的凭证字段定制与财务数据增强

本文深入探讨了SAP ABAP中BADI_FINS_ACDOC_POSTING_EVENTS在KO88工单结算中的应用,详细解析了如何通过BADI实现财务凭证字段的定制与数据增强。文章提供了从结构扩展到BADI方法实现的完整步骤,包括性能优化建议和实际应用中的测试验证流程,帮助开发人员高效解决企业个性化财务需求。

weixin_26869081的博客 354

毕业设计 深度学习异常流量检测系统算法+论文

🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩毕业设计 深度学习异常流量检测系统算法+论文)🥇学长这里给一个题目综合评分(每项满分5分)难度系数:3分工作量:3分创新点:4分🧿 项目分享:见文末!

kooerr的博客 1206

北斗导航 | 从零开始学习基于奇偶矢量的接收机自主完好性监测(RAIM)算法及改进

接收机自主完好性监测(Receiver Autonomous Integrity Monitoring, RAIM)是GNSS接收机内部的一种算法,它仅利用冗余的伪距观测量来判断定位结果是否可靠、是否存在故障卫星,并能识别和排除故障卫星。奇偶矢量法是RAIM最经典的实现方式之一,它将不可直接观测的测量误差映射到一个“奇偶空间”中,使故障检测变得简单且服从精确的概率分布。w\mathbf{w}w虽然能反映故障,但它的协方差矩阵不是单位阵,各分量相关,不利于统计检验。奇偶矢量通过一个正交变换P。

尘世冰封的专栏 379

毕设成品 深度学习异常流量检测系统算法+论文

🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩毕业设计 深度学习异常流量检测系统算法+论文)🥇学长这里给一个题目综合评分(每项满分5分)难度系数:3分工作量:3分创新点:4分🧿 项目分享:见文末!

knooor的博客 1257

小红书 算法一面 十一

例如 **Soft MoE** 采用这种方式,大幅提升负载均衡性,但会增加计算开销。- **熵正则化**:直接最大化门控概率分布的熵,熵越大表示分布越均匀,公式为 $\mathcal{L}_{ent} = -\frac{1}{N}\sum_{i=1}^N\sum_{k=1}^K p_{ik}\log p_{ik}$。- **核心原理**:源自 **GShard** 和 **Switch Transformer**,通过最小化专家选择概率分布的熵,迫使门控网络给每个专家分配相近的 token 数量。

XLYcmy的博客 443

数据库连接算法详解:从基础概念到嵌套循环优化

2.重复键在归并连接中的处理:排序归并连接遇到相同键时,需要保存或回溯同一键对应的记录组,然后输出笛卡尔积。(2)外连接:即使一方没有数据,也保留该侧数据,用NULL填充。对S中的键计算哈希值;(3)连接基数:连接结果的行数可能远大于任意一张输入表。设外表有R个页面,内表S个页面,比较次数O(R+R*S)5.哈希连接的限制:最适用于等值连接,不直接适用于比较。(1)build阶段:对较小的关系R建立哈希表。(1)内连接:只保留两张表之中能够匹配的内容。若R有M行,S有N行,则比较次数为O(MN)

jiangxiaohanya的博客 245

【数据结构】排序算法:归并排序与基数排序

本文介绍了归并排序和基数排序两种非比较型排序算法。归并排序采用分治策略,通过递归分割与合并实现排序,时间复杂度稳定为O(nlogn),空间复杂度O(n),具有稳定性。基数排序则基于数字位数进行分配收集,时间复杂度O(d(n+r)),适用于固定位数的整数或字符串排序。文章通过示例详细说明了两者的执行过程,并对比了八大排序算法的关键特性,包括时间复杂度、空间复杂度和稳定性。最后通过典型例题展示了两种排序的应用场景和解题思路,强调归并排序的分治思想和基数排序的LSD实现是考试重点。(149字)

bianyuan172的博客 298

LeetCode 1. 两数之和 | 从暴力枚举到哈希表最优解 + 空间换时间思想全复盘

文章摘要 题目要求在数组中找到两数之和等于目标值的下标。核心思路是优化查找效率: 暴力法:双重循环枚举所有数对,时间复杂度O(),效率低但易实现。 哈希表优化:利用哈希表O(1)查找特性,遍历时存储已访问元素,每次计算差值并查询,时间复杂度降至O(n)。关键细节是先查后存,避免自匹配。 代码实现:哈希表法通过一次遍历完成,空间换时间,边界处理需注意空数组和不足两元素的情况。 常见错误:内层循环起始点、哈希表键值设计、立即返回结果等易错点需警惕。 面试要点:优先选择哈希表解法,解释与暴力法的差异,强调时间

yc2284238579的博客 265

算法日常・每日刷题--<BFS>4

题目摘要: 给定一个由'X'和'O'组成的矩阵,要求捕获所有被'X'完全包围的'O'区域(即不与边界连通的区域),并将其替换为'X'。解法核心是逆向处理: 标记边界连通区域:遍历矩阵四边,对边界上的'O'进行BFS/DFS,标记所有与之连通的'O'为临时符号(如'.'),表示这些区域未被包围。 批量修改:遍历整个矩阵,将未被标记的'O'(被包围的)改为'X',同时恢复标记的'.'为'O'。 示例: 输入: [['X','X','X','X'], ['X','O','O','X'], ['X','X','O'

2503_92261635的博客 263

10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数

利用滑动窗口解决最大连续1的个数

Jammy_1的博客 226

算法日常・每日刷题--<BFS&&最短路径>4

675. 为高尔夫比赛砍树 - 力扣(LeetCode)675. 为高尔夫比赛砍树 - 你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示, 在这个矩阵中: * 0 表示障碍,无法触碰 * 1 表示地面,可以行走 * 比 1 大的数 表示有树的单元格,可以行走,数值表示树的高度每一步,你都可以向上、下、左、右四个方向之一移动一个单位,如果你站的地方有一棵树,那么你可以决定是否要砍倒它。你需要按照树的高度从低向高砍掉所有的树,每砍过一颗树,该单元格的值变为 1(即变为地面)。

2503_92261635的博客 231

S 曲线加减速算法完整详解(C# 原生实现,无第三方库)

S 曲线加减速是工业运动控制核心轨迹规划算法,相比梯形曲线,依靠约束加加速度 Jerk 实现加速度连续变化,有效消除机械冲击与振动。本文完整讲解七段式 S 曲线原理、阶段推演、时间预规划逻辑,剖析短行程自动裁剪等工程难点。提供无第三方依赖原生 C# 完整实现,内置运动状态机,支持正反方向运动,基于解析多项式实时求解位置、速度、加速度,无积分累积误差。代码可直接用于伺服上位机、模组轨迹发生器,亦可精简移植嵌入式平台。同时对比算法优劣与适用场景,适合工控开发、伺服调试、嵌入式运动算法学习者参考。

工业上位机开发工程师,专注C#底层算法与工控仪器开发。从零手写信号滤波、曲线拟合、机器视觉、排序与密码学哈希,纯原生实现零第三方库,附数学推导与可编译源码,可移植STM32/PLC。 991

Tokenization(分词算法):一切大语言模型的地基

本文深入解析了Tokenization(分词算法)这一大语言模型的基础技术。Tokenization将原始文本切分为模型可处理的子词单元并映射为数字ID,是模型理解文本的第一步。

2301_80194949的博客 206

如何使用keil 5 编写 51单片机 工程-附件资源

如何使用keil 5 编写 51单片机 工程-附件资源

上一篇: 毕设开源 大数据招聘数据可视化系统(源码+论文)
下一篇: 毕设成品 基于机器视觉的目标跟踪算法
kooerr
博客等级 码龄5年 4997粉丝 707原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值