マトリョーシカ的日常

ワクワクばらまく明日のブログ。

soracomでワクワク☆IoT生活  第2回「疑惑のバイナリ」


バイナリ通信を使ってみる

 人間の指が10本だったので、世界は10進数で溢れている。しかしながらPCの世界は2進数で表現される。彼らはON/OFFしかないのだ。(量子コンピュータは知らないが) だから、2進数を送ってやると都合が良い。

 さっと記事を書こう。前回の記事でUDP通信が使えるようになった。これを利用して、soracomにデータを送ることにした。今回は通信プロトコルだけでなく、通信するものごとも変更し、データ利用量を軽減しよう。バイナリデータを送るのだ。幸いなことにsoracomにはバイナリパーサというサービスが提供されている。バイナリデータを送ると、あちらでJSON形式のデータに変換してくれるのだ。

dev.soracom.io

バイナリパーサの設定

 soracomのコンソール画面上でいろいろ設定する。soracom air のところでバイナリパーサをONにする。肝心のデータフォーマットは、バイナリパーサplaygroundを使うと、いい感じに決まる。
binary-parser-playground.soracom.io

 わたしはこんな風にしてみた。

flag_1:0:bool:7 flag_2:0:bool:6 flag_3:0:bool:5 flag_4:0:bool:4 Num:0:uint:2:1 


データ送信プログラム

 ATコマンドで送ってみよう。各種設定をして、以下のようにプログラムを作成した。

const char * host = "uni.soracom.io";
const int port = 23080;
int send_byte = 1

略

  modem.sendAT(GF("+USOCR=17"));
  delay(1000);
  modem.sendAT(GF("+USOCO="), 1, ",\"", host, "\",", port);
  delay(1000);
  modem.sendAT(GF("+USOST="), 1, ",\"", host, "\",", port, ",", send_byte);
  delay(1000);
  modem.stream.print("00001111");

取得したが…!?

やってみたのだが、なんかうまくいかない。データは送信されているが、期待するデータとは違うのだ。以下の表に示す。

送信データ 期待する受信データ 実際の受信データ
-------- -------- --------
00001111 xxxx No.3 xxoo No.0
11111111 oooo No.3 xxoo No.1
00000000 xxxx No.0 xxoo No.0
01111111 xooo No.3 xxoo No.0
00111111 xxoo No.3 xxoo No.0
00001111 xxxx No.3 xxoo No.0
00001111 xxxx No.3 xxoo No.0


左の4bitでo x のbool値を返し、右の2bitでナンバーを返すようにしていた。のだが、なんか違う。バイナリパーサplaygroundではうまくいくのにね。

もしかして、16進数?

 そこから小一時間悩み続けて、ふっと閃いた。「もしかして、文字列を送っちゃっているのか!?」そう。自分が2進数だと思っていたのは実は文字列の01だったのだ!!文字列の"0"や "1" はアスキーコードで以下のように表現される

"0" 
->  00110000

"1"
->  00110001

 これで先ほどの表の結果がかちりとわかった。あれは左の1bit目が0だったら「b00110000」を、 1だったら「b00110001」を返していた結果だったのだ。そうか!!

変換しよう

 そういうわけで、ATコマンドで送る前に2進数を16進数のアスキーコードに変換して送る必要があることがわかった。コードは以下のようになる。

int bit_state = B000000;
a_s = (int)bit_state;
key = (char)a_s;

modem.stream.print(key);

bit_stateはbitWriteなどを利用して所望のbitにしてしまおう。

 そうしてうまくいった。非常によかった。

おわり

 soracomのネタ、まだまだ尽きない。日々のインプットに、アウトプットの速度が負けそうだがなんとか頑張って記事を残していこう。

Photo by Meckl Antal on Unsplash

M5Stack 3GモジュールでUDP通信 〜ATを呼ぶもの〜

 m5stack + 3Gモジュール、とても良い。マイコン一つでデータをクラウドへ送信できるので非常に便利。でもさ、ちょっと通信量多すぎないか?


 12月は100回程度通信した時点ですでに500kiBほど使用していた。(写真は最近のデータも含む) 1回の送信で5KiB!? 多すぎ!!これはどういうことか。サポートへ問い合わせてみた。

