当前位置: 首页 > news >正文

VX-3R APRS发射试验

VX-3R本身是不带APRS功能的,不过可能通过外加TNC实现APRS功能。
有大佬已经用Arduino实现了相应的发射功能:
https://github.com/handiko/Arduino-APRS
我要做的,就是简单修改一下代码,做一个转接板。
YEASU官方没有给出VX-3R的音频接口四节定义,估计是为了推销自家的CT-44,手册上只有这么一个图
在这里插入图片描述
在网上查了一圈,pinguide上有这么个图,然后提了一句“Pinouts for speaker and mic are reversed on the vx-3r”。但是经我实际验证,VX-3R的定义跟网站上是一样的,并没有reversed。
转接板原理图如下:
在这里插入图片描述
实物图如下:
在这里插入图片描述
值得注意的是,VX-3R的PTT是低电平发射。
完整的代码如下:

/**  Copyright (C) 2018 - Handiko Gesang - www.github.com/handiko*  *  This program is free software: you can redistribute it and/or modify*  it under the terms of the GNU General Public License as published by*  the Free Software Foundation, either version 3 of the License, or*  (at your option) any later version.*  *  This program is distributed in the hope that it will be useful,*  but WITHOUT ANY WARRANTY; without even the implied warranty of*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the*  GNU General Public License for more details.*  *  You should have received a copy of the GNU General Public License*  along with this program.  If not, see <https://www.gnu.org/licenses/>.*/
#include <math.h>
#include <stdio.h>// Defines the Square Wave Output Pin
#define OUT_PIN 2#define _1200   1
#define _2400   0#define _FLAG       0x7e
#define _CTRL_ID    0x03
#define _PID        0xf0
#define _DT_EXP     ','
#define _DT_STATUS  '>'
#define _DT_POS     '!'#define _NORMAL     1
#define _BEACON     2#define _FIXPOS         1
#define _STATUS         2
#define _FIXPOS_STATUS  3#define _PTT      5bool nada = _2400;/** SQUARE WAVE SIGNAL GENERATION* * baud_adj lets you to adjust or fine tune overall baud rate* by simultaneously adjust the 1200 Hz and 2400 Hz tone,* so that both tone would scales synchronously.* adj_1200 determined the 1200 hz tone adjustment.* tc1200 is the half of the 1200 Hz signal periods.* *      -------------------------                           -------*     |                         |                         |*     |                         |                         |*     |                         |                         |* ----                           -------------------------* *     |<------ tc1200 --------->|<------ tc1200 --------->|*     * adj_2400 determined the 2400 hz tone adjustment.* tc2400 is the half of the 2400 Hz signal periods.* *      ------------              ------------              -------*     |            |            |            |            |*     |            |            |            |            |            *     |            |            |            |            |* ----              ------------              ------------* *     |<--tc2400-->|<--tc2400-->|<--tc2400-->|<--tc2400-->|*     */
const float baud_adj = 0.975;
const float adj_1200 = 1.0 * baud_adj;
const float adj_2400 = 1.0 * baud_adj;
unsigned int tc1200 = (unsigned int)(0.5 * adj_1200 * 1000000.0 / 1200.0);
unsigned int tc2400 = (unsigned int)(0.5 * adj_2400 * 1000000.0 / 2400.0);/** This strings will be used to generate AFSK signals, over and over again.*/
const char *mycall = "BG7GF";
char myssid = 7;const char *dest = "APRS";
const char *dest_beacon = "BEACON";const char *digi = "WIDE2";
char digissid = 1;const char *mystatus = "Hello World, This is a simple Arduino APRS Transmitter !";const char *lat = "28XX.09N";
const char *lon = "112XX.62E";
const char sym_ovl = 'H';
const char sym_tab = 'a';unsigned int tx_delay = 5000;
unsigned int str_len = 400;char bit_stuff = 0;
unsigned short crc=0xffff;/** */
void set_nada_1200(void);
void set_nada_2400(void);
void set_nada(bool nada);void send_char_NRZI(unsigned char in_byte, bool enBitStuff);
void send_string_len(const char *in_string, int len);void calc_crc(bool in_bit);
void send_crc(void);void send_packet(char packet_type, char dest_type);
void send_flag(unsigned char flag_len);
void send_header(char msg_type);
void send_payload(char type);void set_io(void);
void print_code_version(void);
void print_debug(char type, char dest_type);/** */
void set_nada_1200(void)
{digitalWrite(OUT_PIN, HIGH);delayMicroseconds(tc1200);digitalWrite(OUT_PIN, LOW);delayMicroseconds(tc1200);
}void set_nada_2400(void)
{digitalWrite(OUT_PIN, HIGH);delayMicroseconds(tc2400);digitalWrite(OUT_PIN, LOW);delayMicroseconds(tc2400);digitalWrite(OUT_PIN, HIGH);delayMicroseconds(tc2400);digitalWrite(OUT_PIN, LOW);delayMicroseconds(tc2400);
}void set_nada(bool nada)
{if(nada)set_nada_1200();elseset_nada_2400();
}/** This function will calculate CRC-16 CCITT for the FCS (Frame Check Sequence)* as required for the HDLC frame validity check.* * Using 0x1021 as polynomial generator. The CRC registers are initialized with* 0xFFFF*/
void calc_crc(bool in_bit)
{unsigned short xor_in;xor_in = crc ^ in_bit;crc >>= 1;if(xor_in & 0x01)crc ^= 0x8408;
}void send_crc(void)
{unsigned char crc_lo = crc ^ 0xff;unsigned char crc_hi = (crc >> 8) ^ 0xff;send_char_NRZI(crc_lo, HIGH);send_char_NRZI(crc_hi, HIGH);
}void send_header(char msg_type)
{char temp;/** APRS AX.25 Header * ........................................................* |   DEST   |  SOURCE  |   DIGI   | CTRL FLD |    PID   |* --------------------------------------------------------* |  7 bytes |  7 bytes |  7 bytes |   0x03   |   0xf0   |* --------------------------------------------------------* * DEST   : 6 byte "callsign" + 1 byte ssid* SOURCE : 6 byte your callsign + 1 byte ssid* DIGI   : 6 byte "digi callsign" + 1 byte ssid* * ALL DEST, SOURCE, & DIGI are left shifted 1 bit, ASCII format.* DIGI ssid is left shifted 1 bit + 1* * CTRL FLD is 0x03 and not shifted.* PID is 0xf0 and not shifted.*//********* DEST ***********/if(msg_type == _NORMAL){temp = strlen(dest);for(int j=0; j<temp; j++)send_char_NRZI(dest[j] << 1, HIGH);}else if(msg_type == _BEACON){temp = strlen(dest_beacon);for(int j=0; j<temp; j++)send_char_NRZI(dest_beacon[j] << 1, HIGH);}if(temp < 6){for(int j=0; j<(6 - temp); j++)send_char_NRZI(' ' << 1, HIGH);}send_char_NRZI('0' << 1, HIGH);/********* SOURCE *********/temp = strlen(mycall);for(int j=0; j<temp; j++)send_char_NRZI(mycall[j] << 1, HIGH);if(temp < 6){for(int j=0; j<(6 - temp); j++)send_char_NRZI(' ' << 1, HIGH);}send_char_NRZI((myssid + '0') << 1, HIGH);/********* DIGI ***********/temp = strlen(digi);for(int j=0; j<temp; j++)send_char_NRZI(digi[j] << 1, HIGH);if(temp < 6){for(int j=0; j<(6 - temp); j++)send_char_NRZI(' ' << 1, HIGH);}send_char_NRZI(((digissid + '0') << 1) + 1, HIGH);/***** CTRL FLD & PID *****/send_char_NRZI(_CTRL_ID, HIGH);send_char_NRZI(_PID, HIGH);
}void send_payload(char type)
{/** APRS AX.25 Payloads* * TYPE : POSITION* ........................................................* |DATA TYPE |    LAT   |SYMB. OVL.|    LON   |SYMB. TBL.|* --------------------------------------------------------* |  1 byte  |  8 bytes |  1 byte  |  9 bytes |  1 byte  |* --------------------------------------------------------* * DATA TYPE  : !* LAT        : ddmm.ssN or ddmm.ssS* LON        : dddmm.ssE or dddmm.ssW* * * TYPE : STATUS* ..................................* |DATA TYPE |    STATUS TEXT      |* ----------------------------------* |  1 byte  |       N bytes       |* ----------------------------------* * DATA TYPE  : >* STATUS TEXT: Free form text* * * TYPE : POSITION & STATUS* ..............................................................................* |DATA TYPE |    LAT   |SYMB. OVL.|    LON   |SYMB. TBL.|    STATUS TEXT      |* ------------------------------------------------------------------------------* |  1 byte  |  8 bytes |  1 byte  |  9 bytes |  1 byte  |       N bytes       |* ------------------------------------------------------------------------------* * DATA TYPE  : !* LAT        : ddmm.ssN or ddmm.ssS* LON        : dddmm.ssE or dddmm.ssW* STATUS TEXT: Free form text* * * All of the data are sent in the form of ASCII Text, not shifted.* */if(type == _FIXPOS){send_char_NRZI(_DT_POS, HIGH);send_string_len(lat, strlen(lat));send_char_NRZI(sym_ovl, HIGH);send_string_len(lon, strlen(lon));send_char_NRZI(sym_tab, HIGH);}else if(type == _STATUS){send_char_NRZI(_DT_STATUS, HIGH);send_string_len(mystatus, strlen(mystatus));}else if(type == _FIXPOS_STATUS){send_char_NRZI(_DT_POS, HIGH);send_string_len(lat, strlen(lat));send_char_NRZI(sym_ovl, HIGH);send_string_len(lon, strlen(lon));send_char_NRZI(sym_tab, HIGH);send_char_NRZI(' ', HIGH);send_string_len(mystatus, strlen(mystatus));}
}/** This function will send one byte input and convert it* into AFSK signal one bit at a time LSB first.* * The encode which used is NRZI (Non Return to Zero, Inverted)* bit 1 : transmitted as no change in tone* bit 0 : transmitted as change in tone*/
void send_char_NRZI(unsigned char in_byte, bool enBitStuff)
{bool bits;for(int i = 0; i < 8; i++){bits = in_byte & 0x01;calc_crc(bits);if(bits){set_nada(nada);bit_stuff++;if((enBitStuff) && (bit_stuff == 5)){nada ^= 1;set_nada(nada);bit_stuff = 0;}}else{nada ^= 1;set_nada(nada);bit_stuff = 0;}in_byte >>= 1;}
}void send_string_len(const char *in_string, int len)
{for(int j=0; j<len; j++)send_char_NRZI(in_string[j], HIGH);
}void send_flag(unsigned char flag_len)
{for(int j=0; j<flag_len; j++)send_char_NRZI(_FLAG, LOW); 
}/** In this preliminary test, a packet is consists of FLAG(s) and PAYLOAD(s).* Standard APRS FLAG is 0x7e character sent over and over again as a packet* delimiter. In this example, 100 flags is used the preamble and 3 flags as* the postamble.*/
void send_packet(char packet_type, char dest_type)
{print_debug(packet_type, dest_type);digitalWrite(LED_BUILTIN, 1);digitalWrite(_PTT, LOW);/** AX25 FRAME* * ........................................................* |  FLAG(s) |  HEADER  | PAYLOAD  | FCS(CRC) |  FLAG(s) |* --------------------------------------------------------* |  N bytes | 22 bytes |  N bytes | 2 bytes  |  N bytes |* --------------------------------------------------------* * FLAG(s)  : 0x7e* HEADER   : see header* PAYLOAD  : 1 byte data type + N byte info* FCS      : 2 bytes calculated from HEADER + PAYLOAD*/send_flag(100);crc = 0xffff;send_header(dest_type);send_payload(packet_type);send_crc();send_flag(3);digitalWrite(_PTT, HIGH);digitalWrite(LED_BUILTIN, 0);
}/** Function to randomized the value of a variable with defined low and hi limit value.* Used to create random AFSK pulse length.*/
void randomize(unsigned int &var, unsigned int low, unsigned int high)
{var = random(low, high);
}/** */
void set_io(void)
{pinMode(LED_BUILTIN, OUTPUT);pinMode(OUT_PIN, OUTPUT);pinMode(_PTT, OUTPUT);digitalWrite(_PTT, HIGH);Serial.begin(115200);
}void print_code_version(void)
{Serial.println(" ");Serial.print("Sketch:   ");   Serial.println(__FILE__);Serial.print("Uploaded: ");   Serial.println(__DATE__);Serial.println(" ");Serial.println("Random String Pulsed AFSK Generator - Started \n");
}void print_debug(char type, char dest_type)
{/** PROTOCOL DEBUG.* * Will outputs the transmitted data to the serial monitor* in the form of TNC2 string format.* * MYCALL-N>APRS,DIGIn-N:<PAYLOAD STRING> <CR><LF>*//****** MYCALL ********/Serial.print(mycall);Serial.print('-');Serial.print(myssid, DEC);Serial.print('>');/******** DEST ********/if(dest_type == _NORMAL){Serial.print(dest);}else if(dest_type == _BEACON){Serial.print(dest_beacon);}Serial.print(',');/******** DIGI ********/Serial.print(digi);Serial.print('-');Serial.print(digissid, DEC);Serial.print(':');/******* PAYLOAD ******/if(type == _FIXPOS){Serial.print(_DT_POS);Serial.print(lat);Serial.print(sym_ovl);Serial.print(lon);Serial.print(sym_tab);}else if(type == _STATUS){Serial.print(_DT_STATUS);Serial.print(mystatus);}else if(type == _FIXPOS_STATUS){Serial.print(_DT_POS);Serial.print(lat);Serial.print(sym_ovl);Serial.print(lon);Serial.print(sym_tab);Serial.print(' ');Serial.print(mystatus);}Serial.println(' ');
}/** */
void setup()
{set_io();print_code_version();
}void loop()
{send_packet(random(1,4), random(1,3));delay(tx_delay);randomize(tx_delay, 10, 5000);randomize(str_len, 10, 420);
}

