PGメモ

非エンジニアの記録

arduino + felicaport でURLをプッシュする

先週あたりからarduinoをいじりはじめまして。
目的はfelica搭載携帯にURLをプッシュする事。

いろいろ調べて2週間くらいかかってようやく事が実現できました
お世話になった所
Arduino日本語リファレンス
リーダライタ端末からの携帯ブラウザ起動等(三者間push)に関する情報
三者間通信
アトリエのどか
ASCIIコード表

今回はアトリエのどか様の所のコードを少し改変して使用しました。

#include 
#include 
#include 

#define COMMAND_TIMEOUT  400
#define PUSH_TIMEOUT    2100
#define POLLING_INTERVAL 500

#define LED_PIN 13

RCS620S rcs620s;
int waitCardReleased = 0;



void setup()
{
  int ret;

  digitalWrite(LED_PIN, LOW);
  pinMode(LED_PIN, OUTPUT);

  Serial.begin(115200);
  
  ret = rcs620s.initDevice();
  
  while (!ret) {}
}

int get_push_data(char url, uint8_t *data, byte *data_length)
{
     word chksum = 0;
     word cnt = 0;
     word str_len = (word) (strlen(url)+2); // url + paramsize
     chksum += data[cnt] = 0x01; // must
     cnt++;
     chksum += data[cnt] = 0x02; // run browser
     cnt++;

     chksum += data[cnt] = (byte) (str_len & 0x00ff);
     cnt++;
     chksum += data[cnt] = (byte)((str_len & 0xff00) >> 8);
     cnt++;
     
     str_len -=2;

     // url size
     chksum += data[cnt] = (byte)(str_len & 0x00ff); 
     cnt++;
     chksum += data[cnt] = (byte)((str_len & 0xff00) >> 8); 
     cnt++;
     
     // url body
     for(int i = 0; i < str_len; i++) {
       chksum += data[cnt] = url[i];
       cnt++;
     }
 
     word sum = (word)-chksum;
     data[cnt] = (byte)((sum & 0xff00) >> 8); 
     cnt++;
     data[cnt] = (byte)(sum & 0x00ff);
     cnt++;
 
     *data_length = cnt;
 
     return cnt;
}

void loop()
{
  int ret;

  // Polling
  digitalWrite(LED_PIN, HIGH);
  rcs620s.timeout = COMMAND_TIMEOUT;
  ret = rcs620s.polling();
  if (!ret) {
    if (waitCardReleased) {
      waitCardReleased = 0;
    }
  } else if (!waitCardReleased) {
    // Push
    char url = "http://www.hogehoge.co.jp";
  
    byte len;
    uint8_t data[192];
    int datasize = get_push_data(url, data, &len);

    rcs620s.timeout = PUSH_TIMEOUT;

    ret = rcs620s.push(data, datasize);
    if (ret) {
      waitCardReleased = 1;
    }
  }

  rcs620s.rfOff();
  digitalWrite(LED_PIN, LOW);
  delay(POLLING_INTERVAL);
}