当社では通信の秘密よりお客様の通信内容は確認できないのですが、500 KiB であれば極端に多いとは言えないかと存じます。(一部抜粋)


 毎度のことながら返答が早い。ありがとうございます。

 やはり通信プロトコルの影響が大きいのかもしれない。利用しているのはHTTPというもの。これはよくわかんないけど、送信するデータが多くなってしまうらしい。

 対してUDPというものがある。これはデータを送信しっぱなしなので、応答の確認はしないので信頼性は低い。しかし送るデータが軽量なので通信量が低く抑えられる。なるほど。追跡機能がついた宅急便か、ゆうメールかの違いというところか。

 あれ、でも今使っているTinyGSm はUDPには対応していないぞ。

 お問い合わせいただきありがとうございます。


 M5Stack 用 3G 拡張ボードが搭載する通信モジュール u-blox 社 SARA-U201 は UDP 通信に対応しておりますので、直接 AT コマンドを実行いただければ UDP もご利用いただけます。(おそらくご利用になっていると拝察する TinyGSM が UDP に対応しておりません。)


 詳細は AT コマンドのマニュアルをご参照くださいませ。具体的な実装方法などは当窓口からはご案内できませんが TinyGSM ライブラリの sendAT 関数を利用すると AT コマンドを実行いただけるようですのでご検討いただければと存じます。

u-blox cellular modules AT commands manual

https://www.u-blox.com/en/docs/UBX-13002752


ないならつくればいいじゃない!!

 そこでATコマンドの出番である。これはむかーしのモデムにも使われていた命令であり、送信などができる。じつは3Gモジュールの中に入っている sala u-bloxはこのATコマンドが実行できる。
 tinyGsmのコードをgithubから眺めるとそれらしいところがいくつかあった。

GitHub - vshymanskyy/TinyGSM: A small Arduino library for GSM modules, that just works

いでよATコマンド

プロトタイプ向けマイコンモジュール M5Stack と 3G 拡張ボードをセットアップする | Getting Started | SORACOM Users
まずはこのコードを実行する。m5stack 3gモジュールからsoracomハーベストへデータを送信する。10秒おきに。結構頻度が多いね。

ここでシリアルポートをのぞいてみよう。
....

ちょっとよくわからない。


というわけで、まずはATコマンドを見てみよう。いいのがあった。



C:\Users\ユーザ名\Documents\Arduino\libraries\TinyGSM\src\TinyGsmCommon.h

ここに入っているヘッダファイルを修正するらしい。

    void sendAT(Args... cmd) { \
    streamWrite("AT", cmd..., GSM_NL); \
    stream.flush(); \
    TINY_GSM_YIELD(); \
    /* DBG("### AT:", cmd...); */ \
  } \

 このコメントになっているのを表に出すらしい。

うわ、なんか出てきた!!! なんだこいつは。

貼り付けながら見てみよう

[751] ### AT: 
(中略)
[4044] ### AT: +CFUN=16
[7404] ### TinyGSM Version: 0.7.9
[7404] ### AT: 
(中略)
[9800] ### AT: E0
[9804] ### AT: +CMEE=2
[9811] ### AT: +CGMI
[9816] ### AT: +GMM
[9821] ### Modem: u-blox SARA-U201
[9822] ### AT: +CPIN?
[10829] ### AT: +CPIN?
[10836] ### AT: I
[15854] ### AT: +CGREG?
(中略)
[18405] ### AT: +CGREG?
[18413] ### AT: +UPSDA=0,4
[18422] ### AT: +CGATT=1
[18428] ### AT: +UPSD=0,1," soracom.io "
[18434] ### AT: +UPSD=0,2," sora "
[18439] ### AT: +UPSD=0,3," sora "
[18445] ### AT: +UPSD=0,7,"0.0.0.0"
[18449] ### AT: +UPSDA=0,3
[52031] ### AT: +UPSND=0,8
[52038] ### AT: +CGREG?
[52044] ### AT: +UPSND=0,0
[54088] ### AT: +USOCTL= 0 ,10
[54095] ### AT: +USOCR=6
[54101] ### AT: +USOSO= 0 ,6,1,1
[54106] ### AT: +USOCO= 0 ," beam.soracom.io ", 8888
connected.

なるほど。どうやら、

[起動後の時間] AT  

という流れらしい。

これとu-bloxのatコマンド一覧を眺めてみよう。

https://www.u-blox.com/sites/default/files/u-blox-CEL_ATCommands_%28UBX-13002752%29.pdf
呪文か。


以下のブログで紹介されているやりかたで、ATコマンドを打ちながら試していこう。
デバッグモードを使いながらやっていく

ATコマンドの紹介

AT: +CFUN=16

> Selects the level of functionality fun in the MT.
p45

なるほど。わからん。なにかのスイッチをリセットしているらしい。

AT: E0

全くの不明。

AT: +CGMI
AT: +GMM

製造社とモデルを表示してくれる。 p35

AT: +CMEE=2

これはエラーモードの設定。

 AT: +CPIN?
 AT: +CGREG?
 AT: I

 SIMにデバイスの保護がなされているかを確認。CGREGはGPRSネットワークの確認らしい。AT Iは製品情報が表示される。

よしよし。

AT: +UPSDA=0,4

