近年来,来随着医疗智能自助终端的普及和发展,无人值守的自助终端实现了患者的自主预约,挂号,报告查询等业务。不仅方便了患者的就诊,提升了患者满意度。还降低了医院在预约,挂号,报告打印,查询等环节的人员投入提高了工作效率。
社保卡阅读器是医疗智能自助终端上要实现患者自主预约,挂号,报告查询等业务的重要信息采集设备。除此之外,市民可以持社保卡办理就医购药、医保结算、住院就医等功能。简单来说就是社保卡不是医保卡,但可以当医保卡使用。社保卡是社会保障制度的进步!它包括的内容很多:如医疗保险,养老保险,失业保险,生育保险,工伤保险等等,除此之外还有一定的金融功能。
社保卡读卡器是在符合劳动和社会保障部制定的《社会保障(个人)卡读写器规范》,在设计社保卡读卡器或者是嵌入在自助终端设备中的社保卡读卡模块,需要满足《社会保障(个人)卡读写器规范》要求的同时还是根据实际应用场景对设备通信接口进行灵活扩展。如有些自助终端设备是Android、linux系统。这就要求社保卡读卡器厂商能提供对应的驱动和应用程序开发的API接口函数。
这里我们以NTS-L7-2IN1这款社保卡读卡器作为开发演示,在windows操作系统中,采用C#开发语言对社保卡信息读取。首先,我们要了解社保卡读卡器的功能和结构,简单的方式就是读一下产品介绍。
L7-2IN1拥有一个符合ISO7816协议标准的接触式智能卡卡座支持ISO14443A、B协议非接触式智能卡,提供多种操作系统二次开发API接口。L7-2IN1双界面智能卡读写器内置2个SAM卡座,可以对设备进行身份安全确认,支持社保卡阅读。通过RS232接口或USB口实现同PC机及相关设备的连接。USB采用无驱技术,可方便用户的安装使用,支持多卡操作可用于安全发卡和安全要求较高的领域需要。随机提供各种平台的驱动开发包,附带的演示程序实现访问射频卡的全部功能,并带有自动测卡操作。
L7-2IN1型智能卡读写器是开发IC卡相关产品及系统集成必备的前端处理设备,其丰富、完善的接口函数,可方便地应用于工商、电信、邮政、税务、银行、保险、医疗、会议签到、网吧管理、加油站、停车场等各种收费、储值、查询等智能卡管理应用系统中。
符合ISO7816协议,还有两个PSAM卡座,硬件上是满足了。
接下来,我们根据社保卡读卡器提供的API进行开发,测试。
//社保卡结构 里面存放公开信息
public struct SocialSecurityCardStruct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] szCardNo;//实际只有9个字符
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] szName;//一般是4-8个字符 考虑到特殊人名 搞多点
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] szSSCNo;//一般是身份证号18个字符
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] szSex;//性别
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] szNation;//民族 有的民族名称有点长
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] szBankNo;//对应的银行卡号
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] szSignedDate;//签发日期
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] szValidityEndDate;//到期日期
}
/**
* 7816通道获取社保卡号
* @param nDeviceHandle
* @param psttSocialSecurityCard 社保卡信息结构体指针
* @return true = 成功
*/
[DllImport("LotusCardDriver.dll", EntryPoint = "LotusCardGetSocialSecurityInfoBy7816", SetLastError = true,
CharSet = CharSet.Auto, ExactSpelling = false,
CallingConvention = CallingConvention.StdCall)]
public static extern int LotusCardGetSocialSecurityInfoBy7816(int nDeviceHandle, ref SocialSecurityCardStruct psttSocialSecurityCard);
bResult = CLotusCardDriver.LotusCardGetSocialSecurityInfoBy7816(nHandle, ref sttSocialSecurityCard);
if(bResult!=1)
{
AddLog("获取社保卡信息失败!");
return;
}
AddLog("执行LotusCardGetSocialSecurityInfoBy7816成功!");
AddLog("社保卡号:"+ Encoding.UTF8.GetString(sttSocialSecurityCard.szCardNo));
AddLog("社保号:"+ Encoding.UTF8.GetString(sttSocialSecurityCard.szSSCNo));
AddLog("姓名:"+ Encoding.GetEncoding("GB2312").GetString(sttSocialSecurityCard.szName));
strTmp = Encoding.UTF8.GetString(sttSocialSecurityCard.szSex).Trim();
if("1".Equals(strTmp.Substring(0,1)))
{
AddLog("性别:男");
}
else
{
AddLog("性别:女");
}
AddLog("民族:"+ Encoding.GetEncoding("GB2312").GetString(sttSocialSecurityCard.szNation));
AddLog("发卡日期:"+ Encoding.UTF8.GetString(sttSocialSecurityCard.szSignedDate));
AddLog("到期日:"+ Encoding.UTF8.GetString(sttSocialSecurityCard.szValidityEndDate));
}
读卡效果如下:
这里仅仅完成了对社保卡信息的读取,由于机器里面没有插入PSAM卡,这个PSAM卡需要申请。因此,没有做进一步的PSAM卡安全信息交互,没有做交易和扣款的开发测试。读取社保卡信息的C#范例源码以上传资源中心。