sakura.ioモジュール(LTE)の省電力機能

sakura.ioモジュールのファームウェア開発を担当しています奥原です。
5/7にリリースしましたファームウェアversion 1.4.0にて、実装予定機能となっていました『省電力管理機能』を追加いたしました。
既存の電力モードに『省電力管理機能』が加わり省電力機能の関係が少々複雑になりましたので、改めてsakura.ioモジュールの省電力機能についてご紹介いたします。
また、省電力機能を使用した際の実測値もご紹介いたします。

sakura.ioモジュールの電力モード

sakura.ioモジュールの電力モードは以下の図のようになります・
sakura.ioモジュール電源モード
sakura.ioモジュールには、ActiveモードとDeepSleepモードがあります。
ActiveモードとDeepSleepモードは外部のマイコンからWAKE_IN端子を制御することで切り替えます。

モード名 WAKE_IN端子 説明
Active Hi 動作状態です。
LTE経由でsakura.ioプラットフォームと接続します。
不意の切断があった場合を接続状態を維持するために自動的に再接続を行います。
データの送受信などモジュールの機能が使用できる状態です。
DeepSleep Lo 停止状態です。
消費電力は最小にするため、WAKE_IN端子の監視以外の機能を停止します。
sakura.ioプラットフォームとの接続が切断されていますので送受信は一切行えません。

さらにファームウェアのVersion 1.4.0ではSCM-LTE-01を対象にActiveモード時の待機消費電力を制御する省電力管理機能を追加しました。
省電力管理機能には

  • 省電力制御を行わない『省電力制御無効モード』
  • 無通信時にLTEモデムのスリープ機能を有効にする『自動スリープモード』

の2つのモードがあります。
モジュールの電源投入後は『省電力制御無効モード』になります。
追加された『省電力モード設定コマンド』でモードを選択します。

省電力モード名 設定値 説明
省電力機能無効 0x00 省電力制御を行いません。
従来のファームウェアと同等の振る舞いとなります。
オートスリープ 0x01 無通信時にLTEモデムをスリープさせます。

省電力機能の使い方

Arduino、python、mbedの各ライブラリに『省電力モード設定コマンド』と『省電力モード取得コマンド』を追加しました。

最新版のライブラリをご使用ください。
また、実例としてsakura.io評価基板で動作するmbedのサンプルプログラムを作成しました。
省電力機能をご使用の際のご参考になさってください。

消費電流の計測

SCM-LTE-01の電流計測
開発バージョンのsakura.io評価ボードを電流計測用に改造し、SCM-LTE-01に流れる電流を以下の機材で計測しました。

デジタルマルチメータ
KEYSIGHT 34465A
安定化電源
KIKUSUI PAK20-18A

計測の都合上、安定化電源のフィードバックを有効にしていません。
そのため、電源電圧の変化があり厳密な電流値とはなっていません。
参考値として見ていただければと思います。

DeepSleepモード

待機状態

平均電流は約10μAです。

Activeモード復帰から送信

実際の利用を想定して、DeepSleepモード→Activeモード→接続→データ送信→DeepSleepモードと遷移させたときの消費電流のグラフを以下に示します。
DeepSleepモードの電流グラフ
Activeモードに復帰してから128Byteのデータ送信を終えDeepSleepに入るまで約57秒かかっています。
この間の平均電流は約117.1mAです。
57秒のうち接続待ちが約55秒データ送信に約2秒かかっています。
Activeモードとは違い接続を維持していませんので、電源投入時と同様にLTE接続とsakura.ioプラットフォームへの接続の時間がかかります。

Activeモード(省電力制御無効)

電源投入から待機状態

モジュールの電源投入から待機状態で30分経過するまでの電流値のグラフです。
省電力制御無効モード30分待受
平均電流は71.5mA、最大電流は408.6mAです。
グラフの10分および20分周辺の消費電流の増加は、10分間隔でsakura.ioプラットフォームに送信している死活監視パケットの送信によるものです。
省電力制御無効 定常
死活監視パケット送信間の定常状態の平均電流は68.2mA、最大電流は119.0mAです。

送信

データ送信開始から定常状態に戻るまでのグラフです。
省電力管理無効 送信
約10.3秒かかっており、平均電流は131.8mA、最大電流は285.0mAです。

受信

受信開始から定常状態に戻るまでのグラフです。
省電力制御無効 受信
約10.4秒かかっており、平均電流は129.6mA、最大電流は366.2mAです。

Activeモード(オートスリープ)

電源投入から待機状態

モジュールの電源投入から待受状態で30分経過するまでの電流値のグラフです。
自動スリープモード30分待受
平均電流は14.1mA、最大電流は399.2mAでした。
オートスリープ 定常
死活監視パケット送信間の定常状態の平均電流は9.6mA、最大電流は95.0mA消費しています。

送信

送信開始から定常状態へ戻るまでのグラフです。
オートスリープ 送信
約11.2秒かかっており、平均電流は100.0mA、最大電流は375.3mAです。

受信

受信開始から定常状態へ戻るまでのグラフです。
自動スリープ 受信
約11.4秒かかっており、平均電流は106.1mA、最大電流は407.0mAです。

さいごに

sakura.ioのリリース時より、将来実装機能としていた『省電力管理機能』をお届けすることができました。
今後もより便利で使いやすいプラットフォームになるように機能追加、機能改善を続けて参りますのでよろしくお願いいたします。

Continue Reading

さくらインターネットのIoT事業について

■IoT関連2つのソリューションについて

こんにちは、さくらインターネットでIoT関連の事業を担当させて頂いている山口です。2018年2月からセキュアモバイルコネクトというサービスの提供を開始させていただいたのですが、一昨年からやらせていただいていたsakura.ioというサービスとの違いがわかりにくい、今後はどちらに力を入れていくのか?といったお声を頂くことがあったので、どのような事をさくらインターネットとしてやらせて頂いているのかについて、書かせていただきたいと思います。

さくらインターネットのIoT事業

■風が吹けば桶屋がもうかる?ってのをちゃんと知りたい

さくらインターネットがもともと何をしたかったのか?というと、データの関連性/相関性を世界でシェアできるそのためのプラットフォームを作りたいということになります。

風が吹けば桶屋が儲かる」ということわざを聞いたことがあるかと思います。これは、可能性の低い因果関係を表すものですが、これから様々なモノコトのデータが情報になり、ネットワークで共有されAIやロボティクスによって活用される、情報中心の世の中になっていくと言われています。このような世界になってくると、どのようになるでしょうか?

さくらでは、IoTそのものでなにかができるということではなくて手段として位置づけています。まずは人々の生活の中からなんらか変化や活動量、変化量などのデータがIoTの領域の技術を活用され、ネットワークに上がってきます。そのデータがAIの領域の技術を使って何らかの情報になり、その情報をきっかけにしてロボティクスの領域の技術を使って生活に何らかのリアクション/アクションを起こし、またその変化を検出して・・・

という情報をキーにした世の中になっていくと考えています。

情報中心の世界
情報中心の世界

 

いままでは、風が吹いたことと、桶屋がもうかったことの情報がないまたは共有されていなかった状態だったのが、情報が取得され共有され関係性/相関性がわかってくるとどうでしょう?直接的に計算がしたりするものばかりでは無いと思いますが、なかなかにおもしろい世の中になってくるのではないでしょうか?

■モノ/コトをネットワークに繋げるためのプラットフォーム

さて、では情報中心の生活が来るとして、いまの状況で情報中心の生活の妨げになるものって何でしょうか?ちょっと皆さんの今のまわりのモノを見て頂きたのですが、電気が通っているものってどれだけありますか?

次に、それがデータを受け取り、ネットワークに送れるようになっているものはどれだけありますか?

今は情報化社会と言われていますが、そんな世の中の現在でさえつながっているものは、スマホ/PC/タブレット/TV位が大部分では無いでしょうか?

それ以外にもたくさんあるという方もいますが、やっぱり殆どはどこにもデータを残さず、モノコトのデータは消えていっているのがほとんどだと思います。なぜか?

僕らのまわりにある物は、必ず誰かの手によって作られていて、作られているということは、誰かの技術が使われています、実のところ電気製品の中身をつくる技術と、データを送ったり受け取ったりする技術、それを受け取って活用したりする技術というのは、まるで違う技術分野を必要とします。

IoTというものは、提供していく側からすると、今までは他の技術領域のもの、他の誰かがやっていたものをつなげていく事が必要で、これまではその壁は技術的にも、コスト的にも想像以上に高かったのです。電気製品を作る技術者にインターネットの向こう側むけにデータを投げる物を作れと言って、できる人は少数ですし、それを外部に作ってもらうとなると大変と、こういった事を踏まえて、当初さくらインターネットがはじめたのが、 sakura.io です。

これは、電気製品を作る技術者が普段使っている電気信号を、インターネットでやり取りをするシステムを作っている技術者がつかう、JSONというものと双方向に変換し、「つなぐ、ためる、れんけいする」という機能を、通信モジュールを含めて提供している極めてセキュアなプラットフォームです。

sakura.ioの仕組み

これによって、双方の技術者がいままの技術領域を大幅に拡張することなく、モノコトをネットワークにあげる事が可能になりました。

■セキュアモバイルコネクトが提供する通信

じゃぁそれで良いじゃんって感じになりそうですが、お客様から「これから作る製品は良いのだけれども、いままで作ってしまった製品に組み込めない」というお声や、「sakura.io のセキュアな通信の部分だけを使いたい」というお声を頂くことがありました。

実際何社かに伺った事をまとめると

  • 普段は殆ど通信をしていないがものすごく数が多い
  • 通信する時は高速に通信したい
  • セキュリティはさくらインターネットで守っておいて
  • あ、あとお金はあんまり払いたくない

という、なんとも提供側にはハードルの高いご要望があることがわかりました。これらの背景には、利用者側で電気信号とネットワークの壁をなんとか乗り越えたら、今度はセキュリティと通信コストの壁があったということかと思います。

現状SIMを使った製品というのが世の中に出てきていますが、通信部分についてはインターネットを経由するもので、そのセキュリティは使っている側が担保する、またはモノの中にパソコンで使っているようなセキュリティソフト等を入れて担保してもらうというものが殆どかと思います。

先日提供を開始した、さくらのセキュアモバイルコネクトは、sakura.io で実現していた、インターネットを経由せず、さくらのクラウドの内部ネットワークに、閉域網でつなげることができる通信部分だけを、皆さんに使えるようにしたというものと思っていただけるとわかりやすいかと思います。

