GVKun编程网logo

从Linux 64位访问javax.smartcardio

13

在这篇文章中,我们将带领您了解从Linux64位访问javax.smartcardio的全貌,同时,我们还将为您介绍有关5.键盘控制smartcar、android–如何在不支持已支持SmartCar

在这篇文章中,我们将带领您了解从Linux 64位访问javax.smartcardio的全貌,同时,我们还将为您介绍有关5. 键盘控制 smartcar、android – 如何在不支持已支持SmartCard API的设备的情况下访问Secure Element、Does Harvard make you smarter、freemarker访问java的annotation的知识,以帮助您更好地理解这个主题。

本文目录一览:

从Linux 64位访问javax.smartcardio

从Linux 64位访问javax.smartcardio

我试图使用带有以下代码的javax.smartcardio API加载智能卡终端:

public CardTerminal getReadyCardTerminal() throws CardException {    TerminalFactory factory = TerminalFactory.getDefault();    CardTerminals terminals = factory.terminals();    List<CardTerminal> list = terminals.list(State.CARD_PRESENT);    while (list.isEmpty()) {        terminals.waitForChange(1000);        list = terminals.list(State.CARD_PRESENT);    }    CardTerminal cardTerminal = list.get(0);    return cardTerminal;}

…并且我总是得到以下异常:

java.lang.IllegalStateException: no terminalsat javax.smartcardio.TerminalFactory$NoneCardTerminals.waitForChange(TerminalFactory.java:145)

在Windows Vista / 7上,一切正常,但在Linux上无法正常运行。我正在使用Ubuntu 12.04 64位。

我使用以下命令安装了pcscd服务:

sudo apt-get install libccid pcscd libpcsclite-dev libpcsclite1sudo service pcscd start

然后pcsc_scan命令输出:

PC/SC device scannerV 1.4.18 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>Compiled with PC/SC lite version: 1.7.4Using reader plug''n play mechanismScanning present readers...0: OMNIKEY CardMan 3x21 00 00Tue Sep 11 15:44:49 2012Reader 0: OMNIKEY CardMan 3x21 00 00  Card state: Card inserted,   ATR: <some hexa codes>  ...

因此,一切看起来都很好,但是smartcardio却无法正常工作。我正在尝试使用Oracle和OpenJDK 1.7.0_05(32位和64位)。

该代码可以在Ubuntu 32位环境中与OpenJDK一起正常运行(但不能与Oracle JDK一起运行,实际上不知道为什么)。因此,我认为从Java到PC
/ SC库的64位桥存在问题。

有任何想法吗?

谢谢。

答案1

小编典典

我想我已经找到了解决方法,因为我遇到了类似的问题。在来自ubuntu的错误报告中,它表示javax.smartcardio库在错误的目录中搜索PC
/ SC库。

通过指定机器上PC / SC库的路径(如bugreport提到的那样),我可以正常工作。

错误报告中的路径对我来说是错误的,我在64位fedora上,其中pc / sc库安装在/usr/lib64/libpcsclite.so.1

所以对我来说,解决方法是像这样指定java的库路径:

java -Dsun.security.smartcardio.library=/usr/lib64/libpcsclite.so.1

根据您的Linux发行版,libpcsclite.so.1实际的位置可能有所不同,也可能在/lib/x86_64-linux-gnu/libpcsclite.so.1(例如Kubuntu 15.04)。在这种情况下,可以这样称呼它:

java -Dsun.security.smartcardio.library=/lib/x86_64-linux-gnu/libpcsclite.so.1

5. 键盘控制 smartcar

5. 键盘控制 smartcar

博客转自:https://blog.csdn.net/hcx25909/article/details/9004617

如果尝试过前面的例子,有没有感觉每次让机器人移动还要在终端里输入指令,这也太麻烦了,有没有办法通过键盘来控制机器人的移动呢?答案室当然的了。我研究了其他几个机器人键盘控制的代码,还是有所收获的,最后移植到了 smartcar 上,实验成功。

一、创建控制包

首先,我们为键盘控制单独建立一个包:

roscreate-pkg smartcar_teleop rospy geometry_msgs std_msgs roscpp
rosmake

二、简单的消息发布

在机器人仿真中,主要控制机器人移动的就是 Twist () 结构,如果我们编程将这个结构通过程序发布成 topic,自然就可以控制机器人了。我们先用简单的 python 来尝试一下。 之前的模拟中,我们使用的都是在命令行下进行的消息发布,现在我们需要把这些命令转换成 python 代码,封装到一个单独的节点中去。针对之前的命令行,我们可以很简单的在 smartcar_teleop /scripts 文件夹下编写如下的控制代码:

#!/usr/bin/env python
import roslib; roslib.load_manifest(''smartcar_teleop'')
import rospy
from geometry_msgs.msg import Twist
from std_msgs.msg import String
 
