2018年8月11日土曜日

DNSブロックスクリプトをルーターに入れてみた。

前回WT3020Hに新しいPadavanファームウェアを書き込んだので、wgetでhttpsが使えるようになったのをいいことにDNSブロック用のadblock scriptを入れてみた。広告関連のDNSをブロックするだけでも結構な悪質な広告が消えてくので便利。
curlで構成されているスクリプトが多いんだけど、Padavanファームウェアはwgetしか使えなかったのでwget用に少し書き換えてみた。
##Online Check##
for i in `seq 0 5`
do
nslookup google.com
result=$?
  if [ $result -eq 0 ]; then
    logger "Online"
    sleep 20
    online=1
    break
  else
    logger "Offline"
    online=0
fi
sleep 5
done
if [ $online -eq 0 ]; then
  exit
fi

##Adblock##
if test -s /tmp/hosts0
then
        rm /tmp/hosts0
fi
(wget -O -  https://winhelp2002.mvps.org/hosts.txt |
    sed '2,/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
wget -O -  https://280blocker.net/files/280blocker_domain_202406.txt |
    sed 's/^/127.0.0.1 /g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
wget -O -  https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardMobileAds.txt |
    sed 's/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
wget -O -  https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt |
    sed 's/^/127.0.0.1 /g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
wget -O -  https://warui.intaa.net/adhosts/hosts.txt |
    sed 's/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
echo 127.0.0.1 duckdns.org ) | tr ' ' '\t' |
    tr -s '\t' | tr -d '\015' | sed '/^$/d' | sort -u >/tmp/hosts0
sed '/vortex.data.microsoft.com/d' /tmp/hosts0 -i
sed '/imasdk.googleapis.com/d' /tmp/hosts0 -i
grep addn-hosts=/tmp/hosts0 /etc/dnsmasq.conf ||
    echo addn-hosts=/tmp/hosts0 >>/etc/dnsmasq.conf
killall dnsmasq
/usr/sbin/dnsmasq --addn-hosts=/tmp/hosts0

これをCustomizationの中のScriptsでRun After Router Started:の下に追記すればOK。

2018年8月5日日曜日

WT3020H用にPadavan firmwareをビルドしてみた

久しぶりにWT3020を持ち出したんだけど、Padavanファームウェアが古くてwgetがopensslがなくてhttpsが使えなかったり、OpenVPNクライアントは2.3.11止まりなのでDD-WRTのほうで"--compat-mode 2.3.11"してやらないと繋がらなかったり、SMBv1しか対応していなかったりなので、少し新しめのPadavanファームウェアをビルドしてみた。
OpenWrtを入れても良かったんだけどやっぱり手軽に設定変更できるPadavanファームウェアは便利かも。

prometheus-padavan
これを使用してビルドすると環境構築まで自動っでやってくれるらしい。とりあえずOracle VirtualBoxをインストールして、Ubuntu 16.04 LTS i386を仮想PCにインストール。
sudo apt-get install autoconf automake autopoint bison build-essential flex gawk gettext git gperf libtool pkg-config zlib1g-dev libgmp3-dev libmpc-dev libmpfr-dev texinfo python-docutils cmake libncursesw5-dev libtool-bin help2man
必要なパッケージをインストールして、prometheusを準備。
mkdir prometheus-padavan
cd prometheus-padavan
wget -O start.sh http://prometheus.freize.net/script/start-99.sh
chmod +x start.sh
./start.sh
起動したらNEXXを選んで、WT3020Hを選択する。なんかxxd関連でエラーが出ていたけどエンターで行けた。
そんでもってビルド環境を構築して(10分ちょいかかった)、ファームウェアをビルドするだけ。
とりあえずデフォルトでWT3020H用のPadavanファームウェアをビルドしてみた。
GUIとかいれるアプリケーションとかもカスタマイズできそう。容量に応じてだけど。

ファームウェアをビルドしたらtrxファイルができたので、もうすでにPadavanファームウェア化しているWT3020HのAdministrationの中のFirmware Upgradeからtrx今回ビルドしたtrxファイルを流し込めば完成。このtrxファイルをそのままmtd3に書き込んでも良さそう。
ファームウェアアップデートが終わったら設定もそのまま起動した。

とりあえずデフォルト設定でビルドしてみて動くことが確認できたので、すこしいじってみることに。
prometheusでChange build configから必要なパッケージをオン・オフできるんだけど、それ以外にもEdit config in a notepadを選ぶと手動でパッケージを切り替えられるっぽい。
CONFIG_FIRMWARE_INCLUDE_LANG_RU=y
CONFIG_FIRMWARE_INCLUDE_SMBD=y
をコメントアウトして、
CONFIG_FIRMWARE_INCLUDE_SMBD36=y
のコメントアウトを外してみた。