相关文章:

VX-3R APRS发射试验

VX-3R本身是不带APRS功能的&#xff0c;不过可能通过外加TNC实现APRS功能。 有大佬已经用Arduino实现了相应的发射功能&#xff1a; https://github.com/handiko/Arduino-APRS 我要做的&#xff0c;就是简单修改一下代码&#xff0c;做一个转接板。 YEASU官方没有给出VX-3R的音…...

JAVA毕业设计109—基于Java+Springboot+Vue的宿舍管理系统(源码+数据库)

基于JavaSpringbootVue的宿舍管理系统(源码数据库)109 一、系统介绍 本系统前后端分离 本系统分为学生、宿管、超级管理员三种角色 1、用户&#xff1a; 登录、我的宿舍、申请调宿、报修申请、水电费管理、卫生检查、个人信息修改。 2、宿管&#xff1a; 登录、用户管理…...

CMU/MIT/清华/Umass提出生成式机器人智能体RoboGen

文章目录 导读1. Introduction2. 论文地址3. 项目主页4. 开源地址5. RoboGen Pipeline6. Experimental Results作者介绍Reference 导读 CMU/MIT/清华/Umass提出的全球首个生成式机器人智能体RoboGen&#xff0c;可以无限生成数据&#xff0c;让机器人7*24小时永不停歇地训练。…...