指定されたPSDアクションを返すらしい。なんとことかわからない。

AT: +CGATT=1

GPRSへの接続をON-OFFしている。

AT: +UPSD=0,1," soracom.io "
AT: +UPSD=0,2," sora "
AT: +UPSD=0,3," sora "
AT: +UPSD=0,7,"0.0.0.0"

 パケットスイッチをなんか切り替えるらしい。パケット通信のなにかを設定しているのかな。

AT: +UPSDA=0,3

 パケットスイッチに関するアクションをしかけている。なんぞ。

AT: +UPSND=0,8
AT: +UPSND=0,0

 パケットスイッチに関する何かを確認している模様。

AT: +USOCTL= 0 ,10

通信を許可している。10はTCP通信の許可らしい。

AT: +USOCR=6

ソケットを作っている。6はTCP通信のソケット。

AT: +USOSO= 0 ,6,1,1

ソケットのオプションを設定している。

AT: +USOCO= 0 ," beam.soracom.io ", 8888

ソケットへ接続している。


UDP通信をするにはどうすればいいか

 というわけで、上のコマンドを行った後にpayloadをpostしてやればHTTPはできる。では、UDPはどうすればできるか。以下の通りだ。

AT +USOCR=17

AT +USOCO=1,"uni.soracom.io",23080

AT +USOST = 1,"uni.soracom.io",23080,1,"1"

UDPソケットをつくり、ポートを指定。そうしてバイトを送信する!!
こんなかんじ。そして、TinyGSMを使用しているなら、harvestへ送信したプログラムに以下のコードを追記すればATコマンドが送信できる。

modem.sendAT(GF("+USOCR=17"));
  delay(1000);
  modem.sendAT(GF("+USOCO="), 1, ",\"", host, "\",", port);
  delay(1000);
  modem.sendAT(GF("+USOST="), 1, ",\"", host, "\",", port, ",", 1);
  delay(1000);
  
  modem.stream.print("0");

やったね!


通信量の比較

 かなり下がった! 2月は800回ほどデータ送信をしたが、全体の通信量は130KiBくらい。一回あたり160Biくらいか。前の5KiBに比べたら約1/30になった。うれしいなぁ。

次回予告

 さて、なんとかUDP通信はできたのだが、バイナリの様子がどうもおかしい。バイナリパーサーを通じて観測すると、0だと思って送信したものが0じゃなかったのだ。

次回、「疑惑のバイナリ〜アスキーコードの行方〜」

お楽しみに!!



Photo by eberhard grossgasteiger on Unsplash

分かっちゃいるけど、やるのは難しい /「エッセンシャル思考」


 書き始めが冬のことばかりになっている気がして、私自身が寒さを求めているのだなと感じた。それくらい今年の冬は暖かい。始発の電車で会社に向かう時、冷えた手を缶コーヒーで温めたりもしたいが、そういうほどでもない。だから私はセブンカフェのコーヒーを買うのか。あれおいしいよね。関係ないね。

 エッセンシャル思考を読んだ。目標を明確に!余分なことはしない!そうすればOK!そういう本だ。「そんなのわかっているよ」という声も聞こえるが、これはただわかっているだけではダメだ。実践を伴って初めて価値が生まれる。本を読んで、少しずつエッセンシャルな形が身についてきたので、記録しておく。

 まずは本質的な目標を定める必要があった。これはワクワクして、具体的なものがいいらしい。私はひとまず「IoTで10万円稼ぎたい!」とした。次に不要なものを捨てることにした。この捨てるというのは難しいのだが、なにか新しいことを始めるなら、なにかを捨てなければならない。私は自分に降りかかる仕事のうち、後輩に任せられることは任せることにした。これで自分のやりたい本質的な仕事(社内IoT化)に集中することができた。

 なにも後輩に全部投げるわけではない。目標と期日は明確に伝えた。具体的な方法は後輩も知っていたので、あまり細かく注文するのはやめた。重要だったり、期日が短い仕事は進捗を細かく追う必要があるが、それも最低限にした。時々フォローはするが、いまのところ案外うまく回ってきている。彼も着実に成長しているのだ。すばらしい。私はIoTをやるぞ。

 仕事で身につけたIoTスキルを個人活動でも生かせるようにしたい。そのために職場の仕事はIoTだけになるように努力している。

 捨てることができてきたら、自分のパフォーマンスを高めることを考える。エッセンシャル思考では睡眠時間の確保をうたっている。私は少し睡眠時間が少なかったので、会社の昼休みに10分ほど寝るようにした。これはどう変わっているかよくわからない。ただ、健康に対する意識は変わった。今までは風邪をひいいたら治すくらいにしか考えていなかったが、今は風邪を引く前に体をコントロールするようにしていている。睡眠、運動、野菜、瞑想。瞑想はいらないか。

 あとはバッファをとる。ひたすらバッファをとる。予想してた時間の1.5倍をとるといい、と本に書いてあった。そういうわけで2,3日で終わりそうなことを1週間で行うような計画を立てた。やってみると、突発的な別のことがらや不具合がおこって、ほんとうに1.5倍の時間で収束することもあった。すごい。バッッファすごい。

 エッセンシャル思考は楽しい。楽しいことだけに集中して日々を過ごしていたい。