設定変更してもう一回ビルドするときはクイックビルドするかどうか聞かれるけどエラーが出るのでnで通常ビルドした方が良いかも。
これでsmbdが3.6.25になって、USBマスストレージデバイス共有機能でSMBv2が使えるようになる。あとロシア語は使わないので容量削減といったところ。
とりあえずこのバージョンでwgetでhttpsも使えるようになったし、OpenVPNも2.5.2になってDD-WRTといい感じに繋げられるような設定が使えるようになったし。

USBの機能としても結構便利になっているようで、USBモデムとかUSB over Ethernetとかも使えるっぽい。USB速度低下問題の対策は必要かもしれないけど。
NDISにも対応してるので有線LANに対応していないPocket WiFiをUSBで接続してUSB modemを有効にしてRNDISを選べばポケットWiFiをWANとして設定できる。

日本語化も"/trunk/user/www/dict"の中身を見る限り、ベースのファームウェアとかmerlinファームウェアの日本語ファイルをベースにして作れそう。機能追加とかで容量が足りなくなってもまた16MB化すればいいし。(ファームウェア側も16MB用に変更する必要があるけど。)

ポータブルルーターとして結構最強じゃないかな?

2018年7月28日土曜日

USB Type-C対応のSATA変換基板買ってみた

USB3.0からSATAに変換するアダプタとしてJMicronのJMS567のドングルを使っていたんだけれども、光学ドライブが使えないので試しにVIAのVL716搭載の基板を買ってみた。
Type-A→Type-C変換ケーブルもついてきた
これでeBayで680円ぐらいだった。
何かの2.5インチHDDケース用基板なのかな?基板にはHD2510-1C-V3.0というシルクが入っているぐらいでよくわからない。
商品説明にはUSB3.0と書いてあったけど、VL716なのでUSB3.1まで対応してそう。

早速余ってるSSDを使って速度を測定してみていたところ、結構落ちる
よくみてみると実験に使っていたIntel SSD 320は1Aっぽいので電力不足っぽい?

ということで急遽別給電ケーブルを作成。
このVL716搭載基板はSATAと電源が一体になってしまっているので延長ケーブルをベースに給電ケーブルを作成する。
電源ラインをぶった切ってSATA電源単体の端子とつなぐだけ。今回はSATA電源→FDD用電源変換ケーブルをぶった切って使用した。
あとはこいつに12VのACアダプタからSATA電源に変換するアダプタ(自作)を使用して給電する。このアダプタは内蔵したDC-DCコンバータで12Vから5Vを作っている。

このSATA電源別給電ケーブルを使うことにより5V給電オンリーだったVL716基板でも12Vを使用する3.5インチドライブも使用可能に!

とりあえず動作確認ついでにJMS567と速度比較をしてみた。
Z170内蔵のIntelのUSB3.0コントローラを使用してテスト
VL716のほうはJMS567よりシーケンシャルリードが少し遅いけど、それ以外は軒並み高速っぽい。ちなみにどちらもUASP。

せっかくUSB3.1対応してるんだからと言うことで、ASMediaのUSB3.1ポートに挿してテストしてみた。
ちょっとだけシーケンシャルリードが早くなった気がする?

そして肝心の光学ドライブはJMS567と同様に認識できなかった…
VL716のデータシートにはODDも行けるって書いてあるんだけどなぁ
ASMediaのASM1053とかASM1153はODDファームウェア入れれば対応できるようだし
こいつもファームウェアの問題なのかなぁ
光学ドライブ用に使うならASMediaのASM1153EにODDファームウェア入れるのが手っ取り早そう…



2018年7月1日日曜日

BeagleBone BlueはFPVのカメラとして使えるか?

BeagleBone BlueにとりあえずWebカメラを接続してリアルタイムで映像を送れるのかためしてみた。FPVみたいなことができればいいなと。
WiFi経由で映像を送るとどうしても遅延が気になるので解像度を下げたりしてどの程度遅延が起きるのかも含めて確認してみた。

本当はH264とかで圧縮して遠くに行って帯域が細くなっても通信できればいいかなとか思ったんだけどCPUパワーを食うし遅延も大きくなるかなとか思ったのでまずは簡単なMJPG-Streamerで試してみた。

カメラはLogicoolのC270を使用した。

MJPG-Streamerのインストール。
sudo apt-get install mjpg-streamer

BeagleBone BlueはUSB給電時はUSBポートで電力消費するデバイスが不安定になるので12VのACアダプタも接続しておく。(カメラが再起動を繰り返したりする)
そんでもって
mjpg_streamer -i "input_uvc.so -d /dev/video0 -y  -r 320x240 -f 15" -o "output_http.so -p 8080 -w / usr/share/mjpg-streamer/www"
これでカメラが起動できる。
USBで接続してる場合はPCからhttp://192.168.7.2:8080に接続してStreamをクリックするとリアルタイムの映像が確認できる。

今回は320x240の15FPSで試してみたけど、このぐらいなら結構遅延もなさそう。これ以上になると明らかに遅延している…

とりあえず320x240の15FPSでの遅延を簡易的に測定してみた。
画面にストップウォッチとMJPG-Streamerを横並びに移して、その画面にカメラを向けてスクリーンショットを取る手法で遅延を測った。


この解像度だと遅延は0.17秒ぐらい。思ったよりだいぶ遅延が少ない。PCとの距離が近いからからもしれないけど。CPUの使用率は20%ぐらいだった。

WiFiで手軽にFPVカメラとして使えそう。
モータドライバとかも付いてるしこのボードだけでFPVラジコン作れそうな気がしてきた。

2018年6月23日土曜日

BeagleBone Blueで2Sのバッテリを使ってみた。

BeagleBone Blueにはバッテリ入力端子がついていて2Sのリチウムイオンバッテリを使用することができる。今回は18650タイプのリチウムイオンバッテリを2セル使ってバランス端子付きのバッテリを作って試してみた。

というわけで7.4Whって書いてあった18650のセルが余っていたのでバランス端子だけがついたBealgeBone Blue専用バッテリを作ってみた。投げ売りのノパソ用バッテリをタブを残した状態で分解したやつなのでタブにはんだ付けで組み立ててダイソーの物干し竿カバーと言う名のでかい熱収縮チューブでパックにした。コネクタは3極のXHコネクタでケーブルはAWG20を使用した。赤と黒で7.4Vバッテリなんだけど、バランス端子なので中間から白いケーブルを出してある。
BeagleBone Blue
BeagleBone Blueにはバランス端子から給電も充電もする仕様なのでこの端子だけついてるバッテリでも大丈夫。18650の2Sな電池パックを買ってきて改造するのもいいかも。

このボード、ACアダプタを繋げば充電できるのも便利。バッテリが無くなったらACアダプタ繋げばいいし、ACアダプタ抜けばバッテリ動作に切り替わる。ノートPCみたいな感じ。
ラズパイ用とかだと結構高級な追加ボードになってしまうからなぁ
ちなみに回路図を見た限りではデフォルトでは1A充電に設定されているようなので今回の2000mAhのバッテリだと充電に2時間ぐらいかかりそう。充電IC的には抵抗を変更することによって2Aまで設定できそう。

バッテリ残量LEDも付いてるんだけど、これはGPIOで実装されているようなのでアプリケーションを動かす必要があるっぽい。バッテリを指して起動すると75%のところが一瞬光るので自動で動いてるもんだと思っていた…

アプリケーションはBeagleBone BlueをWiFiなどでインターネットに繋いだ状態で
sudo apt-get update
sudo apt-get install librobotcontrol
でインストールできる。インストールが完了すると自動でLEDが有効になる。
バッテリ電圧を確認したいときは
sudo /usr/bin/rc_battery_monitor
で確認できる。確認したあとにこのアプリケーションを終了するとLEDが消えてしまうので
sudo systemctl restart rc_battery_monitor.service
で再度LEDだけを表示させることができた。

このLEDはGPIOで制御しているので自作のアプリケーションから制御したりもできそう。バッテリ駆動がデフォルトでついてるSBCなにげに便利。

2018年6月17日日曜日

BeagleBone Blueを買ってみた。

BeagleBone Blueが少し気になったので買ってみた。
BeagleBone
Linuxが動くSBCなのにロボット開発用なので入出力が少し豪華。エンコーダ入力とかモータドライバも内蔵されているっぽい。CPUはAM3358でクロックは1Ghz、メモリはDDR3の512MBを積んでいるっぽい。
BeagleBone Blue
ラズパイとかでもGPIOがついているんだけど、エンコーダ入力とかは外付けのマイコンを使わないとやりにくかったりするし、BeagleBone Blueならこれ一つで完結できるとか。
ArduPilotもサポートしているようでOSが動くながらもドローンに搭載されたりしているらしい。
BeagleBone Blue
ボード上のIOはラズパイのピンヘッダと違ってJSTのSHコネクタが採用されていて、各ペリフェラルごとにコネクタが分かれている。専用オプションとかならとても使いやすそうだけど汎用のセンサ類を繋ぐ場合は変換ケーブルを作らなければいけなさそう。
エンコーダ付きのモータを4つ動かせるようにエンコーダ入力とDCモータドライバ出力が4セットあるのがすごい…。バッテリも2Sのバランス入力対応で充電もできちゃうらしい。
インターフェースもUART、I2C、SPI、CAN-BUSなど結構盛りだくさん。9軸IMUも付いてるし。モータとバッテリさえ用意すればなにか作れそうな勢い。WiFiモジュールも一応技適マーク(201-135370)が付いていたのでRev.A2の基板であれば技適も問題なさそう。
ちなみにフラックスのようにみえるのはコンフォーマルコーティングらしい。てっきりリワークされているのかと思ったけど、DCモータとかLiPoバッテリ回路部分はショートしないようにコーティングされてるみたい。
BBBlue
OSもセットアップ済みらしいので、microUSBでPCに接続すると内蔵のeMMCからOSが起動して、USBデバイスとして認識された。CDC ECMというデバイスのドライバがインストールされなかったけど、USBのネットワークデバイスとして認識するのでputtyとかから192.168.7.2にアクセスしてログオンできる。USBシリアルポートとしても認識するのでTeraTermとかを使ってそちらからアクセスすることもできる。