STM32:AHT20温湿度传感器驱动程序开发

注&#xff1a;温湿度传感器AHT20数据手册.pdf http://www.aosong.com/userfiles/files/AHT20%E4%BA%A7%E5%93%81%E8%A7%84%E6%A0%BC%E4%B9%A6(%E4%B8%AD%E6%96%87%E7%89%88)%20B1.pdf 一、分析AHT数据手册文档 (1).准备工作 1.新建工程。配置UART2 2.配置I2C1为I2C标准模式&…...

【Linux】第七站:vim的使用以及配置

文章目录 一、vim1.vim的介绍2.vim基本使用3.vim的命令模式常用命令4.底行模式 二、vim的配置 一、vim 1.vim的介绍 vim编辑器&#xff0c;用来文本编写&#xff0c;可以写代码 它是一个多模式的编辑器 它有很多的模&#xff0c;不过我们暂时先只考虑这三种模式 命令模式插入模…...

汇编-算术运算符

下面给出了一些有效表达式和它们的值&#xff1a;...

线性代数 第六章 二次型

一、矩阵表示 称为二次型的秩。只含有变量的平方项&#xff0c;所有混合项系数全是零&#xff0c;称为标准形&#xff1b;平方项的系数为1、-1或0&#xff0c;称为规范形。 二次型的标准形不唯一&#xff0c;可以用不用的坐标变换化二次型为标准形&#xff1b;二次型的规范形唯…...

