Biglobeモバイルのクーポンと誕生月キャンペーン

関東ではBiglobeモバイルの大型キャッシュバックが定期的に行われているのは知っていても,関西在住の自分はなかなか利用できないので…。比べると条件のショボさが際立つがいたしかたない。

Biglobeモバイルでは契約の確か翌々日にクーポンが付与される(長いスクリーンショット)。核心部分は以下:

上のは音声SIM契約を新規にする場合のみに使用でき,合わせて端末購入をする場合には使えない。下のは,既存契約で機種変更する場合に使え,新たに機種購入をともなって契約する場合には使えない。

さらに,自分の誕生月になるまで知らなかったが,誕生月の人向けの特別キャンペーン(巨大スクリーンショット; スナップショット)がある。その核心部分は以下の図。

月額料金は家族割で2回線目以降毎月200円/月割引適用を受けるのと変わらない ⇐ 実際に家族割なのでこの料金になる。

端末セットの場合,現在最大20,000円相当のポイント還元が機種購入に対してあるキャンペーンが行われているスナップショット)。誕生月のみのキャンペーンは,それに比べて初期費用無料,クーポンで追加で付与される分があるのがいいが(しかし後者が適用されるかは不明),その合計額ほぼそのまま機種購入に対するポイント還元額が減額されているので,特にオトクではない。

SIMのみの場合,現在の音声通話SIM特典スナップショット)は初期費用無料+3,000Gポイント付与。このお誕生月の特典だとそれが同じく初期費用無料+3,500Gポイント付与+(クーポン使用で⇐申し込む際クーポン使用なしでポイント付与があると)2,000Gポイント付与,なので,確かに2,500Gポイント分通常よりお得ではある。たかが知れていると言えばそうなのだが,維持費が550円/月(3GB/月まで)なら数カ月分に相当し,それなりに有意義。ただ,誕生日月以外に普通に契約してもクーポンを利用すれば3,000 + 2,000 = 5,000ポイント合計もらえたので,誕生月の申込みはわずか500ポイント分おとく。

これを利用して8/28に音声SIMのみ契約。なぜか申込みはオンラインではできず電話でするしかない。最初こちらから電話かけてその意向を伝え基本情報を伝えると,コールバックがあってさらに手続き。電話での指示に従ってオンラインで家族会員作成をさせられた。さらにその後コールバックがあり,いろいろ事務的な確認があってやっと終了。総時間はゆうに30分は越えた。

ちなみに,上図のように2,000Gポイント付与があるのは事実だが,音声通話SIM新規申し込みクーポンの使用によるものではなく,家族割の適用によるものだ,という説明を受けたが,公式ウェブサイトにそのような記載はない。まぁ同額の還元が受けられるのなら特に文句はないが…。

この後URLが送られてきて,そこで身分証明証の写真をアップロードすることになっているが,それを月末にやることで,サービス開始を翌月頭からにして,初月無料を最大限に生かすことをアドバイスされた。

 

AutomateにおいてダウンロードされたプログラムにおいてもURIによる同一プログラム内のFlow起動を可能に

Automateロゴ

Automateロゴ

Android用オートメーションソフトウェアAutomateのユーザにだけ意味のある話。

Automateにおいて,通常のプログラミングシステムではプログラムと呼ぶものを “flow” と呼ぶ。しかし大変紛らわしいことに,その中には1つ以上の “flow” が含まれており,こちらの “flow” はそれぞれエントリーポイントを持った一連の処理を指す。Automateにおいて,ユーザが手動で処理を開始したり停止したりするのは後者の flow 単位で行われる。本稿では誤解を避けるため前者の “flow” を「プログラム」と呼ぶことにする。なお,”fiber” というの語も使われるが,それはflowを実行するスレッドと理解すればよい(ただし,必ずしもfiberはスレッドとして実装されているわけではないらしい)。 “Flow ⋅ Automate ⋅ LlamaLab” 参照。

さて,Automateはフローチャート型のビジュアルプログラミングパラダイムを採用しており,それぞれが一つの処理を表すブロックを組み合わせることでプログラムを作成する。Flow startFlow stopというflowを開始する・停止するブロックが用意されているが,対象となるflowはそのURIで指定する。

プログラムの起点となるのはFlow beginningブロックであるが,それを同定するURIはAutomateシステムにより自動的に割り振られる。問題は,このURIがそれぞれのAutomateインスタンスにより異なり,値が一定ではないこと。自分が作成したプログラムを一台のAndroid端末内のAutomateだけで使うのであればこれは問題にならないが,同じプログラムを他端末のAutomateにインポートしたりすると,同じはずのFlow beginningブロックのURIがオリジナルの端末上での値と異なり,そのflowをFlow startFlow stopで開始・停止することができなくなる。

Flow startのドキュメントでは, Flow beginning pickブロックを利用し,プログラム実行時にユーザに手動で正しいflowを選びさせるように指示しているが,それはいくらなんでも非現実的だ。何かいい回避策がないか調べると, “Starting internal flows dynamically : AutomateUser” に回避策があった。それは相対URIを使うこと。

Flow URIは

content://com.llamalab.automate.provider/flows/25/statements/3

のような形式だが,これを単に “statements/3” として呼び出すことで,他端末に移しても引き続き動作するようなプログラムにできる。

他プログラムのフローを呼び出すのは残念ながらそう簡単には行かない。上記URI中の flows の後の数字で,特定のAutomateインスタンス内でのflowを特定するようだ。他プログラムをライブラリー的に利用したいのであれば,一つの手はスマートな方法は諦めてユーザに手動で指定させるのが,ベストではないにしろ現実的。

もっと込み入ったことをしたければ,プログラム・マネージャーのようなものを用意するしかない。このプログラム・マネジャーはそれが動くAutomateの全てのプログラムを管理し,どのプログラム(ないしはその下位flow単位で)がどういった機能を提供するかを知っている(provide <feature> 相当)。さらに機能のリクエストがあったときに(require <feature> 相当)それを実現するflowを教えて,それを呼び出せることを可能にしてやる。ただ,こういった機能を利用できるには最低限各プログラムで,プログラム・マネージャーのflowを知る必要はある。

プログラムをGoogle Driveを利用するなどして同期させるような機能も合わせて持たせられれば理想的。

Androidでブロードキャスト・インテントで受け取ったデータをMQTTブローカに伝達

Amazfit Band 5自分専用の関連写真アルバム)をサードパーティアプリNotifyの使用で見守り目的に使おうとしている。 “一人暮らしの老人の見守りに対するアプローチ” で述べたことの実現の一環。スマートバンドのセンサーで検知できることや他のデバイスで検知できることなどを俯瞰的に見渡して総合的な判断ができるよう,データはMQTTブローカに集約しようとしている。そのため,Android TV準拠ストリーミング・メディア・プレーヤAmigo 7xJP導入したTermux環境内にMQTTブローカをインストールしてある。

Amazfit Band 5が取得するデータはサードパーティ製コンパニオン・モバイルアプリNotifyが有償機能の一つとしてブロードキャスト・インテントとして流してくれる。これをMQTTブローカにさらに伝搬させるには以下のやり方が考えられる。

  • [間接伝搬法] オートメーションアプリAutomateを利用し,それでブロードキャスト・インテントを受け取り,それを何らかの方法でMQTTブローカに伝搬する。
    • [Takserのプラグインを利用] TaskerのMQTTクライアント機能を提供するプラグインでMQTTブローカにそのデータを流す。AutomateそのものはMQTTに関係する機能は持っていないが,Taskerのプラグインが利用できるので。たまたま自分がAutomateの有償ユーザに既になっているのでそれを前提にしているが,Taskerプラグインが利用でき,ブロードキャスト・インテントを扱える全てのオートメーションアプリでこの方法が取れる。
    • [Termuxのコマンドラインツールを利用] TermuxのMosquittoパッケージの中にはmosquitto_pubというコマンドも含まれている。Eclipse PahoのPythonクライアントなんかも候補になろう。その他もあり。
  • [直接伝搬法] ブロードキャスト・インテントで得られるデータを直接MQTTブローカに伝搬させられるアプリを使用する。

間接伝搬法

Taskerプラグインを利用

これに使えるTaskerプラグインは以下の2つ(Google Play Storeでの検索と “Tasker for Android” によれば)。

  • MQTT Publisher Plugin ー 最後の更新は2015年末。
  • MQTT Client ー 最後の更新は2019年初頭。FOSS(リポジトリ)だが2020年初頭頃から作者による更新やissueに対するレスポンスは止まっている模様。

PublisherはMQTTブローカにpublishするアクションしか機能がない。それに対しClientはそれだけでなく,ブローカとの接続を管理する機能,そしてsubscribeする機能もある。アクションとしてはConnect to Broker,イベントとしてはConnection Lost, Connection Re-Established, Message Arrived。これらの機能が必要なのであれば,この二者の中ではClient一択

PublisherはTaskerプラグインとしての機能しかない。一方,Clientは単独でMQTTクライアントアプリとして動作することもできる。

なお,AutomateからこれらTaskerプラグインを使う際,Automate内の変数をプラグイン内で参照する際には,Taskerの流儀に従って変数名の前に “%” をつける必要があるのに注意。その他Taskerプラグインによるアクションの成否に関して注意すべき変数(主に%errと%errmsgか)は “Tasker: Variables” 参照。 “Plug-in action ⋅ Automate ⋅ LlamaLab” によればこれらの値はAutomateからは “%” を落としたerr, errmsgでアクセスできるように読める。

Termux環境下のコマンドを起動

Termux:Taskerリポジトリ)を使ってTaskerからTermuxのスクリプトが起動できる。TermuxのMosquittoパッケージ中にはmosquitto_pubコマンドがあるし,Eclipse PahoのPythonクライアントなんかも候補になろう。

直接伝搬法

直接伝搬法に使えるアプリは以下。

問題

今のところ間接伝搬法のTaskerプラグインを使う方法と直接伝搬法を自宅でテストしただけだが,Broadcast, Client, Publisherの順で安定に動作する印象(Windows上のMQTT Explorerで取得した下のグラフ参照)。特にBroadcastはほぼ接続が切れないように思える(ただし取りこぼしがゼロではない)。自宅内で移動するだけでも,Amazfit Band 5とペアになっているスマホはwifiローミングで接続する先のAPが切り替わるのだが,それでClient, Publisherとも一旦は接続が切れてしまうのかもしれない(とはいえ,Publisherはアクション起動ごとにコネクションを張り直すと思われるので(…そうとも限らない?)影響を受けなくてもおかしくないようにも思える)。数分~10分程度?でこれらも再度動作するようではあるが。Clientであれば接続状態を明示的にコントロールできるので改善は可能と思われる。

 

XiaomiのRedmi Note 10 Pro, Mi 11 Lite 5G, Redmi Note 10 JEのカメラ性能比較

Xiaomi Redmi Note 10 Pro

Xiaomi Redmi Note 10 Pro

Xiaomiはどんどん新スマホ機種を日本市場に投入していてついていけない。とはいえ,Xiaomi Redmi Note 10 Proは既に購入してしまっているし,後続機種との違い(特にカメラ性能において)が気になったので少し調べてみた。記事としてはあまり完成していない。

結論としてはRedmi Note 10 JERAM 4GBでそれだけで無視してよし。Mi 11 LiteとRedmi Note 10 Proは甲乙づけ難いが,若干安いことだしRedmi Note 10 Proを購入したことは少なくとも明らかに損な選択ではなかった,ぐらいは言えそうだ。

価格.com – Xiaomi Redmi Note 10 Pro レビュー評価・評判
価格.com – Xiaomi Mi 11 Lite 5G レビュー評価・評判

Mi 11 LiteはRedmi Note 10 Proに比べ,手に取ると軽い・薄いというのが強く感じられる。一部の日本人の好む防水・おサイフも押さえており,これらは明らかにメリットだが,聞きかじる情報では慌てて作ったのか作りこみが甘いという印象。ディスプレイに当たり外れがあるというのは広く報じられているし,一部ゲームで画面がかくついたり,発熱が激しくてビデオ撮影が強制終了されたり,電池持ちがイマイチだったり,せっかくのおサイフの使い勝手が悪いという評判を聞くと,カメラ云々以前に少なくとも現時点では避けるのが正解のように思われる。

さらにウリのおサイフケータイ機能についても, “「タッチ決済」が使えない? シャオミ製スマホの不思議な仕様 – ケータイ Watch” では,FeliCaとNFCの二者択一しかできず併用ができないとしている。どちらも現状使っていない自分としては関係ないといえばないが,そういう機能が必要な人には結構大きな問題になるんだろう。

とはいえカメラ性能の差は気になるので, “Xiaomi Redmi Note 10 ProのカメラはMi 11 Lite 5Gをフルボッコ出来るか検証してみた” なんかを見ると,全般的にMi 11 Lite 5Gも悪くないがRedmi Note 10 Proの方がややよい,という感じか。 “Mi 11 Lite 5G レビュー!サイズ・性能・カメラをRedmi Note 10 Proと比較 | シンスペース” は少しMi 11 Lite 5Gの方を好むバイアスがかかっている気が。ただ,Mi Lite 5Gのデジタルズーム性能が高いことは最初の記事でも指摘されていることで実際そうなのだろう。Redmi Note 10 Proではデジタルズームするのではなく,ウリの高解像度で撮影してその後必要部分を切り出す方がよさそう。後,夜景撮影もMi Lite 5Gの方が得意そう

ただ, “Redmi Note 10 Proのカメラ画質に大満足してる人はGCamを使って欲しい!AF性能向上で更に化けます。” にあるように,GCamを使うという手がある。どうなるのだろう。

Mi 11 Lite 全部入りコスパ最強スマホ?Redmi Note 10 Proとサイズ、ディスプレイ、性能、カメラの画質、電池持ちを比較・レビュー – YouTube

カメラ性能をさておくとしてMi 11 Lite 5Gのメリット:

うちにあるwifiアクセスポイントでWi-Fi 6に対応しているものは一台もない。⇨ その後購入したドコモの固定回線置き換え用ホームルータHome 5G HR0111axに対応している。ただしクライアントとして対応しているものは今だに1台もなく宝の持ち腐れ。

Redmi Note 10 Proのメリット:

  • トリプルスロット
  • 3.5mmオーディオジャックあり,それを利用したFMラジオ機能あり(Mi 11 Lite 5Gにはない
  • ほぼ素のグローバルモデルなので遊びやすい
  • 若干安い
  • 電池容量が大きい

シャオミ、FeliCa搭載の5Gスマホ「Redmi Note 10 JE」を発表――auとUQ mobileから発売 – ケータイ Watch
Redmi Note 10 JE RAM 4GBでは意味がない? “Redmi Note 10 JEのスペック・対応バンドまとめ – ガルマックスDSDVではないドコモ・ソフトバンク対応が不十分かも

シャオミに聞いた、初の日本専用モデル「Redmi Note 10 JE」の本気度(佐野正弘) – Engadget 日本版

Termux環境にMQTTブローカを導入

Mosquittoロゴ(mosquitto.orgより)

Mosquittoロゴ(mosquitto.orgより)

Android TV準拠ストリーミング・メディア・プレーヤAmigo 7xJPTermux環境を導入してある。これにMQTTブローカをインストールする。Eclipse MosquittoがAptパッケージとして用意されているのでインストールは簡単。SSHトンネルでLAN内のAmigo 7xJPに外部からアクセスできるようになっているので,これを利用してMQTTブローカが外部からアクセスできるようにする。

以前はなかったようだが,MQTTブローカアプリは今は存在する。比較してないが,そちらの方が楽だったかも?

デフォルトではローカルモードで起動し,ネットワークでのアクセスは不可。ネットワークモードで動作するときのデフォルトポートは1883

Mosquittoは他の同様なコマンドなら読みそうな起動時設定ファイルを読まない

Termux版Mosquittoに関して最大にひっかかったのは,mosquitto.conf ファイル(Termux版だと/data/data/com.termux/files/usr/etc/mosquitto/下)をデフォルトでは自動で読み込まないこと。-c オプションで明示的に指定し読み込ませる必要がある。-c オプションで指定しない場合,既存の/data/data/com.termux/files/usr/etc/mosquitto/mosquitto.confファイルを読む…と思ってしまうがそうではなく,単純にデフォルト値を使用するとのこと。TermuxのGithubで-c オプションを指定しない場合そのmosquitto.confファイルを読み込まないのはバグだとレポートしたが,それは上流での仕様であるとされた。通常期待される挙動ではなく大変紛らわしい。

Mosquittoのマニュアルと読むと以下のように書いてある

(-cオプションについて)If not given, then the broker will listen on port 1883 bound to the loopback interface, and the default values as described in mosquitto.conf(5) are used.

“…the default values as described in mosquitto.conf(5) are used.” は文意が明瞭ではなく,パッと見「mosquitto.confファイルに記述されたデフォルト値が使用される」の意にとれてしまうが,「マニュアル mosquitto.conf(5)に説明のあるデフォルト値」のつもりだった,ということのよう。

さらに, ~/.mosquitto ディレクトリ下に,mosquitto.conf, mosquitto.conf~, mosquitto-passwdの3つのファイルを発見した。TermuxのMosquittoのパッケージに含まれていて,インストールされたのかと思いきや,少なくとも最新の版ではそれはない。もちろんここのmosquitto.confが自動で読み込まれるわけでもない。自分がそのようなこれらファイルを作成した覚えはないのだが…。謎。

また,インストールされたMosquittoのバージョンは2.0.11だが, “Migrating from 1.x to 2.0 | Eclipse Mosquitto” にあるように,Mosquittoが1.xから2.0にバージョンアップした際,それまでデフォルトではネットワーク上のどこからも読み書きできるようだったのがそうでなくなったため,バージョン1.xを前提に書かれた資料の内容の一部は2.xにはそのまま当てはまらないので注意

公式レファレンス

ユーザ設定

3ユーザ

そもそもなぜMQTTサーバかというと, “一人暮らしの老人の見守りに対するアプローチ” に書いたようなことを実現するプロジェクトの一環。なので以下の3つのユーザを用意することにした。

  • 自分用 — 全てのトピック($SYS以下含め)の読み書き可
  • 読み書き用 — ある特定のトピック(specific_topic)以下の読み書きが可
  • 読み専用 — ある特定のトピック(specific_topic)以下の読みのみ可

自分用は管理者としてできることが全てできるように。上記のspecific_topicはこのご高齢者に関することだけを切り分けるために導入するもので,それ以下のトピックに対して読み書きができるアカウント,読むだけのアカウントの2種類を用意する。

パスワードファイル作成

Authentication methods | Eclipse Mosquitto” にいろいろなユーザ認証の方法が記載されているが,古典的なパスワードファイルを利用することにする。

パスワードファイル作成にはmosquitto_passwdコマンドを使用するが, “[Bug]: mosquitto_passwd Fails Because It Cannot Create A Temporary File · Issue #7357 · termux/termux-packages” に報告したような問題にぶち当たった。つまりユーザ名,パスワードを引数に与えると指定したパスワードファイルにエントリを追加する -b オプション,ハッシュされてない生パスワードを含めたパスワードファイルのパスワード部分だけハッシュされたものに置き換える -U オプション(既にパスワードがハッシュされたものを含んでいる場合それは再度ハッシュされてしまいそのアカウントは使えなくなる)では一時ファイルの作成に失敗するようで,”Error: Unable to open temporary file. Permission denied.” というエラーを吐く。

ところがユーザごとにパスワードファイルを作成する -c オプションは成功する。なのでユーザ3人ごとに別々のパスワードファイルを作成し,最後にそれを連結して全体のパスワードファイルを生成。

ACLファイル作成

mosquitto.conf man page | Eclipse Mosquitto” にACLファイルの記述のしかたのが記載されている。それを参照に現在以下のようにしている:

# for everybody else
topic deny #
#
user yasuro
topic readwrite #
topic read $SYS/#
#
user read-only-user
topic read specific-topic/#
#
user read-write-user
topic readwrite specific-topic/#

ユーザyasuroには$SYS以下のトピックを含め全てのトピックが閲覧できるようにしたかったが,topic readwrite #だけでは不十分なようで,topic read $SYS/#を追加する必要があった。

SSHトンネルを介した接続

基本的なユーザ認証が用意できたのでSSHトンネルを介してアクセスできるように。

残りの設定

Persistenceやtimeoutの配慮,logging。

その他

per_listener_settingsでリスナーごとの設定をすること

Quick Guide to The Mosquitto.conf File With Examples

Mosquitto Username and Password Authentication -Configuration and Testing

Understanding and Configuring Logging – Mosquitto Broker Configuration

SSHトンネルでLAN内のAndroid TVに外部からアクセス

Inside of A Colorful Tunnelいずれは他人様のお宅に設置される予定のAndroid TV準拠ストリーミング・メディア・プレーヤAmigo 7xJPを外部からアクセスできるようにする必要がある。eo光をご使用中なので,eo光多機能ルーター eo-RT100下のLAN内に設置されることになる。既にTeamViewerを介して画面共有・操作できるようにし不便ながらも遠隔で文字入力できるようにしてあるが,これはいわば最終手段。

すっかり忘れていたが,ほぼ6年前にeo-RT100について少し調べていた。まだ現役とは…。もっとも10ギガ対応のeo-RT150(N) / eo-RT200(N)も今は用意されているようだが。

SSHアクセスだけについては,eo-RT100のポートマッピング機能で特定ポートからAmigo 7xJPで走るsshdのポート(8022)に転送することも考えてあり,それができるためにTermuxからBashスクリプトでダイナミックDNSレコードを自動的に更新するように設定した。残りは現地に赴いて作業する必要がある。現時点ではルータの設定を遠隔に変更するすべがないので。

しかしSSHアクセスだけでは不十分で,Amigo 7xJPにおいてTermuxでインストールした,MQTTブローカやNode-Redのサービスにも外部からアクセスできるようになることが必要。それはSSHトンネリングで実現することにする。ちなみに,私ももちろんアクセスする予定だが,他人様が(私が設定した)自身のスマホでアクセスすることも前提。

基本的な考え方は,インターネット上に自分がいじれるSSHサーバがあればそれを利用してトンネルが張れる,ということ。Node-REDで遊ぶためにOracleの無料VPSサービスを既にセットアップしてあり,そこにSshdもインストールしてあるのでこれを利用する。以下簡単のためこれを「SSHサーバ」と呼ぶことにする。

クライアント上でのsshコマンド

How to Use SSH Tunneling to Access Restricted Servers and Browse Securely,” “SSH/OpenSSH/PortForwarding – Community Help Wiki” などに説明がある3種のSSHのトンネリングのうち,Remote Port Forwardingのケース(Dynamic Port Forwardingはよくわかってない)。で,今の例に即して言うと,基本的にはAmigo 7xJP上で

ssh -R <SSHサーバのポート>:localhost:<localhostのポート> <ユーザ名>@<SSHサーバ>

とするだけ。正確に言うと,<SSHサーバのポート>とはこのトンネルで使用する,SSHサーバが走るホストのポート。<localhostのポート>も同様で,今トンネルで接続しようとしている,localhostで走るサービスで使用しているポート。

-R オプションは必要なだけ単一のsshコマンドに追加できる…と思うのだが未確認。-L オプションではできる。

また,ルータの設定画面自身を遠隔でアクセスできるようにしたいが,そのためには以下の-Rオプションを上と同じsshコマンドに追加すればよいはず。

-R <SSHサーバのポート>:<ルータのアドレス>:<ルータのWeb UIポート(たぶん80)>

SSHサーバーの走るホスト側の設定

SSHサーバの設定

SSHサーバ(この場合OracleのVPS)側の設定も必要。 “A Guide to SSH Port Forwarding/Tunnelling – Boolean World,” “SSH/OpenSSH/Configuring – Community Help Wiki” などを参照。

/etc/ssh/sshd_conf 中で,コメントアウトされていた以下を有効化。

AllowTcpForwarding yes

以下はコメントアウトされていた上に値がnoになっていたと思うがこれもyesにした上で有効化。

GatewayPorts yes

SSHトンネリングに使うアカウントの作成と設定

linux – How to restrict an SSH user to only allow SSH-tunneling? – Unix & Linux Stack Exchange” によると上だけではセキュリティーの観点からは不十分でSSHトンネリングに使う専用アカウントを作成ししかるべく設定したほうがいいようだ。

sudo useradd sshtunnel -m -d /home/sshtunnel -s /bin/true

でsshtunnelユーザを作成しSSHトンネリングはこれを使う。シェルとして/bin/trueを指定するのは意味のあるシェルが起動できないようにするため。が, /etc/passwd 見てみると /usr/sbin/nologin が指定されているアカウントが多くある。こちらの方がより目的が明示的かもしれない。

この場合クライアントからsshを起動する際は -N オプションを付けてそもそもシェルを起動しようとしないようにする必要がある。/bin/trueが起動するとすぐ終了してしまう。さらに -f オプションでバックグラウンド実行

Amigo 7xJPからSSHサーバの走るホストで,トンネリングのために新規作成したユーザでのSSHでのログインがパスワードレスでできるように

このsshtunnelユーザのアカウントでSSHでリモートからログインできるようにするには “Adding Users on an Instance” を参照する。VPSにはもう初期設定したマシンからしかSSHログインできないようになっておりパスワードによるログインはできないので,Amigo 7xJPからパスワードレスでログインできるために必要な公開鍵は,一旦ubuntuユーザとして受け取ってsshtunnelユーザのために設定してやることになる。

ポートのマッピング関係

Registered/user portsは1024–49151なのでこの中から選ぶ。

  • ルータのWeb UI IPアドレス: 80? ⇦ XXXX0
  • ssh 8022 ⇦ XXXX1
  • MQTT 1883 ⇦ XXXX2
  • Node-RED 1880 ⇦ XXXX3

SSHサーバが走るホストのポートで接続を受け付けるようにする

ここで引っかかった。 “Free Tier: Install Apache and PHP on an Ubuntu Instance” にあるように,3. Enable Internet Access でingressルールを,4. Set up Apache and PHPでiptablesを編集する,の2つの双方ともしなければならない,というのが引っかかりやすいところかと。どちらもポートはレンジ指定が可。Iptables であれば --dport port_beginning:port_end のフォーマット。Iptablesの操作にしくじったら, “How To List and Delete Iptables Firewall Rules | DigitalOcean” を参照して修正。

Oracle Cloudが永遠に無料らしいので開発環境を作ってみたかった (ネットワーク編) – Qiita” に丁寧な説明があるんだがそれすらよくわかってない。

ちなみに,HTTP用ポート80が開いてるのはいけないのじゃないかと思ったが,Igress Rulesで “HTTP port for HTTPS cert” というコメントが付いているし,HTTPSの通信に入る前に証明書の送受信するのにHTTPが使われてるってことか。また,iptables でポート10000を指定してみると webmin と表示されるので不審に思ったが,Webminデフォルトポートが10000だからのようだ。

タイムアウト等でトンネルが壊れてしまうことの対策

SSHサーバのセッションのタイムアウト設定はトンネルにも適用されるようで,一定時間後トンネルを介した接続は何の反応もしなくなってしまった。/etc/ssh/sshd_configでClientAliveCountMaxの値を0に設定することでタイムアウトしないようにした。この判断が特にこの後導入したautosshの使用を前提にしたときに正解なのかはよくわからない。

Oracle CloudのVPSで基本SSHサーバは常時起動しているはずであるが,稀有な偶然でたまたま起動していないときに,クライアント側でSSHトンネルを作成しようとしても失敗する。現時点では自動的にリトライを試みるなどのしかけは用意していないので,一度失敗すれば失敗したきり。その場合にはAmigo 7xJPを再起動するのが簡単な解決策になる。

しかし “linux – How to reliably keep an SSH tunnel open? – Super User” でautosshREADME.txt; マニュアル)を知った。幸いにしてTermuxでもaptパッケージとして用意されているので簡単にインストールして利用できる。