こういったサービスは、今までもキャリアが提供されていましたが、初期コストや運用コストが極めて高いため、利用できるサービスは限定されていました。

セキュアモバイルコネクト

 

セキュアモバイルコネクトの価格については、SIM1枚の月額基本料金12円、最大1万枚まで登録できる利用者専用のクラウド内部ネットワークの価格が6,400円と極めて安価であり、コストの面からもセキュリティの面からも利用の裾野を広げることが出来たかと思います。

Continue Reading

sakura.io 評価ボードではじめるIoT開発

本記事は、sakura.ioの利用者で、電鍵とsakura.ioを組み合わせを試みて頂いたりしている、伊勢羽様からご寄稿頂いたものになります!
こういった記事は本当にありがたいので、「何か書いてみたい!」という方がおられましたら、ぜひご連絡ください〜
※本記事内で触って頂いている検証用ボードは、これからみなさまにご提供できるかなぁ〜どうかなと言う段階のものをテストして頂いたもので、開発中のものになります。ご提供に向けて進めておりますので少々お待ちください!

導入

とあるC++プログラマのつぶやき

“最近「IoT」という言葉が流行っていて、興味はあるけど調べてみたら見たことない基板や、やったことのない電子工作の話ばかりが出てくる。いったいどこから始めればいいのだろう・・・”

はい、そんなあなたにはsakura.io Evaluation Boardがおススメです!

はじめに

mbedベースの、C++言語でIoT開発が可能なsakura.io Evaluation Board(以下、評価ボード)のリリースに先駆けまして、mbed開発未経験ながらも評価ボードを初めて手にして開発環境構築からサンプルプログラム作成まで試用させていただきましたIseba’s Laboの伊勢羽です。趣味で電子工作とC++プログラミングをしている一般的なユーザーですが、今回評価ボードでの開発過程や考えた事、作ったものについてお話をしたいと思います。

Continue Reading

『「sakura.io」ではじめるIoT電子工作』のご紹介

2月よりIoTチームに参加しました奥原です。  
今までは組み込みソフトウェアエンジニアとして、マイコンのファームウェアから組み込みLinuxのカーネル周り、アプリケーションなどなどデバイス周りのソフトウェアに携わってきました。  
IoTチームでは主に『さくらの通信モジュール』などのファームウェアを担当します。  
よろしくお願いします。

今回は先日、工学社より発売されました書籍「sakura.io」ではじめるIoT電子工作を紹介させていただきます。

どんな本?

本書は今までの電子工作にsakura.ioを追加して『お手軽にIoTに対応した電子工作をやってみよう!』という本です。

sakura.ioとは何なのかという解説からはじまり、sakura.ioの登録、Arduinoでのsakura.ioの使い方、Raspberry Piでのsakura.ioの使い方、sakura.ioとサービスの連携の仕方と必要なことがていねいに説明されています。
「ネットワークのことなんでわからないよ!」という方でも手順を追っていけば、収集したデータをインターネットから読んだり、インターネット経由で操作できる電子工作ができます。

また、電子工作も易しくイラストや写真に従ってスイッチやLED、センサーをブレッドボードに挿しジャンパワイヤを配線していけば完成します。
回路図を見ながら、はんだごてを握ってはんだ付け…は必要ないので、「電子工作はやったこと無いけどIoT対応のWEBサービスを作ってみたい」という方でも実際に動作するモノができます。

本書は全体的に解説や手順の説明がていねいで、さくらの通信モジュールと必要なモノを渡されて「この本読んでやってみてね」と言われても困らないと思います。

内容

簡単に本書の内容を紹介します。
(以下の〇〇編は私が勝手に分類したもので公式なものではありませんのでご注意ください)

導入編

1章と2章が該当します。

1章では、単体で販売されているLTEモジュールと違い、sakura.ioは、LTEモジュール、LTEの通信網、ソフトウェアライブラリ(Arduino、Pythonなど)、コントロールパネル、外部連携機能をオールインワンにしたサービスであること、少量のデータを間欠で送ることに特化していることがちゃんと解説されています。  

2章では、さくらインターネットへの会員登録とsakura.ioの初期登録の手順を解説しています。

Arduino*1

3章から5章が該当します。
Arduino編を読むと以下のことができます。

  • Arduinoライブラリを使ったsakura.ioへのデータ送信
  • Arduinoライブラリを使ったsakura.ioからのデータ受信
  • WebSocketを使ったsakura.ioからインターネット(ブラウザ)へのデータ送信
  • WebSocketを使ったインターネット(ブラウザ)からsakura.ioへのデータ送信

3章はプッシュスイッチのON/OFFをsakura.ioの管理画面で確認します。
Arduino編の導入にあたり、Arduinoの開発環境のセットアップ、Arduinoとさくらの通信モジュールの接続、プッシュスイッチまわりの回路の配線、sakura.ioの管理画面での確認まで一通りを順を追って解説しています。

4章はArduinoに接続した温度センサーで計測したデータをsakura.ioのWebSocketインターフェースを通じてブラウザ(HTML5+JavaScriptのプログラム)で確認します。

5章はブラウザからArduinoに接続したフルカラーLEDの色をコントロールします。
sakura.ioからデータを受け取る、受信の要素が追加されます。

最初はミニマムで始めて徐々に要素を増やしていく構成です。
実際に手を動かしながら理解を深めていくスタイルです。

Raspberry Pi*2

6章と7章が該当します。
Raspberry Pi編を読むと以下のことができます。

  • Pythonライブラリを使ったsakura.ioへのデータ送信
    • BluetoothLEを使ったセンサーデータの収集
  • Pythonライブラリを使ったsakura.ioからのデータ受信

(sakura.ioからインターネット側への連携は、Arduino編の3章、5章を参照ください)

6章では3章と5章と同じことはRaspberry Piで再現します。
Arduinoと同じことをRaspberry Piではどのようにやるのかという比較ができます。

7章では、BluetoothLEセンサモジュールから取得した温度、湿度、気圧のデータをsakura.ioの管理画面で確認します。
最小構成ですが、無線接続のセンサーからデータを集めネットワークに送る『センサーネットワークのゲートウェイ』に相当する内容です。
同様のアプリケーションを実現したい方には参考になると思います。

Raspberry PiはArduinoとは違いマイコンではなく『小さなパソコン』なので、性能的にソフトウェアでできることが多くなります。
反面、マイコンに比べてI/Oが少ない上にLinuxがハードウェアを管理するので、アプリケーションからハードウェアを直に制御することは苦手です。

Arduino編との対比でRaspberry Piが得意とするBLEなど高レイヤの通信機能を使い苦手とする低レイヤのシリアル(i2c)通信は使わないという、ArduinoとRaspberry Piの向き不向きがしっかりと押さえられた構成になっていると感じます。

サービス連携編

8章が該当します。
サービス連携編を読むと以下のことができます。

  • sakura.ioからWebSocketで取得したデータをJavaScriptでグラフ描画する
  • sakura.ioからMQTTを使ってデータを読み書きする
  • sakura.ioのデータストアにデータを蓄積し、蓄積したデータをAPIで取得する
  • Webhookでデータを送受信する
  • ファイル送信機能をつかってモジュール側(ArduionoやRaspberry Piなど)へファイルを送る

本書のタイトルからは電子工作に寄った印象を受けますが、この第8章は意外と充実しています。
どのインターフェースでどのようなことができるのか比較できるのは良いと感じます。

さいごに

本書は順を追って丁寧に説明する構成になっていて、実際に手を動かしていくときに役立つと思います。
自習はもちろん、ワークショップの教材としても良いなと感じました。

こんな方におすすめ

  • sakura.ioで何ができるか知りたい方
  • sakura.io(さくらの通信モジュール)を買ったあとに何ができるのか悩んでいる方
  • すでに作った電子工作をインターネットと連携させたい方
  • sakura.ioと連携するアプリを作りたい方

リンク集


  1. ArduinoはArduino HoldingおよびArduino財団が設計・製造・販売しているワンボードマイコンボード。容易に電子回路やプログラミングができるため世界的にユーザーが多い。
  2. Raspberry PiはRaspberry Pi財団が設計しているシングルボードコンピュータ。電子回路がつなぎやすい安価なLinux PCとして世界的にユーザーが多い。
Continue Reading

Google Cloud Pub/Sub連携をリリースしました

こんにちは。プラットフォームチームの中西です。

これまで、sakura.io の連携サービスとして、Amazon Web Services とは AWS IoT、Microsoft Azure とは Azure IoT Hub と接続することができました。
本日、Google Cloud Platform(TM) の一機能である Google Cloud Pub/Sub との連携サービスをリリースしました。
これにより、sakura.io モジュールから送信された情報を Google Cloud Platform 上に気軽に展開することが可能となります。

Continue Reading

python-sakuraio v0.1.5 をリリースしました

こんにちは、こたまごです。

sakura.ioをPythonから利用するライブラリであるpython-sakuraioのv0.1.5を先ほどPyPiにリリースしました。

今回の一番大きな追加点は、送信データをキューに入れる際の簡略化です。
これまでは送りたい値を8バイトのバイト列にユーザー側で変換し、 enqueue_tx_raw(channel, type, data, offset=0) メソッドを利用してキューに追加していました。

今回のバージョンでは型の指定が不要な enqueue_tx(channel, value, offset=0) メソッドを追加しています。

valueが整数の場合には 'l' (int64) or 'L' (uint64) 、小数の場合には 'd' (double) 、文字列やバイト列の場合には 'b' (bytes) として自動的に変換しキューに追加されます。

ライブラリの詳細についてはRead the Docs に掲載しているドキュメントをご覧ください。

利用例

counter = 12
temperature = 27.5
humidity = 45.6


sakuraio.enqueue_tx(1, counter)
sakuraio.enqueue_tx(2, temperature)
sakuraio.enqueue_tx(3, humidity)
sakuraio.send()
Continue Reading

さくらがIINとPLMNを取得した話

さくらインターネットがIINとPLMNを取得した話

これはさくらインターネットAdvent Calendar 2017 20日目の記事です

まえがき

 IoTチームの川畑です。この度さくらインターネットは総務省より IIN(898104)PLMN(44006) の割り当てを受けました。これにより、キャリアに紐付かない独自の番号が入ったSIMカードを製造する事や、sakura.ioで展開している端末設備にユニークな識別番号を付与することが可能になりました。お気づきかと思いますが、この番号は主にモバイルネットワークで利用されます。

 今回割り当てを受けるにあたって、始終総務省との全ての交渉を担当する非常に貴重な経験をさせて頂きました。何せ探せど探せどどこにも情報がありませんし、通常は各キャリアの中の人がやる業務です。インターネット上で番号取得の実例が公開されるのは、もしかしたらこれが史上初かもしれません。

