上一个攻略讲到怎么打通linux到读卡器的访问,以及实现最底层的APDU收发。现在让我们进阶一下,进入JavaCard的环境:
关于在ubuntu上搭建JavaCard开发环境,参阅我之前的博客--http://blog.csdn.net/caesarzou/article/details/7534493 , 本文主要讲一下JavaCard的应用下载环境:GP相关的工具。
上一篇文章的环境是ubuntu 11.10在12.04下ant已经升级,不再支持jre1.5。所以先做小小修正
1. 在~/.bashrc中删除JAVA_HOME的定义,使用默认的JRE: OpenJDK icetea
2. 修改~/javacard/samples/build_samples.xml中的编译任务javac,增加属性:fork="true" executable="/usr/lib/jvm/java-1.5.0-sun" 或者增加 target="1.5" 来使用sun的1.5jdk编译或者使用当前的jdk编译1.5版本的字节码。
3. 之前描述了JCOP 3.1.1b eclipse插件在ubuntu上的安装,但只支持了虚拟卡片。我们现在已经打通了PCSC,现在就让这个插件来操作实卡。
#首先打开eclipse,我们发现debug configuration部分的PCSC部分是灰的,不能选择读卡器。
#来到插件的目录
cd /usr/lib/eclipse/plugins/com.ibm.bluez.jcop.eclipse_3.1.1.b/
ls
#我们可以看到操作系统的支持目录
cd os/linux/x86
ls
#可以看到插件在linux下pcsc接口的动态库文件libjpcsc.so,为啥没起效呢? 我们来分析一下
ldd libjpcsc.so
可以看到此动态库依赖的一个动态库找不到了:libpcsclite.so.0
#是不是很眼熟。没错,这正式pcsclite的库。链接失败可能是因为libjpcsc.so编译的时候链接的pcsclite的库版本和当前系统的版本不符。
#我们安装的pcsclite的库是gnu的,所以来到目录
cd /usr/lib/i386-linux-gnu
ls libpcsclite*
#可以找到系统的pcsclite库文件:libpcsclite.so (随着版本不同可能会有变化,具体参考 libpcsclite.la中的libtools的描述)
sudo ln -P libpcsclite.so ../libpcsclite.so.0
#为此库文件建立一个硬链接,再次检查 libjpcsc.so 可以看到链接成功了。
#重新打开eclipse,打开debug configurations, 建立一个Java Card Application的配置,可以看到Card Reader一栏已经激活,选择读卡器,配置好ISD和Key,点Debug。
熟悉的JCShell打开了!
GlobalPlatform自己的开源项目GPShell也有for linux的版本,但是down下来之后编译总是失败,有搞定的同学可以指点一下。
anyway,javacard开发和下载的主要环境已经搭好。做JavaCard Applet的同学可以从windows上搬家过来了。 开发COS的同学,还需要搞定gcc交叉编译~~~我正努力尝试中,希望相应的攻略尽快出来。
据21世纪经济报道,广电总局7月14日下发的一则内部通知,禁止一些视频网站与机顶盒厂商合作推出的机顶盒产品,接下来对智能电视的互联网内容监管条例也可能出台。
根据这则内部通知,广电总局要求互联网经机顶盒(DVD机等)向电视机终端提供视听节目服务的,均须按照国务院关于推进三网融合的有关要求,在经批准的试点城市,由广电部门另行组织。而在广电总局没有开放通过互联网经机顶盒(DVD机等)向电视机终端提供视听节目服务的许可前,各持证网站严禁从事相关业务,不得以内容提供商的身份与非法开展互联网电视业务的公司开展合作。
这次广电总局的通知,主要是针对深圳华强北等地出现的大量可直接上网的机顶盒或DVD。这些机顶盒或DVD盒子可以让电视机直接登录互联网,而很多正规DVD厂商也在纷纷计划推出可以上网的DVD或蓝光碟机。显而易见,这些是这次广电通知监管的重点。不过,彩电厂商推出的智能电视,很多已经可以直接登录互联网。这次下发的通知则还没有涉及到智能电视。
在我看来,广电总局这次下发通知,禁止电视机“上网”的行为,是逆时代潮流,是对于“新媒体”时代负隅顽抗的反击。
由于电视观看在线视频的体验要比电脑好,国内外都在发展能否上网的流媒体机顶盒,在国外,不仅仅Google TV、Apple TV等产品可以提供电视上网功能,连Wii等游戏机都提供上网功能,实现了将网络与电视相结合的目标,完全颠覆我们使用电视的传统方法,有着庞大的商机,市场发展前景不可限量。
在内容方面,大量的互联网视频网站也提供了传统电视所没有的海量电影、电视的点播服务,如果能通过一个简单轻巧的机顶盒将海量的互联网资源整合到电视里,无论对于最终用户、视频网站、广告商来说都是多赢,唯一吃亏的就是传统的电视广告业务。
广电试图通过政策限制电视上网,与国家的“三网融合”政策相抵触,让广电、电信的网络整合陷入了僵局。好在目前中国的互联网不是广电来管理,要是让这样的部门要是来管理,中国的互联网肯定玩完。
我曾经在《电视引领“低智商社会”》一文中指出,随着社会的发展,网络等新的媒体发展迅速,从某种角度来说它已经取代了电视。越来越多的人已经不看电视了,新闻都是从网上看的,通过网络获取信息更快更准确,可以节省大量的时间,电视的确已经落伍了。
目前的新科技的发展出现日新月异的情况,新兴的互联网视频已经出现取代传统电视的趋势,类似YouTube的互联网视频网站的兴起带来了传播的有一次革命性发展,传统电视行业如果再不思改变,继续固步自封,那么很有可能会被新兴的网络媒体所取代。
为了解决在MPMovieController上添加一个和控制栏一起显示的按钮,特别研究了一下MPMoviePlayerController的结构 (controlStyle是default,为了便于查看,省去了部分输出):
(lldb) po [m_view recursiveDescription]
(id) $1 = 0x179529f0 <UIView: 0xfdb55f0; frame = (0 0; 604 256); layer = <CALayer: 0xfd83a10>>
| <MPMovieView: 0xde71d70; frame = (0 0; 604 256);
| | <MPSwipableView: 0x1d774dc0; frame = (0 0; 604 256);
| | | <MPVideoBackgroundView: 0x1d775160; frame = (0 0; 604 256);
| | | | <UIView: 0x1d776160; frame = (0 0; 604 256);
| | | | <MPVideoView: 0x1d7740e0; frame = (0 0; 604 256);
| | | | | <UIView: 0x1d773fc0; frame = (142 -32; 320 320);
| | | | | | <MPVideoBufferLayerContainer: 0x1d772050> (layer)
| | | | | | | <MPVideoBufferLayer: 0x22ebdb20> (layer)
| | | | | | | | <AVPlayerLayerContentLayer: 0xf99d780> (layer)
| | | | | | | | | <FigVideoLayer: 0xdbaab80> (layer)
| | | | | | | | <AVPlayerLayerSubtitleLayer: 0x22eaf480> (layer)
| | | | | | | | | <AVSubtitleTextLayer: 0x22ea70f0> (layer)
| | | | <MPInlineVideoOverlay: 0x1d77e7c0; frame = (0 0; 604 256);
| | | | | <MPInlineTransportControls: 0x1d77edc0; frame = (0 212; 604 44);
| | | | | | <MPDetailSlider: 0x1d7837c0; baseClass = UISlider; frame = (70 12; 475 24);
| | | | | | | <UILabel: 0x1d78e1b0; frame = (-8 -2; 45 25); text = '0:00';
| | | | | | | <UILabel: 0x1d78e240; frame = (438 -2; 45 25); text = '-0:00';
| | | | | | | <UIImageView: 0x1d78e300; frame = (68 5; 360 11);
| | | | | | | <UIImageView: 0x1d78e3a0; frame = (47 5; 21 11);
| | | | | | | <UIImageView: 0x1d78c7e0; frame = (47 6; 381 10);
| | | | | | | <UIImageView: 0x1d78e430; frame = (57 2; 22 21);
| | | | | | <MPTransportButton: 0x1d785a50; baseClass = UIButton; frame = (34 14; 16 18);
| | | | | | | <UIImageView: 0x1d785c70; frame = (0 0; 16 18);
| | | | | | | <UIImageView: 0x1d785bb0; frame = (-42 -41; 100 100);
| | | | | | <MPTransportButton: 0x1d785dd0; baseClass = UIButton; frame = (564 16; 13 14);
| | | | | | | <UIImageView: 0x1d785ff0; frame = (0 0; 13 14);
| | | | | | | <UIImageView: 0x1d785f30; frame = (-43.5 -43; 100 100);
| | | | | | <UILabel: 0xde72ce0; frame = (265 13; 74 19); text = 'Loading…';
| | | | | | <UIActivityIndicatorView: 0xde730d0; frame = (239 12; 20 20);
| | | | | | | <UIImageView: 0xde77e90; frame = (0 0; 20 20);
| | | | | <MPNowPlayingItemQueueInfoButton: 0x1d786690; baseClass = UIButton; frame = (251 10; 103 23);
| | | | | | <UIImageView: 0x1d786750; frame = (0 0; 103 23);
| | | | | | <UIButtonLabel: 0x1d788a50; frame = (0 0; 0 0);
MPInlineVideoOverlay是显示控制栏的浮动view。Touches事件的获取要基于MPVideoBackgroundView进行处理。其中两个MPTransportButton分别是播放和全屏按钮。
对于事件获取,可以使用添加一个UITapGestureRecognizer的方式,不过这种方式会导致原来的操作失效,因为相关的事件被拦截了。另外一种简单的方式是向现有的UITapGestureRecognizer添加一个target即可,这样不会打乱原先的消息传递:
-(void) addTargetActionToGesture:(UIView *)view
{
NSArray * gestureGroup = [view gestureRecognizers];
for(UITapGestureRecognizer * g in gestureGroup)
{
[g addTarget:selfaction:@selector(handleMoviePressed:)];
}
}
转载请注明出处:http://blog.csdn.net/horkychen