class Teleop:
    def __init__(self):
        pub = rospy.Publisher(''cmd_vel'', Twist)
        rospy.init_node(''smartcar_teleop'')
        rate = rospy.Rate(rospy.get_param(''~hz'', 1))
        self.cmd = None
	
        cmd = Twist()
        cmd.linear.x = 0.2
        cmd.linear.y = 0
        cmd.linear.z = 0
        cmd.angular.z = 0
        cmd.angular.z = 0
        cmd.angular.z = 0.5
 
        self.cmd = cmd
        while not rospy.is_shutdown():
            str = "hello world %s" % rospy.get_time()
            rospy.loginfo(str)
            pub.publish(self.cmd)
            rate.sleep()
 
if __name__ == ''__main__'':Teleop()

python 代码在 ROS 中是不需要编译的。先运行之前教程中用到的 smartcar 机器人,在 rviz 中进行显示,然后新建终端,输入如下命令:

rosrun smartcar_teleop teleop.py

也可以建立一个 launch 文件运行:

<launch>
  <arg name="cmd_topic" default="cmd_vel" />
  <node pkg="smartcar_teleop" type="teleop.py" name="smartcar_teleop">
    <remap from="cmd_vel" to="$(arg cmd_topic)" />
  </node>
</launch>

在 rviz 中看一下机器人是不是动起来了!

三、加入键盘控制

1、移植

 因为 ROS 的代码具有很强的可移植性,所以用键盘控制的代码其实可以直接从其他机器人包中移植过来,在这里我主要参考的是 erratic_robot,在这个机器人的代码中有一个 erratic_teleop 包,可以直接移植过来使用。首先,我们将其中 src 文件夹下的 keyboard.cpp 代码文件直接拷贝到我们 smartcar_teleop 包的 src 文件夹下,然后修改 CMakeLists.txt 文件,将下列代码加入文件底部:

rosbuild_add_boost_directories()
rosbuild_add_executable(smartcar_keyboard_teleop src/keyboard.cpp)
target_link_libraries(smartcar_keyboard_teleop boost_thread)

编译完成后,运行 smartcar 模型。重新打开一个终端,打开键盘控制节点并在终端中按下键盘里的 “W”、“S”、“D”、“A” 以及 “Shift” 键进行机器人的控制。效果如下图

键盘控制代码复用

因为代码是我们直接复制过来的,其中有很多与之前 erratic 机器人相关的变量,我们把代码稍作修改,变成自己机器人可读性较强的代码。

#include <termios.h>
#include <signal.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/poll.h>
 
#include <boost/thread/thread.hpp>
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
 
#define KEYCODE_W 0x77
#define KEYCODE_A 0x61
#define KEYCODE_S 0x73
#define KEYCODE_D 0x64
 
#define KEYCODE_A_CAP 0x41
#define KEYCODE_D_CAP 0x44
#define KEYCODE_S_CAP 0x53
#define KEYCODE_W_CAP 0x57
 
class SmartCarKeyboardTeleopNode
{
    private:
        double walk_vel_;
        double run_vel_;
        double yaw_rate_;
        double yaw_rate_run_;
        
        geometry_msgs::Twist cmdvel_;
        ros::NodeHandle n_;
        ros::Publisher pub_;
 
    public:
        SmartCarKeyboardTeleopNode()
        {
            pub_ = n_.advertise<geometry_msgs::Twist>("cmd_vel", 1);
            
            ros::NodeHandle n_private("~");
            n_private.param("walk_vel", walk_vel_, 0.5);
            n_private.param("run_vel", run_vel_, 1.0);
            n_private.param("yaw_rate", yaw_rate_, 1.0);
            n_private.param("yaw_rate_run", yaw_rate_run_, 1.5);
        }
        
        ~SmartCarKeyboardTeleopNode() { }
        void keyboardLoop();
        
        void stopRobot()
        {
            cmdvel_.linear.x = 0.0;
            cmdvel_.angular.z = 0.0;
            pub_.publish(cmdvel_);
        }
};
 
SmartCarKeyboardTeleopNode* tbk;
int kfd = 0;
struct termios cooked, raw;
bool done;
 
int main(int argc, char** argv)
{
    ros::init(argc,argv,"tbk", ros::init_options::AnonymousName | ros::init_options::NoSigintHandler);
    SmartCarKeyboardTeleopNode tbk;
    
    boost::thread t = boost::thread(boost::bind(&SmartCarKeyboardTeleopNode::keyboardLoop, &tbk));
    
    ros::spin();
    
    t.interrupt();
    t.join();
    tbk.stopRobot();
    tcsetattr(kfd, TCSANOW, &cooked);
    
    return(0);
}
 
