*概要 [#t28eed05]
-FeliCa RC-S620Sを使って暗号化されていないブロックを読み込む

*詳細 [#p49e4d36]
-RC-S620Sは[[スイッチサイエンス>https://www.switch-science.com/catalog/353/]]で購入可能
-RC-S620Sの技術資料は[[SONYのサイト>http://www.sony.co.jp/Products/felica/business/tech-support/index.html#Port]]で公開されている
-ArduinoでFelicaを読み取るサンプル
--[[「Arduino向けRC-S620/S制御ライブラリ」ダウンロードページ>http://blog.felicalauncher.com/sdk_for_air/?page_id=2699]]
--[[Arduino+RC-S620/SでFeliCa IDmを取得してLCDに表示する>http://www.atelier-nodoka.net/2012/05/arduino-lcd-rcs620s-felica-idm/]]
-ただし、上記のサンプルだとIDmぐらいしか読み取れない。暗号化されていないブロックを読むためには、RC-S620Sのコマンドリファレンスに書かれている「CommunicateThruEX」コマンドを使用してFelicaカードのコマンドを発行する必要がある
-「CommunicateThruEX」コマンドは上記のサンプルの「RCS620S::cardCommand」で送れる
-Felicaカードのコマンドは[[Felicaカードユーザーズマニュアル>http://www.sony.co.jp/Products/felica/business/tech-support/st_usmnl.html]]に記載されている
-上記のマニュアルの「Read Without Encryptionコマンド」を使用すれば暗号化されていないブロックを読むことができる
-サンプルコードは下[[Interface 2012 4月号の特集 FeliCaリーダを使った電子マネー表示システムの製作>http://www.cqpub.co.jp/interface/download/contents.htm]]が参考になる
-「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;
 }


----

&size(12){Total:&counter(total); / Today:&counter(today); / Yesterday:&counter(yesterday);};

トップ   差分 バックアップ リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS