OpenWrtにSleekXMPPをインストール

Finding An XMPP/Jabber Client or Library That Can Be Used in Scripts“で自分の要件に合致するXMPP/JabberのライブラリはSleekXMPPぐらいしかない、ということがわかったので、OpenWrtルーターにインストールしてみることにした。

ちなみに、SleekXMPPはPythonライブラリであるが、自分にはPythonの知識・経験がないに等しい。

Pipなるシステムを利用してあっさりインストールできるようなのだが、そのPipのインストールからはじめなければならない。”Installation — pip 1.5.6 documentation“を参照。

既にちょっと記憶が曖昧なのだが、以下の問題にぶち当たって、そこにある解決方法で回避した…ように思う。”Does curl have a –no-check-certificate option like wget? – Unix & Linux Stack Exchange

$ echo insecure >> ~/.curlrc

ところがインストールの最中に落ちてしまう。”#12629 (“opkg list” prints “Killed” after “opkg update”) – OpenWrt“にあるように、噂には聞いていたOOM killerが発動してしまった模様。

USBメモリでswapを追加してなんとか乗り切った。

パッケージlibpyexpatもOpenWrtのopkgで別途インストールしなくてはならなかったように思う。

広告

Androidアプリからの通知を自分好みにカスタマイズする

Androidアプリからの通知を自分好みにカスタマイズしたい。通知方法は基本的にアプリに任されていて、アプリ内でカスタマイズができるようになっていることがあるが、全てのアプリでそうなっているわけではないし、用意されているカスタマイズ方法が自分のニーズにマッチしていないことがある。

具体的に想定しているのはSMS受信。これを画面がロックされている状態でも、はっきりポップアップ・ウィンドウで内容まで表示して欲しい。

その手のアプリはいろいろあるが、「画面がロックされている状態でも通知」という条件を満たすものがなかなかない。Popup Notifier Freeはその要件を満たす。アクセシビリティ・サービスを利用して動作するので、SMS以外の一般アプリにも対応できる。何か他のことにも利用できるかも。

ただ、例えばSMS受信であれば、特定の送信者のものだけをポップアップ通知する、といった細かい指定はできない。同じ著者によるPopup Notifier (有償版)NotifierPro(二者の関係はわからない)でもそれはできない模様。

Taskerでもアクセシビリティ・サービスから通知を受けることができるようだから、例えば特定の発信者からのメッセージ/SMSのみポップアップさせたいのなら、頑張れば実現できるだろう。想定しているSMSの内容は、電話番号なのだが、どうせTaskerを使うのであれば、単にそれをそのまま表示するのではなく、住所録を引いてマッチがあれば、その番号の持ち主の名前も合わせて表示することもできるであろう。

ただ、画面がロックされている状態でもできるのかはわからない。ただ、以下のビデオを見る限り可能なようだ。Androidのバージョンによってはできない、というのもどこかで読んだが、自分のメイン端末のAndroidのバージョンはICSで、Jelly BeanでもKitKatでもLollipopでもないので、その問題はないと期待したい。

EZCastの設置を試みた

例によってこの記事は三ヶ月以上前に書きかけてたままになっていたもの。そのため内容は最新ではないのでご注意を。

ちなみに、内容的にこの記事の前編となる”EZCastが届いた“は、コンスタントにこのブログで最も読まれている記事となっている。EZCastって密かに人気があるのかしら。


Micro USB延長ケーブルを使った配線

Micro USB延長ケーブルを使った配線

EZCastというChromecastもどきに興味を持って、注文してみた。自宅でテストしてみた後、本来想定していた設置場所に行って設置してみた。

が、液晶テレビがあまりに大きいため、付属のUSBケーブルでは直接USB ACアダプタとEZCastデバイスを繋げられない。そこで、たまたま立ち寄ったセリアという百均ショップで売っていた「micro USB延長ケーブル」を間に挟んでみた。

写真にあるようにパッケージには全くそのようなことは書かれていないが、これは充電用のようだ。短い充電ケーブルを長く使いやすく Micro USB 延長ケーブル (長さ約1m)と同じもののよう。データ通信には対応していないため、EZCastは動作しなかった。EZCastデバイスに付属の二股USBケーブルはwifiアンテナも兼ねているため、これら間にはデータ通信ができる必要がある。

Micro USB延長ケーブルパッケージ(表)

Micro USB延長ケーブルパッケージ(表)

Micro USB延長ケーブルパッケージ(裏)

Micro USB延長ケーブルパッケージ(裏)

仕切り直しで改めて対応策を考えたが、(データ通信に対応している)micro USBの延長ケーブルを使う、あるいは、HDMI延長ケーブルを使う、の二通りの方法が考えられる。

EZCastデバイス本体が結構熱を持つので、本来はHDMIケーブルを使ってEZCastデバイスは液晶テレビ筐体の外にでるようにして冷却に配慮するほうが正解だろう(後継モデルでは筐体に排熱孔がつけられた)。だが、一般人にとってはそういう性能上の配慮より、見目の方が大事だったりする。

EZCastにmicro USB延長ケーブルを挿してみる

EZCastにmicro USB延長ケーブルを挿してみる

なので、カモン 【(COMON)製】USB2.0(MicroB)延長ケーブル(オス←→メス)/黒/1m【MBE-10】を購入し、これを利用することにした。右の写真はTVの背面カバーを外した状態を示す。激しくわかりづらいと思うが、黄色の線に沿ってあるのがmicro USB延長ケーブル。それに繋がって下に垂れているのが、EZCastデバイスに付属の二股USBケーブル。一端は台の上にある個別スイッチ付きUSBハブに繋がっており、もう一端のwifiアンテナはだらんとぶら下がっている(赤線で囲ってある)。青矢印の先にあるのは、本題とは関係ないが、TVの音声を離れたBluetoothスピーカーに飛ばすためのBluetooth送信機。

EZCastが届いた」の初出時、「ただ、それでもwifiのAPを替えなければならない、というのはいただけない」と書いていたが、これは自分の誤解で、iOSデバイスとAirPlayを介して利用する際には、最初のセットアップ時以外直接iOSデバイスからEZCastにwifi接続する必要はない。それぞれがルーターにwifi接続し、ルーターを介して間接的に接続する形態で利用できる。

iOS上のGoogle謹製YouTubeアプリでは以前はAirPlay機能を利用してEZCastデバイスで動画を表示できたのだが、なぜか今はできない。”Bad URI request”のようなエラーがEZCast側では表示される。

考えられる理由はEZCastのファームウェア・アップグレードか、YouTubeアプリのアップデートによる非互換性の発生。前者については、後で入手した多数のEZCastデバイスにインストールされていた古いファームウェア(ただし最初の1台でうまくいったときのバージョンと同じかどうかは不明)でも同じ症状が出ることで原因とは考えにくい。一方、サードパーティーによるYouTube閲覧アプリ、例えばTubePlayerというアプリ、では、自分がテストできる範囲でのEZCastのファームウェアのバージョンに関係なく、問題なくAirPlay再生が可能であることから、Google謹製YouTubeアプリのアップデートによる非互換性の発生が原因と思われる。ただ、EZCastのフォーラムでも同じ症状を訴えていると思われる人達がいるのだが、これがYouTubeアプリの最新のアップデートより古い時点の話もあるようなので、そこは理解できない。同じように見える別の問題かもしれない。いずれにせよフォーラムでこの問題を報告しておいた。早く解決が図られることを望みたい。

設定画面が出ている状態ではAirPlayやDLNAの通信は全く受け付けない模様。

AndroidのEZCastアプリでは、何の設定もせずにEZCastデバイスに接続できてしまう。これはつまりSSIDから何らかの計算式でそのwifiパスワードを得ることができる、ということを示しているように思う。パスワードをEZCastデバイス側で変更できたように思うのだが、確信がない。

AirPlayで複数デバイスから同じEZCastデバイスにメディア再生を指示した場合、最初のリクエストだけが通り、後のものは無視されるか、ブロックされる模様。


↑を書いたのはかなり前なので、その後のファームウェア、アプリの更新によって仕様や機能が変わっていることにご注意を。

Finding An XMPP/Jabber Client or Library That Can Be Used in Scripts

I have been trying to find a command-line XMPP/Jabber client for the Linux platform that can be called from scripts. More specifically, I want to run it on OpenWrt, which poses a unique challenge; unless its pre-compiled binary is provided from its repository, it is hard to build it on your own because you will have to cross-compile it on a Linux box.

My primary objective is to use it so I can exchange information with my OpenWrt router by way of Google Hangouts. One requirement is that it support embedded images. This seems to mean in the XMPP world that the extension “XEP-0231: Bits of Binary” is supported.

I know Xmpp client written in bash / ash (openwrt). It’s only dependency is ncat (or similar) for the actual ssl connection doesn’t support XEP-0231, but I gave it a shot anyway. I thought even if it doesn’t support XEP-0231, I could get away with a simple approach described in “How can I send an image on the web in an XMPP (Jabber) message?

The system simply didn’t work on my OpenWrt router, unfortunately. I did not bother trying to investigate why it was not working, because it does not support XEP-0231 anyway.

Matthew Wild publishes his projects related to Lua and XMPP, which include the Verse XMPP library for Lua and the Riddim Verse-based bot framework. Verse unfortunately does not support XEP-0231. Perhaps you could implement it relatively easily, but I have no idea at this point.

SleekXMPP Python XMPP library is the only package that I found that supports XEP-0231. “Supported XEPs” says otherwise, but I confirmed that it is included in the stable 1.3.1 version. I have also found a sample code to send an image in a chat message with SleekXMPP. Installing SleekXMPP on my OpenWrt router was a lot of work, though.

Hangups is a very young Python library to access Google Hangouts.

By the way, I run Asterisk with its XMPP/Jabber support enabled. If there was an XMPP/Jabber equivalent of the SMSq command, I would have used it, but no such luck. You could access your Asterisk instance using its AMI or AGI interfaces and have it take care of your XMPP/Jabber needs. But I decided against it because working with the AMI or AGI interfaces seemed like an overkill; plus Asterisk would not be able to handle embedded images.