前言:现在工作的主要内容是关于SDK相关方面开发,而现在的公司的业务绝大多数是关于OpenMobileAPI相关。所以工作的内容就是做关于智能卡相关的SDK项目,写下这篇文章是对近一年工作的总结也是一种记录。自己认识的不足与可能存在的错误,权当是学艺不精吧!

OMA是什么?

开放移动联盟 (OMA) 是一个为移动电话行业开发开放标准的标准机构。它不是像国际电联这样正式的政府赞助的标准组织,而是行业利益相关者就产品和服务的通用规范达成一致的论坛。
维基百科关于OMA
simalliance官网
GitHub地址

涉及场景及用途

在Android客户端主要涉及手机、Sim卡,或者其他一些带有SE安全芯片的设备。其主要应用场景是城市公交、地铁、门禁、或者是需要用到身份认证的且对安全级别有一定要求的业务。
现在智能手机上手机自带的一些交通卡方案,通过NFC进行地铁、公交、门禁等使用。其中读取的安全模块有两种,一种是eSE,也就是手机内嵌安全芯片。另外一种就是通过读取卡槽中的SIM卡上内嵌的安全芯片。这些安全芯片有独立内存、计算能力等可以进行Applet安装与个人化等一些列操作。

特别说明

特别需要说明的一点是,在Android P以后,谷歌将此API的实现纳入官方API中。所以在Android P之前需要外部引入org.simalliance.openmobileapi.jar包才能使用相关功能。Android P及以后的版本可以直接从android.se.omapi位置导入相关类。

使用过程

1.获得SEService对象;

//在org.simalliance.openmobileapi.SEService里获取
SEService mSEService = new SEService(Context context, SEService.OnConnectedListener listener);
//在android.se.omapi.SEService里获取
SEService mSEService = new SEService(Context context, Executor executor, SEService.OnConnectedListener listener);
//传入的参数略有不同。

2.通过获得的SEService对象得到Reader,既mSEService.getReaders();

Reader[] readers = mSEService.getReaders();
//获得的是一个Reader[]在这里就可以对要操作的不用种类的SE安全模块进行区分了。
String readerName = reader.getName();
//可以获取本reader的名字进而选自自己所做业务所需reader类型。
//需要注意的是
boolean b = reader.isSecureElementPresent();
//可以获取当前选择的reader是否可用,之所以需要进行判断是因为,在某些情况下卡是无法访问的。
//比如在遇到AccessControl权限问题是就是无法访问。这是因为所选。

3.通过选择的Reader获取Session,既reader.openSession();

Session mSession = reader.openSession();

4.Session开通道,也就是访问模块中指定的某些区域。

Channel mChannel = mSession.openLogicalChannel(byteAid);
//注意:这里进行开通道所传的参数不是字符串而是一个十六进制byte[],
//在做这个操作时的byte[]就是访问安全域或者是SE上应用的id。
//api使用的是十六进制byte[],也就是APDU,最小指令单元。
//为了方便开发时对所操作的指令进行查看,一般都是指令String,所以需要byte[]与String之间的切换。

5.进行指令交互,将指令依次传到所访问的模块或应用里,交给SE处理。

 byte[] byteRapdu = mChannel.transmit(byteCommand);//这里同Session开通道一样所需要的都是byte[],同样卡片吐回的也是byte[]。//然后就是根据自己业务需要对所返回的APDU进行分析处理。

6.在一个业务完成之后需要进行关闭通道操作。

mChannel.close();
mSession.close();
//开通道时有指定id进行操作,关闭时只需要将之前的channel和session进行关闭就好。
//系统会自动关闭当前开启的通道。
//之所要做这一步操作是因为在本次业务完成之后,如果需要进行选择别的通道进行相应业务,
//而这时如果没有关闭的话会导致新的通道无法打开等异常。

7.全部业务或者是程序退出时进行SEService释放

 mSEService.shutdown();//这一步SEService释放不建议在小业务完成时就进行释放,因为这样会面临频繁的服务连接。

以上就是OMA的简要使用过程。总结一句话就是开通道、传指令、关通道。

注意事项

1.关于APDU
在进行APDU指令交互的过程中返回的APDU指令是由多部分组成,对于客户端需要注意的是最后四位也就是SW,状态字。状态字是对所传到卡里边的APDU处理之后的一个响应状态代码。
常见APDU响应状态字SW

2.关于AccessControl权限错误,无法访问所指向的卡。
出现这种错误的原因是因为,在访问卡的时候没有相应的访问卡的权限。这是一种卡应用保护机制,不是所有应用(Android APP)都可以访问卡里边某些应用(卡应用Applet)。
有些卡是AC全开放,也就是只要通过OMA就可以访问这张卡。有些是AC指定开发,这就需要在发卡的时候提前在卡里写入访问者的Hash签名值,这样在访问卡时才能进行顺利访问。

