对讲机使用手册
本文介绍对讲机使用基本方式
要让两台对讲机能够收发音频信息,很简单:让两台对讲机处于同一频率 + 相同亚音设置即可。频率不用多说了,说一下亚音。亚音就是设备密码,双方都不设置,可以通信,但有可能别人乱入。双方如果设置成一样的,也可以通信,且不会有第三方乱入。宝峰 UV-5R 系列的对讲机,菜单 11 = R-CTCSS(接收亚音),菜单 13 = T-CTCSS(发射亚音)。
一般市面上的对讲机,都会有a/b两个通道,本质相当于可以同时和两个不同的频段的人沟通,仅此而已。
信道模式、频率模式。简单说频率模式(VFO)= 手动输号码,改完马上生效,不用存。信道模式(MR)= 存好的通讯录,把常用频率存进频道,下次一键切。对于通话本身没毛线问题。
好了,你已经知道怎么玩了,散花。
webrtc技术详解
本文将详细研究webrtc的相关技术,最后以一个点对点的视频通话demo散花。webrtc核心模块
MediaStream(媒体流模块):负责捕获摄像头、麦克风的音视频数据,生成媒体流,提供媒体轨道的添加、移除、切换等基础操作。
RTCPeerConnection(对等连接模块):核心模块,负责建立、管理两个端之间的音视频连接,处理 ICE 协商、SDP 交换,实现音视频数据的实时传输与解码。
RTCDataChannel(数据通道模块):辅助模块,用于传输非音视频数据(如实时消息、文件),实现端到端的数据交互。
工作流程
如上图所示,通信流程包含了四方玩家:两个peer、信令服务器及stun服务器。过程解释:
第一步:发起方(peer1)创建RTCPeerConnection(配置STUN服务器),加入本地音视频流,然后创建Offer,发给接收方(peer2);
第二步:接收方(peer2)收到Offer,设置远程描述,然后创建Answer,回传给发起方(peer1);
第三步:双方在完成Offer/Answer协商后,才会向STUN服务器请求自己的公网IP+端口(生 ...
调用栈溢出详解
本文主要结合实例,介绍下调用栈溢出的问题,即对应解决方案规则:Chrome/V8 引擎的调用栈上限约 10000 层,超过后直接抛出 Maximum call stack size exceeded 错误;代码终止执行,无法继续递归。
实例解释:let stackCount = 0; // 记录递归层数
// 同步递归函数(无终止条件,会无限递归)
function recursiveFunc() {
stackCount++;
recursiveFunc(); // 函数最后一步又调用自己 → 同步递归
}
// 捕获栈溢出错误
try {
recursiveFunc();
} catch (error) {
console.log('递归层数:', stackCount); // Chrome中约 10000 层
console.log('错误信息:', error.message); // "Maximum call stack size exceeded"
}
控制台报错:
原因解释 ...
Cesium系列:概览
本文作为cesium系列的第一回,主要介绍些基础的且尽可能全面地内容。坐标系地心为原点,x:坐标点在地球质心到本初子午线(0° 经度)、赤道平面的投影距离(米)y:坐标点在地球质心到东经 90°、赤道平面的投影距离(米)z:坐标点到地球赤道平面的垂直距离(米)
Entity 和 PrimitiveEntity的底层就是Primitive,可以理解为房子和瓦片的关系。创建一个cube,可以用entity,也可以用Primitive。但是,如果上量的时候,性能优化的方案之一就是Primitive,示例代码如下所示。
// 【Entity 示例】单一点/少量点快速创建,封装完整,一行配置即可带样式/描述
// 适合:标记点、简单动画,开发效率优先(内部自动生成Primitive)
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(116.3972, 39.9075, 100),
point: { color: Cesium.Color.RED, pixelSize: 10 } ...
Mysql的问题及对策
最近在整一个rag的项目,数据库用的mysql,频繁报错“Too many connections”。本文会根据项目本身的架构,结合问题,介绍具体方案
3d点云项目性能测试
最近整了个点云的项目,遇到些性能问题。本文将会针对这些问题,给出一些小技巧。在平台上,选择本地的ply点云数据文件展示。效果如下:发现18MB大小的点云文件,耗时2s+,过长,不能忍,优化之。
算法改进整体的逻辑:读取文件内容、逐行读取点数据、整理x、y、z、r、g、b,然后threejs渲染显示。现阶段代码:
// 原始实现
for (let i = 0; i < lines.length; i++) {
const line = lines[i].trim();
if (!line) continue;
const parts = line.split(/\s+/);
if (parts.length >= 6) {
const x = parseFloat(parts[0]);
const y = parseFloat(parts[1]);
const z = parseFloat(parts[2]);
const r = parseInt(parts[3], 10);
const g = par ...
借助AI的能力,实现本地知识库(非工具版)
本文介绍上一篇文章中,我们借助cherry stdio,实现了一个纯个人vip定制的本地向量知识库,本文中,我们将通过完整的前端后端搭建 + 大模型,实现该需求。
总体实现逻辑及技术选型后端:Python 3.8+前端: React 18、Aceternity UI、Framer MotionAI模型:
嵌入模型: all-MiniLM-L6-v2 (384维向量),将问题的文本分割成向量,寻找匹配的答案
推理模型: gemma3:4b (Ollama本地部署),分析结果并用人话返回answer
模型工作流程
根据语料库文档,使用嵌入模型切分成块,生成语料库
文档输入 → 嵌入模型 → FAISS向量索引 → 语义搜索 → 获取相关结果片段 → 推理模型 → 输出结果
最终界面演示
注意,其中用到的模型all-MiniLM-L6-v2和 gemma3:4b,需要本地自行下载。代码详情见git地址
借助AI的能力,实现本地知识库(工具版)
本文将详细介绍,如何利用ai的能力,借助cherry stdio,实现一个离线的、纯个人的本地知识库明确目标目前主流的agent,如豆包、chatgpt等,基本逻辑:界面中,用户输入问题, loading…., 输出结果。我们要实现的也是这一套,只不过,大模型思考的过程中,所用到的资料,是我们自己的,而不是来自于网络。这里需要解释一点的是,模型也分成了很多种类。如bge-m3这种,属于嵌入模型,bec-reranker-base_v1,属于重排模型。这俩可以理解为拆分资料库用的。输入原始问题,通过这俩,定位到相关片段。有了相关片段,再通过如QAwen这种推理模型,归纳总结这些片段,然后以人话的形式,输出结果。
具体实现(以cherry studio为例)下载cherry stdio,绑定硅基流动具体自行百度,一波配置后,其基础界面如下:
创建知识库,投喂语料库创建知识库,配置各阶段的模型,然后上传你想要大模型解析的原始语料库。我本人又一直在维护一个个人的博客,所以我就直接把我遗忘写过的所有文章扔了进去。具体操作如下所示:
搭配推理模型,实现离线版、专为个人服务之agent
don ...
Transformation of Team Development Models
I’ve been using Cursor obsessively lately, which sparked some ideas so I want to share them hereConclusion first: with AI-assisted capability, one person becomes an entire team
The legacy development routinePRD + prototype + code
Product managers interview stakeholders, nail down requirements, and produce the PRD
Designers coordinate with product to deliver the UI prototype
Engineers align with product and design, clarify requirements, then schedule and start coding
This is the typical mainstr ...
