Top > FeliCa RC-S620Sを使って暗号化されていないブロックを読み込む方法

概要

  • FeliCa RC-S620Sを使って暗号化されていないブロックを読み込む

詳細

  • RC-S620Sはスイッチサイエンスで購入可能
  • RC-S620Sの技術資料はSONYのサイトで公開されている
  • ArduinoでFelicaを読み取るサンプル
  • ただし、上記のサンプルだとIDmぐらいしか読み取れない。暗号化されていないブロックを読むためには、RC-S620Sのコマンドリファレンスに書かれている「CommunicateThruEX」コマンドを使用してFelicaカードのコマンドを発行する必要がある
  • 「CommunicateThruEX」コマンドは上記のサンプルの「RCS620S::cardCommand」で送れる
  • FelicaカードのコマンドはFelicaカードユーザーズマニュアルに記載されている
  • 上記のマニュアルの「Read Without Encryptionコマンド」を使用すれば暗号化されていないブロックを読むことができる
  • サンプルコードは下Interface 2012 4月号の特集 FeliCaリーダを使った電子マネー表示システムの製作が参考になる
  • 「balance_reader_src\target\frk_rx62n_hew\balance_reader\balance_reader\read_iccard.c」の下記のコードで大丈夫そう
    /*!
     *    \brief    Read Without Encryptionコマンド処理
     *    \param    idm [in] 対象FeliCaカードのIDm
     *    \param    sio [in] サービスコード
     *    \param    bid [in] ブロック番号
     *    \param    data [out] 読み出したブロックデータの格納療育
     *    \retval   true コマンド成功
     *    \retval   false コマンド失敗
     *    \note     同時読み出しブロック/サービス数は1に限定している
     */
    static bool_t
    read_without_encryption
        (IDM idm , uint16_t sid , uint8_t bid , ICCARD_BLOCK_DATA *data)
    {
        uint8_t command[READWITHOUTENC_LEN];
        uint8_t response[INCOMMTHRU_BUFSIZE(28 + 1)];
        bool_t ret = false;
        
        /* コマンドの作成 */
        command[0] = READWITHOUTENC_LEN;
        command[1] = COMMAND_READWITHOUTENC;
        command[2] = (uint8_t)((idm.high >> 24u) & 0xffu);
        command[3] = (uint8_t)((idm.high >> 16u) & 0xffu);
        command[4] = (uint8_t)((idm.high >> 8u) & 0xffu);
        command[5] = (uint8_t)((idm.high >> 0u) & 0xffu);
        command[6] = (uint8_t)((idm.low >> 24u) & 0xffu);
        command[7] = (uint8_t)((idm.low >> 16u) & 0xffu);
        command[8] = (uint8_t)((idm.low >> 8u) & 0xffu);
        command[9] = (uint8_t)((idm.low >> 0u) & 0xffu);
        command[10] = 1;    /* サービスは1つ */
        command[11] = (uint8_t)((sid >> 0u) & 0xffu);
        command[12] = (uint8_t)((sid >> 8u) & 0xffu);
        command[13] = 1;    /* ブロック数は1つ */
        command[14] = 0x80U;
        command[15] = bid;
        
        if(rc_s620_incommunicatethru(command , response ,
                READWITHOUTENC_LEN , INCOMMTHRU_BUFSIZE(28)) == true)
        {
            /* 読みだしたデータをコピー */
            memcpy(data->data , &response[13] , 16);
            ret = true;
        }
        return ret;
    }

Total:593 / Today:1 / Yesterday:2


リロード   差分   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Sat, 18 Jun 2016 23:38:49 JST (254d)