Emotion Wave Tech Blog

福岡にあるエモーションウェーブ株式会社のエンジニアが書いています。

ACR122U-A9のビープ音を消す方法

このネタ、あまり需要はないと思いますが、 情報が少ないのでいつか誰かのお役に立てば・・・と思います。

ACR122U-A9は、NFC接触ICカードリーダーライターです。 簡単に言うと、ICカードをかざすとカード内のデータを読み書きできる製品です。 国内製品ではsonyPaSoRiが有名で、電子決済や、交通機関などのアプリと 連携して利用されています。

で、本題です。 ACR122U-A9を入手し、カードをかざしたところ「ビッ」というビープ音がしました。 今回作成しているアプリケーションでは、アプリからも音を出していたので、 カードをかざした時にアプリから出す優しげな音と、ACR122Uからでる「ビッ」っという 力強い音がけんかしてしまうという状態になってしまいました・・・。

聞くところによると、以前のバージョンではそんな音は出なかったそうです。 最新のバージョンではデフォルトで音が出るように設定されているとのことで・・。 マニュアルは英語・・・、製品付属のサンプルコードにも、肝心のビープ音制御部分はなし・・・、 その後、あの手この手で調査した結果、ビープ音を消すことに成功しました。

それが以下のサンプルコードです。 VB6のコードですが他言語でも同様の方法で可能です。 SCardConnect、SCardControlは、APIとして提供されているファンクションになります。

Public Function muteACR122() As Long
    'reset
    rtnCode = CardDisConnectACR122()
    
    'connect
    rtnCode = SCardConnect(hContext, frmMain.cbReader.Text, _
                           SCARD_SHARE_DIRECT, 0, hCard, Protocol)
    
    'beep control
    Dim rtnByte As Long
    Call ClearBuffers
    SendBuff(0) = &HFF     'Class
    SendBuff(1) = &H0      'INS
    SendBuff(2) = &H52     'P1
    SendBuff(3) = &H0      'P2
    SendBuff(4) = &H0      'Lc
    SendLen = 5
    RecvLen = UBound(RecvBuff)        
    rtnCode = SCardControl(hCard, IOCTL_CCID_ESCAPE_SCARD_CTL_CODE, _
                           SendBuff(0), SendLen, RecvBuff(0), RecvLen, rtnByte)
    
    muteACR122 = rtnCode

End Function