やっちまった。
パスワードの保存場所
~/.vnc/passwd
ただし、暗号化されているためファイルを開いても読めません。
vncpasswdコマンド
こんなコマンドが有るんですね。
vncpasswdで、引数に先程のファイルを渡して実行するとVNCのパスワードを変更できます。
$ vncpasswd ~/.vnc/passwd
tightvncserverで設定した古いパスワードを聞かれること無く、新しいパスワードに変更できました。
やっちまった。
~/.vnc/passwd
ただし、暗号化されているためファイルを開いても読めません。
こんなコマンドが有るんですね。
vncpasswdで、引数に先程のファイルを渡して実行するとVNCのパスワードを変更できます。
$ vncpasswd ~/.vnc/passwd
tightvncserverで設定した古いパスワードを聞かれること無く、新しいパスワードに変更できました。
取り急ぎ、SD作成〜起動まで。
こちらをご参照のこと。
下記サイトから、RPi用のイメージをダウンロード。 およそ268MBのZIPファイルです。
Mac標準の解凍アプリだと正しく回答できなかったため、The Unarchiver
で解凍。
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はテレビに繋ぎます。
最初、文字がちょこっとだけ流れて、その後Android ThingsのBOOT画面になります。
その後、無事に起動。 特に何もできない様子。
アプリ書きますか・・・。
前回はWi-Fi周りを色々検証してみました。
BluetoothのSnifferなんて持ってないので、Amazonアプリが入っている端末で開発者向けオプションを有効にして、Bluetooth HCIスヌープログを有効にする
にチェックをいれてBluetoothのパケットをキャプチャしてみた。
キャプチャ方法は以下の通り。
http://relativelayout.hatenablog.com/entry/2016/06/02/204600relativelayout.hatenablog.com
特にスマホ→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ボタン。
買ったばかりですが、このボタンをどうにか改造して、他の用途に使えないかの検証をしてみました。
セットアップはスマホのAmazonアプリから行う模様。位置情報のパーミッションが求められるということは、Wi-FiやBluetooth/BLEのスキャンを行っていると思われる。その後、家のAPのSSID/PW入力画面と、商品選択画面が続く。
上記のサイトのように、SSID/PWの設定が終わり、すぐにセットアップを中断すれば、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のトリガーとか)を実行するものである。
MacBookからtcpdumpコマンドを走らせて、Wiresharkでパケットを解析してみた。たしかにARPプローブを発見できる。したがって、Amazon Dashボタンをハックするには、以下のことが言えそうである。
Amazon Dashボタンは非常に安価でDIY魂に火をつける一方で、従来のハック方法では、Amazon Dashボタン押下の監視役が必要となるので、若干面倒である。BLEの通信で授受している情報で抜け穴があれば、なんとかなりそうだが・・・。希望としては、HTTP POSTのURLと、POSTしている内容を変更できたら本当に嬉しいんだけどなぁ・・・。
こんな感じ。
基盤の裏側には皆さんおなじみのESP8266ボードがあります。
スライドスイッチは、USBオスからの5V給電のON/OFFができ、USBの5VとGNDは、ESP8266ボードの5VとGNDにつながっています。
プッシュボタンはESP8266のGNDとGPIO0(Pull-up)につながっていて、ボタン押下をトリガーに、プログラムを走らせることを目論んでます。
USBオスはめんどくさいので既製品を使います。
はんだ付けは苦手なので、テキトーにやっていきます。
今回は試しに、ボタンを押すとTwitterで「#ponponpain」とつぶやくガジェットを作ってみます。
#include <ESP8266WiFi.h> char ssid[] = "SSID"; char password[] = "PASSWORD"; int button = 0; // GPIO 0(PULL-UPを使う) WiFiClient wifiClient; char host[] = "maker.ifttt.com"; char url[] = "/trigger/(IFTTTのトリガー名)/with/key/(IFTTTのKEY)"; int port = 80; void setup() { pinMode(button, INPUT_PULLUP); Serial.begin(115200); Serial.println(""); // 接続処理 connectWifi(); initializeHttpClient(); } void loop() { // 本当は割り込み処理で実装したかったが、Watchdogの例外が起こってしまい断念 if (digitalRead(button) == LOW) { // PONPONPAINを叫ぶ ponponpain(); // 立て続けにPOSTができなかったため、ここで一旦切断 wifiClient.stop(); initializeHttpClient(); } else { delay(100); } } void connectWifi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(100); } Serial.println("connected!"); Serial.println(WiFi.localIP()); } void initializeHttpClient() { if (!wifiClient.connect(host, port)) { Serial.println("connection failed"); Serial.print("client status : "); Serial.println(wifiClient.status()); Serial.print("client connected : "); Serial.println(wifiClient.connected()); } else { Serial.println("connection success"); } } // PONPONPAINを叫ぶ void ponponpain() { WiFiClient wifiClient; String json = "{\"value1\":\"#ponponpain\"}"; if (!wifiClient.connect(host, port)) { Serial.println("connection failed"); return; } Serial.println("http post..."); wifiClient.println(String("POST ") + url + " HTTP/1.1"); wifiClient.println(String("Host: ") + host); wifiClient.println("Cache-Control: no-cache"); wifiClient.println("Content-Type: application/JSON"); wifiClient.print("Content-Length: "); wifiClient.println(json.length()); wifiClient.println(); wifiClient.println(json); }
こんな感じ。相変わらずクソコードです。
IFTTTのMakerチャネルで、イベント(今回はponponpainという名前)を作成して、そこにHTTP-POSTされた値を、そのままTwitterに投稿するレシピを作成。
今回、USBオスからの給電に対応したため、モバイルバッテリーに直挿ししても使えます。
ボタンを押して、しばらくすると・・・
— ポキオ (@pokiiio) 2016年12月3日
こんな感じで、世界中にponponpainを伝えることができました。
国内最大級のIoTに関するライトニングトーク大会。先月に引き続き登壇してきました。運営の方々やウフルの皆さん、ありがとうございました。
ウフルさんのオフィスは虎ノ門(!)にあり、最寄り駅が神谷町とのこと。職場の品川からは直線距離は近いもののアクセスがちょっと悪いので、都バスで品川→飯倉片町まで行ってそこから散歩することに。
東京タワー、こんにちは。半分観光気分で、写真を撮りまくりました。完全にお上りさんです。
飯倉片町から神谷町までは、大使館的な建物が多く、セキュリティレベルが高そうな雰囲気でした。なんか機動隊が乗ってそうなクルマばかりだし、おまわりさん大杉でビビるぜ。
そんなこんなで、ウフルさんオフィス到着。エントランスからしてシャレオツなんですが…
中も超絶シャレオツでチビリそうです。
www.instagram.com
いままでコソコソ実装してきた、家での消費電力(電流)をESP8266ボードで測定してクラウドにアップロードする話です。
#iotlt 電気を大切にする話 pic.twitter.com/x48aAOkqC1
— やまちょ (@yamacho1111) 2016年10月11日
割りとオーディエンスが静かだったので焦りましたが(笑)、ツイッター上では盛り上がってました。
資料はこちらです、ご査収下さい。
懇親会では沢山の方々とお話することができました。
1灯2差ソケット+コンセント2個 E26用 [品番]04-7605
などなど、色々アドバイスを頂きました。個人的には、一応Androidモバイルアプリエンジニアなので、それと組み合わせた何かを作ってみたいなぁと思っていますが…。おいおい何か作ってみようとおもいます。
IoTLTでがじぇるね賞をいただきました。
twitter.comがじぇるね賞をいただきました!
— ポキオ (@pokiiio) 2016年9月14日
ありがとうございました!#iotlt pic.twitter.com/8Xul5wcMpo
GR-SAKURAとは、ざっくり言うとArduinoのようなマイコンボードです。有線LANが付いていたり、GPIOの数が非常に多いです。桜色の基盤が印象的です。
GR-SAKURAはArduinoと違って、WEBコンパイラで実装ができます。たしかに便利なんですが、やっぱりローカルにIDEが欲しい。そんな人向けにIDE for GRが用意されています。Mac版もあるので素晴らしいですね。
とりあえずダウンロード。起動してみると、GUIも桜色。
IDEの画面は、色味こそ違うものの基本的にはArduinoのIDEと同じような感じ。違和感なく使えそうです。
余ってた7セグ液晶を光らせるべく、実装してみます。まぁ、ジャンパワイヤで配線するだけでも一苦労・・・。
今回は、便利ライブラリを使わずに、ゴリゴリ実装してみます。
void setup() { } void loop() { displayNumbers(0, 2,3,4,5,6,7,8,9,10,11,12,13); } void displayNumbers(int numbers, int pin1, int pin2, int pin3, int pin4, int pin5, int pin6, int pin7, int pin8, int pin9, int pin10, int pin11, int pin12){ pinMode(pin1, OUTPUT); pinMode(pin2, OUTPUT); pinMode(pin3, OUTPUT); pinMode(pin4, OUTPUT); pinMode(pin5, OUTPUT); pinMode(pin6, OUTPUT); pinMode(pin7, OUTPUT); pinMode(pin8, OUTPUT); pinMode(pin9, OUTPUT); pinMode(pin10, OUTPUT); pinMode(pin11, OUTPUT); pinMode(pin12, OUTPUT); digitalWrite(pin1, HIGH); digitalWrite(pin2, HIGH); digitalWrite(pin3, HIGH); digitalWrite(pin4, HIGH); digitalWrite(pin5, HIGH); digitalWrite(pin6, HIGH); digitalWrite(pin7, HIGH); digitalWrite(pin8, HIGH); digitalWrite(pin9, HIGH); digitalWrite(pin10, HIGH); digitalWrite(pin11, HIGH); digitalWrite(pin12, HIGH); displayNumber(0,true,pin12,pin11,pin7,pin4,pin2,pin1,pin10,pin5,pin3); displayNumber(0,true,pin9,pin11,pin7,pin4,pin2,pin1,pin10,pin5,pin3); displayNumber(0,true,pin8,pin11,pin7,pin4,pin2,pin1,pin10,pin5,pin3); displayNumber(0,true,pin6,pin11,pin7,pin4,pin2,pin1,pin10,pin5,pin3); } void displayNumber(int number, boolean dot, int com, int a,int b,int c,int d,int e,int f,int g,int dp){ digitalWrite(com, LOW); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(dp, dot ? HIGH : LOW); digitalWrite(com, HIGH); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(dp, HIGH); }
本当は、任意の数字を表示する実装をしようと思ったんですが、途中で心が折れました。今度、テキトーに修正します。
ちょこっとだけGR-SAKURAを使ってみましたが、Arduinoとあまり変わらない感じが非常にうれしいですね。とくに困ること無く実装できました。まだ、有線LAN関係の実装ができていないので、おいおい実装してみたいと思います。
国産マイコンボードGR‐SAKURAではじめる電子工作 (I・O BOOKS)