Androidのメモとか

ポキオの日記です。今日も遅延してない。

地味だけど役に立ったガジェット・オブ・ザ・イヤー的なアレ(しかも4つ)

愛すべきガラクタ達。

Amazon Dash Button

Amazon Dash Button

[asin:B01L2WOS0W:detail]

IoT界隈だけでなく、多方面に影響を与えたガジェットではないでしょうか。とりあえず購入された人も多いハズ。ハック目的に使えるかなと思いつつ、ボタン押下検知が意外と泥臭かったり、個人的には使いみちに困っています・・・。

正確に言うと役に立ってはいませんが、これから役に立つようなハックをする!という決意を込めて。

取り急ぎ首から下げてみまして、どこでもファブリーズ注文できるマンになってみたりしました。来年こそはちゃんといじり倒して上げる予定です。多分。

Peak Design AL-2

Peak Design AL-2

これをガラクタと呼ぶのは少し失礼かもしれない。一眼とかのストラップを簡単に取り外し・取り付けができるようになるガジェット。勉強会とかに行って、意外と机が狭かったりすると、ストラップが邪魔だったりするんですが。かと言って、その後の懇親会とかでストラップをつかってカメラをぶら下げたかったり。そんな欲求を満たしてくれる良いガジェットでした。

フェイスマスコット肩たたき棒 ブラウン

フェイスマスコット肩たたき棒 ブラウン

仕事をしていて、肩が凝ったときにトントン。ムシャクシャしてきたときにトントン。イライラしてきたときにトントン。愛くるしいルックスとは裏腹に、適度な硬さがあり、肩叩き機としては最適。あれ、肩たたきって、「た」が何個でしたっけ・・・?

SLIMPORT VGA/HDMI Adapter

SLIMPORT VGA/HDMI Adapter

eBayで購入。スマホからのHDMI出力といえば、MHLが有名ですが、実はSLIMPORTという規格もあります。LG端末の一部が対応していて、MHLと違って給電が必要ありません。

スマホで発表するダァシェリェスの人 #iotlt

A photo posted by n0bisuke (@n0bisuke) on

前回のIoTLTは、実はスマホで発表してきました。ラップトップ不要で登壇できるので、本当に楽。問題は接続性が未知数なところ。

来年も

よろしくおねがいします。

クリスマスなのでローストポークをArduinoでつくる

クリスマスといえば肉

クリスマスといえば、KFCやファミチキなどのジャンキーな肉が合法的に食すことができる数少ない機会として知られている。一方で、一旦ジャンキーな肉に一度手を染めてしまうと、一時は満たされるものの、徐々に耐性ができてしまい、次第にジャンキーな肉の摂取量が増えてきてしまいます。最終的には依存性という形で私達の健康を脅かす存在になってしまいます。嘘です。

せっかくのクリスマスなので、ローストポークを作ってみたいと思います。

Arduinoで低温調理します

以前(前のブログで)も同様のネタをやりましたが改めて。まずは熱源ですが、スロークッカーを使います。

ローストポーク

スロークッカーは単純に電気を熱に変換して、ただひたすら温める器具です。なので、通常の火加減だと温まりすぎてしまい、肉が固くなってしまいます。そこをArduinoを使って温度コントロールをします。

ローストポーク

Arduinoに温度センサーとソリッドステートリレーを接続します。温度センサーを鍋の中に入れて、常時温度を監視します。そして、温度がある閾値を超えたら、リレーを使ってスロークッカーの電源を切り、逆に閾値を下回ったら電源を入れて、鍋の温度を上げます。

Arduinoはこんな感じで実装します

コードも以前と同じ。ただし、今回バジェットの関係で豚肉を用いるため、念のためターゲットの温度を70℃とし、すこし高めに設定しています。

int MAX = 1024;
float B = 3435;
float T0 = 298.15;
float R0 = 10.0;
float R1 = 0.98;
float TARGET = 70.0;


