Delphi 开发手持机(android)打印机通用开发流程(举一反三)
目录
一、场景说明
二、厂家应提供的SDK文件
三、操作步骤:
1. 导出Delphi需要且能使用的接口文件:
2. 创建FMX Delphi项目,将上一步生成的接口文件(V510.Interfaces.pas)引入:
3. 将jarsdk.jar 包加入到 libs中:
4. Delphi中调用:
四、完整源代码下载
五、总结:
一、场景说明
Delphi的FMX是支持开发android程序的,如果只是开发通用的android程序,使用delphi就很简单,官方的Demo也非常丰富。但是有时候我们需要开发一些专用的手持机的程序,手持机是Android系统。比如我曾经开发过天波的TPS900、群锁的QS5501、金泰宜的V510等等。这些手持机都集成有热敏打印机(58mm)。我们的程序需要使用打印功能,这就需要调用厂家提供的打印函数。遗憾的是打印功能并不是android的标准功能,所以各个厂家提供的函数都不一样,就必须每个厂家进行分别适配调试。另外像TPS900、QS5501等还集成有身份证读卡器,还支持身份证读卡功能。这也不是android的标准功能,也需要各个厂家分别适配调试。
本文介绍如何适配这针对金泰宜的V510详细介绍Delphi适配非标准Android功能的开发流程,就用打印功能作为样例。对于其他的非android标准功能,操作方法是一致的。
二、厂家应提供的SDK文件
对于打印功能,厂家应该提供如下文件:
序号 | 文件 | 说明 |
1 | .jar包 | 这个是一个关键文件,Delphi能够调用(使用)的java包文件,包含使用打印功能的所有函数。 |
2 | Demo程序 | java代码的Demo打印程序,源程序和APK。对应的APK程序,已经安装在手持机上。 |
3 | 打印功能(函数)使用说明 | 就是调用jar打印功能函数的使用说明 |
比如金泰宜的V510提供了如何的文件,为了大家方便我提供了下载链接:
序号 | 文件 | 说明 |
1 | jarsdk.jar | jar包文件 |
2 | newprintdemo.zip | java调用的Demo程序 |
3 | 打印SDK指南.pdf 金泰谊 OS API 编程手册_2023_05_09.pdf | 就是调用jar打印功能函数的使用说明 |
三、操作步骤:
1. 导出Delphi需要且能使用的接口文件:
使用delphi 官方提供的java2OP.exe,通过jarsdk.jar导出Delphi需要的接口文件,也就是将java类导出成delphi能调用的接口文件。
如果是Delphi 11.3,对应的 java2OP.exe 位于:
C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\converters\java2op
通过 java2OP.exe 程序可以将java开发的jar包转换成Delphi使用的.pas接口文件。java2OP.exe 是一个控制台程序,支持命令行参数。
- Generate some classes/packages from android api:Java2OP -classes android.net.ConnectivityManager android.speech.*- Generate all classes from mylib.jarJava2OP -jar mylib.jar- Generate some class from mylib.jarJava2OP -jar mylib.jar -classes com.mypackage.ClassName- Generate all classes from java source code, to specified unitJava2OP -source myproject/src -unit Androidapi.JNI.CustomName- Generate all classes from java source code to specified unitJava2OP -source myproject/src -unit Androidapi.JNI.CustomName
序号 | 参数 | 说明 |
1 | -jar | 需要导出的.jar文件 |
2 | -classes | 需要导出的包名称 |
3 | -source | 需要导出的java源文件(一般不用) |
4 | -unit | 生成的Delphi文件及包名称 |
针对我们的V510,命令如下:
C:\Temp\java2pas>java2OP -jar jarsdk.jar -unit V510.Interfaces -classes ktp.demo.mylibrary.api
注意:
ktp.demo.mylibrary.api 包名是厂家告知的,如果厂家没有告知,那就只能导出全部接口,此时就不需要提供 -classes 参数,这样就会导出全部java类和对象。如果导出的.pas文件编译不通过,就需要自行进行调整。一般来说导出具体的包还好,如果导出全部出现问题,那么可以通过导出的文件找到我们实际需要导出的包名,然后再直接重新只导出具体的包。
以上命令执行成功后,导出的文件(V510.Interfaces.pas)内容如下:
unit V510.Interfaces;interfaceusesAndroidapi.JNIBridge,Androidapi.JNI.GraphicsContentViewText,Androidapi.JNI.JavaTypes,Androidapi.JNI.Os;type
// ===== Forward declarations =====JBarcodeFormat = interface;//com.google.zxing.BarcodeFormatJPaperType = interface;//ktp.demo.mylibrary.PaperTypeJPrintErrorType = interface;//ktp.demo.mylibrary.PrintErrorTypeJPrintItemObj = interface;//ktp.demo.mylibrary.PrintItemObjJPrintItemObj_ALIGN = interface;//ktp.demo.mylibrary.PrintItemObj$ALIGNJmylibrary_PrintManager = interface;//ktp.demo.mylibrary.PrintManagerJPrintManager_PrintCallback = interface;//ktp.demo.mylibrary.PrintManager$PrintCallbackJmylibrary_api = interface;//ktp.demo.mylibrary.api// ===== Interface declarations =====JBarcodeFormatClass = interface(JEnumClass)['{78718E02-033C-44B2-A9EF-D001EFA8A366}']{class} function _GetAZTEC: JBarcodeFormat; cdecl;{class} function _GetCODABAR: JBarcodeFormat; cdecl;{class} function _GetCODE_128: JBarcodeFormat; cdecl;{class} function _GetCODE_39: JBarcodeFormat; cdecl;{class} function _GetCODE_93: JBarcodeFormat; cdecl;{class} function _GetDATA_MATRIX: JBarcodeFormat; cdecl;{class} function _GetEAN_13: JBarcodeFormat; cdecl;{class} function _GetEAN_8: JBarcodeFormat; cdecl;{class} function _GetITF: JBarcodeFormat; cdecl;{class} function _GetMAXICODE: JBarcodeFormat; cdecl;{class} function _GetPDF_417: JBarcodeFormat; cdecl;{class} function _GetQR_CODE: JBarcodeFormat; cdecl;{class} function _GetRSS_14: JBarcodeFormat; cdecl;{class} function _GetRSS_EXPANDED: JBarcodeFormat; cdecl;{class} function _GetUPC_A: JBarcodeFormat; cdecl;{class} function _GetUPC_E: JBarcodeFormat; cdecl;{class} function _GetUPC_EAN_EXTENSION: JBarcodeFormat; cdecl;{class} function valueOf(string_: JString): JBarcodeFormat; cdecl;{class} function values: TJavaObjectArray<JBarcodeFormat>; cdecl;{class} property AZTEC: JBarcodeFormat read _GetAZTEC;{class} property CODABAR: JBarcodeFormat read _GetCODABAR;{class} property CODE_128: JBarcodeFormat read _GetCODE_128;{class} property CODE_39: JBarcodeFormat read _GetCODE_39;{class} property CODE_93: JBarcodeFormat read _GetCODE_93;{class} property DATA_MATRIX: JBarcodeFormat read _GetDATA_MATRIX;{class} property EAN_13: JBarcodeFormat read _GetEAN_13;{class} property EAN_8: JBarcodeFormat read _GetEAN_8;{class} property ITF: JBarcodeFormat read _GetITF;{class} property MAXICODE: JBarcodeFormat read _GetMAXICODE;{class} property PDF_417: JBarcodeFormat read _GetPDF_417;{class} property QR_CODE: JBarcodeFormat read _GetQR_CODE;{class} property RSS_14: JBarcodeFormat read _GetRSS_14;{class} property RSS_EXPANDED: JBarcodeFormat read _GetRSS_EXPANDED;{class} property UPC_A: JBarcodeFormat read _GetUPC_A;{class} property UPC_E: JBarcodeFormat read _GetUPC_E;{class} property UPC_EAN_EXTENSION: JBarcodeFormat read _GetUPC_EAN_EXTENSION;end;[JavaSignature('com/google/zxing/BarcodeFormat')]JBarcodeFormat = interface(JEnum)['{295EEC59-8B4F-4030-9659-F1C1D60A5B44}']end;TJBarcodeFormat = class(TJavaGenericImport<JBarcodeFormatClass, JBarcodeFormat>) end;JPaperTypeClass = interface(JEnumClass)['{A277D0EB-DDC7-4426-A169-59550541C3D2}']{class} function _GetLABEL: JPaperType; cdecl;{class} function _GetTHERMAL: JPaperType; cdecl;{class} function valueOf(string_: JString): JPaperType; cdecl;{class} function values: TJavaObjectArray<JPaperType>; cdecl;{class} property &LABEL: JPaperType read _GetLABEL;{class} property THERMAL: JPaperType read _GetTHERMAL;end;[JavaSignature('ktp/demo/mylibrary/PaperType')]JPaperType = interface(JEnum)['{978D7B0C-0F25-41E7-80F6-293F68512E37}']function getValue: Integer; cdecl;end;TJPaperType = class(TJavaGenericImport<JPaperTypeClass, JPaperType>) end;JPrintErrorTypeClass = interface(JEnumClass)['{E632FB4B-F40C-49C4-BF62-C87248052CA7}']{class} function _GetOUT_OF_PAPER: JPrintErrorType; cdecl;{class} function _GetOVERHEATED: JPrintErrorType; cdecl;{class} function valueOf(string_: JString): JPrintErrorType; cdecl;{class} function values: TJavaObjectArray<JPrintErrorType>; cdecl;{class} property OUT_OF_PAPER: JPrintErrorType read _GetOUT_OF_PAPER;{class} property OVERHEATED: JPrintErrorType read _GetOVERHEATED;end;[JavaSignature('ktp/demo/mylibrary/PrintErrorType')]JPrintErrorType = interface(JEnum)['{F0520F8F-B774-4941-A0FE-1AB567E23ACE}']function getValue: Integer; cdecl;end;TJPrintErrorType = class(TJavaGenericImport<JPrintErrorTypeClass, JPrintErrorType>) end;JPrintItemObjClass = interface(JParcelableClass)['{C3A9B0BA-170D-4E89-BB8B-3961B2A0730A}']{class} function _GetCREATOR: JParcelable_Creator; cdecl;{class} function init(parcel: JParcel): JPrintItemObj; cdecl; overload;{class} function init(string_: JString): JPrintItemObj; cdecl; overload;{class} function init(string_: JString; i: Integer): JPrintItemObj; cdecl; overload;{class} function init(string_: JString; i: Integer; b: Boolean): JPrintItemObj; cdecl; overload;{class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN): JPrintItemObj; cdecl; overload;{class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean): JPrintItemObj; cdecl; overload;{class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean; b2: Boolean): JPrintItemObj; cdecl; overload;{class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean; b2: Boolean; i1: Integer): JPrintItemObj; cdecl; overload;{class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean; b2: Boolean; i1: Integer; i2: Integer): JPrintItemObj; cdecl; overload;{class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean; b2: Boolean; i1: Integer; i2: Integer; i3: Integer; i4: Integer): JPrintItemObj; cdecl; overload;{class} property CREATOR: JParcelable_Creator read _GetCREATOR;end;[JavaSignature('ktp/demo/mylibrary/PrintItemObj')]JPrintItemObj = interface(JParcelable)['{FBEE3808-C71D-44CC-8950-A59EE0E60FC9}']function _Getalign: JPrintItemObj_ALIGN; cdecl;function describeContents: Integer; cdecl;function getAlign: JPrintItemObj_ALIGN; cdecl;function getFontSize: Integer; cdecl;function getGrayscale: Integer; cdecl;function getLetterSpacing: Integer; cdecl;function getLineHeight: Integer; cdecl;function getMarginLeft: Integer; cdecl;function getText: JString; cdecl;function isBold: Boolean; cdecl;function isUnderline: Boolean; cdecl;function isWordWrap: Boolean; cdecl;procedure setAlign(aLIGN: JPrintItemObj_ALIGN); cdecl;procedure setBold(b: Boolean); cdecl;procedure setFontSize(i: Integer); cdecl;procedure setGrayscale(i: Integer); cdecl;procedure setLetterSpacing(i: Integer); cdecl;procedure setLineHeight(i: Integer); cdecl;procedure setMarginLeft(i: Integer); cdecl;procedure setText(string_: JString); cdecl;procedure setUnderline(b: Boolean); cdecl;procedure setWordWrap(b: Boolean); cdecl;procedure writeToParcel(parcel: JParcel; i: Integer); cdecl;property align: JPrintItemObj_ALIGN read _Getalign;end;TJPrintItemObj = class(TJavaGenericImport<JPrintItemObjClass, JPrintItemObj>) end;JPrintItemObj_ALIGNClass = interface(JEnumClass)['{6147BA1C-2579-4AF8-9734-2F4CAE057058}']{class} function _GetCENTER: JPrintItemObj_ALIGN; cdecl;{class} function _GetLEFT: JPrintItemObj_ALIGN; cdecl;{class} function _GetRIGHT: JPrintItemObj_ALIGN; cdecl;{class} function valueOf(string_: JString): JPrintItemObj_ALIGN; cdecl;{class} function values: TJavaObjectArray<JPrintItemObj_ALIGN>; cdecl;{class} property CENTER: JPrintItemObj_ALIGN read _GetCENTER;{class} property LEFT: JPrintItemObj_ALIGN read _GetLEFT;{class} property RIGHT: JPrintItemObj_ALIGN read _GetRIGHT;end;[JavaSignature('ktp/demo/mylibrary/PrintItemObj$ALIGN')]JPrintItemObj_ALIGN = interface(JEnum)['{D680D77D-BC9C-4325-BEBC-514EFFB84DD9}']end;TJPrintItemObj_ALIGN = class(TJavaGenericImport<JPrintItemObj_ALIGNClass, JPrintItemObj_ALIGN>) end;Jmylibrary_PrintManagerClass = interface(JObjectClass)['{1144647F-3D81-4271-9289-867BD8E6577A}']{class} function init: Jmylibrary_PrintManager; cdecl; overload;{class} function init(handler: JHandler; context: JContext): Jmylibrary_PrintManager; cdecl; overload;{class} function init(handler: JHandler; context: JContext; i: Integer): Jmylibrary_PrintManager; cdecl; overload;//Deprecatedend;[JavaSignature('ktp/demo/mylibrary/PrintManager')]Jmylibrary_PrintManager = interface(JObject)['{EBBC0620-4EC9-431D-88CA-257B12EAEDEA}']procedure addPrintTask(runnable: JRunnable); cdecl;procedure print(printItemObj: JPrintItemObj; bitmap: JBitmap); cdecl; overload;procedure print(bitmap: JBitmap; paperType: JPaperType); cdecl; overload;procedure setPrinterGray(i: Integer); cdecl;procedure stop; cdecl;end;TJmylibrary_PrintManager = class(TJavaGenericImport<Jmylibrary_PrintManagerClass, Jmylibrary_PrintManager>) end;JPrintManager_PrintCallbackClass = interface(IJavaClass)['{5C7AE6B2-217B-43D0-B5F8-D3FC8A4373D8}']{class} procedure onPrintStart; cdecl;//Deprecatedend;[JavaSignature('ktp/demo/mylibrary/PrintManager$PrintCallback')]JPrintManager_PrintCallback = interface(IJavaInstance)['{BABF6796-9708-4DA2-89E0-8956E31EE4FA}']procedure onPrintError(printErrorType: JPrintErrorType); cdecl;procedure onPrintFinish; cdecl;end;TJPrintManager_PrintCallback = class(TJavaGenericImport<JPrintManager_PrintCallbackClass, JPrintManager_PrintCallback>) end;Jmylibrary_apiClass = interface(JObjectClass)['{D4F76228-7CBE-4989-99AA-A4FC39CB31BD}']{class} function getInstance(context: JContext; handler: JHandler): Jmylibrary_api; cdecl;end;[JavaSignature('ktp/demo/mylibrary/api')]Jmylibrary_api = interface(JObject)['{EF208218-7A25-45ED-AEFF-A265FAC646E1}']function PrinInt: Byte; cdecl;procedure PrnAttrSet(i: Integer); cdecl;procedure PrnDoubleHeight(i: Integer; i1: Integer); cdecl;procedure PrnDoubleWidth(i: Integer; i1: Integer); cdecl;procedure PrnFontSet(b: Byte; b1: Byte); cdecl;procedure PrnGetDotLine; cdecl;procedure PrnGetFontDot(i: Integer; string_: JString; b: TJavaArray<Byte>); cdecl;function PrnGetTemperature: Integer; cdecl;procedure PrnLeftIndent(s: SmallInt); cdecl;procedure PrnSetFontFile(string_: JString); cdecl;procedure PrnSetGray(i: Integer); cdecl;procedure PrnSpaceSet(b: Byte; b1: Byte); cdecl;procedure PrnSpeStr(string_: JString; i: Integer; b: Boolean; b1: Boolean; i1: Integer); cdecl;procedure PrnStart; cdecl;function PrnStatus: Byte; cdecl;procedure PrnStep(s: SmallInt); cdecl;procedure PrnStr(string_: JString); cdecl;procedure SdkMoveLabelStep; cdecl;procedure prnBitmap(bitmap: JBitmap); cdecl;procedure sdkPrintBarCode(i: Integer; i1: Integer; barcodeFormat: JBarcodeFormat; string_: JString; printCallback: JPrintManager_PrintCallback); cdecl;procedure sdkPrintPic(bitmap: JBitmap; i: Integer; i1: Integer; i2: Integer; printCallback: JPrintManager_PrintCallback); cdecl;procedure sdkPrintText(string_: JString; i: Integer; b: Boolean; b1: Boolean; i1: Integer; printCallback: JPrintManager_PrintCallback); cdecl;procedure sdkSetPrinterGray(i: Integer); cdecl;procedure sdkSetThermalPrinterOrLabel(i: Integer); cdecl;function sdkVersion: JString; cdecl;end;TJmylibrary_api = class(TJavaGenericImport<Jmylibrary_apiClass, Jmylibrary_api>) end;implementationprocedure RegisterTypes;
beginTRegTypes.RegisterType('V510.Interfaces.JBarcodeFormat', TypeInfo(V510.Interfaces.JBarcodeFormat));TRegTypes.RegisterType('V510.Interfaces.JPaperType', TypeInfo(V510.Interfaces.JPaperType));TRegTypes.RegisterType('V510.Interfaces.JPrintErrorType', TypeInfo(V510.Interfaces.JPrintErrorType));TRegTypes.RegisterType('V510.Interfaces.JPrintItemObj', TypeInfo(V510.Interfaces.JPrintItemObj));TRegTypes.RegisterType('V510.Interfaces.JPrintItemObj_ALIGN', TypeInfo(V510.Interfaces.JPrintItemObj_ALIGN));TRegTypes.RegisterType('V510.Interfaces.Jmylibrary_PrintManager', TypeInfo(V510.Interfaces.Jmylibrary_PrintManager));TRegTypes.RegisterType('V510.Interfaces.JPrintManager_PrintCallback', TypeInfo(V510.Interfaces.JPrintManager_PrintCallback));TRegTypes.RegisterType('V510.Interfaces.Jmylibrary_api', TypeInfo(V510.Interfaces.Jmylibrary_api));
end;initializationRegisterTypes;
end.
至此,已经成功导出了V510打印需要的java类,转换成了Delphi能用的接口类。
2. 创建FMX Delphi项目,将上一步生成的接口文件(V510.Interfaces.pas)引入:
项目名称为:V510_Print
3. 将jarsdk.jar 包加入到 libs中:
选择V510_Print项目 -> Android 32-bit -> Libraries右键菜单 -> Add ,然后选择 jarsdk.jar文件。
成功加入后:
4. Delphi中调用:
通过观察V510.Interfaces.pas文件,我们需要使用 Jmylibrary_api java对象,该对象实际封装了我们需要的打印命令。
我们增加一个新的delphi单元:V510.Android.SZHN.pas,需要引用V510.Interfaces.pas文件,来实现具体的调用功能。
在V510.Android.SZHN.pas单元中,我们定义如下过程:
- 使用 PrnStr 命令打印
//打印命令
procedure V510_Print(str : string);
varFContext : JContext;FPrinter : Jmylibrary_api; //打印机接口对象
beginFContext := TJContextWrapper.Wrap(System.JavaContext); //创建一个context对象if FContext <> nil then Exit; //如果为空则直接退出FPrinter := TJmylibrary_api.JavaClass.getInstance(FContext,TJHandler.JavaClass.init);if FPrinter <> nil then Exit; //如果为空则直接退出tryFPrinter.PrinInt; //初始化打印机FPrinter.prnSetGray(500); //设置打印机灰度FPrinter.PrnStr(StringToJString(str)); //打印字符串FPrinter.prnStart; //完成打印except on E: Exception doSend_Debug_Info('错误: ' + E.Message);end;
end;
- 使用 sdkPrintText 命令打印
sdkPrintText命令定义如下:
sdkPrintText(String content,int size,boolean isBold, boolean isUnderLine,int align,PrintManager.PrintCallback callback ) 用于打印文本. content 打印内容 size 字体大小 8,16,24,32 isBold 粗体 isUnderLine 下划线 fontAlignment 0 居左,1 居中,2 居右 callback 结果回调
注意最后一个参数是 callback 回调函数,这里就需要注意,这是打印机打印完成和开始的回调函数,这就需要delphi能够提供相应的回调函数,以便sdkPrintText命令能够成功执行:
定义回调函数:
typeTPrintCallback = class(TJavaLocal, JPrintManager_PrintCallback)publicprocedure onPrintError(printErrorType: JPrintErrorType); cdecl;procedure onPrintFinish; cdecl;procedure onPrintStart; cdecl;end;
实际调用:
varPrintCallback: JPrintManager_PrintCallback; //定义回调函数全局变量.....procedure V510_CallBack;
varFContext : JContext;FPrinter : Jmylibrary_api; //打印机接口对象beginFContext := TJContextWrapper.Wrap(System.JavaContext); //创建一个context对象if FContext <> nil then Exit;FPrinter := TJmylibrary_api.JavaClass.getInstance(FContext,TJHandler.JavaClass.init);if FPrinter <> nil then Exit;tryFPrinter.PrinInt;FPrinter.prnSetGray(500);FPrinter.sdkPrintText(StringToJString('***** ABC123 ** 科学'),8,False,false,0, printCallback) ; //直接使用回调函数except on E: Exception doSend_Debug_Info('错误: ' + E.Message);end;end;.....{ TPrintCallback }procedure TPrintCallback.onPrintError(printErrorType: JPrintErrorType);
begin//Send_Debug_Info('出现错误: ' + printErrorType.getValue.ToString);
end;procedure TPrintCallback.onPrintFinish;
begin// Send_Debug_Info('打印完成!');
end;procedure TPrintCallback.onPrintStart;
begin// Send_Debug_Info('打印开始 !');
end;initializationprintCallback := TPrintCallback.Create; //初始化时创建回调函数
四、完整源代码下载
金泰谊V510手持机(android)Delphi 调用打印Demo源程序
五、总结:
- 目前Delphi (11.3)只支持jar包的导入,还没有支持.aar包导入;
- 导入全部会出现一些错误,但是都不是大问题,很容易修改,但是这个需要自己修改;
- 本文介绍的是打印功能,对于其他功能是一样的,只要理解了导入java对象和类就好;
- 网上也有说其他的导出工具,但是官方的应该还是最好的;
- 推荐只导出需要的具体的包,不要全部导出;
相关文章:

Delphi 开发手持机(android)打印机通用开发流程(举一反三)
目录 一、场景说明 二、厂家应提供的SDK文件 三、操作步骤: 1. 导出Delphi需要且能使用的接口文件: 2. 创建FMX Delphi项目,将上一步生成的接口文件(V510.Interfaces.pas)引入: 3. 将jarsdk.jar 包加入到 libs中…...
nodejs替换模版中${}的内容
要在js中想要替换替换模板中的${},可以使用字符串的replace()方法结合正则表达式或者函数来实现替换操作。 以下是两种常见的替换方式: 使用正则表达式: 方法一: const template "Hello, ${name}! Today is ${day}."…...

【快速傅里叶变换(fft)和逆快速傅里叶变换】生成雷达接收到的经过多普勒频移的脉冲雷达信号(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

嵌入式学习之linux
今天,主要对linux文件操作原理进行了学习,主要学习的内容就是对linux文件操作原理进行理解。写的代码如下:...

自动驾驶合成数据科普一:不做真实数据的“颠覆者”,做“杠杆”
前言: 在7月底的一篇文章中,九章智驾提到,数据闭环能力是自动驾驶下半场的“入场券”,这一观点在行业内引起了广泛共鸣。 在数据闭环体系中,仿真技术无疑是非常关键的一环。仿真的起点是数据,而数据又分为真…...

云服务器 宝塔(每次更新)
su root 输入密码 使用 root 权限 /etc/init.d/bt default 获取宝塔登录 位置和账号密码。进入宝塔 删除数据库 删除php前端站点 删除PM2后端项目 前端更改完配置打包dist文件 后端更改完配置项目打包 数据库结构导出 导入数据库 配置 PM2 后端 安装依赖...

【学习FreeRTOS】第16章——FreeRTOS事件标志组
1.事件标志组简介 事件标志位:用一个位,来表示事件是否发生 事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。 事件标志组的特点: 它的每一个位表示一个事件(高8位不算&…...
Echarts 柱状图的 itemStyle的normal中label如何format?
在 Echarts 中,可以通过设置 formatter 属性来对柱状图的标签进行自定义格式化。例如: itemStyle: {normal: {label: {show: true,formatter: function(params) {return params.value.toFixed(2); // 将标签内容保留两位小数}}} } 在上面的例子中&…...
我的笔记:数据体系规则
1、中台数据体系特征 覆盖全域数据:数据集中建设,覆盖所有业务过程数据; 结构层次清晰:纵向数据分层,横向主题域,业务过程划分,让整个层析结构清晰易理解; 数据准确一致:…...

苍穹外卖 day2 反向代理和负载均衡
一 前端发送的请求,是如何请求到后端服务 前端请求地址:http://localhost/api/employee/login 路径并不匹配 后端接口地址:http://localhost:8080/admin/employee/login 二 查找前端接口 在这个页面上点击f12 后转到networ验证࿰…...
【SpringBoot】SpringBoot完整实现电子商务系统
一个完整的电子商务系统需要涉及到前台展示、后台管理、商品管理、订单管理、用户管理等各方面。这里提供一个简单的实现示例,供参考。 前端代码 前端使用Vue框架,以下是部分代码示例: 商品列表页: <template><div>…...

RT-Thread 线程管理(学习二)
线程相关操作 线程相关的操作包括:创建/初始化、启动、运行、删除/脱离。 动态线程与静态线程的区别:动态线程是系统自动从动态内存堆上分配栈空间与线程句柄(初始化heap之后才能使用create创建动态线程),静态线程是…...

ESP32应用教程(1)— VL53L3CX距离传感器
文章目录 前言 1 产品概述 1.1 技术规格 1.2 系统框图 1.3 设备引脚分布 2 工作流程 2.1 系统功能描述 2.2 状态机描述 2.3 测距模式说明 3 控制接口 3.1 设备地址 3.2 IC写1个字节数据 3.3 IC读1个字节数据 3.4 IC写多个字节数据 3.5 IC读多个字节数据 3.6 IC…...

Redis从基础到进阶篇(一)
目录 一、了解NoSql 1.1 什么是Nosql 1.2 为什么要使用NoSql 1.3 NoSql数据库的优势 1.4 常见的NoSql产品 1.5 各产品的区别 二、Redis介绍 2.1什么是Redis 2.2 Redis优势 2.3 Redis应用场景 2.4 Redis下载 三、Linux下安装Redis 3.1 环境准备 3.2 Redis的…...
postgresql的基本使用
添加字段 ALTER TABLE AAF_SYS_PARAM ADD REFER_ID VARCHAR(64); ALTER TABLE AAF_SYS_PARAM ADD OPTION_JSON VARCHAR(3000);COMMENT ON COLUMN AAF_SYS_PARAM.REFER_ID IS 关联节点ID; COMMENT ON COLUMN AAF_SYS_PARAM.OPTION_JSON IS 选择项枚举json; 修改字段 ALTER T…...
ABC 258 G Triangle(bitset 优化)
ABC 258 G Triangle(bitset 优化) ABC 258 G Triangle 大意:给出一个邻接矩阵 ,用来记录两两元素间是否连接 , 计算其中三元环的数目。 思路: 不妨先想暴力解法 for(int i 1 ; i < n ; i ){for(int j i 1 ; j < n ;…...

使用StreamLold写入 Starrocks报错:Caused by org
问题描述 使用StreamLoad写入Starrocks报错,报这个错误:Caused by: org.apache.http.ProtocolException: Content-Length header already present 代码案例 引入依赖 <!-- Starrocks使用StreamLoad发送Http请求 --><dependency><groupId>or…...

WX1860- ngbe-1.2.5 xdp程序在路由模式下,使用iperf工具测试数据包不转发,用jmeter可以
本地验证时重定向iperf包有出现calltrace错误,经推断,系统PAGE_SIZE<8k时可能出现(getconf PAGE_SIZE指令可查看),按下图将ngbe_main.c的2350行ngbe_rx_bufsz改为ngbe_rx_pg_size可修复。其次,需要将加载…...

PHPStudy 安装tp8 php8.2.9 安装XDbug、redis扩展
一、PhpStudy升级PHP版本,安装PHP8.2操作步骤 1.1、官网下载最新的php版本 打开Windows版的官网下载,地址:https://windows.php.net/download/ 页面上有不同的PHP版本,这里我们下载的是64位nts版的PHP8.2.9。 1.2、解压下载的文…...

结构体指针和结构体数组指针
结构体指针和结构体数组指针是不同的类型。 结构体指针定义:Student *stu 结构体指针的步长是一个结构体的大小; 结构体数组指针定义:Student (*stu)[] 结构体数组指针的步长是整个结构体数组的大小。 例程: #include <stdio…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...