AutosshのREADME.txtでは-Mオプションについて以下の記載がある。

-M 0 will turn the monitoring off, and autossh will only restart ssh on ssh exit.

For example, if you are using a recent version of OpenSSH, you may wish to explore using the ServerAliveInterval and ServerAliveCountMax options to have the SSH client exit if it finds itself no longer connected to the server. In many ways this may be a better solution than the monitoring port.

デフォルトでautosshは-Mオプションで指定されたポートとそれより1大きい数字のポートを利用してサーバとメッセージのやり取りをして接続状態をモニターする。しかし上の記載にあるようにsshクライアント自身の同様な目的の機能を使うほうがよさそうだ。”SSH tunnelling for fun and profit: Autossh” にも同じ趣旨の記述がある。上で見たようにOracle CloudのVPSでは通信用ポートを開けるのは手間であるし。

デフォルトではServerAliveCountIntervalの値は0になっていて,この機能は無効化されているので, /etc/ssh/ssh_config でこの値を15に変更する(Termuxでのディレクトリは正確には /data/data/com.termux/files/usr/etc/ssh )。ServerAliveCountMaxはデフォルトで3だそうなので,sshクライアントは45秒サーバと更新できなければ自分で落ちるはず。

Termuxのssh_configはもともと1行しかなく,上記を追加すると以下の内容になる(ServerAliveCountMaxの値も念のため設定)。

SendEnv LANG
# Yasuro -- the following 2 lines
ServerAliveInterval 15
ServerAliveCountMax 3

Autosshはsshコマンドのオプションもそのまま受け入れる。 “SSH tunnelling for fun and profit: Autossh” で使われているsshコマンドの-TオプションはDisable pseudo-terminal allocationするらしいのでこれも取り入れる。

以上をやってもSSHトンネル経由でリモートからAmigo 7xJPにsshログインした後,暫く経つと固まってしまう。何かしらキーを叩くと1分後ぐらいにsshは終了する。しかしプロセスリストを見るとその前のログイン時に起動されたとおぼわしき sshd, bash プロセスが残っていて(以下のような),いつまでもそれが終了されない。固まる前にいわば自主的に exit したような場合はこの問題は起こらない。

u0_a87    7954  0.0  0.2  10828  4676 ?        Ss    1970   0:00 /data/data/com.termux/files/usr/bin/sshd -R
u0_a87    7955  0.0  0.1   9652  3656 pts/0    Ss+   1970   0:00 /data/data/com.termux/files/usr/bin/bash -l

現時点でこの問題は解消していない。

Windows上でのSSHに使う鍵管理

SSH/OpenSSH/Keys – Community Help Wiki,” “SSH公開鍵認証で接続するまで – Qiita” にLinux環境での標準的な鍵管理が出ている。Windowsでは工夫が必要。ssh-copy-idは用意されてないし,SSHに使うキーを保存する標準的場所(ディレクトリ,フォルダ)が決まっているわけではないので,秘密鍵ファイルへのパスをを常に明示的にsshのコマンドラインオプシンとして与えなければならないのは不便。

なぜNgrokが使えないと判断したか

実はSSHトンネリングなど全く知らなかった。Termuxのwiki中の “Bypassing NAT – Termux Wiki” でNgrokというサービスを知った。それがLAN内のサービスを外部からアクセスできるようにするのに使用できるので好都合。無料プランでは「1つのオンラインNgrokプロセス(まで)」という制約があるが,この1つのプロセスで複数のトンネルが作成できる

無料でNgrokを使う場合セッションは最大8時間という制限があるとか,いやアカウントを作成していれば無料アカウントでもその制限は外れる,などの記載を見たが,真偽は確認していない。しかし,それよりももっと問題なのは以下(斜体は筆者による):

On the free plan, ngrok’s URLs are randomly generated and temporary. If you want to use the same URL every time, you need to upgrade to a paid plan so that you can use the subdomain option for a stable URL with HTTP or TLS tunnels and the remote-addr option for a stable address with TCP tunnels.

他人様がそのスマホからAmigo 7xJPをアクセスすることも前提にしているため,URLが変わってしまうのでは事実上使い物にならない。

Roll your own ngrok in 15 minutes” を読んで,実はインターネット上に自分がいじれるSSHサーバがあればSSHトンネリングを自分で実現できるとわかってそれが基本方針となった。その場合URLが変わるとかいった問題は起こらない。一説ではNgrokの元になったLocaltunnel ~ Expose yourself to the worldが現在のところ完全無料だが,外部からのアクセスのためのURLは毎回変わるので自分の用途には適さない。ちなみに,Ngrokと似たような機能を提供するGoによる実装を紹介する “Building your own Ngrok in 130 lines – DEV Community” の作者は自分が出発点となるアイディアを考え実装したと主張している。