これらの番号取得の最たる例は、携帯電話事業者による取得・運用です。皆さんが普段利用している携帯電話と番号の関係、取得までの道のりをお届けしたいと思います。

IINとは

 IINとは、Issuer Indentify Numberの略で、ICカードの固有番号(ICCID)を発行する先頭最大7桁のプレフィックスです。世界中で利用するため、この番号はITU-T(国際電気通信連合)が管理をしており、電気通信事業用途で利用する場合は総務省を通して番号の申請を行う必要があります。

割り当てられた桁にはそれぞれ以下のような意味があります。
– 89 : 電気通信用途
– 81 : 国番号(日本)。最大3桁
– 04 : 事業者コード

SIMカードはもちろんのこと、クレジットカードなどのICチップにはICCIDが付与されます。弊社におけるICCIDの番号構成は以下の通りです。
– ①ICCIDの先頭6桁にIINを利用する
– ②残りの12桁は事業者が任意の番号を付与する
– ③最後の1桁はチェックディジット

PLMNとは

 PLMNとは、Public Land Mobile Networkの略で、携帯電話事業者の国際的な識別番号です。5桁で構成され、先頭3桁はMCC(Mobile Country Code)で国ごとに番号が変わり、日本には 440441 が割り当てられています。下2桁はMNC(Mobile Network Code)で、各国内の事業者コードですね。こちらも世界中で利用される一意の番号となるため、管轄は同じくITU-Tです。

 PLMNの用途は大きく2つあり、MNOが設置する携帯電話基地局の事業者識別に用いられることと、SIMカードにICCIDとは別に付与される、IMSI(International Mobile Subscriber Identity)のプレフィックスで利用されます。

PLMNの用途1:ビーコン

 各社の携帯電話基地局が自身のPLMNを電波(ビーコン)として報知することで、利用者の端末が契約された事業者へ自動的に接続するために利用されます。docomoですと44010、auだと44050/44051、SoftBankだと44020を基地局から報知しています。自動的に、と書きましたが手動で事業者を選択することも可能です。この図はiPhone7において周辺で報知されている事業者コードをサーチした時のスクリーンショットです。

PLMNの用途2:IMSI

 PLMNの2つ目の用途として、IMSI番号の生成で利用されます。IMSIは、モバイルネットワークにおける加入者の識別番号で、ネットワーク内でのアクセス制御のキーとしても利用されます。ICCIDはICカード固有の番号ですので変わることはありませんが、IMSIはOTA(Over The Air:遠隔でカード内の情報を書き換える技術)により書き換わる可能性があります。

 日本において、IMSIは総務省により 電気通信番号 として割り当てられます。皆さんよくご存知の電話番号も、電気通信番号の1つです(モバイルの世界ではMSISDNと呼ばれています)。IINもPLMNも申請自体は総務省に行うのですが、番号の管轄はITU-Tなので、番号割り当ての審査基準を満たせば裏で代理申請を行ってくれるという形になります。次の章では、実際の割り当てに係る手続きを見ていきましょう。

番号申請

 電気通信番号の管理は、総務本省の番号企画室が担当しています。(実は番号の申請を行おうにも全くアテが無い中、ふだん電気通信事業者の関係でお世話になっている担当官に紹介頂きました)

 ひとまず部内数名でお伺いし、概要をお伝えするところから始まりました。お渡しした資料を精査頂くのですが、不明点は逐一電話等で連絡が入ります。お伺いしてから約1~2週間で番号申請と審査に入りました。IINはITU-Tの規則に基づく審査、PLMNは電気通信番号規則に基づく審査ですので、それぞれ別々の申請用紙に記入を行います。

IIN

 ITUの基準に沿って総務省が代理審査を行います。通常IINは直接ITU申請なのですが、電気通信用途に限っては各国の省庁(日本は総務省)を通して申請を行う必要があります。申請書は以下の2枚です。

  • 1.ITU Registration Form
  • 2.IIN割り当て依頼文書

1の書式は公開文書ですので、こちらから参照して下さい。蛇足ですが、IINの申請にはITUへ手数料として80スイスフラン支払う必要があります。

2は総務省独自の文書ですが、内容はISOで定められたIIN割り当ての承認・拒否基準についての日本語回答です。基準は公開されており、こちらの4.3.1(承認基準)と4.3.2(拒絶基準)に回答します。

IINの申請は書類作成に約3週間、割り当てまで約2ヶ月かかりました。

PLMN

 電気通信番号規則に基づき、電気通信番号申請書への記入を行います。事項書の内容は以下の通りです。

  • 1.電気通信番号を必要とする理由
  • 2.必要とする電気通信番号の数及びその根拠となる需要の見込み
  • 3.必要とする電気通信番号の数に係る電気通信役務の提供の計画
  • 4.電気通信番号を管理する方法
  • 5.ネットワーク構成図
  • 6.別表第2に規定する要件を確認できる事項
  • 7.別表第3に規定する要件を確認できる事項
  • 8.その他電気通信番号の指定のために特に必要な事項

書式を見たい方は電気通信番号申請書で誰でも申請書を閲覧することが可能です。