void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT); // ソリッドステートリレーのON/OFF
  pinMode(12, OUTPUT); // 温度センサーのON/OFF
  pinMode(13, OUTPUT); // インディケーターLEDのON/OFF
}

void loop() {
  digitalWrite(12, HIGH);
  delay(1000);

  float temperature = getTemperature(analogRead(0));
  cookWithLove(temperature);
  Serial.println(temperature);

  digitalWrite(12, LOW);
  delay(9000);
}

float getTemperature(int analogInput) {
  Serial.println(analogInput);
  float r = calcResistance(analogInput);
  float t = calcTemperature(r);
  return t;
}

float calcResistance(int input) {
  return R1 * (MAX - input) / input;
}

float calcTemperature(float resistance) {
  float k = 1 / (log(resistance / R0) / B + (1 / T0));
  return k - 273.15;
}

void cookWithLove(float temperature) {
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);

  if (temperature < TARGET) {
    digitalWrite(2, HIGH);
    digitalWrite(13, HIGH);
  } else if (temperature > TARGET)  {
    digitalWrite(2, LOW);
    digitalWrite(13, LOW);
  }
}

肉を投入して調理開始

ローストポーク

肉は予め塩コショウを擦り込んで、若干のオリーブオイルをベタベタ塗った状態でジップロックに入れて一晩冷蔵庫で寝かしています。念のため、調理開始直前に肉の表面だけは軽くフライパンで焼いておきます。

ローストポーク

再びジップロックに幽閉して、スロークッカーにチャポンして、スイッチオン。冷水から温めると時間がかかりそうだったので、スロークッカーには予め温水を入れておきます。

ローストポーク

1−2時間(くらいだったはず)で、試しに肉(3パック準備したうちの1パック)を取り出してみて、切ってみました。いやー美味です。写真はすごく赤く写ってますが、それなりに火は通ってます。ただし、残りの2パックは計3−4時間加熱しました(してしまった)が、かなりパサパサになってしまったので、熱し過ぎには注意です。真似をしてもいいですが、食中毒になっても知りません。また、美味しすぎて食べ過ぎてしまっても責任は持ちません。

というわけで、良いホリデーシーズンを。

[asin:B0044X2E5S:detail]

ESP8266でHTTP GETするならWiFiClientじゃなくてHTTPClientのほうが良い

何言ってるか分からないと思いますが。

ESP8266

いろいろ困ったちゃんだったWiFiClient

relativelayout.hatenablog.com

ESP8266触る上で、やっぱりやりたくなるのがHTTP GET。以前、京急の運行情報のページをHTTP GETする際に使っていたのがWiFiClient。別に意識していたわけではなく、たまたまサンプルコードがWiFiClientだったので、それを使っていました。

しかし、一つ問題があって、GETするPayloadが長すぎると途中で途切れてしまう問題。これが厄介で、ワークアラウンドとしてRangeを指定してGETするPayloadを小さく、特定の部分だけ返してもらうようなRequestを投げるようにしていました。

便利で、デキる子、HTTPClient

たまたまネットを見ていたら、HTTPClientなるものを見つけ、なんとなく使ってみたらいい感じでした。インスタンスの初期化も簡単だし、とにかくRequestのHeaderも特に記載しなくてもGETできるので素敵です。

とりあえず、コードで書いてみました。

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

char ssid[] = "XXXXXXXX";
char password[] = "YYYYYYYY";

void setup() {
  Serial.begin(115200);
  Serial.println("");

  connectWifi();

  String result1 = getPageSource1("http://unkou.keikyu.co.jp/");
  Serial.println(result1);

  String result2 = getPageSource2("unkou.keikyu.co.jp");
  Serial.println(result2);

  disconnectWifi();
}

void loop() {

}

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  Serial.println("connected!");
}

void disconnectWifi() {
  WiFi.disconnect();
  Serial.println("disconnected!");
}

String getPageSource1(char host[]) {
  HTTPClient http;

  http.begin(host);
  int httpCode = http.GET();

  String result = "";

  if (httpCode < 0) {
    result = http.errorToString(httpCode);
  } else if (http.getSize() < 0) {
    result =  "size is invalid";
  } else {
    result = http.getString();
  }

  http.end();
  return result;
}

String getPageSource2(char host[]) {
  WiFiClient client;

  if ( !client.connect(host, 80) ) {
    return String("");
  }

  client.print(String("GET ") + "/" +
               " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  client.println();

  delay(1000);

  String body = "";

  while (client.available()) {
    body += client.readStringUntil('\r');
  }

  return body;
}

getPageSource1()はHTTPClientでGETし、getPageSource2()はWiFiClientで京急の運行情報を取得するコードにしてみました。

WiFiClientで取得してみる

シリアルモニタを見てみる。

ESP8266

最初はいい感じに取得できているが・・・

ESP8266

なぜか、最後は尻切れになって終了。 HTMLのHeaderが終わった直後くらいで切れているので、データとしてはあまり取得できていません。

HTTPClientで取得してみる

やっぱりHTTPClientですね。

ESP8266

ResponseのHeaderは見ることはできないものの、いい感じに取得できています。

ESP8266

そして、HTMLも最後の</html>まで取得できています。ちょっとHTTPClient、いい感じなので当面こちらを使ってみようと思います。

Raspberry PiのVNCのパスワードを忘れたので変更する

やっちまった。

パスワードの保存場所

~/.vnc/passwd

ただし、暗号化されているためファイルを開いても読めません。

vncpasswdコマンド

こんなコマンドが有るんですね。

raspberry pi vncpasswd

vncpasswdで、引数に先程のファイルを渡して実行するとVNCのパスワードを変更できます。

$ vncpasswd ~/.vnc/passwd

tightvncserverで設定した古いパスワードを聞かれること無く、新しいパスワードに変更できました。

Android ThingsのPreview版をRaspberry Pi用に焼いてみた

取り急ぎ、SD作成〜起動まで。

Android Thingsとは

こちらをご参照のこと。

developer.android.com

jp.techcrunch.com

Preview版のダウンロード

下記サイトから、RPi用のイメージをダウンロード。 およそ268MBのZIPファイルです。

developer.android.com

Mac標準の解凍アプリだと正しく回答できなかったため、The Unarchiverで解凍。

Preview版を焼き焼き

MacBook Airで作成しました。 まず、Micro SDをMacBook Airに刺す。(8GB以上)

とりあえず、Micro SDのDisk番号を下記コマンドで探す。

$ diskutil list

すると、こんな感じでDiskの番号がわかる。

/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *7.7 GB     disk2
   1:                 DOS_FAT_32 UNTITLED                7.7 GB     disk2s1

2番ということがわかったので、まずはアンマウント。

$ diskutil unmountDisk /dev/disk2

そんでもって、先程解答したイメージを焼いていきます。

$ sudo dd bs=1m if= path/to/iot_rpi3.img  of=/dev/disk2

これが結構時間がかかりました。

4352+0 records in
4352+0 records out
4563402752 bytes transferred in 4306.709407 secs (1059603 bytes/sec)

4300秒。1.2時間であります。 なにか設定間違えたかな・・・?

起動

Raspberry PiにMicro SDを刺して起動します。 一応、HDMIはテレビに繋ぎます。

Raspberry Pi 3 MODEL B

Raspberry Pi 3 MODEL B

  • 発売日: 2016/05/31
  • メディア: Personal Computers

最初、文字がちょこっとだけ流れて、その後Android ThingsのBOOT画面になります。

Android Things

その後、無事に起動。 特に何もできない様子。

アプリ書きますか・・・。

Amazon Dashボタンのハックにおける期待と落胆(Bluetooth編)

Amazon Dash Button

前回はWi-Fi周りを色々検証してみました。

relativelayout.hatenablog.com

今回はBluetoothを覗いてみました

BluetoothSnifferなんて持ってないので、Amazonアプリが入っている端末で開発者向けオプションを有効にして、Bluetooth HCIスヌープログを有効にするにチェックをいれてBluetoothのパケットをキャプチャしてみた。

Amazon Dash Button

キャプチャ方法は以下の通り。

http://relativelayout.hatenablog.com/entry/2016/06/02/204600relativelayout.hatenablog.com

たしかにAmazon Dash Buttonと通信している

Amazon Dash Button

特にスマホAmazon Dash ButtonへのWriteをよく見てみると、初っ端にすごい大きなPayloadをAmazon Dash Buttonに送っている。しかもPrepare Writeで小分けにして。

{"publicKey":"-----BEGIN PUBLIC KEY-----\n(長い英数字)\n(長い英数字)\n-----END PUBLIC KEY-----\n","scheme":0}

うーん、これは鍵っぽいですね(真顔) その後にスマホからWriteしているデータも、全くよくわからないPayloadなので、完全に暗号化されているようです。まぁ、平文では送りませんよね・・・。Bluetoothで送っているデータを書き換えられても、ちょっと実装はダルそうです。

というわけで

結局、Amazon Dash ButtonのHackはARP Probeの監視しか無いんでしょうか・・・。

Amazon Dashボタンのハックにおける期待と落胆(Wi-Fi編)

これ買いました

Amazon Dash

巷で流行りのAmazon Dashボタン。

[asin:B01L2WOS0W:detail]

買ったばかりですが、このボタンをどうにか改造して、他の用途に使えないかの検証をしてみました。

まずはセットアップ

Amazon Dash

セットアップはスマホAmazonアプリから行う模様。位置情報のパーミッションが求められるということは、Wi-FiBluetooth/BLEのスキャンを行っていると思われる。その後、家のAPのSSID/PW入力画面と、商品選択画面が続く。

github.com

上記のサイトのように、SSID/PWの設定が終わり、すぐにセットアップを中断すれば、Amazon Dashボタンに接続先の情報が書き込まれるが、ボタンを押したときに注文される商品の設定がされていない状態のため、どんなにAmazon Dashのボタンを押しても商品は注文されない。

Amazon Dashボタンをハックするには

そもそもAmazon Dashボタンは、ボタンが押されてから設定済みのAPに接続して、特定のURLに何かしらの情報をPOSTして、注文をしていると思われる。ただし、Amazon Dashボタンのハック方法は、上記のDasherを含めて、ネット上の情報を見る限り少しトリッキーである。

Amazon DashボタンがAPに接続した後に、ネットワーク上にBroadcastされるAPR Probeを監視して、そのBroadcastがAmazon Dashボタン(のMACアドレス)から行われたものかどうかを判断するもの。もしAmazon Dashボタンが押されたと検知されたら、他のタスク(例えばIFTTTのトリガーとか)を実行するものである。

Amazon Dash

MacBookからtcpdumpコマンドを走らせて、Wiresharkでパケットを解析してみた。たしかにARPプローブを発見できる。したがって、Amazon Dashボタンをハックするには、以下のことが言えそうである。

  • Amazon Dashボタンのハックは、AP接続後にBroadcastされるARP Probeを監視するのが一般的
  • 逆に言えば、Amazon Dashボタンが接続してくるネットワーク上で、常にARP Probeを監視するスクリプト・マシンが必要になってくる
  • 一方で、Amazon Dashボタンからの購入時、Amazonアプリがネットワーク上に存在しなくても注文ができた
  • AmazonアプリはARP Probeの監視をしておらず、注文自体はAmazon Dashボタン単体で完結しているっぽい

Amazon Dashボタンは非常に安価でDIY魂に火をつける一方で、従来のハック方法では、Amazon Dashボタン押下の監視役が必要となるので、若干面倒である。BLEの通信で授受している情報で抜け穴があれば、なんとかなりそうだが・・・。希望としては、HTTP POSTのURLと、POSTしている内容を変更できたら本当に嬉しいんだけどなぁ・・・。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。