最后可以访问我的github里边有封装好的OMA使用:
ShinlookerGitHub-SmartCard

如果想了解更多关于OMA卡相关,可以下载GP规范中文版。里有关于卡的全面介绍与更详细的说明。
GP卡开发规范说明书_中文版

以上便是OMA基本的使用逻辑与注意事项,有很多不足请多多指教。
------咱们来日方长。

Android OpenMobileAPI、OMA、智能卡开发总结相关推荐

  1. Android项目驱动式开发教程 第2版,《Android项目驱动式开发教程》第一章开发入门.ppt...

    <Android项目驱动式开发教程>第一章开发入门 1.4 项目框架分析 4 android:versionName="1.0" > 5 8 第9行代码andro ...

  2. 总结android项目的基本开发步骤(转帖)

    总结android项目的基本开发步骤(转帖) 做了几个android企业应用项目后,总结了项目的基本开发步骤,希望能够交流. 一 应用规划:     ※确定功能.     ※必须的界面及界面跳转的流程 ...

  3. Android系统Google Maps开发实例浅析

    Google Map(谷歌地图)是Google公司提供的电子地图服务.包括了三种视图:矢量地图.卫星图片.地形地图.对于Android系统来说,可以利用Google提供的地图服务来开发自己的一些应用. ...

  4. Android原生(Native)C开发之二 framebuffer篇

    为什么80%的码农都做不了架构师?>>>    Android原生(Native)C开发之二 framebuffer篇 如对Android原生(Natvie)C开发还任何疑问,请参阅 ...

  5. android的webView的教程,Android WebView 应用界面开发教程

    WebView组件本身就是一个浏览器实现,Android5.0增强的WebView基于Chromium M37,直接支持WebRTC.WebAudio.WebGL.开发者可以直接在WebView中使用 ...

  6. 实现在Android本地视频播放器开发

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  7. 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...

    Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...

  8. android studio ndk-builld方式开发

    之前都是在Ubuntu开发,项目也是老的,自然也就顺理成章的用eclipse做各种android的开发.最近想在android studio 切换下,有点不习惯.android studio 为ndk ...

  9. 操作系统:Android(Google公司开发的操作系统)

    ylbtech-操作系统:Android(Google公司开发的操作系统) Android是一种基于Linux的自由及开放源代码的操作系统.主要使用于移动设备,如智能手机和平板电脑,由Google(谷 ...

  10. 【Android 逆向】Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★

    文章目录 一.Android 进程注入工具开发系列博客 二.Android 进程注入工具 源码下载编译 三.逆向环境搭建 四.使用注入工具进行逆向操作 1.获取远程进程号 2.注入工具准备 3.注入动 ...

最新文章

  1. 丰农控股 CIO 王轶枭:万亿级农资市场,神策数据助力大丰收筑就数据驱动核心竞争力...
  2. Windows下visual studio code搭建golang开发环境
  3. python操作hbase,Python操作Hbase
  4. [react] childContextTypes是什么?它有什么用?
  5. STL源码剖析 set集合
  6. Java编程技巧之样板代码
  7. UITableView的重用
  8. 联想笔记本键盘排线_三分钟了解笔记本键盘维修技巧
  9. datacolumn 表达式 除数为0
  10. 分析“关于Linux内核引入的accept_local参数的一个问题”
  11. SolidEdge完整安装教程-亲测
  12. 亚马逊IC-ID/ISED认证需要提供什么资料
  13. pytorch矩阵乘法mm,bmm
  14. Bluetooth Baseband介绍
  15. 高斯金字塔和拉普拉斯金字塔实现图像融合
  16. 阿里收购豌豆荚 想什么呢?
  17. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码
  18. 计算机中专升大专难不难,自考大专难吗?
  19. 中文预处理流程(以搜狐语料全网新闻数据为例)
  20. 示例详述Docker部署tensorflow-serving

热门文章

  1. 多线程对共享资源的访问
  2. 粤海服务器维修,粤海街道总工会搭设“悦读”平台邀职工分... 深圳本地-大加...
  3. hbase表格实现数据压缩
  4. 服务器虚拟打印机为什么经常打打不,打印机虚拟论文,关于制作PDF打印服务器相关参考文献资料-免费论文范文...
  5. 网络(HCNA00笔记)
  6. html5 游戏 限制,HTML5新技术让游戏解决了三个大问题
  7. 函数图像变换的规律,以一元函数和二元函数为例来说明,对多元函数同样适用。...
  8. 由爆火的“羊了个羊”浅谈小游戏开发
  9. ad10搜索快捷键_AD10设计所需快捷键(席雪晴)
  10. 项目实战第三篇:STM32多功能智能小车硬件选型2(传感器选型篇)