補足:電気通信番号の概要と割り当てフローはこちらを参照。

ここからひたすらトライアンドエラーです。番号の申請内容に付随して、電気通信番号を利用する端末が、技術基準に適合している旨の証明、責任分界点の細かな設定・説明が必要です。このように、他の規則(端末設備等規則)や法令(電波法)に係る情報も求められます。
申請内容へのツッコミ・他の法令に係る確認等で、PLMN取得にまるまる3ヶ月要しました。

番号の割り当て

往訪から取得まで約3ヶ月の道のりでしたが、無事に番号を取得することができました。

最後に

番号の概要と、その取得の道のりについて書いてきました。興味のある人にとって、普段見られない事業者の裏側が垣間見れる記事は非常に新鮮でわくわくするものがあると思うのですが、いかがでしょうか。ITUによって取得内容は公示されますし、あえて隠す必要も無いので、せっかくですからIoTチーム活動の軌跡の1つとして書かせてもらいました。 また、自分自身が感じた 全く情報が無くて困った 事もあり、同じく番号取得をお考えの他の事業者の参考にもなれば良いなという気持ちです。

さくらインターネットは、今後はこの番号を活用し、更なるサービス価値の向上を目指します。

番号取得は、まだまだ序章に過ぎません。

(追記:PLMNとIINの取得にあたり、ITUより申請者の情報が公開されるのですが、まさかこのような形で自分の名前がインターネットに残るとは思ってもみませんでした。)

加筆・修正

2018/6/15 読者にご指摘を頂き、 IINの下二桁=MNC という誤った表現を削除しました。

Continue Reading

IchigoJam BASIC RPiでsakura.ioを使う

さくらインターネット Advent Calendar 2017の8日目の記事です。

こんにちは、こたまごです。

今日は、IchigoJam BASIC RPiの紹介と、sakura.ioと組み合わせてみて動いた報告をします。

IchigoJam

みなさま、IchigoJamはご存知でしょうか。
ご存知の通り、LPC1114で構成された、BASICでプログラミングができる教育用こどもパソコンです。

IcigoJam と sakura.io

IchigoJamでsakura.ioを接続するという利用方法は既に生みの親の福野さんから公開されています。

福野泰介の一日一創 – IchigoJamではじめるIoT sakura.io ハンズオン(データ発信編)

また、実環境でも利用されており、鯖江市のバスの運行状況もIchigoJamとsakura.ioで収集され、オープンデータとして公開されていたりします。

sakura.io x IchigoJam BASIC = かんたんIoT 〜鯖江市のバスで稼働する公共交通IoT〜

 

IchigoJam BASIC RPi

そのIchigoJamがそのままRaspberry Piでも動作する、という「IchigoJam BASIC RPi」が10月に公開されています。

モニタとキーボードを繋ぐだけでプログラミングができるという利便性をそのままにRaspberry Piでプログラミングができます。実環境ではワンチップマイコンのIchigoJamがおすすめですが、HDMIも使えて、USBキーボードも使えるので、試したい時にはおすすめです。

IchigoJam BASIC RPi と sakura.io

先日、さくらインターネットはsakura.ioとRaspberry Piを簡単に接続できるsakura.io HAT for Raspberry Piを発売しました。

sakura.io HAT for Raspberry Pi

 

Raspberry Pi HAT と IchigoJam BASIC RPiがあるということは試すしかないですよね!

ということで、やってみました。

シールドにsakura.ioモジュールを載せて、Raspberry Piに載っけるだけです。

sakura.io HAT

IchigoJam BASIC RPiのインストールはSDカードにダウンロードしたファイルをコピーするだけです。

起動したら先ほどの福野さんの記事を参考に、以下のように入力しました。

