GB/T28181流媒体相关协议详解
GB/T28181流媒体相关协议详解
文章目录
- GB/T28181流媒体相关协议详解
- 1 GB/T28181协议中使用的应用层协议介绍
- 2 实时视频点播协议交互流程
- 2.1 设备注册
- 2.2 设备保活
- 2.3 视频播放
- 总结
本文主要主要针对28181协议中视频流的部分,来阐述视频流通过28181协议如何进行视频会话和视频传输的。本文主要介绍28181协议中引用的协议、视频封装格式、实时视频点播协议交互流程等内容。
1 GB/T28181协议中使用的应用层协议介绍
28181协议规范中涉及到SIP、SDP、RTP、RTCP、RTSP等应用层协议,其中SIP+XML主要用于消息交互,SIP+SDP主要用户视频会话,RTP/RTCP主要用于媒体流传输控制,RTSP主要用户录像回放。有关各种协议的详细介绍可参考如下文章,本文不做详细介绍:
- SIP协议:参照文章 sip协议介绍
- SDP协议:参照文章 h264和h265视频流SDP描述详解
- RTCP/RTCP:参照文章 RTP/RTCP协议详解
- RTSP:参照文章 RTSP协议详解
为方便以后查看,关注公众号:壹零仓,发送消息获取相关文章,比如:发送RTP,可获取RTP协议的介绍。
2 实时视频点播协议交互流程
本章节主要针对实时视频点播协议进行详细介绍,28181发起视频会话前,首先视频终端设备需要注册到国标平台,国标平台需要查询到设备的摄像头ID,根据摄像头ID发起视频会话,进行音视频传输。
本章节抓取的协议的实验环境如下:
- 视频终端设备:海康威视的IPC
- 国标平台:EasyGBS
有关国标平台EasyGBS的使用介绍,后面会单独出一篇文章进行介绍。
28181传输层支持TCP和UDP,视频申请支持主动模式和被动模式,本文主要以常用的UDP被动模式为例,说明交互流程,后续文章会详细介绍视频主被动模式以及基于TCP的传输。
2.1 设备注册
GB/T 28181协议介绍 的文章中已经介绍了设备注册流程,设备注册流程图如下:
- REGISTER不携带鉴权信息消息实例如下:
REGISTER sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 10.45.12.141:5060;rport;branch=z9hG4bK873415819
From: <sip:34020000001110000002@3402000000>;tag=292191181
To: <sip:34020000001110000002@3402000000>
Call-ID: 924327262
CSeq: 1 REGISTER
Contact: <sip:34020000001110000002@10.45.12.141:5060>
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
协议详解:
- 第1行:SIP消息的方法是REGISTER,34020000002000000001是国标服务器的国标ID,也就是EasyGBS端国标ID,具体国标ID的编码方法可以参考GB/T 28181—2022中的附录D。3402000000指的是国标服务器的域国标ID,SIP/2.0指的是SIP协议版本。
- 第2行:为Via头,Via头中包含了发送请求方的相关信息,SIP/2.0/UDP表示使用的是2.0版本的SIP协议,使用的传输协议是UDP,也可以使用TCP协议;10.45.12.141:5060为请求发送方的IP、port;Via头包含branch参数,不能重复,branch是一个事务ID(Transaction ID),用于区分同一个UA所发起的不同Transaction,遵循IETF RFC3261规范的实现;rport字段表示使用rport机制路由响应,详情见IETF RFC35818,一般为了nat穿越,内网IPC向公网国标平台注册时,需要带有此字段,此时国标服务器会把从请求的UDP包中获取发送方外网对应的IP和端口,在响应中返回给发送方。
- 第3行:From头,From头中包含了请求发送方的逻辑标识,在GB28181协议中是发送请求的设备国标ID和域名。tag参数是为了身份认证的,值为随机数。
- 第4行:To头,To头在SIP协议中是为了标明请求接收方的逻辑标识的,在GB28181协议中填写的是发送请求的设备国标ID和域名。
- 第5行:Call-ID头,Call-ID头是全局唯一的,在同一个session中保持一致,在不同session中不同。
- 第6行:CSeq头,CSeq头用于标识命令顺序,序号部分为无符号整数,最大值为2^31。序号起始值是随机的,后续在同一个session中依次递增。ACK和CANCLE中的CSeq需与INVITE中的Cseq保持一致。
- 第7行:Contact头,Contact头包含源的URI信息,用来给响应消息直接和源建立连接用。在GB28181协议中为SIP设备编码@源IP地址:端口。
- 第8行:Max-Forwards头,Max-Forwards头用于设置包最大中转次数,默认是70。
- 第9行:User-Agent头,User-Agent头用于设置关于UA的信息,用户可以自定义。
- 第10:Expires头,Expires头表示超时时间。
- 第11行:Content-Length头,Content-Length头表示消息体长度,无消息体赋值0。
- 认证失败响应消息实例如下:
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.45.12.141:5060;rport=5060;received=10.45.12.141;branch=z9hG4bK873415819
From: <sip:34020000001110000002@3402000000>;tag=292191181
To: <sip:34020000001110000002@3402000000>;tag=53631846
CSeq: 1 REGISTER
Call-ID: 924327262
User-Agent: EasyGBS v200511
Content-Length: 0
Contact: <sip:34020000002000000001@10.45.12.83:5061>
WWW-Authenticate: Digest realm="3402000000",nonce="29eb6d344c29a70a0997d173e937e693"
协议详解如下:
- 第1行:SIP/2.0 401 Unauthorized,表示认证失败。
- 第2行:Via头,因为请求带有rport,所以响应中带有rport和received,表示国标服务器通过udp包解析出来的发送端的PORT和IP分别赋值给rport和received。
- 第3行与第四行:与请求类似
- 第5行:CSeq头,与请求类似,表示服务端命令序列
- 第6行:Call-ID头,与请求一致
- 第7行:User-Agent头,与请求类似,表示服务端UA信息
- 第8行:Content-Length头,与请求类似,表示消息体长度
- 第9行:Contact头,与请求一致
- 第10行:WWW-Authenticate头,WWW-Authenticate头用于配置服务端支持的认证方式及认证参数,这里认证方式为digest。
- REGISTER带有鉴权信息消息实例如下:
REGISTER sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 10.45.12.141:5060;rport;branch=z9hG4bK864745657
From: <sip:34020000001110000002@3402000000>;tag=292191181
To: <sip:34020000001110000002@3402000000>
Call-ID: 924327262
CSeq: 2 REGISTER
Contact: <sip:34020000001110000002@10.45.12.141:5060>
Authorization: Digest username="34020000001110000002", realm="3402000000", nonce="29eb6d344c29a70a0997d173e937e693", uri="sip:34020000002000000001@3402000000", response="42b636f290984b1d796907c882e4d5a8", algorithm=MD5
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
这里相比第一次发送的REGISTER消息,多了Authorization字段,其字段内容为digest认证信息。
- 注册成功响应消息实例如下:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.45.12.141:5060;rport=5060;received=10.45.12.141;branch=z9hG4bK864745657
From: <sip:34020000001110000002@3402000000>;tag=292191181
To: <sip:34020000001110000002@3402000000>;tag=424631862
CSeq: 2 REGISTER
Call-ID: 924327262
User-Agent: Easy SIP Server
Content-Length: 0
Date: 2022-11-07T17:22:22.710
Expires: 3600
Contact: <sip:34020000002000000001@10.45.12.83:5061>
头字段解析同上文,这里不做过多描述。
2.2 设备保活
28181协议中规定了保活的消息类型:Keepalive,主要用于设备端向国标平台定时汇报设备状态,进而实现服务器与设备之间的心跳检测机制,一般当国标平台在两个心跳周期未接收到心跳,则认为设备出下线,所以为了保证设备与国标平台之间的正常通信,设备端需要定时向国标平台发送保活协议,协议流程如下:
- 保活消息实例如下:
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 10.45.12.141:5060;rport;branch=z9hG4bK999920179
From: <sip:34020000001110000002@3402000000>;tag=1336295153
To: <sip:34020000002000000001@3402000000>
Call-ID: 1577903431
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 164<?xml version="1.0" encoding="GB2312"?>
<Notify>
<CmdType>Keepalive</CmdType>
<SN>1822</SN>
<DeviceID>34020000001110000002</DeviceID>
<Status>OK</Status>
</Notify>
sip方法采用MESSAGE,sip头前文已经详细介绍了,这里针对消息体进行详解。
MESSAGE消息头中Content-type头为Content-type: Application/MANSCDP+xml,表示保活信息报送命令采用MANSCDP(监控报警联网系统控制描述协议,Monitoringand Alarming Network System Control Description Protocol)协议格式定义,消息体详细解释见GB/T28181-2022 A.2.5通知命令-状态信息报送部分,GB/T28181-2022可通过关注公众号:壹零仓,发送:协议规范,来获取。
- xml中Notify元素表示此消息是通知命令
- xml中CmdType表示命令类型,这里为Keepalive
- xml中的SN表示序列号
- xml中的DeviceID表示设备ID
- xml中的Status表示设备状态,这里为OK
- 保活消息响应实例如下:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.45.12.141:5060;rport=5060;received=10.45.12.141;branch=z9hG4bK999920179
From: <sip:34020000001110000002@3402000000>;tag=1336295153
To: <sip:34020000002000000001@3402000000>;tag=698636847
CSeq: 20 MESSAGE
Call-ID: 1577903431
User-Agent: Easy SIP Server
Content-Length: 0
2.3 视频播放
前文已经介绍了视频播放的协议流程,如下图所示:
- 视频播放请求INVITE实例如下:
INVITE sip:34020000001320000002@10.45.12.141:5060;transport=udp SIP/2.0
Via: SIP/2.0/UDP 10.45.12.83:5061;rport=5061;branch=z9hG4bK735682946
From: <sip:34020000002000000001@3402000000>;tag=671682946
To: <sip:34020000001320000002@10.45.12.141:5060>
Call-ID: 787682407
CSeq: 3 INVITE
Max-Forwards: 70
User-Agent: Easy SIP Server
Content-Length: 218
Content-Type: application/sdp
Contact: <sip:34020000002000000001@10.45.12.83:5061>
Subject: 34020000001320000002:0200000002,34020000002000000001:0v=0
o=34020000002000000001 0 0 IN IP4 10.45.12.83
s=Play
c=IN IP4 10.45.12.83
t=0 0
m=video 50000 RTP/AVP 96 98 97
a=recvonly
a=rtpmap:96 PS/90000
a=rtpmap:98 H264/90000
a=rtpmap:97 MPEG4/90000
y=0200000002
SIP方法为INVITE,消息体为SDP,这里对请求的SDP进行详细介绍:
- V表示协议版本,默认直接赋值0
- O表示会话所有者标识(originator and session identifier),
o=<用户名> <session id> <会话版本> <网络类型><地址类型> <地址>
,国标协议中,用户名为国标ID,这里为服务器ID,session id为0,会话版本为0,网络类型为IN,地址类型为IPv4,地址为服务器IP地址。 - S表示会话名称,
s=<session name> <session description>
,会话名称默认为Play,会话描述默认为空。 - C表示数据连接描述,
c=<networktype> <address type> <connection address>
,
网络类型为IN,地址类型为IPv4,地址为服务器IP地址。 - t表示会话活动时间,
t=<start time> <stop time>
,实时视频时都赋值为0。 - m表示媒体描述,描述媒体类型、接收媒体流端口、传输层协议、负载类型等,媒体类型采用video表示传输视频或音视频混合,采用audio表示纯音频;传输方式采用RTP/AVP表示采用RTP over UDP,采用TCP/RTP/AVP表示传输层协议采用RTP over TCP,本实例中表示申请的媒体类型为音视频/视频,接收媒体流的端口为50000,传输层协议为RTP over UDP,负载类型为96、98、97
- a表示媒体扩展属性,a=recvonly表示只接受媒体流,a=rtpmap表示rtp映射信息描述,这里a=rtpmap:96 PS/90000表示传输的PS流的payload为96,采样率为90000,a=rtpmap:98 H264/90000表示传输的H264流的payload为98,采样率为90000,a=rtpmap:97 MPEG4/90000表示传输的MPEG4流的payload为97,采样率为90000。
- y表示SSRC值,为十进制整数字符串,格式为:dddddddddd,第一位为0表示实时流,为1表示历史流,第2-6位为国标ID的4-8位,第7-10位作为流媒体同步信源表示。
28181中规定了SDP各字段的含义,具体可参照GB/T28181-2022 附录F。服务端发送INVITE携带的媒体信息,表示国标服务器支持的流媒体。
- INVITE响应消息实例:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.45.12.83:5061;rport=5061;branch=z9hG4bK735682946
From: <sip:34020000002000000001@3402000000>;tag=671682946
To: <sip:34020000001320000002@10.45.12.141:5060>;tag=140553725
Call-ID: 787682407
CSeq: 3 INVITE
Contact: <sip:34020000001110000002@10.45.12.141:5060>
Content-Type: application/sdp
User-Agent: IP Camera
Content-Length: 199v=0
o=34020000001110000002 261 261 IN IP4 10.45.12.141
s=Play
c=IN IP4 10.45.12.141
t=0 0
m=video 15060 RTP/AVP 96
a=setup:active
a=sendonly
a=rtpmap:96 PS/90000
a=filesize:0
y=0200000002
响应中的SDP描述的流媒体信息表示IPC支持的流媒体格式及传输方式,IPC响应的SDP中,包含了a=setup:active,这个字段只在TCP传输中起作用,UDP可以忽略,对于TCP传输,包含此字段表示IPC主动连接国标服务器,如果为a=setup:passive表示IPC端为被动模式,由国标服务器发起TCP连接。
通过SDP可以看出,IPC发送的是PS封装的实时流,payload为96,采用UDP的传输模式,发送流的源端端口为15060。国标协议支持最广泛的流媒体封装协议为PS,有关PS的详细介绍可关注公众号:壹零仓,发送:ps,获取相关文章。
- ACK消息实例:
ACK sip:34020000001320000002@10.45.12.141:5060;transport=udp SIP/2.0
Via: SIP/2.0/UDP 10.45.12.83:5061;rport=5061;branch=z9hG4bK672682961
From: <sip:34020000002000000001@3402000000>;tag=671682946
To: <sip:34020000001320000002@10.45.12.141:5060>;tag=140553725
Call-ID: 787682407
CSeq: 3 ACK
Max-Forwards: 70
User-Agent: Easy SIP Server
Content-Length: 0
SIP的ACK方法,通知IPC服务端已经准备好了,可以发送媒体流了。
- RTP/RTCP媒体流传输
通过视频会话可知,接下来IPC应该主动向国标服务器发送RTP流,RTP协议带的媒体流封装格式为PS,传输层协议为UDP,RTP源端地址为15060,目的端地址为50000,SSRC=0200000002,抓包协议实例如下:
从RTP解析上看,与视频会话交互的信息一致。
总结
GB/T28181协议经过多个版本的迭代,应用在音视频传输中,已经非常完善了,最新的协议版本已经支持TCP模式进行信令交互和音视频传输,还支持主被动模式,在跨网上也有很好的适应性。
关注公众号:壹零仓,发送:28181,获取更多28181文章。
相关文章:

GB/T28181流媒体相关协议详解
GB/T28181流媒体相关协议详解 文章目录 GB/T28181流媒体相关协议详解1 GB/T28181协议中使用的应用层协议介绍2 实时视频点播协议交互流程2.1 设备注册2.2 设备保活2.3 视频播放 总结 本文主要主要针对28181协议中视频流的部分,来阐述视频流通过28181协议如何进行视频…...
十进制转二进制的算法代码 ← Python
【算法分析】 本算法需要用到的Python知识点: 1.求余%,整除 //。例如,7%21,7//23,而7/23.5。 2.Python列表的 append 及 pop 函数。 • append(x) 函数用于将 x 添加到现有列表中。 • pop() 函数默认移除列表中…...

智慧垃圾站:AI视频智能识别技术助力智慧环保项目,以“智”替人强监管
一、背景分析 建设“技术先进、架构合理、开放智能、安全可靠”的智慧环保平台,整合环境相关的数据,对接已建业务系统,将环境相关数据进行统一管理,结合GIS技术进行监测、监控信息的展现和挖掘分析,实现业务数据的快速…...
LeetCode 面试题 16.07. 最大数值
文章目录 一、题目二、C# 题解 一、题目 编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。 示例: 输入: a 1, b 2 输出: 2 点击此处跳转题目。 二、C# 题解 找出最大的数,本质还是…...

