マトリョーシカ的日常

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

文章だけ書いていこう

 実際のところ、文章とならない日々が続いており、ボキャブラリーは枯渇している。数年前の自分からは想像できないかもしれないが、ここ一年ほどまともに本を読んでいない。言葉に触れる機会がめっきり減ってしまった。それは優先事項とか現実味とか地に足のついた行動を目指したためである。ちょっとは現実的になってきたのだ。

 ここはだれもみてない場所であるから、わたしはわたしだけの言葉を書いていけばいい。あとのことがらはまた次回に回せばいい。そうやって生きていくのだ。

 日々コードを書いている。この間、Rubyでゲームを作ったらけっこう楽しかった。なんだかそれらしいロジックも組めるようになったので、今度はRailsもいっぱい頑張ることにした。Railsは共同開発をほかのだれかと繰り返しながらわっしょいやってる。Gitとかいう生き物を使いこなせるようにしよう。

 プログラミングがなんか人生にしっくりきている。もうちょっと早くやればよかったと思ったけど、小学生の頃からやっていたので時期は問題ではなかった。生きている時間のうち、プログラミングをする時間をもうちょい増やしたい。そうすればたのしく生きれる気がする。

 たのしさ。たのしさはいいなぁ。私の主成分はたのしさでできているなぁ。

Photo by Roman Kraft on Unsplash

31歳になった

 この一年はまったく本を読んでおらず、とんでもなく語彙が少なくなってしまった。それでも文章は書けるわけで、いったいこれを文章たらしめている物体はなんなのか、見当がつかない。31歳になった。

COVID-19

 やばくね? いろいろやばい。でも一個人ではどうすることもできないので、マスク手洗いうがいをがんばるしかない。社会がふにゃふにゃになってきているので、自分もふにゃふにゃにならないといけない。

勉強

 昨年とりくんだ技術士二次試験は筆記試験で落ちてしまった。再チャレンジはまだしない。いまはそれ以上にやりたいことが多すぎる。プログラミングとしてRubyとRailsに取り組んでいる。えいやとやりたい。

つくったもの

 なにかあるだろうか。技術書典はコロナの影響で流れてしまったが原稿は書いた。
FARMTORY JOURNAL vol.3 育てる食べる×テクノロジー 電子版 - farmtory - BOOTH

 あとはカップラーメンタイマーや春を感じるIoT、ハンコ押しロボット(もどき)などをつくった。

仕事

 コロナの影響で弊社もやばい。生き残れるかどうかわからない。自分の身は自分で守るしかない。ちょっと足回りを軽くしてやって、どこへでもいけるようにしないといけない。
 仕事でもIoTをやれるようになった。非常に楽しい。

子供

 二人目もだんだんと大きくなって、家中うるさい。あと十年はこの状態が続くのかな。コロナが落ち着いてたらみんなで旅行に行きたい。

オンラインサロン

 この一年でわたしの周りの環境が変わった。人生逆転サロンというオンラインサロンへ入会し、メンターになった。IoTの情報を発信している。ワクワクIoT講座も開講していて、いろいろがんばっている。あと、そこでRubyも勉強している。みんないいひと。みんなたのしい。

やりたいことリスト

 以前はやりたいことが腐るほどあったが、ただリストアップするだけではなにもできないことに気づいた。現実的な期限を設けないといけない。

 というわけで、31になってもがんばります!

 


Photo by Akhil Lincoln on Unsplash

近況の文章

 久しぶりに文章を書こうとしたら、世間はコロナばかりになっていた。感染者数は日々増えていて、企業にも休業要請がだされたりした。わたしたちも家にひきこもらないといけない。そのような世の中だ。私の勤めているところは、社員の一部を休業させながらなんとか回っている。いや、まわってないけど。

オンライン登壇

 ここ一ヶ月でオンラインイベントに参加するようになった。コロナの影響で、IT関係のイベントがすべてオンラインになったのだ。地方民の私としては、トーキョーが一気に身近なものになった気がする。ただ参加するだけではもったいないので、いくつかはオンライン登壇した。
 
【オンライン開催に変更】ビジュアルプログラミングIoTLT vol2 - connpass


【オンライン】M5Stackユーザーミーティング番外編【LINE Beacon化ハンズオン】 - connpass


 オンライン登壇は手軽で楽しい。会場へ移動することもないので、LTの5分が終わったら、すぐにこどもと遊ぶことが可能だ。これからはオンラインの時代になる。というよりオフラインは制限されていてなかなかできない。IoTの勉強会もオンライン上で開いてしまえばいい。そう思った。

cluseterVRがたのしい

 クラスターは、あのコロナのクラスターではない。バーチャルSNSと呼ばれているサービスだ。利用者は仮想空間でアバターを動かすことができる。VR機器がなくてもPC・スマホで利用することができる。たのしい。

 広島のclusterイベントにも参加した。たのしい。


 farmtory-labの紹介がclusterVRで行われていたので参加した。わっしょいやってる感があって、よかった。

 時代はなんかすごいはやさでかわっているらしい。わたしも変わらなくちゃいけない。生存しよう。
 

Photo by David Marcu on Unsplash

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