1 'sakura.io Test
20 POKE#800,#21,10,1,76,N,N>>8,0,0,0,0,0,0,N>>8^N^102
30 ?I2CR(79,#800,13,#820,3)

このプログラムでは、変数Nに入っている整数をチャンネル1としてsakura.ioに送信するというプログラムです。

その上で、以下のように入力すると送信されます。

N=10
RUN

sakura.ioのWebSocket画面でみてみると、ちゃんと届いていることがわかります。

全く同じコードでワンチップマイコンとRaspberry Piと動くのは便利ですね!

Linuxで使う場合には

Raspberry PiだからLinuxで使いたい、という方のために、Pythonのライブラリ(python-sakuraio)も公開しています。

sudo apt-get install python3-smbus
sudo pip3 install sakuraio

でインストールできるので、こちらもぜひご利用ください。

Continue Reading

babelプラグインの作り方・活用方法

さくらインターネット Advent Calendar 2017の13日目の記事です。

さくらインターネットでは、sakura.ioのコントロールパネルを始めとした、様々な管理画面が存在しています。状況に合わせた最適解を選んでいるので、様々な設計やフレームワークの利用などが行われています。その中で、最近社内でもよく使われるようになった babel について、掘り下げて調べてみました。

この記事はbabel7を参照しています。記事を書いている時点では、betaなので正式リリースの際には変更される点が有るかもしれません。

目次

  • babelの簡単なおさらい
    • パッケージ構成
    • 処理のフローの理解
  • babelプラグインの作成
    • 簡単なプラグインを作成
    • テストを実行
  • babelプラグインを使ってコード自動生成を行う
    • s2sの紹介

パッケージ構成

Babelは、JavaScriptで書かれたJavaScriptのコンパイラーです。
非常にコード量の多いプロダクトになっており、以下のようにたくさんの小さいパッケージで構成されています。

インタフェース

  • @babel/core: .babelrc 等の設定を読み込み、ソースコードに対してプラグインの適用を順次行う
  • @babel/polyfill: ブラウザなどのランタイムにて、 core-js regenerator による標準ライブラリ等の補完を行う
  • @babel/register: require をフックし、コンパイルされたファイルを返す
  • @babel/cli: コマンドラインからコンパイルするためのコマンド

@babel/plugin-*

  • Transform Plugins
    • コード→コード (AST→AST) の変換を行う
    • ex: @babel/plugin-transform-arrow-functions
  • Syntax Plugins
    • babylon内に実装された、構文解析に使用するプラグインを設定するパッケージ
    • 現時点で構文解析を拡張することは出来ない
    • ex: @babel/plugin-syntax-jsx

※AST: コンパイラが扱う構文木 Abstract Syntax Tree

@babel/preset-*

各種構文をサポートするためのプラグインを一括適用するパッケージです。
1つのパッケージを適用するだけで、複数のパッケージが導入されます。

  • @babel/preset-es2015
    • @babel/plugin-transform-arrow-functions: () => {}function () {}
    • @babel/plugin-transform-spread: [...a, 'foo'];[].concat(a, [ 'foo' ]);
    • etc…
  • @babel/preset-react
    • @babel/plugin-syntax-jsx: <JSX /> のようなコードをパースして、Babelが扱えるようにする
    • @babel/plugin-transform-react-jsx: <span>hoge</span>React.createElement('span', null, 'hoge')
  • @babel/preset-env: ターゲットブラウザ・ランタイムに対応したコードを生成するためのプラグインを自動選択

内部パッケージ

今まで紹介を行ったパッケージの内部で呼ばれるものです。
プラグインを自作する際にも使用します。

  • @babel/babylon
    • 構文解析を行う
    • デフォルトでES2017構文が有効
    • JSX, Flow, Typescriptにも対応
  • @babel/types
    • ASTのジェネレーター・バリデーター
    • プラグインなどでASTを組み立てる時に使う
  • @babel/template
    • ASTのテンプレートを作成可能
    • 文字列で書いたコード内のプレスホルダにASTを差し込める
  • @babel/traverse
    • ASTを辿り、ノードの置換・追加・削除を行う
  • @babel/generator
    • ASTをコードに変換する
  • @babel/code-frame
    • エラーをソースの場所とともに表示する

いままでのあらすじ

ここまでで紹介したパッケージの流れをざっくり図にすると、このようになっています。

ちなみに現時点でまだbetaですが、babel 7は以下のような変更が行われています。

  • Scoped Package化 babel-core@babel/core
  • TypeScriptの標準対応が入る
  • flowで書き直しているっぽい
  • 新しい構文への対応も一緒に追加される予定
    • Optional Chaining: a?.b = 42;
    • BigInt: 50000n + 60n;

Babelプラグインを作る

ここではBabelのTransform Pluginsを作成しようと思います。
処理としては、babylonで解析されたASTを編集し返すみです。
babelプラグインを作るための手順は以下のとおりです。

  1. IN/OUTの形式をコードを定義する
  2. IN/OUTのASTを読む
  3. ASTを読み込んで、OUTの形式のASTを構築するコードを書く

順に追って説明します。

今回紹介する内容は、 https://github.com/kamijin-fanta/babel-example-2017 でコードを公開しています。

IN/OUTの形式をコードを定義する

ここでは、 hoge という識別子を fuga に置き換えるプラグインを作ります。
期待されるコードは以下のとおりです。

IN:

console.log(hoge)

OUT:

console.log(fuga)

ASTを読む

上で定義したASTをそれぞれ読んでみましょう。
ASTを読むには https://astexplorer.net/ が便利です。
ここでは、言語にJavaScriptを選択し、パーサーにbabylon7を選択します。

IN側のコードを入力しました。
console.log(hoge)CallExpression として認識され、呼び出す関数は callee 配列は arguments として格納されています。

callee 側の console.log は、 MemberExpression として定義されます。 object に格納された Identifierproperty に格納された Identifier でコードを表しています。

引数である (hoge)arguments 配列の中に Identifier として定義されています。

プラグインを書く

まず、何もしない最小のプラグインを作ってみます。

$ npm i @babel/core @babel/babel-cli
$ mkdir src
$ touch src/index.js
$ cat '{ "plugins": ["./index.js"] }' > .babelrc

index.jsを編集し、以下の内容にします。

// index.js
module.exports = function({ types: t }) {
  return {
    name: 'babel-example-plugin',
    visitor: {
      Identifier(path) {
        console.log('path: ', path.node)
      }
    }
  };
};

babelを実行し、標準出力に出力される結果を読んでみましょう。

$ node_modules/.bin/babel input.js
path:  Node {
  type: 'Identifier',
  start: 0,
  end: 7,
  loc: ~~~略~~~,
  name: 'console' }
path:  Node {
  type: 'Identifier',
  start: 8,
  end: 11,
  loc: ~~~略~~~,
  name: 'log' }
path:  Node {
  type: 'Identifier',
  start: 12,
  end: 16,
  loc: ~~~略~~~,
  name: 'hoge' }

プラグインで定義している visitor オブジェクトに対して、ノードのTypeに対してのマッチングを書いていきます。再帰的に探索を行い、マッチしたvisitorを呼び出します。Type名のメソッドを定義すると、親ノード・自ノードの情報等が含まれるパスが引数に渡されます。

上の例では、 console log hoge という3つのIdentifierがマッチしました。

次に、ノードの一部を書き換えてみましょう。
path オブジェクトの node プロパティが、現在のASTを表しています。下の例では、Identifierタイプでマッチしたノードのパスがpath引数に渡されます。Identifierは、属性としてnameを持ちます。その属性を書き換えてみましょう。

// index.js
module.exports = function({ types: t }) {
  return {
    name: 'babel-example-plugin',
    visitor: {
      Identifier(path) {
        if (path.node.name === 'hoge') {
          path.node.name = 'fuga';
        }
      }
    }
  };
};

このコードの出力結果はこうなります。

console.log(fuga);

テストを行う

テストは、 jestbabel-plugin-tester を使うのが使いやすそうなので、試してみます。

単純なテスト

先程はCLIから簡単にプラグインを扱うため、 .babelrc に設定しましたが、babel-plugin-testerを使うことで不要になるので、一緒に設定を書き換えます。

$ npm i jset babel-jest babel-plugin-tester @babel/preset-env
// .babelrc
{
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "node": "6.10"
      }
    }]
  ]
}

