*概要 [#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);};