IM30 MDB编程指南
第1章 修订历史
版本更新记录
日期 | 版本号 | 更新说明 | 作者 |
---|---|---|---|
2019-09-21 | V1.0.0 | 首次发布。 | Android团队 |
2019-09-26 | V1.0.4 | 修改pax_MdbpSetAddr。 | Android团队 |
2019-12-18 | V1.0.5 | 修改MDB NDK API。 | Android团队 |
2020-04-03 | V1.0.6 | 添加MDB JAVA API。 | Android团队 |
第2章 目录
-
引言
- 1.1 目的
- 1.2 受众
- 1.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设备发送