Linux下通過CCID協定與USB裝置進行互動經驗總結

2020-10-25 07:01:11

1.目標

  在linux系統下通過ccid協定與USB裝置實現通訊。

2. 實現方法

  通過參考其他人的部落格,決定採用如下方式來實現ccid通訊。

2.1 安裝libudev

  udev 是Linux2.6核心裡的一個功能,它替代了原來的devfs,成為當前Linux 預設的裝置管理工具。udev以守護行程的形式執行,通過偵聽核心發出來的uevent來管理/dev目錄下的裝置檔案。不像之前的裝置管理工具,udev在使用者空間(userspace) 執行,而不在核心空間(kernel space) 執行。

2.1.1 編譯安裝

  如果是Centos可以通過執行:sudo yum install systemd-devel 或者sudo yum install libudev-devel;如果是Ubuntu可以通過:sudo apt-get install systemd-devel 或者 sudo apt-get install libudev-devel;如果已經有libudev-devel.rpm包,可以執行sudo rpm -ivh libudev-devel.rpm。

2.1.2 安裝提示錯誤

  在Ubuntu14.04下,直接執行sudo apt-get install systemd-devel 或者 sudo apt-get install libudev-devel,有的時候並不能安裝成功,會出現下面的提示:
在這裡插入圖片描述
  一般apt-get出現上面的情況,就是沒有更新APT庫,安裝如下方式進行更新即可(需要等待一段時間~):

sudo apt-get update
sudo apt-get upgrade

  執行結束後,我們再執行sudo apt-get install libudev-devel即可成功。

2.2 編譯安裝libusb

  對於連線到電腦的USB裝置,一般都會需要安裝對應的USB driver來支援。有一款開源的跨平臺的USB driver,就是libusb,可以用來進行自定義的USB裝置的驅動開發。
  libusb是一個C語言編寫的庫,可以供上層的應用來呼叫,和連線在筆電上的USB裝置進行通訊。易於移植,而且有對應的libusb-API的檔案,可以用於Linux, OS X, Windows, Android, OpenBSD等系統。而且支援USB 1.0到3.1的規範。一般在Linux系統上會自帶了libusb的。其他的平臺一般需要安裝libusb。

2.2.1 下載libusb

  在https://github.com/libusb/libusb/releases/ 地址中選擇一個版本進行下載,本文使用的是libusb-1.0.18。

2.2.2 編譯安裝過程

(1)解壓libusb-1.0.18.tar.gz安裝包,執行tar -xvf libusb-1.0.18.tar.gz。
(2)進入到libusb-1.0.18檔案下,執行三步:(a)./configure; (b) make; (c)sudo make install;

2.2.3 安裝時提示的錯誤

(1)錯誤提示
  checking for inline… inline
  checking operating system… Linux
  checking for library containing clock_gettime… -lrt
  checking libudev.h usability… no
  checking libudev.h presence… no
  checking for libudev.h… no
  configure: error: 「udev support requested but libudev not installed」
(2)解決辦法
  安裝libudev-devel即可解決,安裝方法已2.1節介紹。

2.3 編譯安裝pcsc-lite

  pcsc-lite 封裝了存取使用 SCard API (PC/SC) 存取智慧卡裝置的開發包。

2.3.1 下載pcsc-lite

https://alioth-archive.debian.org/releases/pcsclite/pcsclite/地址中選擇一個版本進行下載,本文選擇的是pcsc-lite-1.8.11版本。

2.3.2 編譯安裝過程

(1)解壓pcsc-lite-1.8.11.tar.bz2安裝包,執行tar -xvf pcsc-lite-1.8.11.tar.bz2。
(2)進入pcsc-lite-1.8.11資料夾下,執行三步:(a)./configure;(b)make;(c)sudo make install

2.4 編譯安裝ccid

  該庫為符合CCID協定的USB智慧卡驅動程式提供了PC / SC IFD處理程式實現。需要此軟體包才能通過PC / SC Lite資源管理器(pcscd)與CCID智慧卡讀取器進行通訊。

2.4.1 下載ccid

  在https://alioth-archive.debian.org/releases/pcsclite/ccid/ 地址中選擇一個版本進行下載,本文使用的是ccid-1.4.16版本。

2.4.2 編譯安裝過程

(1)解壓ccid-1.4.16.tar.bz2安裝包,執行tar -xvf ccid-1.4.16.tar.bz2。
(2)進入ccid-1.4.16檔案下,找到readers/supported_readers.txt檔案,進行如下修改:(a)增加:裝置名稱(自定義);(b)增加:VID:PID:裝置描述符;
(3)執行編譯及安裝,(a)./configure;(b)make;(c)sudo make install;

2.5 設定環境變數

  將編譯生成的共用庫的路徑新增到環境變數中。執行如下操作:
(1)通過vim /etc/profile的指令,開啟profile檔案。
(2)增加:export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH,儲存退出。
(3)執行 source /etc/profile。

2.6 ccid通訊協定測試

2.6.1 啟動pcsc服務

  在命令列中執行pcscd,注意如果不是root賬戶執行sudo pcscd。

2.6.2 測試結果

  在pcsc-lite-1.8.11/src/ 的路徑下找到testpcsc可執行檔案,插入裝置後,執行./testpcsc,結果如下則證明CCID協定通訊成功。
在這裡插入圖片描述

2.7 其他軟體包的安裝

  因為專案需要安裝一些其他的開源庫,因此在這裡記錄一下。

2.7.1 編譯安裝boost

  Boost是為C++語言標準庫提供擴充套件的一些C++程式庫的總稱。Boost庫是一個可移植、提供原始碼的C++庫,作為標準庫的後備,是C++標準化程序的開發引擎之一,是為C++語言標準庫提供擴充套件的一些C++程式庫的總稱。

2.7.1.1 下載boost

https://sourceforge.net/projects/boost/files/boost/ 地址中選擇一個版本下載,本文中使用的是boost_1_43_0。

2.7.1.2 編譯安裝過程

(1)解壓boost_1_43_0.tar.gz安裝包,執行tar -xvf boost_1_43_0.tar.gz。
(2)進入boost_1_43_0檔案中,執行如下步驟:(a)./bootstrap.sh;(b)./bjam(需要等待很長一段時間~);

2.7.1.3 安裝時提示錯誤

在這裡插入圖片描述
  由第一行可知有78個目標失敗,經過分析有一下幾個問題需要修改:
(1)./boost/python/detail/wrap_python.hpp:50:23: fatal error: pyconfig.h: No such file or directory,即pyconfig.h檔案無法找到。導致該問題產生的原因是,所需檔案在/usr/include/python2.7路徑下,需要將該路徑設定到系統路徑下。開啟/etc/profile檔案增加如下內容,再執行source /etc/profile

export PATH=/usr/include/python2.7:$PATH

再執行./bjam,結果如下:
在這裡插入圖片描述
(2)未完。。。

5. 參考連結

(1)https://blog.csdn.net/fafactx/article/details/22931141
(2)https://blog.51cto.com/seiang/1950594
(3)https://blog.csdn.net/suxiang198/article/details/75106296
(4)https://www.jianshu.com/p/8581d232dd6c
(5)https://blog.csdn.net/magic_ninja/article/details/87981662
(6)https://baike.baidu.com/item/boost/69144?fr=aladdin
(7)https://blog.csdn.net/yujun_huoxu/article/details/7913135