void SmartCarKeyboardTeleopNode::keyboardLoop()
{
    char c;
    double max_tv = walk_vel_;
    double max_rv = yaw_rate_;
    bool dirty = false;
    int speed = 0;
    int turn = 0;
    
    // get the console in raw mode
    tcgetattr(kfd, &cooked);
    memcpy(&raw, &cooked, sizeof(struct termios));
    raw.c_lflag &=~ (ICANON | ECHO);
    raw.c_cc[VEOL] = 1;
    raw.c_cc[VEOF] = 2;
    tcsetattr(kfd, TCSANOW, &raw);
    
    puts("Reading from keyboard");
    puts("Use WASD keys to control the robot");
    puts("Press Shift to move faster");
    
    struct pollfd ufd;
    ufd.fd = kfd;
    ufd.events = POLLIN;
    
    for(;;)
    {
        boost::this_thread::interruption_point();
        
        // get the next event from the keyboard
        int num;
        
        if ((num = poll(&ufd, 1, 250)) < 0)
        {
            perror("poll():");
            return;
        }
        else if(num > 0)
        {
            if(read(kfd, &c, 1) < 0)
            {
                perror("read():");
                return;
            }
        }
        else
        {
            if (dirty == true)
            {
                stopRobot();
                dirty = false;
            }
            
            continue;
        }
        
        switch(c)
        {
            case KEYCODE_W:
                max_tv = walk_vel_;
                speed = 1;
                turn = 0;
                dirty = true;
                break;
            case KEYCODE_S:
                max_tv = walk_vel_;
                speed = -1;
                turn = 0;
                dirty = true;
                break;
            case KEYCODE_A:
                max_rv = yaw_rate_;
                speed = 0;
                turn = 1;
                dirty = true;
                break;
            case KEYCODE_D:
                max_rv = yaw_rate_;
                speed = 0;
                turn = -1;
                dirty = true;
                break;
                
            case KEYCODE_W_CAP:
                max_tv = run_vel_;
                speed = 1;
                turn = 0;
                dirty = true;
                break;
            case KEYCODE_S_CAP:
                max_tv = run_vel_;
                speed = -1;
                turn = 0;
                dirty = true;
                break;
            case KEYCODE_A_CAP:
                max_rv = yaw_rate_run_;
                speed = 0;
                turn = 1;
                dirty = true;
                break;
            case KEYCODE_D_CAP:
                max_rv = yaw_rate_run_;
                speed = 0;
                turn = -1;
                dirty = true;
                break;              
            default:
                max_tv = walk_vel_;
                max_rv = yaw_rate_;
                speed = 0;
                turn = 0;
                dirty = false;
        }
        cmdvel_.linear.x = speed * max_tv;
        cmdvel_.angular.z = turn * max_rv;
        pub_.publish(cmdvel_);
    }
}

参考链接:http://ros.org/wiki/turtlebot_teleop/Tutorials/Teleoperation 和 http://www.ros.org/wiki/simulator_gazebo/Tutorials/TeleopErraticSimulation

键盘控制代码 Python 实现

虽然很多机器人的键盘控制使用的都是 C++ 编写的代码,但是考虑到 python 的强大,我们还是需要尝试使用 python 来编写程序。首先需要理解上面 C++ 程序的流程。在上面的程序中,我们单独创建了一个线程来读取中断中的输入,然后根据输入发布不同的速度和角度消息。介于线程的概念还比较薄弱,在 python 中使用循环替代线程。然后需要考虑的只是如何使用 python 来处理中断中的输入字符,通过上网查找资料,发现使用的 API 和 C++ 的基本是一致的。最终的程序如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*
 
import  os
import  sys
import  tty, termios
import roslib; roslib.load_manifest(''smartcar_teleop'')
import rospy
from geometry_msgs.msg import Twist
from std_msgs.msg import String
 
# 全局变量
cmd = Twist()
pub = rospy.Publisher(''cmd_vel'', Twist)
 