以下Ngrokで行くことを前提に調査していたときのもの。未整理。HTTP上のトンネリングだけサポートしていると誤解していたときに書いたものもあるので注意。


Accessing localhost from Anywhere – SitePoint

How to install Ngrok in Termux best method in 2021 – Technical Sayan

MQTT Clientアプリはwebsocketを利用した通信にも対応している。Mi 体組成計2のデータをMQTTブローカにあげるのに使用を検討しているOpenScale SyncMQTT 3.1(5.xではなく)にしか対応しておらず,websocketにも対応していない。ただ,この通信は自宅LAN内でしか起こらないはずなので,ブローカのIPアドレスなりホスト名なりが固定でアクセスできる限り,素のMQTTの通信さえできれば用は足りる。

SSHであればWeb-based SSH – Wikipedia GitHub – shellinabox/shellinabox: Official-ish Fork of Shell In A Box はTermuxでインストールできる。

SSH接続をWebブラウザの純粋なHTTP上で実現する – nwtgck / Ryo Ota

Ngrok – secure introspectable tunnels to localhost Windows, MacOS, Linux用のバイナリが用意されている

Ngrokの公式クライアントはオープンソースではないのでTermuxは使用を推奨していないが,それを利用するレシピーは見当たる。

termux install ngrok – Google Search

ngrok – npm

@667/ngrok-dns – npm

node-red-contrib-ngrok (node) – Node-RED

Getting Started with Ngrok in Node-RED » Developer Content from Vonage ♥

local環境のNode-REDにngrokが頼もしすぎる – Qiita

Remote-RED for Node-RED Tutorial 1 – Remote Access – YouTube” は興味深いが,Node-REDに特化した解で,しかも遠隔に見えるのはダッシュボードのみ。

TermuxからBashスクリプトでダイナミックDNSレコードを自動的に更新

いずれは他人様のお宅に設置される予定のAndroid TV準拠ストリーミング・メディア・プレーヤAmigo 7xJPを外部からアクセスできるよう,ダイナミックDNSサービスを利用する。特にTermuxでインストールした,SSHやNode-Redのサービスにアクセスすることを想定。このお宅のLANルータに付与されるIPアドレスをダイナミックDNSサービスに反映させるのに既存Bashスクリプトを利用することにしたが予想外に手間がかかった。

なお,別途TeamViewerを介して画面共有・操作できるようにし不便ながらも遠隔に文字入力できるようにしてあるがそちらはあくまでバックアップ手段。

ポートマッピング機能を利用すること前提で外部からルータにアクセスできるようダイナミックDNSサービスを利用する。深い意味はないがNo-IPを利用することにする(My No-IP)。IPアドレスを更新するクライアントが必要で,その機能を有するAndroidアプリは当然あると思った。実際あるのだが評価は概ね悪い。古くて最近のAndroidではエラーを起こす,手動でボタンを押さないと更新動作が起こらない…などなど。

No-IPは公式のLinuxクライントを用意しているが自分でコンパイルする必要がある。Termuxがデフォルトで対応しているリポジトリにLLVMは含まれているし,Its-Pointlessというコミュティ・リポジトリを利用するようにするとそこにGCCも含まれていることがわかっている。なのでコンパイルは可能だろうが,おそらく今後ともめったに使わないであろうツールチェインを一式インストールするのは無駄な気がするし,theonemule/no-ip: A shell script that works as Dynamic Update Client (DUC) for noip.comのREADMEでは,このツールの作者がその公式Linuxクライアントをどうしても正常動作させられなかった,としている。

この作者は代わりに使えるBashスクリプトを作成してくれているのでこれをありがたく使わせてもらう。 “Integrate with No-IP DDNS – API Information” にNo-IPのDNSレコードをHTTPのGETで外部から更新するAPIが説明してある。その部分を実現するのがスクリプト中の以下。

RESULT=$(wget -qO- $AUTHHEADER $USERAGENT $NOIPURL)

まずは変数を引用してないがために問題が起きていたので引用。加えてデバッグのため暫定的にqオプションを外す。

RESULT=$(wget -O- “$AUTHHEADER” “$USERAGENT” “$NOIPURL”)

しかしこれでは以下のエラーが起こる。

Resolving dynupdate.no-ip.com… 158.247.7.204
Connecting to dynupdate.no-ip.com|158.247.7.204|:443… connected.
HTTP request sent, awaiting response… 400 Bad Request
2021-08-13 22:46:11 ERROR 400: Bad Request.

“Bad Request” とだけ言われてもなぁ,とふと認証のためのヘッダを落としてみた。

RESULT=$(wget -O- “$USERAGENT” $NOIPURL)

そうすると以下のように通ってしまった!”Unauthorized” といわれつつ!それでええんかい!?

Resolving dynupdate.no-ip.com… 158.247.7.204
Connecting to dynupdate.no-ip.com|158.247.7.204|:443… connected.
HTTP request sent, awaiting response… 401 Unauthorized
Authentication selected: Basic realm=”No-IP DNS Update API”
Reusing existing connection to dynupdate.no-ip.com:443.
HTTP request sent, awaiting response… 200 OK
Length: unspecified [text/plain]
Saving to: ‘STDOUT’

– [ <=> ] 20 –.-KB/s in 0s

2021-08-13 22:55:42 (324 KB/s) – written to stdout [20]

さて,今ヘッダ情報で認証をするかのように書いたが, “Integrate with No-IP DDNS – API Information” にあるように実はURLそのものにユーザ名,パスワードとも埋め込む形をとっており(すぐ下に具体的に),認証自身はそれでできるはずだ(URLが平文で流れるのは大変望ましくないが…)。さて,この文書には以下のように書かれている(斜体は私)。

Authorization: base64-encoded-auth-string should be the base64 encoding of username:password.

username:password: Username and password associated with the hostnames that are to be updated. No-IP uses an email address as the username.

スクリプトの実装ではユーザ名は電子メールアドレスではないものを使用している。仮にアカウントに結びついた電子メールに変えてみると,おそらくは “@” の扱いでwgetが処理できなくなる。 “@” は電子メールに含まれる上に,以下のようにURLの中にも現れるからだ。

http://username:password@dynupdate.no-ip.com/nic/update?hostname=mytest.example.com&myip=192.0.2.25

URLのユーザ名は電子メールではないIDの文字列で,Base64処理の対象は電子メールが期待されているのか…などとは思ったがとりあえず動いているようなので深追いしない。

なお,ログファイルは以下のような感じ:

Fri Aug 13 22:39:28 JST 2021 --  nochg xx.xx.xx.xx
Fri Aug 13 22:45:51 JST 2021 --
Fri Aug 13 22:46:11 JST 2021 --
Fri Aug 13 22:55:42 JST 2021 --  good xx.xx.xx.xx
Fri Aug 13 23:05:44 JST 2021 --  nochg xx.xx.xx.xx

“–” の右にあるのはwgetコマンドの返り値のはず。もし返り値に応じてどこかに通知を出すようなことをしたければ,① “nochg xx.xx.xx.xx” の場合,② “good xx.xx.xx.xx” の場合,③ “” の場合,の3つのケースに対応すればよい。⇐ 30日ごとにドメインネーム「契約」を更新しなくてはならないのだが,それを怠っていると,④ “nohost” となることがわかった。

theonemule/no-ip: A shell script that works as Dynamic Update Client (DUC) for noip.comではCronを使った定期実行なども考えられているが,単純にno-ip.shの定期実行オプションを利用することにした(10分間隔)。

How do I Crontab on Termux.. : termux” にTermuxでのCronの使い方が。Termux:APIは termux-job-scheduler というスクリプトを含んでいて,これはAndroidのネイティブなジョブスケジューラを利用するものだとどこかで読んだんだがソースが見つからない。Termuxのwikiにも現時点で説明がなく,とりあえずヘルプを末尾に掲載しておく。

現在の ~/.termux/boot/start-servers.sh の内容は以下の通り:

#!/data/data/com.termux/files/usr/bin/sh
node-red --node-args="--max-old-space-size=128"
/data/data/com.termux/files/home/bin/no-ip.sh \
      -c=/data/data/com.termux/files/home/.no-ip/no-ip.conf &
sshd

Termuxはシングルユーザ環境で,標準的なUnixパスが利用できるわけでもないので(”Differences from Linux – Termux Wiki“),自分が直接手を入れたものは全てホームディレクトリ以下に置くことにした。その方がバックアップの面でもわかりやすいだろう。 Termuxは間違いなく便利なんだが,ちゃんとしたLinuxとはいろいろな点で違うので,それを常時意識せねばならず少し煩わしい。PRoot – Termux Wikiを利用すればより本格的なLinux体験ができるようだが,現時点ではそれがペイするかどうかわからない。

なお,Cronを利用しなかったのは,おそらくそのために期待されている方法はTermux-Servicesを介して利用することなのだが,それをブート時自動起動させる必要があり,いろいろヤヤコシクなりそうだったから。


Termux-job-schedulerのヘルプ:

~ $ termux-job-scheduler -h
Usage: termux-job-scheduler [options]
Schedule a script to run at specified intervals.
  -p/--pending               list pending jobs and exit
  --cancel-all               cancel all pending jobs and exit
  --cancel                   cancel given job-id and exit
Options for scheduling:
  -s/--script path           path to the script to be called
  --job-id int               job id (will overwrite any previous job with the same id)
  --period-ms int            schedule job approximately every period-ms milliseconds (default 0 mean
s once).
                             Note that since Android N, the minimum period is 900,000ms (15 minutes)
.
  --network text             run only when this type of network available (default any): any|unmeter
ed|cellular|not_roaming|none
  --battery-not-low boolean  run only when battery is not low, default true (at least Android O)
  --storage-not-low boolean  run only when storage is not low, default false (at least Android O)
  --charging boolean         run only when charging, default false
  --persisted boolean        should the job survive reboots, default false
  --trigger-content-uri text (at least Android N)
  --trigger-content-flag int default 1, (at least Android N)

TeamViewerを介してアクセスしたAndroid TVでの文字入力

Android TV準拠ストリーミング・メディア・プレーヤAmigo 7xJPTeamViewerを介して画面共有・操作できるようにした。Amigo 7xJPと遠隔操作元のPCが同じLAN内にあるときにもこれは地味に有用だが,Amigo 7xJPが地理的に離れた別のLAN内にあるときにこれは決定的に有用。

さて,Amigo 7xJPにはTermuxもインストールしてある。SSHで直接アクセスできるようにはするつもりだが,TeamViewerを介してAmigo 7xJPにアクセスした際にも,Termuxを操作できるようにしておけば保険になる。

しかし,TeamViewerではPCでの押し下げされるキーのコードをAndroid TVに直接送ることはできない。TeamViewer自身の制限なんだろうと思っている。加えて,Amigo 7xJPのデフォルトのAndroid TV用Gboardでは十字キーリモコンでの操作に特化しているため, TeamViewerからマウスによる操作は一切できない。つまりデフォルトではTeamViewerを介して遠隔にAndroid TVに文字入力をする手段がない

だとすると解決策は,普通のスマホ・タブレット用のキーボードアプリをインストールしてやってそれを利用すればいい。自分はAndroidスマホではGboardを使っているが,Android TVにスマホ/タブレット用GboardをインストールしようとしてAndroid TV用Gboardが上書きされてしまうことが過去にあった。それはまずいので,無料で信頼できそうなものとしてMicrosoft Swiftkeyを選択。現在Swiftkeyは日本語はサポートしていないが特に日本語入力は必要にならないだろう。上図では仮想キーボードの高さを調整して低くしている。デフォルトのままだと画面のほとんどを埋めてしまうので。

…と一旦は思ったが,Termuxの入力には記号等が多用されるであろうと, “[REQUEST] best keyboard app for doing coding on android : androidapps” を参照してMultiling O Keyboard + emojiをインストール(ウェブサイト)。加えて以下のプラグインもインストール。

カスタマイゼーションが山ほどできる玄人好みな感じがひしひしと伝わってくる(下図)。後者のプラグインで日本語入力もできるようになるのはよいが,そもそもこういう形態でTermuxにアクセスすることはほとんどないわけだから,CodeBoard Keyboard for Codingのようなもっとシンプルなものの方が結局よいかもしれない。Swiftkeyは結局アンインストール。

いずれにせよPC上でキーボードでタイプする文字がそのままTermuxに送られるわけではなく,マウスで1文字ずつポツポツ仮想キーボード上の文字を拾うことになる。手間がかかるが,入力手段が全くないのに比べれば断然よい。また,用が済んだら,本来の使用者のためにGboardにデフォルトキーボードを戻しておく必要がある

キーボード切り替えアプリもインストールしてはみたが,Android TVではそのアプリにパッとアクセスできないし,それでは普通に設定メニューで切り替えるのと手間は変わらないので不要と判断しアンインストール。

スマートウォッチを首さげ見守りケータイとして流用

追記(2021年9月): まだ記事にできてないが,ここで検討したものを購入してみたところ大失敗だった ⇦ 中途半端だが記事にした。ここでは命を左右する事態に使うことを想定しているのだから,ケチらずちゃんとしたものを使うのがやはりよいのかもしれない。それでもApple Watchは高いのでそれを選ぶことは考えにくいが, “au、Apple Watchの「ナンバーシェア」を48カ月無料に – ITmedia Mobile” でもしPovo2.0と組み合わせることができるのなら,検討してもいいかもしれない。


首さげも可能な見守りケータイとして流用できそうなスマートウォッチにはどういうものがあるか,という話。もともとは “突然体の自由が思うようにきかなくなったときに助けを呼べるには” の一部だった。その後いろいろ調査を進めて内容を拡充したので独立させる。

今年80歳でお一人暮らしの高齢者の方を守れるようにするのが目的。単に携帯電話を持っている,というだけでは不十分であることは上記記事に説明したのでご参照あれ。もちろん外出時にも大事なことだが,夜中に一人で人通りのないところに行ったりするのでもなければ,問題が起きた際周りの人が助けてくれることが期待できる。なので特に自宅で一人でいらっしゃる場合に対処できることを重視したい。

上記記事中では携帯電話を身に着けてもらえない場合に,せめて小型・軽量のBLEボタンを携帯してもらうようなことも考察したが,その後の調査・実験でその路線では,特に電波の到達の面でなかなか思うようにいかないということがもうわかっている。自宅だけでよければBLE電波を送受信できwifiとブリッジできる機器を複数台配置することでなのでその方向で問題は克服できるが,外出時と自宅にいるときと別々の方法になるのは望ましくない。もちろん外出先全てにブリッジを事前に設置するようなことはできるわけがなく,携帯電話に頼るしかない。なのでこの記事ではケータイを身に着けていただくという前提で,どういうものが使えるかを考える。

候補となりうるケータイ

通常使用用のHuawei Nova Lite 3を常時携帯してもらえればそれでこの問題解決なんだが,ご本人によると重すぎる(カバー等を除き本体のみで160g)とのこと。確かにそうであろう。だとすると,何か他の携帯電話を用意しないといけない。できれば首さげができるような軽さが欲しい。男性であればポケットに突っ込んどけば,となるが,ご婦人はポケットのない衣類をおめしになることもあり,やはり首さげが確実。

MNOがみまもりケータイの類を出しているが,ソフトバンクのみまもりケータイ4で101g。Nova Lite 3に比べると軽量ではあるが画期的には軽くない。紐を引っ張ってSOS発信できるという手軽さは頼もしいが…。それよりも,見るからに子供向けのみまもりケータイを首さげするのはさすがに心理的抵抗があるだろう。

Niche_Phone-S+は52gということで劇的に軽い。 “ケータイオタクが「NichePhone-S 4G」のニッチな利用法を考えてみる – Engadget 日本版” で紹介しているような社員証入れのようなケースに入れるのであれば首さげの抵抗も少ないだろう。対応通信バンドに限りがあるので,基本ドコモ・ソフトバンク回線でないと使えないようだ。スピードダイアル機能があるのはよいが,GPS機能がないのでは外出時の見守りが達成できない

スマートウォッチの流用

もう一つ考えられる手が通話機能のあるスマートウォッチを利用すること。とはいえ通話機能のあるスマートウォッチは重くかさばるので,これまた着用してもらえない可能性がある。そうはいっても,通常のケータイ/スマホに比べれば軽いので,バンドを外しペンダント状にしたら着用してもらえる可能性がある。そのためにはバンドが取り外せるようになっているものでなければならない

さらに子供用のものがよい。SOS発信専用のボタンが用意されてたりするからだ。 “子供用スマートウォッチおすすめ8選!電話・GPSなど人気機能別に紹介 | テックキャンプ ブログ” にいくつか紹介がある。子供用のものでないものでも,肝心なときにSOS発信ができるよう,しっかりとした物理ボタンを持っているものである必要がある。

こういった製品はえてして対応通信バンドが限られていることが多いので,そこに注意が必要。以下にあるような海外製品だと4Gではバンド1, 3, 8には対応していることからすると,ソフトバンク回線の使用が無難だと思われる( “日本の全キャリアの4G周波数帯まとめ【楽天モバイル追加】 | telektlist” )。他のキャリアのプラチナバンドには対応していないため。VoLTE対応は怪しい。アマゾンのレビューでNuroモバイルお試しプラン0.2GB(データ通信専用で330円/月)で十分,という人がいた。自分はやはり音声通話を重視したいが, “なるたけ安価に携帯電話番号維持” にはソフトバンク回線のものはない。3GB/月で990円/月のLINEMOのミニプランか。今LINEMOでたモンキャンペーン「5分以内の国内通話が無料になる通話オプション「通話準定額」(税込550円/月)がLINEMO契約から1年後まで無料」が利用できるし,10,000円相当あげちゃうキャンペーンもやっている。ミニプランはあげちゃうキャンペーンの対象外なので,一旦2,728円/月のスマホプランで契約し,翌々月にPaypayボーナスが付与されるなりその翌月からミニプランにすればよい。スマートウォッチを使ったVoIP通話の品質を確かめて,十分であればデータ通信のみでもよかろう。

また,Bluetooth機能が省かれているものも多いようなのでそれも注意。4G対応のものは通常wifiにも対応(エントリーモデルだと5GHzには対応していない)。また,ある程度以上のモデルでないとmicroSDカードには対応していない。それが必要になるかどうかは別の問題だが。さらに,Bluetooth対応といっても,BLEには対応していない可能性が高い。

さらに自分が見た範囲のスマートウォッチの中身は結局全てAndroid端末だった(Wear OSではない)。安価なものはバージョンが4.4でこれはこころもとない。アプリをインストールできたとしても,最近のアプリは最低対応Androidバージョンが6.0とかであったりするので4.4だと結局Androidならではのことはできない可能性がある。

以下4G対応を前提にAliExpressでぱらぱら見た範囲で目についたもの。なお,カメラ解像度の説明で “30W” という謎な表記が見られるが, “What does 30W pixel in a camera mean? – Quora” によると 0.3 megapixel, つまり30万画素ということ。

最低レベル: Android 4.4, RAM 512MB + ROM 4GB,Bluetooth非対応

このレベルとその次のレベルぐらいは主に子供用であり,そのため基本性能は低いが安価であり,かつ物理ボタンが比較的しっかりしているところがよい。このクラスはAndroid 4.4を搭載し,RAM 512GB+ROM 4GBという構成がスタンダード。

このクラスのスマートウォッチの使用記が “ASCII.jp:子供向けだがAndroid搭載 中国製スマートウォッチにいろんなアプリを入れてみた (1/2)“。

LT21 4G Kids Smart Watch GPS tracker Children Clock Waterproof Video Call Remote listening GPS LBS WIFI positioning kids Watches ー ~$40 USD。強調していないが実はAndroid機。4.4だがRAM:512MB; ROM:4GBでそもそも大したことは期待できないしGoogle Play Storeもおおかた用意されてないだろう。製造元による情報。 “LT21 4G Smart Watch Kids GPS WIFI Video Call SOS Waterproof Child Smartwatch Camera Monitor Tracker – YouTube” 参照。日本語UIも設定できるもよう。Bluetoothには対応していない。問い合わせしたら80gほどでサードパーティアプリのインストールはできないとのこと。

  • 3G Network:WCDMA B1/2/5/8
  • 4G Network:FDD-LTE:B1/2/3/4/5/7/8/12(or17)/20/28A

LT05 4G Kids Smart Watch GPS tracker Children Waterproof Video Call Remote listening GPS LBS WIFI positioning kids smart clock LT05 ー ~$40 USD。上と同じ製造元によるもの。Bluetooth機能あり,としているがアマゾンで売られているものについても製造元の情報にもそういう記載はないのでガセだろう。上の記事の中で紹介しているQISHUO 多機能 4G スマートウォッチ 子供向け キッズウォッチ 通話 ビデオチャット 位置確認 GPS 歩数計 防水 ピンクと同型と思われる(値段は倍以上だが…)ので日本でのレビューが参考になる(使用できるキャリアなどについて)。 “LT05 4g kids smart watch review – YouTube” 参照。このビデオを見ると日本語もUI言語として選べることがわかる ⇐ アマゾンのQ&Aでは出品者がそうではないと言っている。 レビューには「1点残念なことがチャットは親から日本語で送れますが子供からは日本語で送れないことです。しかしこちらを購入してよかったと思います」とも。 “Gamma Yun Tech 4G Kids Smart Watch – YouTube” もおそらくこのモデルについての紹介ビデオ。カメラ性能を重視するなら同じ製造元のLT09がよさそうLT05, LT09ともBluetoothには対応していない

  • 3G Network:WCDMA B1/2/5/8
  • 4G Network:FDD-LTE:B1/2/3/4/5/7/8/12(or17)/20/28A


4G Kids Smart Watch GPS LBS WIFI Location Remote Monitoring Video Call for Android IOS Fashion Children Tracker Smart Clock DF55
$50 USD弱。512MB+4GB。質問をしたセラーのお勧め。理由は “Diliberto DF55 4G kids GPS watch with vibrating Line App video call – YouTube” にあるように本体がバンドから取り外せるから。ハードウェアボタンがしっかりあるのはいいが特に大きくもない。microUSBケーブルで充電できるのは地味にポイントか。明記されてないがおおかたAndroidなんだろうが,アプリを自分でインストールしたりできることは期待できない。上記ビデオを見るとLineアプリがプリインストールされていることがわかるが,LineはOSごとに同一アカウントで使える機器は1つだけなのであまりうれしくないか。おそらくこれも同型(~$45 USD)。

  • 3G: WCDMA :B1
  • 4G: TDD-LTE :B38 B39 B40 B41
    FDD-LTE :B1 B2 B3 B5 B7 B8


4G Kids Smart GPS Video Call Wifi Camera Location Trace Fence Heart Rate Sport Monitor Smartwatch For Children Baby Girl Watch
ー ~$50 USD。512MB+4GB。確証はないがおそらくこれもAndroid 4.4機。このリスト中唯一の丸形ディスプレイ搭載で,個人的にはかっこいと思う。

  • 3G: WCDMA B1/2/5/8
  • 4G: FDD-LTE: B1 B2 B3 B4 B5 B7 B8 B12(17) B20 B28A (Or B1 B3 B5 B7 B8 B38 B39 B40 B41)

最低レベルのひとつ上: 最低レベルにBluetoothのサポートが追加

IPX7 Waterproof Smart 4G Remote Camera GPS WI-FI Kids Children Students Smartwatch SOS Video Call Monitor Tracker Location Watch ー ~$45 USDAndroid 6.0 ⇐ セラーに問い合わせて実はAndroid 4.1 (?) であること,RAM 512MB + ROM 4GBであることを認めた。Play Storeには言及がなくおそらく不対応。Bluetooth機能あり(上の2機種にない特徴)。同じものと思われるものが,Greentiger 4G Network A36E Wifi GPS SOS Smart Watch Kids Video call IP67 waterproof Alarm Clock Camera Baby Watch VS Q50 Q90として出品されているので($40 USD強),型番としてはA36Eか。RAM 512MB, ROM 4G。日本語UIはないもよう。購入者のレビューを見ると,ストラップのスペアがついてきた,とかあるのでストラップを外すことができるということなんだろう。また,Bluetoothでのアプリのサイドロードに触れているのもあるのでできそうだ。 “A36E kids smart watch 4g video call phone watch with GPS wifi location – YouTube” が紹介ビデオ(ちなみに他人が作成したビデオをパクったものと思われる)。

ただ,Android 4.4であるかのような記述もあり,6.0であるかははなはだ怪しいROM増強版だとする “A36E Plus“($60 USD弱)で問い合わせるとRAM 512MB+ROM 6GB,やはりAndroidは4.4.4とのこと。これはWhatsappアプリがプリインストールされていることもウリのようで, “How to update WhatsApp version on A36E kids watch – YouTube” にBluetoothでAPKファイルを送信してWhatsappアプリをアップデートする様が記録されている。ただKitKatだと最近のアプリは動かせない可能性が大。

  • 3G: WCDMA :B1(2100MHz) ⇐最初のリスティングでは。GreentingerのはB1,B2,B5,B8.
  • 4G:TDD-LTE :B38 B39 B40 B41
    FDD-LTE:B1(2100MHz)/B3(1800MHz)/B7(2600MHz)/B8(900MHz)

Y95 4G Children Smart Watch GPS Tracker Waterproof HD Video Call SIM Cards Wifi LBS Location SOS Watch Kids Smart Phone PK A36E ー ~$32 USD。上のA36Eと似通ったスペックだと思われるがフラッシュライトがない。 “💎Kids Smart Watch Y95 Blue and Pink Waterproof With 4G GPS WIFI Camera and Video Call Tracker #TOP – YouTube,” “Diliberto Y95 4G kids smart watch – YouTube,” “Updated Y95 kids smart watch with Line – YouTube” 参照。

  • 3G: WCDMA:Band 1\2\5\8.
  • 4G: FDD-LTE:Band 1\3\5\7\8.
    TDD-LTE:Band38\39\40\41(100M)

上記クラスまでのデバイス用コンパニオンアプリ

一般的にこれらスマートウォッチのスマホ側コンパニオンアプリはSeTrackerとされていることが多いようだが,代替アプリがいくつかあるようだ。その中のFind My Kids: Child Cell Phone Location Tracker解説を読むとSeTrackerを使うことが想定されているスマートウォッチとはFind My Kidsも使えるらしい

記憶領域拡充,Android 6.0のものも

このクラスからは子供用ではなく大人用という扱いになる。そのためGPS追跡やSOSコールなどの機能は自分で実現する必要がある。中身は一般的Android端末なので自由度は高いのだが自分でそういった手配をする必要があるというのは手間といえば手間。

Smart 4G GPS WiFi Kid Adult Student Tracer Locator APP Store Heart Rate Monitor Camera WhatsApp Bluetooth Android Phone Watch ー RAM 1GB + ROM 8GBの場合で $60 USD弱。上のに比べてしっかりとした物理ボタンがある。バンドはソフトバンクに対応している。Google Play Store対応,BLEにも対応が明記されている。バンド交換が可能なことも明記。Android 4.4なのが激しく惜しい。

Smart 4G GPS Tracker Location Student Elder Wristwatch Whatsapp Video Call Heart Rate Blood Pressure Monitor Android Phone Watch$70 USD。この直後のAndroid 9.0の搭載のクラスより高いのは納得行かないが,それらよりしっかりした物理ボタンがありそうだ。Android 6.0でRAM 1GB-ROM 8GB。Bluetoothには対応するもよう。日本語UIには非対応。

  • 3G: WCDMA :B1(2100MHz)
  • 4G:TDD-LTE :B38 B39 B40 B41
    FDD-LTE:B1(2100MHz)/B3(1800MHz)/B7(2600MHz)/B8(900MHz)

Smart 4G GPS WI-FI Trace Location Adult Student Wristwatch Video Call Heart Rate Blood Pressure Monitor Android Camera SOS Watch ー ~$60 USD(RAM 1GB+ROM 16GBの場合)。これはmicroSDカードには対応していない物理ボタンは,このクラスの下の2機種に比べてしっかりしている模様Google Play Store対応,日本語UI対応BLE含めBluetooth 4.2対応24mm幅の標準ストラップを使用し,付け替え自由と明記

  • 3G: WCDMA :B1(2100MHz)
  • 4G:TDD-LTE :B38 B39 B40 B41
    FDD-LTE:B1(2100MHz)/B3(1800MHz)/B7(2600MHz)/B8(900MHz)

これを結局買ったが,セラーに問い合わせたらAndroid 9.0搭載,といってたのに実際は6.0.1。RAM 1GB/ROM 16GBのを注文したはずだが,実際はRAM 1GB/ROM 8GB。これはサードパーティー製アプリが示す数値だが,「設定」メニューで見るとRAM 2GB/ROM 16GBとハッタリ表示するしかけまでご丁寧に用意してある。

Android 9.0

Smart 4G Remote Camera GPS WI-FI Kid Student Google Play Smartwatch Video Call Monitor Tracker Location Bluetooth Phone Watch ー ~$50 USD。Androidのバージョンに言及ないが,すぐ下のリスティングにこの製品も合わせて含まれており,そこではAndroid 9.0とされている。Play Storeに対応していることを明確に述べている。唯一の物理ボタンである電源ボタンが小さくて押しにくそうなのが不安microSDカードも使用可。

  • 3G:WCDMA :B1(2100MHz),B8(900MHz)
  • 4G:TDD-LTE :B38 B39 B40 B41
    FDD-LTE:B1(2100MHz)/B3(1800MHz)/B7(2600MHz)/B8(900MHz)

Android 9.0 RAM 1GB ROM 8GB Smart 4G GPS Kid Student Music Camera Wristwatch SOS Monitor Trace Location Google Play Phone Watch ー 竜頭のあるバージョンが ~$60 USD。Android 9.0。RAM 1GB+ROM 8GB。Play Store対応。竜頭というUIが緊急時に扱い良いのかどうかが不安。ダブルカメラで1つが前面を向いているのが,もし披見守り者が首さげをしているのなら,非常事態に彼女に何が見えているのか外部から知るのに役に立つのかもしれない。microSDカードも使用可。

  • 3G: WCDMA :B1(2100MHz)
  • 4G:TDD-LTE :B38 B39 B40 B41
    FDD-LTE:B1(2100MHz)/B3(1800MHz)/B7(2600MHz)/B8(900MHz)

結局どれを選択?

Android機としてちゃんと活用できるようにするか,それは諦めて安価なものにするかで迷ったが,結局前者の考えでAndroid 9.0の項の最初のを選択。Android 9.0搭載のものでより安いものもあったが,物理キーがしっかりしてそうだったのであえてこれを選択。microSDカードは使えないことも考えて,ROMは16GBのものにした。8GBで足りるかもしれないがmicroSDカードを後で追加できないので。

また,BLEが使えるというのもポイント高い。BLEが使えれば,スマートウォッチにiTag BLEトラッカーを非常ボタンとして流用するというようなことも可能になってくる。

Android機としては使えたらもうけもの,程度の割り切りをするのならA36Eを選んでいたろう。

レスポンスのまともなAliExpressセラー

AliExpressでは,必要な情報が商品説明に正確に与えられることはなく,しかたなくセラーに問い合わせてもまともな返事が来る方が珍しいという常識的にはありえない世界。ただ,そんな混沌とした世界ででも,問い合わせに対して比較的まともなレスポンスを返してくるセラーはいて,可能であればそういったセラーから購入するのがベストなのは言うまでもない。以下はその例:

AliExpress Shipping Fee Discrepancy

I’ve realized something very odd: the very same item on my shopping cart on AliExpress produces different shipping fees on PC and on mobile.

Let’s take the this item for example. The seller offers free shipping when you choose Cainiao Super Economy Global as your carrier. I choose that carrier to get free shipping and add it to my shopping cart.

When I try to purchase it on the Chrome browser on Windows, this is what I get.

The carrier is automatically changed to AliExpress Standard Shipping and I cannot change it back to Cainiao Super Economy Global. And I get charged for shipping.

When I try to purchase it on the AliExpress mobile app, I get free shipping.

Why is this? I guess I can just make my purchases on the mobile app, but it is cumbersome. I’d much rather do it on my PC.