跳到主要内容

我需要平板吗?

· 阅读需 1 分钟
Quany
软件工程师

需求场景

  • 开会
  • 移动办公
  • 手写
实时编辑器
function Clock(props) {
  const [date, setDate] = useState(new Date());
  useEffect(() => {
    const timerID = setInterval(() => tick(), 1000);

    return function cleanup() {
      clearInterval(timerID);
    };
  });

  function tick() {
    setDate(new Date());
  }

  return (
    <div>
      <h2>It is {date.toLocaleTimeString()}.</h2>
    </div>
  );
}
结果
Loading...

微信公众号

降本增效之节省服务器资源

· 阅读需 2 分钟
Quany
软件工程师

服务器资源

前端集合服务器,部署小型应用

服务器IP地址

  • 10.3.3.215
  • 10.3.8.12

业务站点

xlm.vbill.cn

  • 构建目标:/home/app/nginx/html

https://xlm.vbill.cn/yhh/ 友好货

https://xlm.vbill.cn/card/doCard.html 办卡

https://xlm.vbill.cn/aboutus/aboutus.html 关于我们

https://xlm.vbill.cn/xlm-anniversary/index.html 开启我的荣耀之路

https://xlm.vbill.cn/xlm-events/reg/regist_first.html 注册鑫联盟

https://xlm.vbill.cn/wechatRegiter/regist_first.html 微信注册鑫联盟

https://xlm.vbill.cn/xlsuixing/about.html 工作-拉勾网

https://xlm.vbill.cn/yinqi/index.html 银企官网,没得到业务确认,待定

  • 移动端

    • ionic cordova 东西 cordova_plugins.js app www
  • locallib 有 mui 库,不知道那里引用

  • 域名资源

    • xlm.vbill.cn
    • xlm-sc.suixingpay.com
    • www.yinqironghe.com, yinqironghe.com
    • yhhy.yinqironghe.com: 无法访问

优化方案

鑫联盟App下载、活动页面

服务器IP地址

  • 18.10.80.123
  • 18.10.80.124

业务站点

免费云方案

  • 迁移服务资源文件
  • 域名指向

https://app.netlify.com/

微信公众号

牙医-智能体

· 阅读需 1 分钟
Quany
软件工程师

节省服务器资源

集中一台,不影响

云服务商

  • surge

扣子

内容生成

微信公众号

智能门锁

· 阅读需 8 分钟
Quany
软件工程师

那款只能门锁最好

根据2024年的智能门锁推荐和测评,以下是一些表现较好的智能门锁品牌和型号:

  1. 飞利浦301FVP:这款智能门锁以其高性价比受到推荐。它具备7种解锁方式,包括3D人脸识别技术,以及130°广角猫眼和3.5英寸室内高清大屏。这款门锁的人脸识别技术可以应对素颜、浓妆、戴帽子等多种情况,并且具有远程可视功能。价格方面,领券后大约在1999元左右,性价比很高。

  2. 飞利浦702FVP:作为飞利浦的旗舰款产品,这款智能门锁配置齐全,包括3D人脸识别、电子猫眼、高清大屏、远程可视等功能。它的智能猫眼视野范围达到165°,并且支持远程可视功能,适合对智能门锁有较高要求的用户。

  3. 凯迪仕K20 Pro Max:这款智能锁配置齐全,包括智能猫眼、高清室内大屏、远程可视通话、3D人脸识别等。虽然在测评中人脸识别开锁反应稍慢,但日常使用影响不大,适合对智能门锁功能有全面需求的用户。

  4. 德施曼V7Plus:这款智能锁在千元价位内提供了4200mAh大容量锂电池,续航超长,支持7种解锁方式,包括指纹、密码、手机APP、小程序等。它还支持手机互联,可以管理解锁信息和查看开锁记录等,适合预算有限但希望体验智能门锁便利性的用户。

  5. 小米全自动智能门锁Pro:这款智能门锁集合了门锁、门铃、摄像头三项功能,全自动开锁方式,关门自动上锁。它还具备230万像素的摄像头,可以清晰查看门外情况,并且支持米家多场景智能联动,适合有智能家居生态基础的用户。

  6. 华为智能门锁Pro:这款门锁在猫眼功能上表现出色,采用1080P高清分辨率摄像头,夜视效果好。如果你对猫眼功能有较高要求,可以考虑这款产品。

  7. 鹿客S50F全自动智能指纹锁:这款智能锁支持多种解锁方式,包括指纹、密码、蓝牙等,采用直插式C级全铜锁芯,安全性能高。它还具备双重报警设置,能够及时预警异常状态,适合追求高安全性的用户。

选择智能门锁时,除了考虑品牌和型号,还应该根据自己的需求和预算来决定。例如,如果你需要远程监控功能,那么选择带有智能猫眼和远程可视功能的门锁会更适合。如果你更注重性价比,那么飞利浦301FVP或德施曼V7Plus可能是更好的选择。

这些智能门锁的安全性如何?

智能门锁的安全性是用户非常关心的问题,以下是一些主流智能门锁品牌的安全性特点:

  1. 飞利浦智能门锁

    • 飞利浦DDL702-FVP-7HW采用雷达传感器,能够侦测门外异常逗留并推送告警信息,提升安全性 。
    • 具备防拆、系统锁定、徘徊逗留等安全告警功能,异常情况实时推送至手机 。
    • 室内面板设有4英寸LCD显示屏,方便查看来访客人及门外情况,无需另外安装传统猫眼 。
    • 支持多种解锁方式,包括指纹、密码、卡片、钥匙等,满足不同家庭成员的使用需求 。
  2. 凯迪仕K20 Pro Max

    • 拥有13重安全设计,包括3D人脸识别、可视猫眼等,提供全面的安全保障 。
    • 采用瑞典FPC半导体指纹识别技术,自带AI芯片,提高使用的快捷性与安全性 。
    • 支持临时密码功能,方便远程为访客开门 。
  3. 德施曼V7 Plus

    • 采用指纹识别技术,确保只有授权用户才能进入家门 。
    • 具有防撬报警功能,一旦有人试图非法闯入,系统会立即发出警报 。
    • 采用锂电池供电,绿色环保,且续航能力强 。
  4. 小米全自动智能门锁Pro

    • 采用C级直插式锁芯,是目前最高级别的锁芯,即使外面板被破坏也无法打开门锁 。
    • 锁舌采用一体化精铸不锈钢材质,耐用且安全 。
    • 支持多维半导体指纹识别,识别率较高,提供较高的安全性 。
  5. 华为智能门锁Pro

    • 采用软件级加密,Harmony TEE OS通过CC EAL5+级安全认证,保障人脸、指纹等关键隐私数据本地存储 。
    • 支持多种安全告警,如防错误试开报警、防撬报警、离家布防报警等 。
    • 采用直插式C级锁芯,有效防止暴力破坏 。
  6. 鹿客S50F全自动智能指纹锁

    • 支持米家APP联动,可以设置智能生活场景,提高家庭安全 。
    • 具备应急供电口,即使门锁没电也可以用移动电源临时供电开锁 。

总体来说,这些智能门锁品牌在安全性方面都有一定的保障,包括但不限于多种生物识别技术、防撬报警、临时密码功能、加密数据存储等。不过,消费者在选购时还应考虑自己的具体需求和预算,选择最适合自己的智能门锁产品。

微信公众号

Newland NSDK MDB开发指南

· 阅读需 6 分钟
Quany
软件工程师

修订表

  • 版本1.0,2023年8月31日,创建文档。
  • 版本1.1,2023年9月25日,更新“MDBFunctionCallBack”及其参数描述。
  • 版本1.2,2023年11月23日,增加第3章“事务流程”以介绍API调用流程。

Newland NSDK MDB开发指南 修订版 V1.2 福建新大陆支付技术有限公司 2023年11月

1. 引言 本文档旨在介绍NSDK MDB库的接口和所有参数。

2. 接口 2.1 初始化 MDBModule

  • 方法:void init()
  • 描述:初始化MDB模块库。在调用其他接口之前必须先调用此方法。
  • 异常:MDBException

2.2 设置MDB配置 MDBModule

  • 方法:void setMDBConfig(MDBConfiguration mdbConfiguration)
  • 参数:
    • mdbConfiguration:MDB配置数据,详情见下文“MDBConfiguration”。
  • 描述:设置MDB配置。可以使用“MDBConfiguration”对象一次性设置所有配置。
  • 异常:MDBException

MDBConfiguration 类定义了各种配置参数,包括无现金配置信息、国家代码、货币单位、小数位数、最大响应时间、是否支持退款、是否支持显示、是否支持多售货、是否支持现金销售等。

当然,这里是翻译的内容:

2.2 设置 MDB 配置

可以通过一个 MDBConfiguration 对象设置所有配置:

class MDBConfiguration {
/* 无现金配置信息,例如,目前仅支持 Level 01 */
byte featureLevel = (byte) 0x01; /* 表示读卡器的功能级别 */

byte countryCodeH = (byte) 0x18; /* 国家代码由 countryCodeH 和 countryCodeL 组成,左侧数字为 0 表示使用国际电话代码来表示国家。例如,美国代码是 00 01H(countryCodeH = 00 和 countryCodeL = 01)。 */

byte countryCodeL = (byte) 0x40; /* 左侧数字为 1 表示使用 ISO 4217 数字货币代码的最新版本。例如,美元代码为 18 40H(countryCodeH = 18 和 countryCodeL = 40)。 */

byte scaleFactor = (byte) 0x01; /* 用于缩放 VMC 和读卡器之间传输的所有货币值的乘数 */

byte decimalPlaces = (byte) 0x02; /* 用于通信货币值的小数位数 */

byte maxResponseTime = (byte) 0x1E; /* 应用程序最大响应时间(秒) */

byte refundSupport = (byte) 0x01; /* 表示读卡器是否支持退款 */

byte displaySupport = (byte) 0x01; /* 表示读卡器是否支持显示 */

byte multiVendSupport = 0; /* 表示读卡器是否支持多次销售 */

byte cashSaleSupport = 0; /* 表示读卡器是否支持现金销售 */

byte cashlessAddress = 0x10; /* 表示读卡器的地址,0x10 或 0x60 */

/* Level03 可选功能 */
byte fileTransLayerSupport = 0; /* 是否支持文件传输层 */

byte monetaryFormat = 0; /* 0 = 16 位货币格式(默认),1 = 32 位货币格式 */

byte multiCurrencySupport = 0; /* 支持多货币/多语言 */

byte negativeVendAllow = 0; /* 允许负销售 */

byte dataEntryAllow = 0; /* 允许数据输入 */

byte alwaysIdleAllow = (byte) 0x01; /* 允许“始终空闲”状态 */

/* 设备信息索引 */
byte[] manufactureCode = "NLD".getBytes(); /* 制造商代码 - ASCII - 最多 3 字节 */

byte[] serialNumber = null; /* 序列号 - ASCII - 12 字节 */

byte[] modelNumber = null; /* 型号 - ASCII - 12 字节 */

byte[] softwareVersion = null; /* 软件版本 - 打包的 BCD - 2 字节 */

/* 消息处理 */
int sessionIdleTimeout = 60;
int vendTimeout = 60;

/* 调试级别 */
int debug = 0;
......
}

以上是关于 MDBConfiguration 类的详细配置说明。

2.3 设置MDB回调 MDBModule

  • 方法:void setMDBCallback(MDBFunctionCallBack mdbCallback)
  • 参数:
    • mdbCallback:要设置到MDB模块的函数回调,之后在接收到相应指令时将触发这些回调。
  • 描述:设置MDB函数回调到库中,可以使用这些回调执行详细操作。
  • 异常:MDBException

MDBFunctionCallBack 接口定义了一系列回调方法,包括重置、设置MCU配置信息、获取价格信息、启用和禁用读卡器、请求售货进度、取消售货、售货成功、售货失败、售货超时、会话完成、现金销售、请求充值、协商最大退款金额、获取VMC信息、启用L3特性等。

2.4 执行MDB MDBModule

  • 方法:void perform()
  • 描述:执行MDB直到调用“停止”。

2.5 停止MDB MDBModule

  • 方法:void stop()
  • 描述:停止事务并释放事务线程。

2.6 获取MDB设备信息 MDBModule

  • 方法:byte[] getMDBDeviceInfo(MDBDeviceInfoType infoType)
  • 参数:
    • infoType:MDB设备信息的类型,详情见下文。
  • 描述:通过输入的类型获取MDB信息。
  • 异常:MDBException

2.7 清理配置 MDBModule

  • 方法:void cleanUp()
  • 描述:清理设置到MCU的配置。这只能在“停止事务”之后和退出应用程序之前调用一次。
  • 异常:MDBException

3. 事务流程 3.1 API调用流程 3.2 初始化流程 3.3 标准售货流程

关于启动通信流程

· 阅读需 1 分钟
Quany
软件工程师

流程图

在启动页(SplashActivity)预处理完成后,在下载参数接口获取当前设备是串口还是用 MDB,再启动对应页面 =》 Activity;

模板工程

· 阅读需 5 分钟
Quany
软件工程师

一个具有良好开发框架的银行模板项目。它基于Newland SDK实现了各种金融交易。

演示