uname -aをしたらLinux beaglebone 4.4.59-ti-r96だった。こちらの記事を参考にWifiに接続してapt-getでアップデートしておいた。
デフォルトの状態だとラズパイと違って色々アプリケーションが入っていないので(lsusbとかkillallもつかえない…)apt-getで色々入れていかないと。

電源ボタンとか複数のLEDがついていてわかりやすいし結構使いやすいかも。電源ボタンで終了できるのは地味に便利。

Wifiルータに繋いで動かすときにもIPがわからなくなったりするのでとりあえずmDNSをインストールしておいた。
sudo apt-get install avahi-daemon libnss-mdns
これで再起動すればbeaglebone.localで接続できるようになる。

あとはサーボ用の5Vを有効にするにはGPIO80を出力モードに変更してHIGHにする必要があるっぽい。
sudo echo 80 >  /sys/class/gpio/export
sudo echo "out" > /sys/class/gpio/gpio80/direction
sudo echo 1 > /sys/class/gpio/gpio80/value
ACアダプタか、2Sのバッテリからしか給電できないけど、これでDCコンバータが有効になる。ついでにGPS端子とPower Out端子から出ている5VもUSB給電時は出力されない。
詳しくは回路図が公開されているのでそちらを見るとわかるかも。(UARTがどこに繋がってるかも書いてあるし。)

2018年6月2日土曜日

LS-CHLでSMBv2を使う

数ヶ月前にLS-CHLのHDD交換を依頼してきた友人からLinkStationに繋がらなくなったとの報告が。調べてみるとつながらないのはSambaだけで、MacとかだとSambaにも接続できる…
どうやらWindows 10がSMB1.0をデフォルトで無効にしたっぽくてSMB1.0しか対応してないこの世代のLinkStationに繋がらなくなった模様。
例の脆弱性によってSMB1.0を無効にするのが推奨されたりしてるし、これで繋がらなくなってる人結構いるかも?

調べてみると海外のフォーラムでSMB2.0を有効にする方法を公開してる人が居たので参考にして改造してみた。
ちなみに今回使用したLinkStationはLS-CHLv2でファームウェアが現時点での最新のv1.74です。行指定でパッチ当ててるのでそれ以外ではうまく動かない可能性あり。うまく動かないどころかファイルが壊れる可能性があるので注意。

とりあえずファームウェアを解凍して何行目に追記すればよいかを確認した。
公式ファームウェアアップデータの中のhddrootfs.imgは例によって拡張子をzipにしてネットに上がっているパスワードで解凍できる。さらに解凍したファイルをWinRARで覗くとLinkStationのシステム内部と同じようなファイル構成になってるはず。

このバージョンのファームウェアでは/etc/init.d/smb.shを確認した限り58行目に先程のフォーラムで公開してくれているコマンドを挿入すれば良さそうなのでacp_commander.jarを使って書き込んでみた。

本来はTelnetとかSSHを有効化した後にsmb.shファイルを書き換えるのだけれども、今回はTelnetやSSHは不要で単純にSMBv2を有効にしたいだけだったので、acp_commander.jarでsedコマンドで行指定で挿入してみた。なのでファームバージョンが異なる場合は使え無いはず。

acp_commander.jarを動かすためにJavaをインストールしておく。
ファイアーウォールは無効にしておく。
LS-CHLv2のIPを"192.168.11.2"、adminパスワードは"password"とするので、この手順でやってみたい方は自分の環境に読み替えてください。

コマンドプロンプトを起動して、cdでacp_commander.jarがあるところに移動
java -jar acp_commander.jar -t 192.168.11.2 -ip 192.168.11.2 -pw password -s
でうまくLinkStationにつながれば
/root>
となるのでここに
sed -i "58i/bin/sed -i '3i\\    max protocol = SMB2\\' /etc/samba/smb.conf" /etc/init.d/smb.sh
と貼り付けてエンター(一行
OK (ACP_STATE_OK)
となれば完了

あとはLinkStationを再起動すればSMB2.0に対応してるはず。
共通ファームのLS-XHLとかLS-VLとかでも行けるかも?
これで最新のWindows 10からもアクセスできる。