这里提到的握手机制,简单点讲,就是增加某些确认信息。
为什么这样说呢?因为SP中有些地方比较特殊,我们就拿一个简单的例子,读卡器IDC等待进卡的命令。我们知道这个命令在WOSA规范中叫做WFS_CMD_IDC_READ_RAW_DATA,其功能是一直打开读卡器的闸门,等待有个客户将卡插入,如果硬件检测到有卡插入了,则会发送一个WFS_EXEE_IDC_MEDIAINSERTED事件给ATMC上层,接着将卡的信息返回给ATMC上层应用。这里面有个比较特殊的地方是该命令没有超时机制,就是该函数理论上如果没有卡插入,就永远不会返回。
我们考虑一下下面的情况:如果有个客户插卡进入读卡器,读卡器检测到有卡进来,则发送一个WFS_EXEE_IDC_MEDIAINSERTED事件。我们都知道,Windows是基于消息机制的操作系统,发送一个事件是有可能失败的,那么如果WFS_EXEE_IDC_MEDIAINSERTED事件没有到达ATMC上层会怎样呢?更进一步,如果硬件检测到卡插入,但是硬件处理本身没有返回,一样没有事件到达ATMC上层。
如果熟悉ATM的人就会知道,这种现象很多人叫做“夹卡”,即卡停在读卡器里面,但是ATMC上层不知道卡已经插入,还在那播放欢迎画面,插入的卡退不出来,别人也无法再插卡进去,导致ATM不能运转了。
其实我们可以有几种方式来处理这种情况,可以是ATMC上层调用WFS_CMD_IDC_READ_RAW_DATA命令后,自己设置个定时器不断检查是否有卡在读卡器里面,如果有则命令返回,然后做吞卡等处理;也可以增加握手机制,硬件一发现有卡,就给ATMC上层一个确认信息,该信息不通过事件返回,上层就可以重新设定一个超时处理机制。
其他也有些方式,总的来说要在SP中防止这种情况的发生,尽量写出比较稳定的SP来,这样看来不熟悉ATM的业务知识,很多情况是不会凭空想到的,做东西的时候多考虑下还是很有必要的。
刘永胜 2005年8月于中国广州洛溪岛
为什么这样说呢?因为SP中有些地方比较特殊,我们就拿一个简单的例子,读卡器IDC等待进卡的命令。我们知道这个命令在WOSA规范中叫做WFS_CMD_IDC_READ_RAW_DATA,其功能是一直打开读卡器的闸门,等待有个客户将卡插入,如果硬件检测到有卡插入了,则会发送一个WFS_EXEE_IDC_MEDIAINSERTED事件给ATMC上层,接着将卡的信息返回给ATMC上层应用。这里面有个比较特殊的地方是该命令没有超时机制,就是该函数理论上如果没有卡插入,就永远不会返回。
我们考虑一下下面的情况:如果有个客户插卡进入读卡器,读卡器检测到有卡进来,则发送一个WFS_EXEE_IDC_MEDIAINSERTED事件。我们都知道,Windows是基于消息机制的操作系统,发送一个事件是有可能失败的,那么如果WFS_EXEE_IDC_MEDIAINSERTED事件没有到达ATMC上层会怎样呢?更进一步,如果硬件检测到卡插入,但是硬件处理本身没有返回,一样没有事件到达ATMC上层。
如果熟悉ATM的人就会知道,这种现象很多人叫做“夹卡”,即卡停在读卡器里面,但是ATMC上层不知道卡已经插入,还在那播放欢迎画面,插入的卡退不出来,别人也无法再插卡进去,导致ATM不能运转了。
其实我们可以有几种方式来处理这种情况,可以是ATMC上层调用WFS_CMD_IDC_READ_RAW_DATA命令后,自己设置个定时器不断检查是否有卡在读卡器里面,如果有则命令返回,然后做吞卡等处理;也可以增加握手机制,硬件一发现有卡,就给ATMC上层一个确认信息,该信息不通过事件返回,上层就可以重新设定一个超时处理机制。
其他也有些方式,总的来说要在SP中防止这种情况的发生,尽量写出比较稳定的SP来,这样看来不熟悉ATM的业务知识,很多情况是不会凭空想到的,做东西的时候多考虑下还是很有必要的。
刘永胜 2005年8月于中国广州洛溪岛
Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=466314