PS 安装教程 2022版(全网最详细图文教程)
目录 一.简介 二.安装步骤 软件:PS版本:2022语言:简体中文大小:2.83G安装环境:Win10(1903)及以上版本,64位操作系统硬件要求:CPU2.0GHz 内存4G(或更高,不支…...
[Python] OSError: [E050] Can‘t find model ‘en_core_web_sm‘.
OSError: [E050] Can’t find model ‘en_core_web_sm’. It doesn’t seem to be a Python package or a valid path to a data directory. 下载模型 python -m spacy download en_core_web_sm加载模型 import spacy# 加载英语模型 nlp spacy.load("en_core_web_sm&q…...
集合总结(Java)
Collection 常用方法 package com.test01;import java.util.ArrayList; import java.util.Collection; /*添加元素---boolean add(E e);移除元素---boolean remove(Object c);判断元素是否存在---boolean contains(Object c);*/ public class S {public static void main(Str…...

【ONE·Linux || 网络基础(一)】
总言 主要内容:简述网络传输流程(TCP/IP五层模式概念认知,Mac地址、端口号、网络字节序等),演示socke套接字编程(UDP模式)。 文章目录 总言1、基础简述1.1、计算机网络背景1.2、认识网络协议&a…...

Day12力扣打卡
打卡记录 找出满足差值条件的下标 II(双指针维护最大最小) 链接 采用双指针保留间隔 indexDifference 进行遍历,求出慢指针对应一路遍历过来的最大值和最小值。 class Solution { public:vector<int> findIndices(vector<int>…...
SQL注入原理及思路(mysql)
数据库知识 mysql数据库 show database; #列出所有数据库 show tables; #列出所有表名 show columns from 表名; #列出表的列 select * from 表名 #查询数据库中某表的信息 select * from 表名 where 列xx #查询某表中符合列xx的信息 select * from 表名 order by 数字 #用于将…...

vue核心面试题汇总【查缺补漏】
给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 很喜欢‘万变不离其宗’这句话,希望在不断的思考和总结中找到Vue中的宗,来解答面试官抛出的…...

使用WebStorm创建和配置TypeScript项目
创建 这里我用的是WebStorm 2019.2.2版本 首先,创建一个空项目 File -> New -> Project->Empty Project生成配置文件 自动配置: 打开终端输入tsc --init,即可自动生成tsconfig.json文件 手动配置: 在项目根目录下新建一…...

vue源码分析(四)——vue 挂载($mount)的详细过程
文章目录 前言一、使用RuntimeCompiler解析$mount的原因二、$mount 解析的详细过程1.解析挂载的#app执行了vm.$mount2. 通过$mount方法执行以下文件的mount方法3. 执行util工具文件夹中的query方法4. 执行query方法后返回$mount方法判断el是否是body5. 判断!options.render&…...

真机环境配置教程
1.下载安装包 https://developers.google.com/android/images 2.刷机教程 Xposed精品连载 | 一篇文章彻底搞定安卓刷机与Root 3.配置root...
新电脑第一次重启后蓝屏
新电脑第一次重启后蓝屏 悲惨事故,远程参加插电第一次开机,按“FNShiftF10”启动cmd窗口输入oobe\bypassnro 回车重启跳过网络连接,设置一个用户名密码设置为空,不设密码确定,进入系统软件操作磁盘操作(磁盘…...

k8s statefulSet 学习笔记
文章目录 缩写: stsweb-sts.yaml创建sts扩缩容金丝雀发布OnDelete 删除时更新 缩写: sts 通过 kubectl api-resources 可以查到: NAMESHORTNAMESAPIVERSIONNAMESPACEDKINDstatefulsetsstsapps/v1trueStatefulSet web-sts.yaml apiVersion: v1 kind: Service met…...
gitlab 通过变量连接自建K8S
services:- docker:19.03.7-dind- golang:1.17.8-alpine3.15- docker:stable stages:- package- build and push docker image- deploy variables:KUBECONFIG: /etc/deploy/config build:tags:- k8simage: golang:1.17.8-alpine3.15stage: package# 只作用在main分支only:- mai…...
LuatOS-SOC接口文档(air780E)--mcu - 封装mcu一些特殊操作
常量 常量 类型 解释 mcu.UART number 外设类型-串口 mcu.I2C number 外设类型-I2C mcu.SPI number 外设类型-SPI mcu.PWM number 外设类型-PWM mcu.GPIO number 外设类型-GPIO mcu.I2S number 外设类型-I2S mcu.LCD number 外设类型-LCD mcu.CAM num…...

第14期 | GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…...

【数据结构】优先级队列
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 PriorityQueue 1. 什么是优先级队列…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...