次にテストコードを書きます。codeが入力コードで、outputが出力コードです。

// src/index.test.js

import plugin from './index';
import pluginTester from 'babel-plugin-tester';

pluginTester({
  plugin,
  tests: [
    {
      title: 'example',
      code: `console.log(hoge);`,
      output: `console.log(fuga);`,
    },
  ],
});
$ node_modules/.bin/jest

 PASS  src\index.test.js
  babel-example-plugin
    √ example (6ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.603s, estimated 1s
Ran all test suites related to changed files.

スナップショットテスト

jestには、入出力の値の変化をテストするためのスナップショットテストの機能が有ります。 https://facebook.github.io/jest/docs/en/snapshot-testing.html

babel-plugin-testerはjestのスナップショットテストに対応しているため、非常に簡単にこの機能を使うことが出来ます。テストコードを書き換えて試します。 snapshot: true を設定し、outputを指定しないのがポイントです。

// src/index.test.js

import plugin from './index';
import pluginTester from 'babel-plugin-tester';

pluginTester({
  plugin,
  snapshot: true,
  tests: [
    {
      title: 'snapshot test',
      code: `console.log(hoge);`,
    },
  ],
});

テストを動かすと、 __snapshots__/index.test.js.snap ファイルが生成されます。次回このファイルと異なる値が出力された際は、エラーとなります。

// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`snapshot test 1`] = `
"
console.log(hoge);

      ↓ ↓ ↓ ↓ ↓ ↓

console.log(fuga);
"
`;

こうして、スナップショットをとっておくことで、プラグインの変更を手軽に検知できるようになります。

s2sの紹介

Babalプラグインを作ることで、Babelの機能などが理解できたかと思います。基本的に行っていることがコード→コードということがよく理解できたかなと思います。そのコードからコードを生成するBabelPluginの性質に着目したのが、s2sです。

https://github.com/akameco/s2s

s2sと適切なBabelPluginを組み合わせると、Redux等で大量に必要となるボイラープレートの削減を行うことができます。

基本的な動作は、このような流れです。エディタでファイルを保存すると、即時にコードが自動生成され、追記されたように見えます。

  1. ファイルが保存されたタイミングでハンドラ(babel-plugin)が起動
  2. babel-pluginはASTを受け取り、編集を行って返す
  3. 結果の文字列でファイルを上書きする

例えば、FlowでのReduxアプリケーションで使用する babel-plugin-s2s-action-types は、以下のような変換を行います。

In:

export type Action = Increment

Out:

// @flow
export const INCREMENT: "app/counter/INCREMENT" = "app/counter/INCREMENT";

export const Actions = {
  INCREMENT
};

export type Increment = {
  type: typeof INCREMENT
};

export type Action = Increment;

タイプ数が半分以下になっている事がお分かりいただけると思います。ただ、内部でやっていることは基本的に、ファイルのwatch・BabelPluginを使用したtransform・ファイルの書き込みの3点です。なので、ユーザが自由に拡張することが出来ます。

私も、babylon7がTypeScriptに対応していたので、上のプラグインのTS版のプラグインを作ってみました。非常に簡単に実装を行うことが出来ました。

https://github.com/kamijin-fanta/babel-plugins/tree/master/packages/babel-plugin-s2s-action-types-ts

まとめ

  • babel怖くない
    • babelのプラグインはASTを理解すると作れる
  • AST怖くない
    • astexplorer等、ASTの理解を助けるツールが存在する

冬休みはカスタムのBabelPluginを作ってみてはいかがでしょうか。

資料

  • https://github.com/thejameskyle/babel-handbook/blob/master/translations/en/plugin-handbook.md
    • もう少し掘り下げてプラグインを作る方法がかかれている
  • https://github.com/kamijin-fanta/babel-example-2017
    • 今回のサンプルプログラムを置いたリポジトリ
Continue Reading
Close Menu