跳到主要内容

IM30 MDB编程指南

第1章 修订历史

版本更新记录

日期版本号更新说明作者
2019-09-21V1.0.0首次发布。Android团队
2019-09-26V1.0.4修改pax_MdbpSetAddr。Android团队
2019-12-18V1.0.5修改MDB NDK API。Android团队
2020-04-03V1.0.6添加MDB JAVA API。Android团队

第2章 目录

  1. 引言

    • 1.1 目的
    • 1.2 受众
    • 1.3 应用平台
  2. 概述

  3. MDB

    • 3.1 介绍
    • 3.2 通信格式
      • 3.2.1 字符格式
      • 3.2.2 块格式
      • 3.2.3 响应码
    • 3.3 JAVA API
      • 3.3.1 isMdbEnable
      • 3.3.2 EnableMdbAndReboot
    • 3.4 NDK API
      • 3.4.1 mdb_open
      • 3.4.2 mdb_set_mode
      • 3.4.3 mdb_read
      • 3.4.4 mdb_write
      • 3.4.5 mdb_flush
      • 3.4.6 mdb_close
      • 3.4.7 mdbp_set_addr
      • 3.4.8 setThreadPriority

第3章 引言

3.1 目的

本文档描述了传统POS系统与IM30在软件系统和用户操作上的区别。

3.2 受众

本文档适用于系统开发者、应用开发者、技术支持和售后服务人员等。

3.3 应用平台

  • 操作系统:Paydroid 7.1.1
  • 固件版本:IM30_PayDroid_7.1.1_Taurus_V05.3.0X_2019XXXX_Release.paydroid

第4章 概述

IM30是一款基于A64平台的新型自助支付终端,开发时使用了Paydroid 7.1.1内核。


第5章 MDB

5.1 介绍

多滴总线(MDB)是一种用于协调自动售货机主控制器(VMC)与多个外围设备之间通信的协议,由国家自动售货机销售协会(NAMA)和欧洲自动售货机协会(EVA)制定。MDB采用9600bps的波特率在主从模式下进行通信,规定总线上有1个主设备和多达32个外围设备。每个外围设备都有唯一的地址和命令。所有通信外围设备都由主设备初始化。IM30提供了控制MDB功能的NDK API,并且这些API可以通过动态库libpaxapi.so调用。

5.2 通信格式

5.2.1 字符格式

一个字节由1个起始位+8个数据位+1个模式位+1个停止位组成。模式位可以是0或1,分别根据传输模式确定。当控制器VMC向外围设备发送数据时,模式位1代表地址字节,0代表数据字节。当外围设备向控制器VMC发送数据时,模式位1表示所有字节已发送。

5.2.2 块格式

主设备->外围设备

控制器VMC向外围设备传输的数据由一个地址字节、多个数据字节和一个校验字节组成,总数不超过36个字节。

地址字节包含两部分命令,高5位是外围设备地址,低3位是外围设备命令。

当主设备响应外围设备时,会发送确认(ACK)、无响应(NAK)和重发(RET),5毫秒无响应(超时)等同于无响应。

如果从外围设备地址开始5毫秒内没有响应,主设备将重新发出相同或不同的命令,直到收到外围设备的响应或达到最大无响应时间(投币机2秒,纸币机5秒)。在此期间,主设备应同时访问其他外围设备。

主设备可以通过拉低传输线(至少100毫秒)来重置总线。

外围设备->主设备

帧数据包含一个数据块、1字节校验和和1字节ACK或NAK。校验和字节包含在最大数据块内(36字节)。

当一个外围设备响应主设备时,主设备必须响应ACK、NAK或RET。

外围设备在响应ACK或NAK时不需要校验和。

如果外围设备发送数据块后5毫秒内没有响应,主设备必须在该时间内用ACK、NAK或RET响应。

5.2.3 校验码

每个数据块的末尾发送校验字节。它是地址字节和所有数据字节的总和,但不包括在总和中。

5.2.4 响应码

ACK 00H

RET AAH

NAK FFH

5.3 JAVA API

API在MdbUtil类中定义,应用程序可以通过UptApi_V1.0X_2020XXXX.jar调用

5.3.1 isMdbEnable

原型

public boolean isMdbEnable();

功能

确定系统是否启用了MDB功能

参数

NULL

返回

true

系统启用了MDB功能

false

系统未启用MDB功能

说明

创建一个MdbUtil实例,然后调用此方法

5.3.2 EnableMdbAndReboot

原型

public int EnableMdbAndReboot(boolean enable);

功能

启用或禁用MDB功能,然后重启

参数

enable:

true:启用MDB然后重启

false:禁用MDB然后重启

返回

0:成功

-1:失败

由于执行API后系统将重新启动,可以忽略返回值。

说明

创建一个MdbUtil实例,然后调用此方法。只要不更新固件,只需要设置一次

5.4 NDK API

此API在mdb.h中声明,可以通过动态库libpaxmdb.so调用。

5.4.1 mdb_open

原型

int mdb_open (const char *dev_name)

功能

打开MDB设备。

参数

dev_name

设备节点,可以是“/dev/mdb_master”和“/dev/mdb_slave”,分别代表主设备和外围设备。

返回

=0

设备文件句柄

-1

失败

说明

在操作MDB设备之前,必须调用此函数打开设备;否则,以下相关函数将无法工作。

5.4.2 mdb_set_mode

原型

int mdb_set_mode (int fd, int mode)

功能

设置MDB设备的工作环境模式。

参数

fd

设备文件句柄,是mdb_open()的返回码。

mode

MDB设备的工作环境模式,可以是0或1,

0: MDB_MASTER,代表主模式;

1: MDB_PERIPHERAL,代表外围模式。

返回

0

成功

-1

失败

说明

打开MDB设备后必须调用此函数。

5.4.3 mdb_read

原型

int mdb_read (int fd, unsigned short *buf, unsigned int count, unsigned int timeout, unsigned int interval, int return_on_modeset)

功能

从MDB设备读取数据。

参数

fd

设备文件句柄,是mdb_open()的返回码。

buf

接收数据的缓冲区。

count

要接收的数据数量,count不能大于buf的实际大小。

timeout

接收第一个字节前的最大等待时间,建议为6000微秒。

interval

接收第一个字节后,后续两个字节之间的最大时间间隔,建议为2300微秒。

return_on_modeset

当当前MDB设备是MDB_MASTER时,return_on_modeset=1可以接收一帧数据;

当当前MDB设备是MDB_PERIPHERAL时,return_on_modeset=1可以接收地址数据。

返回

=0

实际接收到的字节数

-1

失败

说明

当当前MDB设备是MDB_MASTER时,可以接收一帧数据;

当当前MDB设备是MDB_PERIPHERAL时,可以接收地址数据。

5.4.4 mdb_write

原型

int mdb_write (int fd, const unsigned short *buf, unsigned int count)

功能

通过MDB设备发送数据。

参数

fd

设备文件句柄,是mdb_open()的返回码。

buf

发送数据的缓冲区。

count

要发送的数据数量。

返回

0

实际发送的字节数

-1

失败

说明

只有当数据从MDB设备发送