leetCode 213. 打家劫舍 II + 动态规划 + 从记忆化搜索到递推 + 空间优化

关于此题我的往期文章,动规五部曲详解篇&#xff1a; leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢&#xff1f;_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133409962213. 打家劫舍 II - 力扣&#x…...

网络编程套接字(二)

目录 简单的TCP网络程序服务端创建套接字服务端绑定服务端监听服务端获取连接服务端处理请求单执行流服务器的弊端 多进程版TCP网络程序捕捉SIGCHLD信号让孙子进程提供服务多线程版的TCP网络程序客户端创建套接字客户端链接服务器客户端发起请求 线程池版的TCP网络程序 简单的T…...

[极客大挑战 2019]Knife 1(两种解法)

题目环境&#xff1a; 这道题主要考察中国菜刀和中国蚁剑的使用方法 以及对PHP一句话木马的理解 咱们先了解一下PHP一句话木马&#xff0c;好吗&#xff1f; **eval($_POST["Syc"]);** **eval是PHP代码执行函数&#xff0c;**把字符串按照 PHP 代码来执行。 $_POST P…...

国家统计局教育部各级各类学历教育学生情况数据爬取

教育部数据爬取 1、数据来源2、爬取目标3、网页分析4、爬取与解析5、如何使用Excel打开CSV1、数据来源 国家统计局:http://www.stats.gov.cn/sj/ 教育部:http://www.moe.gov.cn/jyb_sjzl/ 数据来源:国家统计局教育部文献教育统计数据2021年全国基本情况(各级各类学历教育学…...

