LTE端末でIPv6

ついにIPv6がやってくる。

国内スマホユーザーを“IPv6デフォルト化”する計画が明らかに、携帯キャリア大手3社が2017年夏ごろ対応開始

というニュースが前に出ていて、どーせいつものヤルヤルでやらないんだべ…ヲレ知ってるもん。と思っていたら…

インターネットプロトコル IPv6対応について
Xi契約で、2017年夏モデル以降の対象機種はIPv6化!! しかも…

2017年夏モデル以降は原則、対応機種であれば、デフォルトでIPv6通信を利用する設定となっています。

マジでデフォでIPv6キタ━━━━(゚∀゚)━━━━!!
ってことで…もう暑いし夏っぽい気もするし、IPv6使えるんぢゃね?と思ってやってみたら、凄いっす…マジでIPv6降臨してくる。

■ iPhone
放置していたら、IPv6が降ってきていた。

■ Android
docomoの設定方法の通り、SPモードの設定をすると降ってくる。

Androidの場合は既存端末は設定が必要だけど、iPhone大国日本(w)だとデフォでみんなのスマホがIPv6化されているという流れが予想される。つまり…特に何も気にしなくてもIPv6を利用している、といった状態になるでしょー。
既にGoogle、Twitter、Akamai、Facebook…etcとか海外のサービスは、IPv6で利用できる。YoutubeとかはIPv6&QUICで動いていたりする。

■ IPv6デフォになった時の利点
国内の大抵のサービスはIPv4のみだったり、IPv6を振らないで運用していると思うけど、IPv6のアクセスがIPv4に比べて、結果的に相対的に早くなる。まず、環境的にはこんな感じ(IPv6グローバルを晒すけど、マスクするの面倒くさいし、まぁ良いっかwって感じ)

– 端末 : docomo SPモード(普通のSIM)、iPhone7 Plus、IPv4/v6が降ってきている、こんな感じね。

– サーバ: テスト用サーバ
同じサーバで適当に取っていたドメインを利用
domain : techgeeek.tokyo(ipv4のみ), www.techgeek.tokyo(ipv4/v6)
IPv4 : 150.95.155.109
IPv6 : 2400:8500:1302:829:150:95:155:109

この時、IPv4、IPv6でテスト用サーバにHTTP:80で接続するとき、最初のHTTP GETが端末から発行されるまでの時間をチェックする。

IPv4の時、first HTTP GET : 1.012014sec

IPv6の時、first HTTP GET : 1.003130sec

IPv6の方が、8.8msec早い。何度かやって平均を見てみると分かると思うけど、測定している時の端末やNW状況にも依存するものの、〜20msecほどIPv6の方が早かった。DNS応答の場合に依っては1秒超えることも。この原因の元になるのは、
大抵のOS(iPhone, Linux系、Win系)はIPv6のDNS問い合わせを優先する。
このことに起因している。

IPv4の接続シーケンスを図で見てみると…

AAAAも問い合わせるけど、Aレコードが戻ってきてTCP(SYN)で接続が行われる。他方…IPv6の場合は、Aレコード(IPv4)側が戻ってこなくても、最初に問い合わせたIPv6のAAAAを利用して、すぐさまTCP(SYN)が飛んでいる。まぁ、最初にAAAAの名前解決をしに行っているから当然と言えば、当然だけど。

つまり…IPv4/v6 Dualでスマホから接続しに行く時、IPv6の方が早く接続されるという流れになる。

■ 通信速度の利・欠点
サーバ側がIPv6も持っていると、端末からのアクセスが早くなる。地味にx0msecの差は大きい。
つまりIPv4のみの場合、IPv6に比べて遅くなる。現時点で、IPv4のみのNW、スマホもIPv4のみが多いから、IPv6 Globalを降っても何も変わらないけど、スマホがIPv4/v6 Dualになると顕在化する。例えば、広告や大量配信しているシステムやゲーム、数msecでも早くデータを渡したい!!といった所だと、この差がジワリと現れてくる。

「DNSが一旦解決されてキャッシュされれば問題ないべ?」とか優先度を変えればいいじゃん、と思うかも知れない…けど、残念な事にIPv4のみの場合、最初に何故かIPv6 AAAAレコードを問い合わせてから無かったら、IPv4側で接続しに行くというのが発動する(iPhoneで。常時では無いけど)。つまり…キャッシュされていてもIPv6側を問い合わせてから、IPv4側のキャッシュを使って接続する…という、IPv4に対する嫌がらせ(www)としか思えない動きが発生する。そもそも、DNSで設定していないにも関わらず。

(1行目、既にv4のアドレスを解決しているにも関わらず、AAAAを問い合わせる。)

まぁ、あれっすよ…GoogleのIPv6テストページを見て見るとヲレ未来に来ている感(w)で満足しちゃいそう。だけど、このIPv4のみで運用した場合に発生する、アクセス遅延について、IPv6を渋っている上司やら管理者を説得する材料とかでどぞ、「v4のまま、遅いアクセスを許容するんですね!!」って感じで。

まぁ…スマホ側がIPv4/v6のどちらも使えるのに、システム・サーバ側がIPv4だけ!!とか、もう意味ワカランというかカオス感はするけどねw 徐々にIPv6が使われますよーに:)

iOS 11 – AVDepthData camera test

Apple release new API AVDepthData(A container for per-pixel distance or disparity information captured by compatible camera devices.) on iOS11 beta, it can use on iPhone 7 dual camera now.

– DepthCamera image.
full body.1

full.body.2

left hand

– chair
RGB

DepthData

– ramen
RGB

DepthData

– box on chair
RGB

DepthData

– 3 box on texture sheet
RGB

DepthData

– on my desk
RGB

DepthData

– Japanese traditional armor
RGB

DepthData

– simple passage
RGB

DepthData

– on my desk
RGB

DepthData

– windshield
RGB

DepthData

– checker board on wood table
RGB

DepthData

– box&can on checker board(wood table)
RGB

DepthData

