Android 连接德佟打印机全实例+踩坑
文章目录
- 1. sdk下载
- 2. 开始开发
- 2.1 打印之前准备工作
- 2.2 打印机是否连接检测
- 2.3 打印框架设计
最近有个需求是要连接 德佟打印机 进行打印相关事宜, 现在就遇到的问题简单阐述一下。

1. sdk下载
我们首先需要在官网下载对应的SDK,地址为:https://www.detonger.com/#/sdk/detail?sdkID=16BC0F46-ACC4-4EBB-9340-47328936E779
下载之后,务必请仔细阅读它的文档:

最重要的是需要铭记,需要开启蓝牙开关和定位开关(GPS),谨记谨记!
2. 开始开发
因为已经开发上线了,所以我就把我踩过的坑用代码整理出来,供大家有类似需求的避坑:
2.1 打印之前准备工作
我的建议是,专门有个类来检测打印环境是否满足要求,不然环境不匹配,根本就打印不了,这是我目前碰到的一些问题,所以进行打印之前的预检测,目前就只检查了蓝牙和 GPS 状态,因为这是硬性条件。
public static Pair<Integer,String> checkPrintEnvironment(){//1. 蓝牙是否打开BluetoothManagerHelper managerHelper = new BluetoothManagerHelper(MyApp.getInstance());if (!managerHelper.isBluetoothEnabled()){return new Pair<>(-1,"请打开蓝牙");}//3. 蓝牙状态不可用if (!managerHelper.isBluetoothAvailable()){return new Pair<>(-2,"蓝牙状态不可用,请检查蓝牙设置");}//2. 蓝牙权限不可用if (!managerHelper.hasBluetoothPermission()){return new Pair<>(-3,"蓝牙权限异常,请开启相关权限");}//4. gps状态检查if (!GPSUtils.isOpen(MyApp.getInstance())){return new Pair<>(-4,"GPS未打开,请打开GPS");}//TODOreturn new Pair<>(0,"打印环境正常");}
2.2 打印机是否连接检测
在打印之前,我们需要监测是否存在打印机连接,如果没有,需要告之用户进行打印机连接:
List<IDzPrinter.PrinterAddress> allPrinterAddress = CustomPrintManager.getInstance().getAllPrinterAddress();
if (null == allPrinterAddress || allPrinterAddress.isEmpty()){return new Pair<>(false, "没有找到打印机");
}
2.3 打印框架设计
因为需求要求可能会打印多次,而且每次的打印任务可能不一样,有时候可能只打印文字,但有时候可能需要打印图片,那么我们就需要设计一套队列打印打印系统,而且每一次打印都是比较耗时和异步的,所以框架设计必须满足:
- 可同时多次提交多个打印任务,
- 打印任务可能都不一样
- 打印机按照任务提交的顺序进行打印(这里没有做优先级设计)
大概的流程图应该按照如下方式:

那么按照以上的逻辑,我们来进行设计打印框架:
首先需要定义一个在整个打印流程中,可以传递的接口, 这个接口贯穿了一次打印从开始到结束的整个事件,用于记录打印机的状态和可能发生的问题,我们便于进行管控
public interface PrintTaskDownCallback {/*** 打印任务发生改变状态*/void onPrintTaskDown(int status, String message);}
下面,我们就需要进行定义一个异步执行 Task,这个 Task 接口是将整个打印流程拆分成的最小单位。一个打印任务中可能存在连接任务
,多个绘制文字任务
和 多个绘制图片任务
,所以我们需要抽象出来:
public interface AsyncPrintTask {int CONNECT_TASK = 0;int PRINT_TASK = 1;void nextRun(PrintTaskDownCallback task);PrintLogicCallback getPrintLogicCallback();int getTaskType();}
这里的 PrintLogicCallback
主要是记录日志所用:
/*** 打印回调*/
public interface PrintLogicCallback {void onPrintLogicInfo(int taskType, int code, String msg);
}
现在,我们就需要定义最重要的打印队列了,采用 first in first out
原则,我们采用LinkedList
进行封装:
public class PrintTaskQueue {private final Queue<AsyncPrintTask> taskQueue = new LinkedList<>();private boolean isRunning = false;//提交任务public synchronized void submitTask(AsyncPrintTask... taskList) {if (taskList == null || taskList.length == 0) {return;}for (AsyncPrintTask task : taskList){taskQueue.offer(task);}if (!isRunning) {isRunning = true;runNextTask();}}private synchronized void runNextTask() {if (taskQueue.isEmpty()) {isRunning = false;return;}// 取出队列中的第一个任务AsyncPrintTask task = taskQueue.poll();if (task != null) {isRunning = true ;task.nextRun((status, message) -> {if (task.getPrintLogicCallback() != null) {task.getPrintLogicCallback().onPrintLogicInfo(task.getTaskType(), status, message);}if (task.getTaskType() == AsyncPrintTask.CONNECT_TASK) {// 连接任务完成后,继续执行下一个任务// 可以根据 status 判断连接完成runNextTask();} else {// 可以根据 status 判断当前任务是否完成runNextTask();}});}}public void clear(){taskQueue.clear();isRunning = false;}}
稍微解释一下主体的逻辑,例如存在三个任务:TaskA,TaskB 和 TaskC,现在的想法就是先把 TaskA,TaskB 和 TaskC 放入到队列中,然后先取出 TaskA,等 TaskA 执行完成,再去取 TaskB,等 TaskB 任务完成,再去取 TaskC,直接队列中数据为空,打印任务结束。那么以上的 PrintTaskQueue
就是该方式的实施。
现在,我们就可以实现相关的具体 Task 了。
比如,我们要先实现一个连接任务:
/*** 打印机连接任务*/
public class ConnectTaskImpl implements AsyncPrintTask{private final PrintLogicCallback printLogicCallback;public ConnectTaskImpl(PrintLogicCallback printLogicCallback) {this.printLogicCallback = printLogicCallback;}@Overridepublic void nextRun(PrintTaskDownCallback task) {//CustomPrintManager.getInstance().gotoConnectTask(task);//具体去连接打印机任务}@Overridepublic PrintLogicCallback getPrintLogicCallback() {return printLogicCallback;}@Overridepublic int getTaskType() {return CONNECT_TASK;}}
其次,现在要实现打印文字的任务:
public class AsyncPrintTextTaskImpl implements AsyncPrintTask{private final String content;private final PrintLogicCallback printLogicCallback;public AsyncPrintTaskImpl(String content, PrintLogicCallback printLogicCallback) {this.content = content;this.printLogicCallback = printLogicCallback;}@Overridepublic void nextRun(PrintTaskDownCallback task) {//CustomPrintManager.getInstance().gotoPrintText(tagEntity, task);}@Overridepublic PrintLogicCallback getPrintLogicCallback() {return printLogicCallback;}@Overridepublic int getTaskType() {return PRINT_TASK;}}
然后,我们可以定义一个打印图片的任务:
public class AsyncPrintImageTaskImpl implements AsyncPrintTask{private final Bitmap image;private final PrintLogicCallback printLogicCallback;public AsyncPrintQRTaskImpl(Bitmap image, PrintLogicCallback printLogicCallback) {this.image = image;this.printLogicCallback = printLogicCallback;}@Overridepublic void nextRun(PrintTaskDownCallback task) {//CustomPrintManager.getInstance().gotoImagePrint(image, task);}@Overridepublic PrintLogicCallback getPrintLogicCallback() {return printLogicCallback;}@Overridepublic int getTaskType() {return PRINT_TASK;}
}
现在,已经定义了各种任务的实现,我们整合起来,提交任务可以写成这样:
public class PrinterSDK {private static final PrinterSDK instance = new PrinterSDK();private final PrintTaskQueue taskQueue = new PrintTaskQueue();public static PrinterSDK getInstance(){return instance;}// 前期准备public Pair<Boolean,String> prepare(){Pair<Integer, String> environmentCheckResult = EnvironmentCheckUtils.checkPrintEnvironment();if (environmentCheckResult.first != 0){return new Pair<>(false, environmentCheckResult.second);}List<IDzPrinter.PrinterAddress> allPrinterAddress = CustomPrintManager.getInstance().getAllPrinterAddress();if (null == allPrinterAddress || allPrinterAddress.isEmpty()){return new Pair<>(false, "没有找到打印机");}CustomPrintManager.getInstance().preparePrint();return new Pair<>(true, "准备完成");}public void commitPrinterPrepare(){taskQueue.submitTask(new ConnectTaskImpl(null));}/*** 提交打印文字任务*/public void commitPrintText(String text,PrintLogicCallback callback){taskQueue.submitTask(new ConnectTaskImpl(callback),new AsyncPrintTextTaskImpl(entity,callback));}/*** 提交打印图片任务*/public void commitPrintImage(Bitmap bitmap, PrintLogicCallback callback){taskQueue.submitTask(new ConnectTaskImpl(callback),new AsyncPrintImageTaskImpl(bitmap,callback));}
现在,最重要的是CustomPrintManager
, 这个是类似底层,与打印机交互的底层语言了, 这里我就不贴了,基本上就是根据德佟
的 SDK 进行封装一下即可。
最后来贴一下成果:
图片 | 图片+ 文字 |
---|---|
![]() | ![]() |
相关文章:
Android 连接德佟打印机全实例+踩坑
文章目录 1. sdk下载2. 开始开发2.1 打印之前准备工作2.2 打印机是否连接检测2.3 打印框架设计 最近有个需求是要连接 德佟打印机 进行打印相关事宜, 现在就遇到的问题简单阐述一下。 1. sdk下载 我们首先需要在官网下载对应的SDK,地址为:https://www.d…...
TikTok 矩阵运营新手实操保姆级教程 2.0 版本
在当下这个全球化的数字浪潮中,TikTok 这片充满机遇的流量蓝海,正吸引着无数创业者和品牌方争相角逐。而要想在这激烈的竞争中脱颖而出,TikTok 矩阵运营无疑是至关重要的制胜法宝。今天,就给大家送上这份超实用的新手实操教程&…...
WordPress:Locoy.php火车头采集
<?php /* 模块参数列表: post_title 必选 标题 post_content 必选 内容 tag 可选 标签 post_category 可选 分类 post_date 可选 时间 post_excerpt 可选 摘要 post_author 可选 作者 category_description 可选 分类信息 post_cate_meta[name] 可选 自定义分…...
C++ 有哪些标准版本
目录 1.主要分为以下几个版本C98(ISO/IEC 14882:1998) 第一个国际标准C03(ISO/IEC 14882:2003)小幅度修订C11(ISO/IEC 14882:2011)一次重大更新C14(ISO/IEC 14882:2014)增量改进C17&…...
二、MySQL操作命令汇总
文章目录 二、MySQL操作命令汇总1.数据库操作2.表的增删改查2.1 查表2.2 建表给表添加注释假如表已经存在 2.3 删表2.4 查看表结构2.5 改表 3.简单查询3.1 查询单个字段3.2 查询多个字段3.3 查询所有字段3.4 查询结果去重3.5 查询结果排序3.6 查询结果限制条数3.7 查询分组结果…...
编程日志4.28
队列的链表表示代码 #include<iostream> #include<stdexcept> using namespace std; //队列 类的声明 template<typename T>//1.模板声明,表明Queue类是一个通用的模板类,可以用于存储任何类型的元素T class Queue {//2.Queue类的声…...
Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType)
Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType) Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType),用于控制信号发出后如何调用槽…...
Python案例实战《手势识别》
目录 1、效果图2、手势识别关键步骤(1) 导入必要的库(2)配置 MediaPipe(3)启动摄像头(4)设置手指张开判断的距离阈值(5)计算手指之间的欧几里得距离ÿ…...
NGINX `ngx_http_charset_module` 字符集声明与编码转换
一、模块定位与功能 ngx_http_charset_module 主要提供两大能力: 响应头声明:在 Content-Type 头部自动添加 ; charsetXXX,告知客户端所用字符集。单向编码转换:在 NGINX 层将一种单字节编码(如 koi8-r、windows-125…...
进程与线程详细介绍
目录 一 进程概念 二 进程的组成 2.1 PCB 2.2 数据段 2.3 程序段 三 进程的五大特点 四 进程的创建与销毁 五 线程概念 六 线程特征 七 进程与线程的区别与联系 区别 联系 一 进程概念 进程是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位…...
JAVA中ArrayList的解析
gogogo出发喽!让我们来认识一下它吧 什么是ArrayList Java 中的 ArrayList 是 Java 集合框架中的重要类,用于实现动态数组 动态数组:可按需自动扩展或缩小,无需手动管理数组大小。比如不断向 ArrayList 添加元素时,…...
【LLM+Code】Devin PromptTools详细解读
Devin 官网:https://devin.ai/ Prompt 大部分篇幅都是tools的直出的description和parameters的一些信息 其他的包含 Communicatework的一些指导Best PracticesInformation HandlingData SecurityResponse Limitationsplanthink You are Devin, a software engi…...
AI应用开发实战分享
一、前言 30年前的IntelWindows互相绑定,让世界被计算机技术重构了一次,有了程序员这个工种。十几年前iPhone、Android前后脚发布,智能手机和移动App互相绑定,引爆了一个长达十几年的移动互联网大跃进时代。而随着人工智能大模型…...
浅聊find_package命令的搜索模式(Search Modes)
背景 find_package应该算是我们使用最多的cmake命令了。但是它是如何找到上游库的.cmake文件的? 根据官方文档,整理下find_package涉及到的搜索模式。 搜索模式 find_package涉及到的搜索模式有两种:模块模式(Module mode)和配置模式(Conf…...
FPGA图像处理(二)-----彩色图像灰度化
由于fpga实现除法相对复杂,故将除法变为乘法再移位。因此每种方法对图像输入数据均分3步进行,极其有效信号打三拍处理。 timescale 1ns / 1ps // // Description: 彩色图像灰度化 // module image_rgb2gray(input wire clk ,input wir…...
Ultralytics中的YOLODataset和BaseDataset
YOLODataset 和 BaseDataset 是 Ultralytics YOLO 框架中用于加载和处理数据集的两个关键类。 YOLODataset类(ultralytics/data/dataset.py)继承于 BaseDataset类(ultralytics/data/base.py) BaseDataset() BaseDataset 是一个…...
Mac 使用 Charles代理生成https服务
在Mac电脑上使用Charles软件通过代理生成HTTPS服务,让手机访问电脑的开发地址,可按以下步骤操作: 一、Charles软件设置 安装与启动Charles:从Charles官网下载并安装Charles软件,之后启动它。开启代理服务 点击菜单栏…...
【PostgreSQL】数据库主从库备份与高可用部署
文章目录 一、架构设计原理二、部署清单示例2.1 StatefulSet配置片段2.2 Service配置三、配置详解3.1 主节点postgresql.conf3.2 从节点配置四、初始化流程4.1 创建复制用户4.2 配置pg_hba.conf五、故障转移示例5.1 自动切换脚本5.2 手动提升从节点六、监控与维护6.1 关键监控指…...
ERP进销存系统源码,SaaS模式多租户ERP管理系统,SpringBoot、Vue、UniAPP技术框架
SaaS ERP管理系统源码,覆盖了整个生产企业所有部门的管理:采购、销售、仓库、生产、财务、质量、OA: ERP源码技术架构:SpringBootVueElementUIUniAPP ERP系统功能清单: 流程处理中心:待审批任务、已审批任…...
Decode rpc invocation failed: null -> DecodeableRpcInvocation
DecodeableRpcInvocation 异常情况解决方法 错误警告官方FAQ 异常情况 记录一下Dubbo调用异常 java.util.concurrent.ExecutionException: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2025-05-07 22:09:5…...
VAE和Stable Diffusion的关系
文章目录 ✅ 简单回顾:什么是 VAE?🔄 Stable Diffusion 和 VAE 的关系:🎯 编码器:💥 解码器: 🤔 那 Stable Diffusion 本身是 VAE 吗?🧠 简要对比…...
stable Diffusion模型结构
详细描述一下stable Diffusion的推理过程 其实很简单 prompt先经过textencoder tokenizer,embedding 随机生成噪声图片 通过vae encode压缩成潜空间大小 unet with cross attn 去噪 并融合文本信息 # 上面两个信息如何混合 cross-attention sd模型中各种不同的采样器…...
Milvus(16):索引解释
索引是建立在数据之上的附加结构。其内部结构取决于所使用的近似近邻搜索算法。索引可以加快搜索速度,但在搜索过程中会产生额外的预处理时间、空间和 RAM。此外,使用索引通常会降低召回率(虽然影响可以忽略不计,但仍然很重要&…...
数字化转型-4A架构之应用架构
系列文章 数字化转型-4A架构(业务架构、应用架构、数据架构、技术架构)数字化转型-4A架构之业务架构 前言 应用架构AA(Application Architecture)是规划支撑业务的核心系统与功能模块,实现端到端协同。 一、什么是应…...
中间件-RocketMQ
RocketMQ 基本架构消息模型消费者消费消息模式顺序消息机制延迟消息批量消息事务消息消息重试最佳实践 基本架构 nameServer: 维护broker列表信息,客户端连接时只需要连接nameServer。可配置成集群。 broker:broker分为master和slave,master负…...
AI开发playwright tool提示词
[TASK] 生成一个isModuleElementObject function,若element的qa-test class在对象moduleObj {"qa-test-mycourses-course": "qa-test-mycourses-course-title", "qa-test-discussion-module": "qa-test-discussion-description&…...
《Origin画百图》之带显著性标记的多因子分组柱状图
带显著性标记的多因子分组柱状图 需要数据: 组1(大类) 组2(小类) Y数据 Y误差 选中Y数据和Y误差两列数据, 点击绘图--分组图--多因子分组柱状图 数据列就是上一步选择的Y和Y误差, 点击子组…...
邮件发送频率如何设置?尊重文化差异是关键!
一、不同文化背景,邮件频率大不同 1.工作习惯不一样 一些西方国家,美国和欧洲工作时间和个人时间分得很清楚。工作日的上午 9 点到下午 5 点,这期间发邮件,收件人大概率会看也会回。但是在深夜或者周末发邮件容易让收件人觉得你…...
Python 识别图片上标点位置
Python识别图片上标点位置 要识别图片上的标点位置,可以使用Python中的OpenCV库。以下是几种常见的方法: 方法一:使用颜色阈值识别 import cv2 import numpy as np# 读取图片 image cv2.imread(image.jpg)# 转换为HSV颜色空间 hsv cv2.c…...
JDK Version Manager (JVMS)
以下是使用 JDK Version Manager (JVMS) 工具在Windows系统中安装JDK的详细步骤及注意事项,结合多篇搜索结果整理而成: --- 一、安装前准备 1. 下载JVMS - 访问 [GitHub Releases页面](https://github.com/ystyle/jvms/releases) 或镜像地址&#x…...
办公学习 效率提升 超级PDF处理软件 转换批量 本地处理
各位办公小能手们!我跟你们说啊,有个软件叫超级PDF,那可真是PDF文件处理界的全能选手,专门解决咱们办公、学习时文档管理的各种难题。接下来我给大家好好唠唠它的厉害之处。 先说说它的核心功能。第一是格式转换,这软件…...
阿里云服务器-centos部署定时同步数据库数据-dbswitch
前言: 本文章介绍通过dbswitch工具实现2个mysql数据库之间实现自动同步数据。 应用场景:公司要求实现正式环境数据库数据自动冷备 dbswitch依赖环境:git ,maven,jdk 方式一: 不需要在服务器中安装git和maven,直接用…...
C++函数栈帧详解
函数栈帧的创建和销毁 在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体取决于编译器的实现! 且需要注意的是,越高级的编译器越不容易观察到函数栈帧的内部的实现; 关于函数栈帧的维护这里我们要重点介…...
Wireshark抓账号密码
训练内容: 1. 安装Ethereal或者Wireshark,熟悉网络嗅探器的使用方法; 2. 实现浏览器与IIS服务器的ssl安全访问; 3. 利用网络嗅探器截获浏览器访问IIS服务器之间数据包,包括有ssl安全连接(https方式&am…...
【hot100】bug指南记录1
之前学了一阵C,还是更熟悉C的语法呀,转Java还有点不适应........ 这个系列纯纯记录自己刷题犯的愚蠢的错误......hhhh,我是人,one 愚蠢的码人...... 巩固巩固基础好吗?!编程菜鸟.......hhh,又…...
物联网从HomeAssistant开始
文章目录 一、在树梅派5上安装home-assistant二、接入米家1.对比下趋势2.手动安装插件3.配置方式 三、接入公牛1.手动安装插件2.配置方式 一、在树梅派5上安装home-assistant https://www.home-assistant.io/installation/ https://github.com/home-assistant/operating-syste…...
2025年渗透测试面试题总结-网络安全、Web安全、渗透测试笔试总结(一)(附回答)(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 网络安全、Web安全、渗透测试笔试总结(一) 1.什么是 WebShell? 2.什么是网络钓鱼? 3.你获取网络…...
C++ set和map系列(关联式容器)的介绍及使用
欢迎来到干货小仓库 "一个好汉三个帮,程序员同样如此" 1.关联式容器 STL中的容器分为两类,序列式容器和关联式容器。 序列式容器:例如STL库中的vector、list和deque、forward_list(C11)等,这些容器统称为序列式容器&…...
C#与Halcon联合编程
一、加载图片 导入并初始化 using HalconDotNet; ho_Image new HObject();需要在引用中导入 halcondotnet.dll 关联句柄 打开新窗口 //创建一个句柄变量 绑定winform 窗口 HTuple winfowFater this.pictureBox1.Handle; //打开新的窗口 HOperatorSet.SetWindowAttr(&qu…...
5.0.4 VisualStateManager(视觉状态管理器)使用说明
在 WPF 中,VisualStateManager(视觉状态管理器)是用于管理控件在不同状态下的外观变化的核心组件。它通过定义视觉状态(如按钮的默认、悬停、按下状态)和状态过渡动画,使控件在不同交互场景下动态切换样式,而无需重写整个控件模板。以下是其核心用法和示例: 1. 基本概…...
onenet连接微信小程序(mqtt协议)
一、关于mqtt协议 mqtt协议常用于物联网,是一种轻量级的消息推送协议。 其中有三个角色,Publisher设备(客户端)发布主题到服务器,其他的设备通过订阅主题,获取该主题下的消息,Publisher可以发…...
IT需求规格说明书,IT软件系统需求设计文档(DOC)
1 范围 1.1 系统概述 1.2 文档概述 1.3 术语及缩略语 2 引用文档 3 需求 3.1 要求的状态和方式 3.2 系统能力需求 3.3 系统外部接口需求 3.3.1 管理接口 3.3.2 业务接口 3.4 系统内部接口需求 3.5 系统内部数据需求 3.6 适应性需求 3.7 安全性需求 3.8 保密性需…...
探索 DevExpress:构建卓越应用的得力助手
探索 DevExpress:构建卓越应用的得力助手 在当今竞争激烈的软件开发领域,打造高效、美观且功能强大的应用程序是每个开发者的追求。而 DevExpress 作为一款备受瞩目的开发工具,为开发者们提供了实现这一目标的有力支持。在本专栏博客中&…...
康养休闲旅游住宿服务实训室:构建产教融合新标杆
随着健康中国战略的深入实施与银发经济市场的持续扩张,康养休闲旅游作为融合健康管理、文化体验与休闲度假的复合型产业,正迎来前所未有的发展机遇。北京凯禾瑞华科技有限公司依托其在智慧康养领域的技术积淀与产业洞察,创新推出“康养休闲旅…...
Python 程序设计教程:构建您的第一个计算器类
Python 程序设计教程:构建您的第一个计算器类 1. 引言:为什么要学习类? 面向对象编程 (Object-Oriented Programming, OOP) 是一种强大的编程范式,它通过将数据和操作数据的函数(方法)捆绑在一起来组织和结构化代码 1。类 (Class) 是 OOP 的核心概念,不仅在 Python 中…...
深入浅出理解常见的分布式ID解决方案
分布式ID在构建大规模分布式系统时扮演着至关重要的角色,主要用于确保在分布式环境中数据的唯一性和一致性。以下是分布式ID的几个主要作用: 确保唯一性:在分布式系统中,可能有成千上万个实例同时请求ID。分布式ID生成系统能保证即…...
mac 使用 Docker 安装向量数据库Milvus独立版的保姆级别教程
Milvus 特点:开源的云原生向量数据库,支持多种索引类型和GPU加速,能够在亿级向量规模下实现低延迟高吞吐。具有灵活的部署选项和强大的社区支持。 适用场景:适合处理超大规模数据和高性能需求的应用,如图像搜索、推荐…...
Ubuntu日志文件清空的三种方式
清空Ubuntu日志文件可以通过三种方式: 使用命令行清空日志文件:可以使用以下命令清空特定日志文件,例如清空syslog文件: sudo truncate -s 0 /var/log/syslog使用编辑器清空日志文件:可以使用文本编辑器如Nano或Vi来…...
文章记单词 | 第68篇(六级)
一,单词释义 differentiate:英 [ˌdɪfəˈrenʃieɪt] 美 [ˌdɪfəˈrenʃieɪt] ,动词,意为 “区分;辨别;使有差别;使不同;表明… 间的差别;构成… 间差别的原因”。…...
Postman最佳平替, API测试工具Bruno实用教程(一):基础篇
序言 在前文【github星标超3万!Postman最强平替Bruno你用了吗?】中,我们介绍了目前目前Github上广受关注的新锐接口测试工具Bruno,给厌倦了Postman必须在线使用限制的同学提供了一个很好的替代选择。 Bruno的核心优势,官网重点给出了如下几点: 承诺开源和可扩展,并且专…...