mysql、clickhouse时间日期加法

mysql 在’2023-10-27 23:59:59’上增加5秒&#xff1a; SELECT DATE_ADD(2023-10-27 23:59:59, INTERVAL 5 second);clickhouse SELECT date_add(SECOND, 3, toDate(2018-01-01 00:00:00));clickhouse时间按秒、分、时、日、月、年作差 按秒&#xff1a; SELECT dateDiff…...

21.合并两个有序链表

#include <iostream>struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {} };class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {ListNode dummy ListNode(-1); // 创建一个虚拟节点作为头节点ListNode* …...

thinkphp漏洞复现

thinkphp漏洞复现 ThinkPHP 2.x 任意代码执行漏洞Thinkphp5 5.0.22/5.1.29 远程代码执行ThinkPHP5 5.0.23 远程代码执行ThinkPHP5 SQL Injection Vulnerability && Sensitive Information Disclosure VulnerabilityThinkPHP Lang Local File Inclusion ThinkPHP 2.x 任…...

暴力递归转动态规划(十三)

题目 给定3个参数&#xff0c;N&#xff0c;M&#xff0c;K 怪兽有N滴血&#xff0c;等着英雄来砍自己 英雄每一次打击&#xff0c;都会让怪兽流失[0~M]的血量 到底流失多少&#xff1f;每一次在[0~M]上等概率的获得一个值 求K次打击之后&#xff0c;英雄把怪兽砍死的概率。 暴…...

java EE 进阶

java EE 主要是学框架(框架的使用,框架的原理) 框架可以说是实现了部分功能的半成品,还没装修的毛坯房,然后我们再自己打造成自己喜欢的成品 这里学习四个框架 : Spring ,Spring Boot, Spring MVC, Mybatis JavaEE 一定要多练习,才能学好 Maven 目前我们主要用的两个功能: …...

记录paddlepaddle-gpu安装

背景 由于最近需要使用paddleocr&#xff0c;因此需要安装依赖paddlepaddle-gpu&#xff0c;不管怎么安装cuda11.6-11.8安装了一遍&#xff0c;都无法正常安装成功。如下所示&#xff1a; 环境&#xff1a;wsl2linux18.04 >>> import paddle >>> paddle.u…...

django如何连接sqlite数据库?

目录 一、SQLite数据库简介 二、Django连接SQLite数据库 1、配置数据库 2、创建数据库表 三、使用Django ORM操作SQLite数据库 1、定义模型 2、创建对象 3、查询对象 总结 本文将深入探讨如何在Django框架中连接和使用SQLite数据库。我们将介绍SQLite数据库的特点&…...

面试算法47:二叉树剪枝

题目 一棵二叉树的所有节点的值要么是0要么是1&#xff0c;请剪除该二叉树中所有节点的值全都是0的子树。例如&#xff0c;在剪除图8.2&#xff08;a&#xff09;中二叉树中所有节点值都为0的子树之后的结果如图8.2&#xff08;b&#xff09;所示。 分析 下面总结什么样的节…...

云安全-云原生k8s攻击点(8080,6443,10250未授权攻击点)

0x00 k8s简介 k8s&#xff08;Kubernetes&#xff09; 是容器管理平台&#xff0c;用来管理容器化的应用&#xff0c;提供快速的容器调度、弹性伸缩等诸多功能&#xff0c;可以理解为容器云&#xff0c;不涉及到业务层面的开发。只要你的应用可以实现容器化&#xff0c;就可以部…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...