– box&can on wood table
RGB

DepthData

– box&can on white table
RGB

DepthData

– box&can on checker board(white table)
RGB

DepthData

– checker board on white table
RGB

DepthData

– white table
RGB

DepthData

– outside
RGB

DepthData

– outside
RGB

DepthData

– bamboo
RGB

DepthData

– rose
RGB

DepthData

– hydrangea
RGB

Depth

ufwを可視化

最近のUbuntu Linuxはufw(User Fire Wall)でiptablesをサクッと管理できる。iptableはある一定の攻撃とかバーストしてきた物は遮断してログに出力する事ができる。ufwだと/var/log/ufw.logに出力されて…こんな感じで見れる。

Jan 15 06:54:07 xxxxxxxx kernel: [403471.687391] [UFW BLOCK] IN=eth0 OUT= MAC=02:AA:BB:CC:DD:EE:FF:GG:HH:II:JJ:KK:LL:00 SRC=94.179.145.26 DST=AAA.AAA.AAA.AAA LEN=40 TOS=0x00 PREC=0x00 TTL=239 ID=16411 PROTO=TCP SPT=9807 DPT=23231 WINDOW=8192 RES=0x00 SYN URGP=0 
Jan 15 06:54:18 xxxxxxxx kernel: [403483.004926] [UFW BLOCK] IN=eth0 OUT= MAC=02:AA:BB:CC:DD:EE:FF:GG:HH:II:JJ:KK:LL:00 SRC=203.189.152.165 DST=AAA.AAA.AAA.AAA LEN=44 TOS=0x00 PREC=0x00 TTL=240 ID=15727 PROTO=TCP SPT=62986 DPT=23 WINDOW=14600 RES=0x00 SYN URGP=0 
Jan 15 06:54:44 xxxxxxxx kernel: [403509.027416] [UFW BLOCK] IN=eth0 OUT= MAC=02:AA:BB:CC:DD:EE:FF:GG:HH:II:JJ:KK:LL:00 SRC=203.189.156.28 DST=AAA.AAA.AAA.AAA LEN=44 TOS=0x00 PREC=0x00 TTL=240 ID=4355 PROTO=TCP SPT=2541 DPT=23 WINDOW=14600 RES=0x00 SYN URGP=0 

一部割愛しているけど、まぁこんな感じ。折角、アタックしてきてくれているから、このlogginデータを使わないわけにはいけないよね…何か楽しいし(w)と思うのは自然な感じ。
というわけで、構成はこんな感じでkibanaで可視化することに。

[ufw.log]->[fluentd]->[elasticsearch]->[kibana]

まずは結果から…データは2017/01/14-17のとある1個のサーバに対して。こんな感じ。

1) attack logging count
12190(2.8/min)

2) TCP/UDP attack
TCP: 9144, UDP:3046

まぁ…TCPですよねー感はする。

2) port/tcp, udp attack top 20

イマドキtelnetかよ(w)的なツッコミをしたくなる。

3) attack country unique ip top 20

China                                   1076
Viet Nam                              367
United States                       334
Brazil                                     294
Korea, Republic of               274
Turkey                                  251
India                                      214
Taiwan, Province of China  210
Mexico                                  207
Russian Federation             196
Iran, Islamic Republic of     134
Argentina                             101
Romania                                 86
Italy                                        80
France                                    78
Ukraine                                   75
Thailand                                 74
Australia                                64
Poland                                    60
Colombia                                60

1位は断トツの中国。まぁこれはそうですね感はするけど、2位がUSを抜いてベトナムというのが何気にビリビリするものがある。あとはいっぱいIPアドレスのリストが取れて何か嬉しい(w)。

他にも攻撃してきたipをtracerouteして逆向きのIPアドレスの情報もロギングして取得している。例えばこんな感じに(超割愛しているw)

 
攻撃元
IP       101.204.212.118
Lon/Lat  30.6667, 104.067
国/街     China/Chengdu
+-----+-----------------+---------+---------+---------------+-------------------+
| ttl    | ip_addr           | lon       | lat        |country_name| city_name         |
+-----+-----------------+---------+---------+---------------+-------------------+
|   1  | 133.208.191.134 | 139.692 | 35.6895 | Japan         | Tokyo             |
|   2  | 62.115.63.101   | -87.65  | 41.85   | United States | Chicago           |
|   3  | 213.248.82.206  | 8.68417 | 50.1155 | Germany       | Frankfurt am Main |
|   4  | 219.158.25.29   | 116.397 | 39.9075 | China         | Beijing           |
|   5  | 219.158.103.97  | 116.397 | 39.9075 | China         | Beijing           |
|   6  | 219.158.110.222 | 116.397 | 39.9075 | China         | Beijing           |
+-----+-----------------+---------+---------+---------------+-------------------+

この場合は、中国->ドイツ->アメリカ->日本といった経路っすね。近いのに地球の反対側を通ってきているね。遠方よりはるばるお疲れさまです。このデータはDBに突っ込んでおいて使えるようにしていたりもする。

■ 設定
1) UFW
このufwはめっちゃ簡単にiptablesを管理できるからサラッと使っていたりする。例えば…

# ufw status 
状態: アクティブ
To                         Action      From
--                         ------      ----
443                        ALLOW       Anywhere
80                         ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

こんな感じで一覧でサクッと分かる。iptablesだと…標準だとこんな感じね。

# iptables -L 
Chain INPUT (policy DROP)
target     prot opt source               destination         
ufw-before-logging-input  all  --  anywhere             anywhere            
ufw-before-input  all  --  anywhere             anywhere            
ufw-after-input  all  --  anywhere             anywhere            
ufw-after-logging-input  all  --  anywhere             anywhere            
ufw-reject-input  all  --  anywhere             anywhere            
ufw-track-input  all  --  anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ufw-before-logging-forward  all  --  anywhere             anywhere            
ufw-before-forward  all  --  anywhere             anywhere            
ufw-after-forward  all  --  anywhere             anywhere            
ufw-after-logging-forward  all  --  anywhere             anywhere            
ufw-reject-forward  all  --  anywhere             anywhere            
ufw-track-forward  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ufw-before-logging-output  all  --  anywhere             anywhere            
ufw-before-output  all  --  anywhere             anywhere            
ufw-after-output  all  --  anywhere             anywhere            
ufw-after-logging-output  all  --  anywhere             anywhere            
ufw-reject-output  all  --  anywhere             anywhere            
ufw-track-output  all  --  anywhere             anywhere            

Chain ufw-after-forward (1 references)
target     prot opt source               destination         

Chain ufw-after-input (1 references)
target     prot opt source               destination         
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-ns
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-dgm
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:netbios-ssn
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:microsoft-ds
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootps
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootpc
ufw-skip-to-policy-input  all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST

Chain ufw-after-logging-forward (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-after-logging-input (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-after-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-after-output (1 references)
target     prot opt source               destination         

Chain ufw-before-forward (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
ACCEPT     icmp --  anywhere             anywhere             icmp source-quench
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ufw-user-forward  all  --  anywhere             anywhere            

Chain ufw-before-input (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ufw-logging-deny  all  --  anywhere             anywhere             ctstate INVALID
DROP       all  --  anywhere             anywhere             ctstate INVALID
ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
ACCEPT     icmp --  anywhere             anywhere             icmp source-quench
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc
ufw-not-local  all  --  anywhere             anywhere            
ACCEPT     udp  --  anywhere             224.0.0.251          udp dpt:mdns
ACCEPT     udp  --  anywhere             239.255.255.250      udp dpt:1900
ufw-user-input  all  --  anywhere             anywhere            

Chain ufw-before-logging-forward (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-input (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-before-output (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ufw-user-output  all  --  anywhere             anywhere            

Chain ufw-logging-allow (0 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW ALLOW] "

Chain ufw-logging-deny (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             ctstate INVALID limit: avg 3/min burst 10
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-not-local (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type MULTICAST
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST
ufw-logging-deny  all  --  anywhere             anywhere             limit: avg 3/min burst 10
DROP       all  --  anywhere             anywhere            

Chain ufw-reject-forward (1 references)
target     prot opt source               destination         

Chain ufw-reject-input (1 references)
target     prot opt source               destination         

Chain ufw-reject-output (1 references)
target     prot opt source               destination         

Chain ufw-skip-to-policy-forward (0 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            

Chain ufw-skip-to-policy-input (7 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            

Chain ufw-skip-to-policy-output (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain ufw-track-forward (1 references)
target     prot opt source               destination         

Chain ufw-track-input (1 references)
target     prot opt source               destination         

Chain ufw-track-output (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             ctstate NEW
ACCEPT     udp  --  anywhere             anywhere             ctstate NEW

Chain ufw-user-forward (1 references)
target     prot opt source               destination         

Chain ufw-user-input (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     udp  --  anywhere             anywhere             udp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere             udp dpt:http

Chain ufw-user-limit (2 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 5 LOG level warning prefix "[UFW LIMIT BLOCK] "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain ufw-user-limit-accept (2 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain ufw-user-logging-forward (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-input (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-output (0 references)
target     prot opt source               destination         

Chain ufw-user-output (1 references)
target     prot opt source               destination      

まぁ..iptablesはパッと見で意味不明っすね。ってことで、ufwは適宜設定しておく。

2) fluentdの設定
ノリでこんな感じ。ufwからは他にも色々と取れたりするから適宜取得しておく。ぶっちゃけ、これ書いて設定とか終わりな感はする。

<source>
 type tail
 time_key time
 format /(?<time>[^\]]*).*SRC=(?<src>[^ ]*).*PROTO=(?<proto>[^ ]*).*DPT=(?<dpt>[^ ]*).*/ 
 time_format %b %d %H:%M:%S 
 path /var/log/ufw.log
 pos_file /var/log/td-agent/ufw.pos
 tag ufw.combined
</source>
<match ufw.*>
 type elasticsearch
 host hogehoge.host
 port 9200

 index_name ufw_log
 type_name ufw_log
 logstash_format true
 logstash_prefix ufw_access
 logstash_dateformat %Y%m
</match>

3) elasticsearch/kibanaの設定
これはググればOK。突っ込んで見るだけ。

■ おわりに…
こういうデータを持っておいて可視化しておくと、攻撃元IPのブラックリスト化、攻撃の傾向/トレンドの把握とかで、まぁちょろっとは使えるでしょう。まぁ、あとはpub/sub系のに流して、ブラウザで攻撃があったら情報がリアルタイムで見れるようにしておくとかね。これ系のは何となくそれなりっぽい規模の会社に1個くらい、可視化しれ見れるよーにしておくと、何となく後々幸せになれるような気がちょっぴりする。
あとtracerouteをかけて、経路のデータ/IPアドレスを取得してDBにまるごと突っ込んで簡単に使えるようにもしている。何となくDBにも入れておけば後々便利だし(esだけでも良いけどね)。

ESP32 with Arduino how to work

I got a ESP32-S from US friend kaduhi. Thank you!! I will enjoy this exciting device and experiment/create codes:)

p_20161121_213054_hdr

ESP32-S spec is here.
CPU : Xtensa® 32-bit LX6 Dua-core processor
ROM/SRAM: 448 KByte ROM, 520 KByte SRAM
WiFi : 802.11 b/g/n/e/i
Bluetooth : Bluetooth v4.2 BR/EDR and BLE
And others amazing spec is hardware accelerated encryption: AES / SHA2 / Elliptical Curve Cryptography / RSA-4096. This hardware encryption is very useful for IoT and TLS networking. I thinking ESP32 is powerful PC including networking spec.

手持ちの歴代ESPとのサイズ比較な感じだと。右下がESP32-S、左上がESP-WROOM-02、右上はESP8266、左下がESP12。
p_20161121_220216

基板に付けるとこんな感じに。
p_20161121_224414

img_0083

開封して基板にとりあえず付けるとこんな感じ。前のESP8266に比べて圧倒的にピン数が多いっすね。「これだけのだし、何でも面白いものを作れるだろ?」という暗黙のプレッシャーを感じるです…

ここで、この子にピンヘッダをおもむろに付けようと思ったけど、2列だからブレッドボードに指したりしようとすると何かと不都合が…
そういう時に活躍するのが、スルホール用テストワイヤとか。ただ、自分は後でピンの抜き差しを自由に出来るように、2列10ピンのピンソケットの1個を抜いて使うことに。

img_0086

完成

img_0095

Arduinoで使ってみる

すでにESP32 Arduinoが公開されている。ESP8266と一緒な感じでArduino IDEから使えると非常に便利で、開発者も一気に広まるというのもあるからね。ということで、このgitを使う。

記載の通り進める。自分の環境はMacOS 10.11.6でPythonは2.7というのもあって、pyserialを入れる必要があった。

cd /Applications/Arduino.app/Contents/Java
cd hardware
mkdir espressif
cd espressif
git clone https://github.com/espressif/arduino-esp32.git esp32
cd esp32/tools
python get.py
# pyserialを入れる。pyenvとかpipを使っている場合は、それに合わせて入れる
wget https://pypi.python.org/packages/1f/3b/ee6f354bcb1e28a7cd735be98f39ecf80554948284b41e9f7965951befa6/pyserial-3.2.1.tar.gz
tar -zxvf pyserial-3.2.1.tar.gz
cd pyserial-3.2.1
sudo python setup.py install 

次にArduinoの起動〜利用。Arduinoを起動してESP32を選択。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-24-1-37-13

次にESPとシリアルの結線。これはそのまんま。自分はFT232RL搭載小型USB-シリアルアダプタ 3.3Vをいつも使っているんだけど、3.3V/GND, TX<->RXをESP32側とつなげるとOK。

起動時のログはこんな感じでシリアルから見れる(既にArduino化されているのだけど)。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-24-1-22-31

そして問題の書き込み。これはムチャクチャ簡単。

1. RESET + IO0を同時押し
2. RESETを離す
3. Arduino IDE上からFlashをポチる

以上な感じ。この辺はムチャクチャ簡単に出来る。2の時点でシリアルを見るとこんな感じの表記が出ている。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-24-1-24-15

そして書き込みをすると、Arduino IDEではこんな表記が出る。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-24-1-24-21

そしてLEDピカー

img_0093

上向きにピンソケットを出せば良かったかな…と2秒くらい後悔したw FT232RLだけでサクサクっと動かして使えるのはめっちゃ良い。

あと不明な所はESP32 forumを見れば解決すると思われ。最後に、FCCは通っているけど現時点ではTELECは通って無いっすね。WiFiのlibとかは上記のgitに普通に入っている。ここではWiFiを出しているとは何も書いていないんでお察しでw

追記で…WiFiに接続しようとすると、このままだと接続できない。というのも、このESP32はピークで500mA消費するようで、このFTDIの3.3Vでは到底供給できない。WiFiのプログラムを有効にして接続するとブチっと切れる。
そこで、こんな感じで3.3V 500mAのTA48m033Fを使って供給してあげたら良い感じに、WiFiも使えてフルで何でも出来るようになる。
img_0240

ESP32-S and Arduino

kaduhiさんからESP32-Sを米国から頂いて…中国〜米国〜そして日本へ遠路はるばるようこそ。ありがとうございます!!感謝です、実験&コードを作ったり遊んでみます。

p_20161121_213054_hdr

ESP32のスペックはざっくりだと。詳細はググると出てくるけど、本家のはこちら
CPU : Xtensa® 32-bit LX6 Dua-core processor
ROM/SRAM: 448 KByte ROM, 520 KByte SRAM
WiFi : 802.11 b/g/n/e/i
Bluetooth : Bluetooth v4.2 BR/EDR and BLE
他には、RTC、そして自分的に凄いと思うのが、ハードウェア暗号化アクセラレーション。TLSが(実装すれば)サクッとつかえるー!!AES-HASH(SHA-2) library-RSA-ECC-Random Number Generator。凄い、これ凄い。言ってしまえばNWにつながる小さいPCっすね。

手持ちの歴代ESPとのサイズ比較な感じだと。右下がESP32-S、左上がESP-WROOM-02、右上はESP8266、左下がESP12。
p_20161121_220216

基板に付けるとこんな感じに。
p_20161121_224414

img_0083

開封して基板にとりあえず付けるとこんな感じ。前のESP8266に比べて圧倒的にピン数が多いっすね。「これだけのだし、何でも面白いものを作れるだろ?」という暗黙のプレッシャーを感じるです…

ここで、この子にピンヘッダをおもむろに付けようと思ったけど、2列だからブレッドボードに指したりしようとすると何かと不都合が…
そういう時に活躍するのが、スルホール用テストワイヤとか。ただ、自分は後でピンの抜き差しを自由に出来るように、2列10ピンのピンソケットの1個を抜いて使うことに。

img_0086

完成

img_0095

Arduinoで使ってみる

すでにESP32 Arduinoが公開されている。ESP8266と一緒な感じでArduino IDEから使えると非常に便利で、開発者も一気に広まるというのもあるからね。ということで、このgitを使う。

記載の通り進める。自分の環境はMacOS 10.11.6でPythonは2.7というのもあって、pyserialを入れる必要があった。

cd /Applications/Arduino.app/Contents/Java
cd hardware
mkdir espressif
cd espressif
git clone https://github.com/espressif/arduino-esp32.git esp32
cd esp32/tools
python get.py
# pyserialを入れる。pyenvとかpipを使っている場合は、それに合わせて入れる
wget https://pypi.python.org/packages/1f/3b/ee6f354bcb1e28a7cd735be98f39ecf80554948284b41e9f7965951befa6/pyserial-3.2.1.tar.gz
tar -zxvf pyserial-3.2.1.tar.gz
cd pyserial-3.2.1
sudo python setup.py install 

次にArduinoの起動〜利用。Arduinoを起動してESP32を選択。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-24-1-37-13

次にESPとシリアルの結線。これはそのまんま。自分はFT232RL搭載小型USB-シリアルアダプタ 3.3Vをいつも使っているんだけど、3.3V/GND, TX<->RXをESP32側とつなげるとOK。

起動時のログはこんな感じでシリアルから見れる(既にArduino化されているのだけど)。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-24-1-22-31

そして問題の書き込み。これはムチャクチャ簡単。

1. RESET + IO0を同時押し
2. RESETを離す
3. Arduino IDE上からFlashをポチる

以上な感じ。この辺はムチャクチャ簡単に出来る。2の時点でシリアルを見るとこんな感じの表記が出ている。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-24-1-24-15

そして書き込みをすると、Arduino IDEではこんな表記が出る。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-24-1-24-21

そしてLEDピカー

img_0093

上向きにピンソケットを出せば良かったかな…と2秒くらい後悔したw FT232RLだけでサクサクっと動かして使えるのはめっちゃ良い。

あと不明な所はESP32 forumを見れば解決すると思われ。最後に、FCCは通っているけど現時点ではTELECは通って無いっすね。WiFiのlibとかは上記のgitに普通に入っている。ここではWiFiを出しているとは何も書いていないんでお察しでw

mbedTLSの組込で分かったこと

実際に組込TLSをやってみて分かったことのまとめ。公開しているのはこれ、TlsTcpClient

これは実際の端末でTLS 1.2で通信しているシーケンス。Application Dataが暗号化されている。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-19-14-42-04

対象はParticleというデバイス。CPUはCoretex ARM M3 120MHz、1MB flash, 128KB RAMになっている。1Mbyte Flashだけどシステム用に512Kやら色々と使われて、ユーザアプリ領域には128Kbyte利用できる。

ここにTLS(TCP)をサクッと入れて利用できるlibraryを提供しようという試みになる。ParticleではTCPClientという物が用意されていて、このTLS版=TlsTcpClientということになる。

ちなみにMQTT libraryをこの端末向けに提供していて、今まで3500以上ものビルド&アプリで利用されていたり、まぁ、それなりには使われている。ここでMQTT TLSに対応してよ!!というリクエストを受けていたけど、面倒くさいから放置していた。自分は約10年近く昔にTLS libを直接使ったOverlay Networkを作った経験上、TLSは鬼門(ゲロむずい)というのを知っていたから、まぁ、そのうち本家で対応するだろう…と。けど、ずーっと待っていても対応されない。何故かDTLSはfirmwareからビルドすれば使えるようだけど、肝心のWebIDEやサクッと使える環境がない。という事で、突然思い立って実装して既にpublicとして使えるようにした。

そこで分かった組込TLSのポイントを少しまとめ。

組込TLS実装上のポイント

■ OpenSSL使いたい!!
はい、SSLと言えばOpenSSL最強です。大抵の端末、サーバに入っていて、SSLSocketという素晴らしいものが使える。ただ、当然だけどサイズが半端ない。現時点で最新のopenssl-1.1.0c.tar.gzをUbuntu x64でビルドした時のlibサイズの総量は、9227602byteもあった。どんなに削ったとしても128Kbyteには程遠い。
そこで組込向けopen sourceなTLSには以下の種類がある。

wolfTLS(CyaSSL)
mbedTLS(polrSSL)
axTLS
matrixSSL

他にも色々とある。この中からチョイスしたのはmbedTLS。考慮したのはライセンス、将来性の2つ。
もちろんだけど、同じmbed、ARMの石だからといってlibを持ってきてビルドすればOK!!みたいな事は全くない…このParticleの環境上で動くように対応する事になる。主に行うのは次の2点。この修正作業に2日くらい費やした。

1. コンパイルエラーが超膨大に出てくるから、それをいちいち修正、解消
2. 必要なlibc関係の関数がParticle上の環境に無い。関数を作って追加したりして補完。

■ CPUパワー
よくTLSをこういう貧弱なMCU/CPUの石でやろうとすると言われるのが、CPU遅いからTLSで通信とか使えないんじゃない?というもの。ただ、TLSをCortext M3とかでやると重くてヤバイとかは幻想だった。Cipher SuiteがTLS_RSA_AES128_GCM_SHA256のケースでネットワーク時間(RTT、ここでは上流にiPhone LTEをテザリングしてパケットキャプチャした)を入れても、上画像のWireSharkキャプチャの通り20ms以下でHandshakeが収まる。
M3 120Mhzいいね。AES128も高速に処理出来ていて素晴らしい。

ただ、最近のこの手のモノではアクセラレータが積んである。例えばESP32 ( ESP32:IoTボード ESP8266のお兄さん ) はこのサイズでRSA/AES/SHAのアクセラレータが搭載されていて、そもそも的にここまで実装する必要すらない。
恐らく今後は暗号化/セキュリティの実装がこの手の組込物には搭載されて、ここまで気合で実装する必要はなく、より高速、簡単に使えるようになると思われる。

■ サイズ調整
これが恐らく一番のポイントになる。容量と採用するCipher Suitesとかオプション&アルゴリズムのバランスがサイズに対して絶妙に効いてくる。コレ、マジ重要。
TLSはザックリだと、「通信相手と利用可能な暗号化の調整(ネゴシエーション)を行って、通信で利用される鍵交換を安全に行ったセッションを確立して通信を行う」といった感じの物で、対応している暗号化のアルゴリズムが多い方が”気持ちとして”なんとなく嬉しい。この辺はTLSやPKI周辺への多少のノウハウが必要だったり、何というか…組込や通信だけじゃなく非常に広範な技術への俯瞰した部分が必要になると思われ。
つまり、色々とアルゴリズムは入れたい、ただ入れると容量オーバーでfirmwareに入れられないと言う葛藤になる。
現時点ではこんな感じ。

webide-build

アプリケーションのビルドとTLS部分のビルドも入れて92Kbyte、本体だけだと80Kbyteくらい。ちなみに商用物だと50Kbyteくらいのが普通っぽい。もう少し調整すればTLS部分だけで商用並の50〜60Kbyteまで綺麗にできる自信はある。今は1stバージョンだから…という言い訳(ということで)。対応するCipher Suiteはこちら。

TLS_DHE_PSK_WITH_AES_256_CBC_SHA
TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
TLS_DHE_PSK_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_PSK_WITH_AES_256_CBC_SHA
TLS_RSA_PSK_WITH_AES_128_GCM_SHA256
TLS_RSA_PSK_WITH_AES_128_CBC_SHA256
TLS_RSA_PSK_WITH_AES_128_CBC_SHA
TLS_PSK_WITH_AES_256_CBC_SHA
TLS_PSK_WITH_AES_128_GCM_SHA256
TLS_PSK_WITH_AES_128_CBC_SHA256
TLS_PSK_WITH_AES_128_CBC_SHA

現時点から将来的に安全で高速に処理が出来るだろう暗号化、殆どのサーバ側で対応しているだろうアルゴリズムを対象にしている。ごっそりと削ったのが、TLSサーバとしての処理部分、DTLSとして利用される部分、何気に効いたのがアルゴリズムよりも、debug部分やデフォで使われてしまうtest certificationだったりもする。

■ 全体感
何となく思い立ってやり始めて、ソースコードの調整と全体感の理解に2日、ユーザーが利用するクラスと実際の実装に1日のトータル3日くらいで作ってpublish。ずっとリクエストされていたから、とっとと作れば良かったのに感はあるけど、何にしてもTLSは鬼門でネットワーク、セキュリティ、アルゴリズム、現時点での動向とか、ノウハウが非常に広範な部分への俯瞰した部分が必要になるし、実装もゲロ難しいから「必要だったら自分で実装してプルリク送ってよ」的に避けていた…mbedTLSのお手軽さにかなり助けられた。

mbedTLS の作りの思想、構造が大体理解出来た感はある。多分、大抵の環境で対応可能な気がする。
IoT的な環境ではTLSを始めとした暗号化は間違いなく必要、重要になる。これから、mbedTLSを使ったりする方へは、全体構造とか資料で見つけるより、コードを読んだ方が早いと思う。日本語の資料なんてググってもろくに無いけど、構造自体はそれほど難しくない。それ以上に容量調整や使うアルゴリズムをどうするか?とか、利用環境上で使えない(存在しない…orz)関数を用意するといった部分がより多く必要になる。

TLS client library for Particle Photon

TlsTcpClient for Particle Photn, Now release version 0.1.0.

TLS TCP client library cloud not use on Particle Photon WebIDE, but NOW we can use TLS TCP simple client library based by mbedTLS. Here is sample source code. Developer can connect to every TLS web/server using that Root CA pem file.

#include "application.h"

#include "TlsTcpClient/TlsTcpClient.h"

// Photon connect Let's Encrypt Website in this example.
#define LET_ENCRYPT_CA_PEM                                              \
"-----BEGIN CERTIFICATE----- \r\n"                                      \
"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\r\n"  \
"-----END CERTIFICATE----- \r\n"
const char letencryptCaPem[] = LET_ENCRYPT_CA_PEM;

void setup() {
    Serial.begin(9600);
}

void loop() {
    unsigned char buff[256];

    TlsTcpClient client;

    // setup Root CA pem.
    client.init(letencryptCaPem, sizeof(letencryptCaPem));
    
    // connect HTTPS server.
    client.connect("www.hirotakaster.com", 443);
    
    // send to HTTPS request.
    int len = sprintf((char *)buff, "GET /robots.txt HTTP/1.0\r\nHost: www.hirotakaster.com\r\nContent-Length: 0\r\n\r\n");
    client.write(buff, len );

    // GET HTTPS request.
    memset(buff, 0, sizeof(buff));
    while(1) {
        if (!client.available()) {
            delay(100);
        } else {
            int ret = client.read(buff, sizeof(buff) - 1);
            if (ret > 0) {
                Serial.println((char *)buff);
                break;
            }
        }
    };
    delay(5000);
}

This library already add to Particle WebIDE contribute library, it can use very easy.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-16-21-18-10

This is my web server(this blog) and Photon TLS sequence and cipher spec captured with Wireshark. Cipher suites are AES128/256 based.
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-16-21-00-33

ポスト君 – Renew LINE version

iBeacon, WiFi版のポスト君を作って時間が経ったけど、地味にまだやっていたりしている。ESP8266やLINE Messaging APIが使えたり環境面の変化に合わせて改良したりでrenew.


img_3590

– 基本機能
ポストにポスト君を設置して、LINEメッセでポストへの投函を確認する。
暇な時に話かけると、話相手になってくれる。(ポストと会話をする)

– 使い方
1. ポスト君をポストに設置
2. LINEでポスト君と友達になる
3.1. 「開始」「はじめて」でポストの監視をはじめる。
3.2. 「終了」「おわり」でポストの監視が終了する。
3.3. 「XX秒間隔」「XX分間隔」でチェック間隔の時間を調整できる。(省電力対策)
4. 何か話すと雑談相手になってくれる。

雑談時はこんな感じ。この手のAI的なのと自分は会話が見事に噛み合わない。ポスト君の設定は19歳、女性、B型にしている。この設定自体、自分(39歳 男性)と会話が噛み合うのか?という問題もあるけど。


img_3588

– 構成
ESP, 距離センサ, 自動応答雑談AI, LINE Messaging API, MQTT Broker

– 動作動画

もちろん旧版の通知方法も使えて、iBeacon(BLE)、またはメール版も手元で動いている。このポスト君、「毎日郵便箱を開けて確認する手間を省く」というのがあるけど、毎日郵便が来る人はそうは居なくて「ポストを開けた時に空っぽだった時の残念感」を解消する部分もあったりする。

どう使われるのか?という利用シーンとしては、以下な感じ。郵便箱や宅配ボックスにポスト君を設置すると、簡単にIoT化する事ができる。
1. いつでもポストへの投函をチェックできる。(LINE、メール、iBeacon通知)
2. 郵便箱を開けて確認する必要が無くなる。
3. 家でゴロゴロしている時でも、郵便が来たら通知をしてくれる。



— 以下技術的な部分
LINEメッセ部分の全体的な構成は以下な感じ。

ポスト君[ESP/IR] <-WiFi-> サーバ[MQTT Broker/Web AP] <--> [LINE] <--> ユーザ[LINEアプリ]

ユーザからのコマンド(開始、終了、XX間隔)とかはLINE側からのcallbackをWebAPで受けてMQTTに変換、MQTT通知としてポスト君に司令を与える。
逆にポスト君(ESP)はポストへの投函チェックを行って、投函が発生した時にMQTTメッセージ送信、サーバ側で受信したらLINE Messaging APIに変換して通知をユーザに行う。MQTT Brokerはmosquitto、MQTT/Web APの部分はgolangでサクサクっと作っていて、この部分がLINE/MQTTの変換GWとしての役割になる。またコマンド以外のメッセージについては、雑談API側に転送して応答を戻している(Chatbot化)。
LINE Messaging APIはムチャクチャ簡単で、こういった環境とモノを接続して制御、センサーデータを解析したり動きを与える場合の構成、そしてIoTなプロトコルとしてよく言われるMQTTを利用する場合の構成として、このような構成はアリでしょう。
そしてESPの激安パワーのおかげで、素材費用だけで1,000円以下になった。これはとってもメリットがある点の一つでもあると思う。

Hololens使ってみる

触ってみた感想を書くのを忘れて数ヶ月、Hololensを触ってちょっとした召喚アプリを作ってみた感想など。

Hololensといえば…これですね。

どーんw
img_2107

MSのサイトにあるようなイケメンっぽく装着できず、被ってます感がモリモリだけど。

Hololensを使って適当にUnityで開発をすると、デスク上に召喚しちゃったり色々と遊べる。慣れた人なら使い始めてから、1時間もかからず、すぐアプリを書いて動かせると思われ。
20160615_125315_hololens

他にも床の上に物を置いたり…
20160615_123655_hololens

空中に浮かばせたり…
20160615_124001_hololens

お約束のゲームっすね。

他にもSLAMというか、Hololensを被ってそこらじゅうを歩き回ると、自動で部屋の3Dモデルを生成してくれるという凄まじい機能もあったり。
pic2

ホロ部分はこんな感じ
img_2112

いわゆるARメガネ物とは一線を画す性能というか、メガネというよりはWindows PCっすね。
何がビビるか?というと、バッテリー搭載で動かしても暑くならないし、2時間とか楽勝で動くという省電力。外向きにカメラが大量に付いてセンシングしつつ、空間処理を行いレンズに投影しつつアプリが動いて2時間くらいは楽勝でサクサク動いていたはず。しかも、暑くならない(これ重要)。Windows10 MobileがHololensでは動いていて、これはセンサー類が大量に付いたモバイルPCと思っても良い。

これはメガネ物じゃなく、頭に装着するモバイルPC。ただし、大量センサーつき、ホロレンズな投影で空間上にオブジェクトが見える…という新しい端末っすね。よくOculus/PS VRモノの全ての視野を奪った映像を見せるVRとは違って、MRって言うのか実空間の物とのインタラクションがあるような物っすね。視野角が狭いというのはよく聞く感じだけど、それすらも凌駕する空間上に「ここにある感」が凄い感じ。こればっかりは、実際に装着して感じるしかなくって、文字や机上で考えるより、体験して感じてみると凄さが分かると思われ。
他にも似たようなものに、metaとかもあったり。

micro:bit互換機を使ってみる

まだ触りはじめの段階だけど、スイッチサイエンスさんがmicro:bit互換機のモニターを募集していて、勢いで応募してみたら…当たりました!! ちなみに、自分はクジ運とか一切ないです。宝くじは当たっても300円が最高とかだけど、なぜかこういう時に運を発動するようで…ありがとうございます!! Maker Faire Tokyoでも販売されるようで、期待度高いっす。

まず、micro:bitってなーに?という方はこちらを…
BBCのMicro:bitがイギリスのすべての11歳と12歳の子どもたちに無料配布される
BBCのMicro:bitは子どもたちにぴったりのプログラミング端末
英国でチビッコに無料!!で配られている端末で、これを使ってプログラミングの勉強をしたり遊んだり出来るというステキ端末です。LED、BLE、加速度センサ…etcが付いて無料!!無料っすよ。こういう物を配れるというのは、既に日本とは環境的にヤバイ違う感がするですね。
ちなみに、今年のMaker Faire Bay AreaでMicrosoftさんブースでmicro:bitを使ったワークショップか何かをやっていたり、日本では何で…?といった所は感じていたですね。

まずは開封の儀、こちらはオモテ面
IMG_2451

こちらは裏面。一部の方はパット見でご存知的なBLEモジュールが付いていますね。
IMG_2449

すぐUSB 2.0 microとPCを繋げて、micro:bitのHPからCreate Codeをポチって適当にビルドしたのをダウンロード、そしてOS上からはmbedと見えているディスクにコピーすれば…動きます。この間、ぶっちゃけ1分かからないっす。初めに動かしたのはこちら。

IMG_2453

正確に測っていないから分からないけど、マジで1分はかからないと思われ。そこでファーストインプレッションの感想は…

1. 凄い、凄いっす。半端ないっす。感動です。言葉で表現するのが難しい感動です。

2. 上記の写真の通り、光らせたいLEDの所をクリックでポチるだけで光る!!お手軽で直感的。

3. Arduinoとかと比較するのもだけど、チビッコ向けにLEDを買ってきて...といった事が必要なく、「箱から出す。USBにつなげる。Web上でコンパイル。ファイルをコピーして動く!!」という恐ろしいまでの簡単さ。

4. "百聞は一見にしかず"とは良くいったもので、PC上でプログラムしてアプリが動く、Webが作れる...といった画面やモニターの中で起きる事より、手元で実際に書いたプログラム(ブロック)がLEDで光って見えるという現実感に勝るもの無し。しかも超カンタンでお手軽。素晴らしい。

5. micro:bitのHPのプログラミング環境(Code Kingdoms:JavaScript, Microsoft Block Editor, Touch Develop)のUIが秀逸です。ビビります。

総じて…凄い!!の一言。こんな素晴らしい環境を英国だとチビッコに配って使わせているというのは、教育のベースの部分で歴然たる差が(既に…)出ているんじゃ?と思えるほど。2020年からプログラムを小学校で必修とか言っている場合じゃないんじゃないの?的な感じがちょっぴり。
ちなみに…チビッコに触らせてみたら、実際に適当にLEDを光らせて動かすまで、説明は殆ど不要で直感的に使えた。恐ろしいほどの簡単さだぞmicro:bit。これはヤバイ。

■ PCから使ってみる

PCから使う場合は特に説明がいらない気もするけど、以下な流れで。

1) micro:bitのHPでcreate codeをポチる

2) 好きな環境を選ぶ
スクリーンショット 2016-07-20 1.13.27

3) 適当にコードを書く。これはBlock Editor。
スクリーンショット 2016-07-20 1.14.30

4) コンパイルして出来たファイルを保存。
スクリーンショット 2016-07-20 1.15.15

5) micro:bitをPCにつなげるとmbedという外部diskとして見えるので、そこに保存したファイルをコピー。mbedで作るときと一緒のノリっすね。

■ スマホから使ってみる

ちょっと使ってみた感じで。BLEという事は、スマホのアプリがあってiPhoneと接続してビルドとかも出来るんじゃん?と思ったら…やっぱりありました。
iPhoneはこちら
Androidはこちら

ピアリングして使うにはちょっぴりコツが必要で、以下の流れにて。

1) アプリを立ち上げる。
IMG_2523

2) Connectionsをポチる
IMG_2524

3) Pair a new micro:bitをポチる
IMG_2525

4) ここで記載の通りmicro:bitのA、Bボタンを押しながらリセットを押して離す

5) micro:bitの実機にLEDのパターンが表示されるので、その通りに画面のLED表記も埋めてあげる。これがある意味、認証の役割になっているですね。
こちら実機
IMG_2527

こちら画面の表記
IMG_2526

そしたらNext

6) micro:bitを探してくれる。んでペアリングの画面が出てくる。
IMG_2528

IMG_2529

7) micro:bitの実機でAボタンを押せって指示が出ていたと思うから、実機のAボタンを押すと…数字がLEDで表示される。その数字の通りにスマホの画面に数字を入力する。実機だと左矢印が出ていて、明示的にAボタンを押してねといった感じで分かる。細かい所まで案内が行き届いていて気持ちが良い。
P_20160719_190451

8) ペアリング完了!!
IMG_2530

以下、さらさらっとアプリでプログラムする。ブロックを組めば直感的にプログラムが出来る。

1) アプリのトップからCreate Codeをポチる。
IMG_2531