[demo.apk]BankTemplate,而 [platform.apk] 是一个本地模拟平台。通过这两个apk,可以在开发POS上执行模拟交易。

操作:模拟应用 -> (服务已开启)配置 -> 保存 -> 对话框确认。然后,可以在BankTemplate上执行交易。

注意:模拟平台apk只能在开发POS上执行。

Gradle和环境

Android StudioGradle插件版本Gradle版本Android SDK
2023.2.18.0.28.033

如果打开项目时出现错误,请升级Gradle到最新版本。(Android Studio->帮助->检查更新

为了方便项目开发,BankTemplate的gradle 进行了一些修改,与原生版本存在以下差异:

  • SDK版本
  • 库依赖
  • 生成的APK名称
  • 签名配置
  • 命名空间(以前是AndroidManifest.xml中的package

具体内容,请参见 **[Gradle配置]

UI

BankTemplate开发了基本的主题、元素颜色和尺寸。

它自定义了常见视图和组件,并使用了多个Lottie动画,适应不同屏幕。

具体内容,请参见 [UI]

逻辑流程

当你在启动器上点击BankTemplate时,应用程序将根据以下流程处理:

[App] 被调用。App将初始化应用程序的基本参数。这个步骤在一个单独的线程上执行,不会影响UI进程。这些参数是应用程序需要初始化的前半部分参数。

//初始化应用程序中的数据
public class App extends BaseApplication {
@Override
public void onCreate() {
...
BaseApplication.SINGLE_EXECUTOR.execute(() -> {
SelfCheckHelper.initAppConfig(this);
});
}
}

然后,[MainActivity] 将被启动。它将在与App相同的单线程上初始化剩余参数。这样可以使参数的初始化按顺序执行。BankTemplate的所有屏幕都在Fragment中实现。

public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
BaseApplication.SINGLE_EXECUTOR.execute(() -> {
SelfCheckHelper.initDevice(this);
...
mSupportDelegate.switchContent(MainFragment.newInstance());
});
...
}
}

所以[MainFragment]将由MainActivity打开以显示主菜单。MainFragment有一个ViewPager来显示[MenuFragment]。MenuFragment包含主菜单。如果一个屏幕无法显示所有菜单项,你可以滑动屏幕到下一个屏幕或进入一个[SubMenuFragment]。

public class MainFragment extends BaseFragment {
...
private void initView() {
...
List<MenuFragment> childFragments = createMenuFragments(items.subList(1, items.size()));
binding.viewPager.setAdapter(new FragmentStateAdapter(this) {
@NonNull
@Override
public Fragment createFragment(int position) {
return childFragments.get(position);
}

@Override
public int getItemCount() {
return childFragments.size();
}
});
...
}
...
@Override
public void onResume() {
super.onResume();
if (MainMenu.getInstance().isChanged()) {
initView();
}
}
}

当点击主菜单项时,[TransActivity]将被打开。然后,TransActivity将开始交易。

public class TransActivity extends BaseActivity {
...
private void transact() {
...
AbstractTrans trans;
try {
Class<? extends AbstractTrans> clz = TransUtils.getTrans(pubBean.getTransType());
if (clz == null) {
LoggerUtils.e("Transaction class is null.");
intent.putExtra(TransTag.MESSAGE, getString(R.string.core_transaction_result_no_such_trans));
intent.putExtra(TransTag.RESULT_CODE, ResultCode.FL);
setResult(RESULT_CANCELED, intent);
finish();
return;
}
LoggerUtils.d("Instantiate transaction: " + clz);
trans = clz.newInstance();
} catch (IllegalAccessException | InstantiationException e) {
...
finish();
return;
}
...
trans.init(this, pubBean);
trans.transact((success) -> {
...
finish();
});
}
...
}

交易

每个交易处理由一个交易类控制。交易类将在TransActivity启动时调用,并在交易类完成后TransActivity结束。

具体内容,请参见 [交易] 。

应用设置

[Settings]是一个用于应用设置的交易。当Settings执行时,它将启动[SettingsActivity]。

SettingsActivity需要密码。有两个密码用于不同的设置。

  • 201003 -> 供应商设置。此密码在代码中是固定的。供应商设置用于紧急处理。
  • 000000-> 管理员/商户设置。此密码可以在设置中修改或通过core/src/main/asset/default_params.ini进行修改。此设置用于商户配置。

Newland SDK

BankTemplate将所有与SDK库相关的API封装在[sdk_helper]模块中。

它包括以下SDK:

ISO8583

[ISO8583.md] 介绍了如何打包8583数据。