(Photo by Dan Meyers on Unsplash)

エッセンシャル思考 最少の時間で成果を最大にする

kintoneの勉強会でLTをした話

 文章の淀みのようなものをすくってどこかに投げている、そんなことができているか。以前の文章のほうがどこかとげとげしさがあって、ずっとシャープでいた。それが良いか悪いかは別の話として、今は決して書けないのだろうなと気がついた。

 kintoneというグループウェアの勉強会があって、わたしはそこでLTをした。オフラインのイベントに参加するのは初めてだったが、わりとどうにかなった。
 題目はこれ。

 

www.slideshare.net
kintone Café 広島 Vol.17@広島 - connpass

 IoTをやっていく上で、データの表示はkintoneにまかせるといいよ!という話をした。多くの準備はできなかったが、反応はよかった。嬉しかった。その日のためにつくった名刺を、何人かの人と交換した。嬉しかった。けっこう経験値を得た気がした。そういうことだった。まずは手を上げないとはじまらなかった。「今年はオフラインのイベントに参加したいな」と考えていたところに、勉強会が開催されるという通知が来た。LT枠が空いていたので思い切って申し込んだ。「どうやるか」はそのあと考えることにした。

 手を上げまくる日々が続いている。先月は毎週がチャレンジングなものだった。けど、それをあまり自分で意識しなくなってきた。わりといい兆候だと思う。

 今年中にIoTの勉強会を開きたい。みんなでくだらないものを作ってわっしょいやっていきたい。

Photo by John Fowler on Unsplash

広く深く楽しいIoTの本 /IoTエンジニア養成読本 設計編

f:id:kyokucho1989:20200120220111j:plain

 難しく考え過ぎていた。雪は降らなかった。当たり前と思っていたことがそうではなかったりした。日々の暮らしにいくつかの句読点をうち、私はそれを読み進めていく。IoTが熟成していく。日本語もままならない。
 「IoTエンジニア養成読本 設計編」を読んだ。非常に養成された。ここまで広く深くIoTに言及している本はないのではないか。どこか皆IoTを未来っぽい技術だと思って、距離を置いて発言してるがこれはそうではなかった。IoT使われるデバイス、通信、クラウド、セキュリティ、それらが散りばめられている。自分の中でなんとなく頭に入っていた言葉たちが体系化されてきた。この感覚は久しぶりで興奮する。

 前にも書いたが、IoTは全ての知識を頭に入れておく必要はない。そして全ての技術を自分で開発する必要もない。大切なのは生産性の向上である。IoTをやって、自分や周りが豊かになればそれでいいのだ。お金をかけてもいいなら、既存の良いサービスを使ってしまおう。クラウドやデバイス、良いものはたくさんある。私がおすすめするのはM5Stack + soracom である。これでだいたいのデータは可視化できてしまう。機械学習やエッジコンピューティングとかをやろうと思ったらAWSやラズパイが入ってくるだろうが、それはまたそれの話。

 この本に書いてあることもやりながら学んでいけばいい。

 つまり、自分の得意な領域だけでなく、センサーからの情報取得方法、組み込みコンピューティング、ネットワークの設定、クラウド、判断のためのアルゴリズムや機械学習など、多岐にわたる知識と技術を一定レベルで習得しておけば、自らの手で新しい価値を生み出すことができる可能性ができるのです。

「IoTエンジニア養成読本 設計編」p150

 そうだね、そのとおり。

IoTとセキュリティ

 本書にも書かれていたが、IoTにはIoTならではのセキュリティ上のリスクがある。デバイスが小さく、マシンパワーが小さい。そして保守が困難な場合が多い。誰かがさーと持ち帰ってしまうかもしれないし、デバイスに複雑な暗号処理をさせるようなことは難しい。どうするか。

 経済産業省がIoTセキュリティガイドラインを発表している。
IoTセキュリティガイドラインを策定しました(METI/経済産業省)

 これをふまえて、セキュリティを色々考えていくといい。社内の啓蒙や、ロギング、リリース後の保守などさまざまなことが書かれている。


 ざっくりと本を紹介した。楽しい本だった。今後もざっくり本の感想を書いていくぞ。

Photo by brandon siu on Unsplash