2) ここではMicrosoft Block Editorを起動して、適当にブロックを組み立てる。ノリでOK!!これは端末をシェイクすると表示が消えて、Aボタンを押すと画面にAと表示するような感じのプログラム。
IMG_2533
この時、iPhoneの場合でSafariが起動すると、プライベートモードで起動しないで!!って警告が表示されると思われ。そういう時は、Safariの設定でプライベートモードをOffっておけばOK。

4) 上の左から3番目のボタンをポチってコンパイルする。
IMG_2534

5) ファイルのダウンロード。自分は「次の方法で開く…」をポチって出てくる画面から、「micro:bitにコピー」を選択する感じで。
IMG_2535

IMG_2536

6) いきなりFlash画面(w)。プログラムには自動で名前が付けられるようで(もちろん、自分でも可)、不思議なほどスクリプトという名前に。Flashボタンをポチって、micro:bitにプログラムを転送。
IMG_2538

7) micro:bitを探してくれて…
IMG_2540

書き込み…完了!!
IMG_2542

8) ぴーかー!!
IMG_2543

iPhoneでやってみたんだけど…画面が小さくて心が折れる可能性が。スマホでも可能だと思うけど、この辺はPad物を使った方が良いと思われ。

■ mbedもあるよ

最後に…mbedという事は、そっすね。やっぱりやりたくなるこちら。サンプルいっぱいヒャッハー状態です。mbed使いな人はサクサク行けると思われ。さすがにこっちは、いきなりチビッコにレッツトライ!!は難しいとは思うけど、MicroBitクラスでサクサクいける感じ。BLEでプログラムとかメンドイんじゃ…って思った人とか、初めてやってみる人にはオススメ。
スクリーンショット 2016-07-20 0.53.42

■ 追記…

ふと思って追記で。UIや使い勝手が洗練されていてコンパクトにまとまっていて、かなり素晴らしいです。こんな素晴らしい環境を使ってプログラム&開発をしている子供が大きくなったら、どんな新しい物を作るんだろうか?という期待が生まれてくる。そして、エンジニアな自分目線だと、こういう環境を使って大きくなった開発者と肩を並べて勝負していく、同じような感性で競い合っていくという事になる。様々な点で学びが大きいから、熟練した開発者から初めてこういう物に触ってみるひと、そしてちびっ子にはマジで使って欲しいと思ったりした。

そして…このBLE(Nordic nRF51822)が搭載されているということは…多分、次のことが出来ると思われ。
Google Eddystoneが動く&ビーコンになる。
– IPv6(6LoWPAN)が使えて、IPv6をmicro:bitに振って通信できる。
とかとか。多分だけど、どっちも出来ると思われ。