def keyboardLoop():
    #初始化
    rospy.init_node(''smartcar_teleop'')
    rate = rospy.Rate(rospy.get_param(''~hz'', 1))
 
    #速度变量
    walk_vel_ = rospy.get_param(''walk_vel'', 0.5)
    run_vel_ = rospy.get_param(''run_vel'', 1.0)
    yaw_rate_ = rospy.get_param(''yaw_rate'', 1.0)
    yaw_rate_run_ = rospy.get_param(''yaw_rate_run'', 1.5)
 
    max_tv = walk_vel_
    max_rv = yaw_rate_
 
    #显示提示信息
    print "Reading from keyboard"
    print "Use WASD keys to control the robot"
    print "Press Caps to move faster"
    print "Press q to quit"
 
    #读取按键循环
    while not rospy.is_shutdown():
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
		#不产生回显效果
        old_settings[3] = old_settings[3] & ~termios.ICANON & ~termios.ECHO
        try :
            tty.setraw( fd )
            ch = sys.stdin.read( 1 )
        finally :
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
 
        if ch == ''w'':
            max_tv = walk_vel_
            speed = 1
            turn = 0
        elif ch == ''s'':
            max_tv = walk_vel_
            speed = -1
            turn = 0
        elif ch == ''a'':
            max_rv = yaw_rate_
            speed = 0
            turn = 1
        elif ch == ''d'':
            max_rv = yaw_rate_
            speed = 0
            turn = -1
        elif ch == ''W'':
            max_tv = run_vel_
            speed = 1
            turn = 0
        elif ch == ''S'':
            max_tv = run_vel_
            speed = -1
            turn = 0
        elif ch == ''A'':
            max_rv = yaw_rate_run_
            speed = 0
            turn = 1
        elif ch == ''D'':
            max_rv = yaw_rate_run_
            speed = 0
            turn = -1
        elif ch == ''q'':
            exit()
        else:
            max_tv = walk_vel_
            max_rv = yaw_rate_
            speed = 0
            turn = 0
 
        #发送消息
        cmd.linear.x = speed * max_tv;
        cmd.angular.z = turn * max_rv;
        pub.publish(cmd)
        rate.sleep()
		#停止机器人
        stop_robot();
 
def stop_robot():
    cmd.linear.x = 0.0
    cmd.angular.z = 0.0
    pub.publish(cmd)
 
if __name__ == ''__main__'':
    try:
        keyboardLoop()
    except rospy.ROSInterruptException:
        pass

参考链接:http://blog.csdn.net/marising/article/details/3173848 和  http://nullege.com/codes/search/termios.ICANON

android – 如何在不支持已支持SmartCard API的设备的情况下访问Secure Element

android – 如何在不支持已支持SmartCard API的设备的情况下访问Secure Element

SEEK-for- Android文档称 listed devices支持SmartCard API.

我想通过我的Android应用程序访问基于SIM的安全元素(SE).我是否可以在不支持任何这些受支持的设备且无需重建其Android系统映像的情况下实现此目的?就我而言,该设备是三星galaxy S3.

解决方法

是的,您可以在不支持系统的情况下使用SEEK-for-Android.但是,这项技术非常依赖于设备;某些供应商特定的库必须存在于系统中.索尼Xperia没有必要的改变,它对我来说很好.在添加了一些库(三星公司按照我们的要求做到了)之后,三星手机也没问题.

您唯一需要做的就是使用特殊的SDK构建应用程序.使用Giesecke&amp ;;的SDK Open Mobile API. Devrient GmbH并在清单XML中声明org.simalliance.openmobileapi库:

<application android:label="@string/app_name">

    <uses-library android:name="org.simalliance.openmobileapi" android:required="true" />

    <activity android:name=".MainActivity">
      ...
    </activity>
</application>

看看这个教程:https://github.com/seek-for-android/pool/wiki/UsingSmartCardAPI.我跟着它,我成功了.

Does Harvard make you smarter

Does Harvard make you smarter

Vocabulary:

    stubborn 

    contemplate

    scrawny

    bodybuilder

    cyclist

    bottom heavy

    appeal

    well-built

    streamlined

    sign up

    a short while

    succumb

    succumb to

    illusion

    extensive

    physique

    fall prey to 

    cheekbone(s) 

    chiselled

    recruit

    mediocre

    cafeteria 

    rigorous

    lure

    horrendous

    tuition

    prospective

    fall for

    imply

    wholesale

    swallow

    pay cheque

    contentment

    trait

    stark

    futile

    treacherous

    berth

    wary

    strive

    immaculate

    demeanour

    plunge


     The last paragraph:

            In conclusion : be wary when you are encouraged to strive for certain things - be abs of steel,immaculate looks , a higher income, a long life , a particular demeanour or happiness . You might fall prey to the swimmer''s body illusion . Before you decide to take the plunge, look in the mirror - and be honst about  what you see .

        虽然看起来这个结论似乎有点打击人啊,但是也是在提醒我们追求一些东西的时候,不要盲目,要认清自己。

        

        比较浅显的理解,欢迎交流。




freemarker访问java的annotation

freemarker访问java的annotation

freemarker访问annotation


比如annotation是这样的
public @interface FireField {
String value();
//描述
String description() default "";
}


如果annotation是在链表中
List<FireField> fieldAnnotationItems= new ArrayList<FireField>();

在访问时加上括号:
<#list fieldAnnotationItems as f>
${f.value()}
${f.description()}
</#list>

关于从Linux 64位访问javax.smartcardio的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于5. 键盘控制 smartcar、android – 如何在不支持已支持SmartCard API的设备的情况下访问Secure Element、Does Harvard make you smarter、freemarker访问java的annotation的相关信息,请在本站寻找。

本文标签: