2016年8月17日水曜日

chan_mobile用ファームウェア



GL-MT300NでCHAN_MOBILEを使えるファームウェア
なんかpythonも入ったっぽく容量カツカツで本当にそれにしか使えない

ファーム

不必要なpythonを除いてみた

追加ファイル


pythonを除いたものでも3MBしか残りがないので注意
基本的にルーターの内側で電話の転送だけ行うことを前提にしている

要するに、MVNOに移ったけど前の電話番号にかかってくる電話をbrastelで転送したい
というのを少ないステップで実現できたらいいよねという話
外からレジストさせるとなるとfail2banとか色々ほしくなるので、
raspbx使うなりorange piにそれっぽいの入れるほうが手っ取り早い
一応ipsetは入れてるはずなので
opkg update
opkg install hostip
で、DDNSを逆引きさせれる方法でクライアントを制限するぐらいはできるかな

setup.tarを/tmpにでもコピーして
tar xvf setup.tar
chmod +x setup.sh
./setup.sh

で必要なファイルをコピーしてくれるはず。予め入れておけばいいんだけど面倒なのでw
必要なものは
GL-MT300N
3ドルぐらいのBT4.0ドングル(planexのmicro4とかでもよい)

BTでハンズフリーが使えて
BTタイムアウトにしない設定ができる
携帯電話(たぶん)

○グラティーナ2(運用中)
△ポラロイドpigu (5分くらいで切れる)
○doogee DG110(ごにょごにょできる)
○IDEOS(主にテスト中)
○N-03E

OpenWrt*CLI> mobile show devices
ID              Address           Group Adapter         Connected State      SMS
N03E            38:BF:33:10:XX:XX 2     dlink3          Yes       Free       No
U8150           28:5F:DB:33:XX:XX 2     dlink2          Yes       Free       No

ハブを使ってドングルを2こさせば複数収容も可能
bluetoothctlでホストを切り替えて設定するには

select XX:XX:XX:XX:XX:XX:XX
agent DisplayOnly
default-agent on
scan on
pair XX:XX:XX:XX:XX:XX:XX
trust XX:XX:XX:XX:XX:XX:XX

をすればOK


SIMなしでテストするにはbrastel+標準SIPが便利



JBのMTK6572,6582だとIMEI書き換えは簡単なのでキッズケータイでカケホ契約してゲフンゲフン
登録方法とかは割愛で
EXROOTはなんかかっこ悪いのでなんとかしたかっただけで特にメリットはない(笑)


--ほかの追加機能--

asterisk11-chan-dongle

値段の安い E173に対応するよう手を入れたもの

E173の場合は

portsel=1

を設定すること。

このドングルは音声ポートが違っているようなのでAT^PORTSEL=1をセットしてやらないといけない

https://github.com/gabrielzmt/asterisk-chan-dongle/issues/152

この通りにすると今度は普通のが使えなくなるのでdongle.confの値を使うようにした

他のご一行さま




2016年7月3日日曜日

ATTINY85のi2cスレーブデバイスをOPENWRTにつないでみる



さて、虎の子のGPIOを使ってしまったのでリレーをつなげなくなってしまった。
シリアルポートにarduinoをつなげるという手も考えた・・・っていうか作ったのだけど

i2cのスレーブにarduinoのようなもの をぶら下げるほうがいいと思えた。


tinywireSというライブラリがあるっぽい。
http://qiita.com/mt08/items/46d73c4e1957c1eb55f5


DIGISPARKは持ってないけど、ATTINY85,45なら持っているのでサクッとブートローダーを書いて
適当にサンプルソースを書き換える。


// ATTiny based I2C relay control
// ForkRobotics 2012
//

#include "TinyWireS.h"                  // wrapper class for I2C slave routines

#define I2C_SLAVE_ADDR  0x26            // i2c slave address
#define Relay1_PIN  1
#define Relay2_PIN  4
#define Relay3_PIN  3

void setup() {
  pinMode(Relay1_PIN, OUTPUT);
  pinMode(Relay2_PIN, OUTPUT);
  pinMode(Relay3_PIN, OUTPUT);
  digitalWrite(Relay1_PIN, HIGH); //HIGHでOFFのリレー用
  digitalWrite(Relay2_PIN, HIGH);
  digitalWrite(Relay3_PIN, HIGH);

  TinyWireS.begin(I2C_SLAVE_ADDR);      // init I2C Slave mode
}

void loop() {
  byte byteRcvd = 0;
  if (TinyWireS.available()) {          // got I2C input!
    byteRcvd = TinyWireS.receive();     // get the byte from master
    switch (byteRcvd) {
      case 0x01:
        digitalWrite(Relay1_PIN, LOW);
        break;
      case 0x02:
        digitalWrite(Relay2_PIN, LOW);
        break;

      case 0x03:
        digitalWrite(Relay3_PIN, LOW);
        break;
      case 0x11:
        digitalWrite(Relay1_PIN, HIGH);
        break;

      case 0x12:
        digitalWrite(Relay2_PIN, HIGH);
        break;
      case 0x13:
        digitalWrite(Relay3_PIN, HIGH);
        break;


    }

  }
}

void Switch(int relay) {
  if (digitalRead(relay) == HIGH) {
    digitalWrite(relay, LOW);
  }
  else {
    digitalWrite(relay, HIGH);
  }
}

超絶手抜きだけど気にしない。

#6番ピンON/OFF
#i2cset -y 0 0x26 0x01 0x00 b
#i2cset -y 0 0x26 0x11 0x00 b


ふつうは正論理でいいはずなのだけど、arduino用の5vリレーは大抵負論理なので注意
途中に抵抗を入れてやらなきゃいけなかったりもするしめんどくさい。
ebayに3.3v用のリレーが売ってるのを買ってつなげたほうが手っ取り早い。



OPENWRTにLCDをつなげてみる


GL-MT300Nではほかに供用されていないGPIOでピンが出ているのは

WPSボタン用2番
未使用の44番

これをi2cにして液晶をつなげてみる。

これにはちょっと問題があって、この手のルータは大抵3.3v 

LCDに変換ボードがついているものは大抵5vだ。

ただ、いくつか例外があって、変換ボードを介さないACM1602 ACM802なんてのは3.3v

ちょうど手元にあった スイッチサイエンスの液晶(3.3v版)

を接続してみる。

まずは参考にするページ

https://wiki.openwrt.org/doc/hardware/port.i2c

http://netlog.jpn.org/r271-635/2013/01/raspberry_pi_i2c_lcd.html
配線は
SCL->GPIO 2
SDA-> GPIO 44
VCC->3.3v
GNDー>GND


といたってシンプル

# opkg update
# opkg install kmod-i2c-gpio-custom kmod-i2c-core
# insmod i2c-dev
# insmod i2c-gpio-custom bus0=0,2,44
ところがどっこい、こやつにはi2c-toolsがないので


# wget http://dl.eko.one.pl/chaos_calmer/ramips/packages/i2c-tools_3.1.2-1_ramips_24kec.ipk

# opkg install i2c-tools_3.1.2-1_ramips_24kec.ipk


確認
# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- 26 -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

3eが見えていればOK。

起動時ロードさせるには

# echo "i2c-gpio-custom bus0=0,2,44" > /etc/modules.d/99-i2c-gpio-custom

んなのでええんでないのと。
先人のありがたいスクリプトをリスペクト(古い)しよう

# opkg install bash perl

# vi i2c_lcd.sh

#!/bin/bash
function usage {
    echo "Usage: $0 [-ic] [-p pos] message" > /dev/stderr;
    echo "       -i : LCD init, -c : Clear Screen" > /dev/stderr
    echo "       -p : position (0:top left, 40:bottom left)" > /dev/stderr
    exit 1
}
[ $# = 0 ] && usage

while getopts "icp:" flag; do
    case $flag in
        \?) usage ;;
        i)  i2cset -y 0 0x3e 0 0x38 0x39 0x14 0x70 0x5e 0x6c i
            sleep 0.25
            i2cset -y 0 0x3e 0 0x0c 0x01 0x06 i
            sleep 0.05
            ;;
        c)  i2cset -y 0 0x3e 0 0x01 ;;
        p)  i2cset -y 0 0x3e 0 $((OPTARG+128)) ;;
    esac
done
shift $((OPTIND-1))
[ $# = 0 ] && exit

LANG=C
MSG=`echo -n "$1" | perl -pe '$_=join" ",map{ord }split//'`
#echo $MSG
i2cset -y 0 0x3e 0x40 $MSG i

で保存。


# chmod +x ./i2c_lcd.sh
#  ./i2c_lcd.sh -i
#  ./i2c_lcd.sh  "hogehoge"
#  ./i2c_lcd.sh -c

2016年6月30日木曜日

OPENWRTでページング

いわゆる ぴんぽんぱんぽんってやつ。

アイコムがそのものを出していたらしいのだけど、生産終了になった模様

じゃぁラズパイなりでやればいいじゃないっていうことを有名どころさんも考えた。


紆余曲折の果ておっぱいでも同じことをしてみた。。。が省略
おそらく詰まるところが1つあって


loborisカーネルだと
HDMIのRAWサポートが有効なので動かない


カーネルを再コンパイルしないとだめ。


ふと、openwrtのtrunkを見てたら、asterisk13でossとalsaサポートが有効化されていた。
CCにバックポートしてコンパイルしたらGL-MT300Nで動いた。


GL-MT300Nは苦労せずに動かせるGPIOポートが2個(2,44)があるのでそれを使う。
GPIO2は元々WPSボタン用なので、
電源投入時プルアップがされておりリレーがONになってしまう。
それ以外は納得の出来だ。

2016年3月18日金曜日

GL-MT300A 発売!

http://www.gl-inet.com/product/gl-mt300a/

すでにARM-A9系でchan_mobileが動くと確認できたので
今更買わなくても良い気がするけどぽちった。
これでGbEなら文句なしなのだが
微妙に外すのが中華っぽい。
トラベルルーターとしては高性能だけど
そもそも、トラベルルーターという商品が
日本ではほとんど役に立たない。

ルーターとしてはWHR-300HP2程度の性能しかなく
ラズパイ3が優秀過ぎなのとおっぱいが安すぎなので
おもちゃとしての魅力も乏しい。






CPUMTK 7620A @580Mhz
Memory/StorageDDR1 128MB/ FLASH 16MB
Interfaces1 WAN, 1 LAN, 1 USB2.0, 1 micro USB (power), 1 Reset button
Frequency2.4GHz
Transmission rate300Mbps
Max Tx Power20dBm
Protocol802.11 b/g/n
External Storage supportFAT32/EXFAT/EXT4/EXT3/EXT2/NTFS
Webcam supportMJPG, YUV
DIY featuresUART, TF Card interface, 3.3V & 5V power port
External antenna supportYes
PoE supportNo
Power input5V/1A
Power consumption<3W
Dimension, Weigh58*58*25mm, 39g

TFスロットというのがピンだけ出ていてあとは自分で
って言われると(たぶんいわれる)面倒というかダルイい。

どうやらSDのドーターボードは無料でつけてくれるが、はんだ付けは自分でしてね
らしい。それならまぁいいか。

ざっとソース覗いた感じ、300Nと大差ないのでasterisk11とchan_mobileはあっさり動きそうだ。

asterisk11で携帯電話を収容する という一点だけでコスト比較

名称価格
OrangePI-ONE$13.1(9.99)+SDCARD+BT
NANOPI M1$21(10)+SDCARD+BT
GL-MT300A$36(30)+SDCARD+BT
Raspberry Pi 36500円($35)+SDCARD
Xiaomi Mi WiFi Mini$29+SDCARD+BT+HUB

純正でケースがない点を除けばおっぱい1号が最強
でもorangepiのサポート体制ってないも同然だからね~
NANOPIM1のこれからに期待

GL-MT300Aは立ち位置がちょっと微妙



AR71xxで音が出ないのはENDIANの問題っぽいことはわかった。
問題はどこで起きているのか? で
BLUEZにそれっぽい問題があったので5.37まで上げてみるも変わらず。
PULSEAUDIOのほうかな?と思って手を入れてみたけどこちらも空振り。

すでに動かす必要が無いとはいえ、動かないと腹が立つ。

2016年3月14日月曜日

わりと完璧な asterisk routerを作る(機種選定)

色々な実験の結果以下のことがわかった
いいから(ry-> http://ppl.ug/QHRh4bvF0sc/

1.OpenWRT CC だとchan_mobileが動かせる

bluez5.30が disable audioでコンパイルされているので再コンパイルが必要(たぶん)
asterisk11がdisable bluetoothでコンパイルされているので再コンパイルが必要

すごく重要なことなのだが
Ar71xx だと音がまともに出ない

頭きたのでCCの最新をビルドしてみたけど結果は同じだった。
big endianだとだめってことなのか?

2.chan_dongleもちゃんと動く

たっ・・・たぶん・・・ただしパッチをあてるのは結構面倒な作業なので
動くドングルは限定される



2016年3月9日水曜日

openwrt CC で chan_mobileを試す(暫定版)

Bluez5.30になってるしいけるんでねえの?

と、思い立って試してみた。
元々、日本でasteriskが流行らない上に
openwrtでasterisk11を動かす必要はないし
bluetoothでつなぐ必要なんてまるっきりないので
情報らしいものが全然ない(笑)

今のところ

(AR71xx)WNDR4300-> 音がぐちゃぐちゃで使いもんにならない
(RALINK)GL-MT300N+ハブ->なんか動いてる??
(BCM53xx)WZR-600DHP2->なんか動いてる??

能書きはいいからchan_mobile.soはよ! って人は
http://ppl.ug/Csl3k10giIY/ (MT7620用)


2016年2月26日金曜日

携帯->ブラステル転送 最低限の設定

[globals]
BRNUMBER=かける側番号
TGNUMBER=受ける側番号

[gratina]
exten => s,1,NoOp("gratina")
same  =>         n,GotoIf($["${CALLERID(num)}" = "${BRNUMBER}"]?test)
same  =>         n,Ringing(1)
same  =>         n,answer()
;same  =>         n,WaitExten(1)
same  =>         n,Dial(SIP/${TGNUMBER}@brastel,60,r)
same  =>         n,Congestion
same  =>         n,Hangup()
same  =>         n(test),answer()
same  =>         n,wait(5)
same  =>         n,Playback(hello-world)
same  =>         n,Hangup()

[keep]
exten => s,1,NoOp("keep account")
same  =>         n,wait(1)
same  =>         n,answer()
same  =>         n,WaitExten(10)
same  =>         n,Playback(hello-world)
same  =>         n,Hangup()


outgoing.txt (所有権asterisk:asterisk)
Channel: SIP/ブラステルのトランク/携帯番号
MaxRetries: 1
RetryTime: 90
WaitTime: 90
Context: keep
Extension: s


cp -a outgoing.txt /var/spool/asterisk/outgoing/ を年2回ぐらいcronで実行する。

電話番号振られてたら消されないという話もあるけどね。

2016年2月19日金曜日

openwrtでipsetとfail2ban

ログを転送してそのログを元にbanするというならばありかもしれないが
2000円に満たないおっぱい1号とたばこ1箱にもならない
電気代ケチってリスクを増やす必要があるのだろうか?

なーんて考えたら負け。

1.タイムゾーンの設定

UTCなら問題ない。
ローカルタイム(JST)にLUCIで設定しただけだと
asteriskのログはUTCのままだったりする。
ついでにasteriskのログ表示も変えておく。

opkg install zoneinfo-asia
ln -sf /usr/share/zoneinfo/Japan /etc/localtime
cp -a /etc/asterisk/logger.conf  /etc/asterisk/logger.conf.org
sed -i -e "/^\[general\]$/a dateformat=%F %T" /etc/asterisk/logger.conf

ゾーンファイルにこだわりがあるぜ!って人は
Japanじゃなくてasia/Tokyoでもいいけど同じだぞ・・

そうそう、関係ないけどasterisk入れると大抵aelも入るので
[21]
type=friend
defaultuser=21
secret=passw0rd
canreinvite=no
host=dynamic
context=ael-default

とでもしておくと、とりあえず1000に電話するとおめでとうメッセージが聞こえる。
確認したらcontextを変えてmodule.confでaelをnoloadにすればあとくされがない。


2.一気に設定

pythonはlightでもそれなりの容量を喰うのでnand32MBとかの機種じゃ無理です。
で、USBに入れるかって話になるとドングル使うにはハブがいる。
ちょいまて、おしゃれなハブ買うと同じ値段でOPI-ONEかえるやん!

WNDR4300なら安心の100MB!
11na使えないんですけどね…



mkdir -p /etc/ssl/certs
export SSL_CERT_DIR=/etc/ssl/certs
source /etc/profile
opkg install ca-certificates wget python ipset gunzip tar ipset
wget https://github.com/fail2ban/fail2ban/archive/0.9.3.tar.gz
tar xvfz 0.9.3.tar.gz
cd fail2ban-0.9.3
python setup.py install

cat << EOF > /etc/init.d/ipset-persistent
#!/bin/sh /etc/rc.common
# Copyright (C) 2014 OpenWrt.org
START=17
STOP=17
start() {
echo start
/usr/sbin/ipset -! restore < /etc/iptables/ipset 2> /dev/null
}
stop() {
echo stop
/usr/sbin/ipset save > /etc/iptables/ipset
}
EOF
cat << EOF > /etc/init.d/fail2ban
#!/bin/sh /etc/rc.common
# Copyright (C) 2014 OpenWrt.org
START=98
STOP=98
RUNDIR=/var/run/fail2ban
start() {
test -d \$RUNDIR || mkdir -p \$RUNDIR
test ! -e \$RUNDIR/fail2ban.sock || rm -f \$RUNDIR/fail2ban.sock
exec /usr/bin/fail2ban-client -f -x start
}
stop() {
exec /usr/bin/fail2ban-client stop
exec rm -f  \$RUNDIR/fail2ban.pid
}
EOF
chmod +x /etc/init.d/ipset-persistent
chmod +x /etc/init.d/fail2ban
/etc/init.d/ipset-persistent enable
/etc/init.d/fail2ban enable
cat << EOF > ./jp_list.sh
#!/bin/sh
if [ -s cidr.txt ]; then
mv cidr.txt cidr.txt.old
fi
wget http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip cidr.txt.gz
ipsz=\`wc -c < cidr.txt\`
if [ \$ipsz -lt 1500000 ]; then
rm -f cidr.txt
else
ipset swap JPLIST JPLIST
if [ \$? -ne 0 ] ;then
ipset create -! JPLIST hash:net
fi
ipset create -! JPLIST2 hash:net
sed -n 's/^JP\\t//p' cidr.txt | while read ADDRESS; do
ipset add JPLIST2 \$ADDRESS
done
ipset swap JPLIST JPLIST2
ipset destroy JPLIST2
fi
EOF
chmod +x ./jp_list.sh
./jp_list.sh

超てきとう。
openwrtやDD-WRTはinitスクリプトが超シンプルでよいね。

ラズパイやらでipsetの読み込みをする場合スクリプトがいる
http://ppl.ug/ae9qsuHnMwI/

systemctl enable ipset-presistent

で/etc/rcS.d にリンクが生えてるはず

2016年2月15日月曜日

orangepi ONE用 script.bin


http://www.cnx-software.com/2016/02/13/received-your-orange-pi-one-youll-need-to-tweak-your-fex-file-script-bin/

http://linux-sunxi.org/Orange_Pi_One#Compatibility
早速賢い人が解決してくれたようだ。

しかし問題は残っていて、コストダウンの結果電圧が
1.1vと1.3vの2ステージだけになった模様

5ドル下げるために色々どりょくしているんだね~


http://linux-sunxi.org/Orange_Pi_PC#CPU_clock_speed_limit

電圧に関してはこちらでは1.1vで816MHz以下
1.3vでちょっと電圧不足だけど1200MHzとなってる。
原典はH3のSDKのようで、loborisさんのfexの元ネタにも同じ記述があった。
648MHzが公式のminclock 816MHzまで1.1vというのが正しいのではなかろうか。

ちなみにヒートシンクなしでは816MHz@1.1vでもフルにロード掛けると平気で80度に達する。
1200MHz駆動はすっぱりあきらめて816/480@1.1vで使うことにした。

一応そのまま作ったscript.bin 1200@1.3v 648@1.1v
http://ppl.ug/YPyFQawrn9Q/


----
ケースがあって(出来が良いとは言っていない)
電圧が細かく調整できて
メモリ512MB多くて
USBも2こ多い

PCでいいんじゃないかなぁ

2016年2月14日日曜日

【誰得シリーズ】 NETGEAR WNDR4300 用 openwrt 15.05 nand 最大拡張 イメージ & pptpd &asterisk11

大昔、 投げ売りだったWNDR4300を

大事にお使いのあなたに…


ddwrtでjffsがうまいことフォーマットできなかったりしたWNDR4300

なぜかopenwrtでも冷遇されていて
NANDが128MBもあるのに25MBしか使ってくれない。

仕方がないのでimagebuilderで無理やり拡張してみた
11naのチャンネルが使えないのは仕様っぽい。

http://ppl.ug/OOoSOTXoHuU/


動くか知らんがpptpdも作ってみた

http://ppl.ug/3lqV8VXq7XE/

asterisk11が落ちるので作ってみた
標準で必ず落ちるasteriskが上がってるってWNDR4300虐められすぎ。

こちらは山ほどあるので、たっぷり増えたWNDR4300の適当なhogehogeに展開
/etc/opkg.confに追加
src/gz chaos_calmer_telephony2 file://hogehoge/telephony

でおまじない
cd /hogehoge/telephony
usign -G -s mime.key -p mime.pub
opkg-key add mime.pub
usign -S -m Packages -s mime.key -x Packages.sig
opkg update

ぱっとみ動いているっぽい。
chan_dongleは使える。使えるものはかなり限定されるけど
受けられるか知らないがFAXも音がする
BTは最初から動かない。かなり敷居たかいなこれは


orangepi one はじめました

10ドル切りのボードorange pi one こと、おっぱい1号はじめました。

PCと同じカーネルイメージでOKって聞いてたけど、クロック変更が聞かないようだ

[    0.000000] [ARISC ERROR] :message addr   : f004b840
[    0.000000] [ARISC ERROR] :message state  : 5
[    0.000000] [ARISC ERROR] :message attr   : 2
[    0.000000] [ARISC ERROR] :message type   : 30
[    0.000000] [ARISC ERROR] :message result : ff

1.2GHz固定で電圧もかなり来てるらしくあっという間にオーバーヒートするっぽい。
困ったもんだ。

5ドルでメモリが512MB増えると考えるとpcのほうがお得に見える。
H3使ったBPi-R1出してくれたら一番なんだがなぁ

2016年2月9日火曜日

余話 asterisk11 超手抜き 回線使用確認 pre-dial-handler と hangup-handler

もう随分前のことだけど、
回線が使用中なのか、相手が話中なのか 
判断する方法がわからなくて無理やりなんとかした方法。

当たり前だけど、dialして戻ってきたstatusで確認すればいいのに
なんでこんなことしたんだか・・・

何かに使えそうなのでめもっとく。

方法


電話をかけたら、DBにデータを書いて、hungup したら消す
で、電話をかける前にそれを見ればいいじゃん?! 
という超単純な方法。
pre-dial-handler と hangup-handler を使う。

[hogehoge]
exten => start,1,Set(MYNUMBER=${ARG1})
same  =>       n,Dial(hogehoge,120,Tb(pre-dial-handler,s,1(${MYNUMBER})))

[subReciver]
exten => start,1,Set(MYNUMBER=${ARG1})
same  =>       n,Dial(SIP/21,TB(pre-dial-handler,s,1(${MYNUMBER})))

[pre-dial-handler]
exten => s,1,Verbose(0,Entering contex ${ARG1} ${CONTEXT} in channel ${CHANNEL} with EXTEN and CID set to ${EXTEN} and ${CALLERID(num)})
same  => n,Set(DB(${ARG1}/use)=1)
same  => n, Set(CHANNEL(hangup_handler_push)=hangup-handler,s,1(${ARG1}))

[hangup-handler]
exten => s,1,Verbose(0,Entering context ${ARG1} ${CONTEXT} in channel ${CHANNEL} with EXTEN and CID set to ${EXTEN} and ${CALLERID(num)})
same  => n,Set(DB(${ARG1}/use)=0)
same => n,NoOp(${DB_DELETE(${ARG1}/use)})
same => n,Return()  

一部抜粋しただけなのでこのままじゃ使えないです。

subReciverで着信するとまずBオプションがあるので
pre-dial-handlerのs、1から引数${MYNUMBER})で実行

DBコマンドでデータベースに${MYNUMBER}/use に1を書きます。


次に切断時に実行するコマンドをCHANNEL(hangup_handler_push)で設定します。


ここまで終わると SIP/21にdialします。


hungupするとhangup-handler,s,1(${ARG1}))を実行します。

ARG1はMYNUMBERですから
一応0にしてDB_DELETEで消します。
余計なことせず一発で消せばいいのに。。

かける側と受ける側でオプションがb と B 違うので注意が必要です。


やっつけ感が半端ないけど一応使えたので気にしないことにしました。
peerでBusyかInuseか判別つかねーよ っていう場合にどうぞ

もっと賢い方法もありそうだけど、問題ないみたいだしいいかっ




2016年2月7日日曜日

raspbx で chan_mobileを使う その2

FreePBXをインストールすると、sip.conf等のファイルは自動的に作成されます。
GUIだけで操作するなら結構なことで便利(なのか?)なのですが、

適当に書いてあとは触らない よくわからないけどコピペだけで、使いたい

ってなると、情報が多くてコピー貼り付けできるほうが良いので
余計なお世話も甚だしい。
でも、起動を止めたりするのは面倒なので、
customファイルを触って設定します。




sip_general_custom.conf を 編集
sip_general_custom.conf を 編集してみます。

allowguest=no

と書いたら保存して閉じます。
カスタム用のファイルは 
ファイル名_セクション_custom.conf

となっているので、
この場合 sip.conf の general セクションに
allowguest=noを書いたのと同じ結果になるはずです。


sipの設

いくらでも参考になるサイトはあるのでちょっと捻くれたことをやってみましょう。
まぁ元ネタのあるパクリなんですけどね。
一般に流布している設定はこんな感じ。

[21]
type=friend
defaultuser=21
secret=passw0rd
canreinvite=no
host=dynamic

閉じたネットワーク上であればこれでもよいでしょう。
SIPポートを外部にだすことがいいのか、というのは、また別の話として
外部に出す場合ユーザ名が数字だけ、というのはちょっと怖い。


sip_custom.conf


[hogehoge21]
type=friend
defaultuser=hogehoge21
callerid=21<21>
secret=passw0rd
canreinvite=no
host=dynamic
context=naisen
[hogehoge22]
type=friend
defaultuser=hogehoge22
callerid=22<22>
secret=passw0rd
canreinvite=no
host=dynamic
context=naisen

まずユーザ名をhogehogeXXにしてcalleridにXXを設定します。
さらにdefaultuserを別のものにすると効果的です。
認証IDも入れないといけなくて面倒なのでしませんけどね。

しかし、このままだと、hogehogeXX@raspbxに電話をしないとかからないと。
XXで電話できるようにextentionsで書き換えを行っちゃえってことで、
まずグローバル変数にhogehogeを登録しておきます。

extensions_override_freepbx.conf

[globals]
HOGE=hogehoge



そしてextentionsでHOGEを追加します。

extensions_custom.conf

[naisen]
exten => _[23]X,1,NoOp(${CALLERID(num)})
same  =>    n,Dial(SIP/${HOGE}${EXTEN})
same  =>    n,Congestion
same  =>    n,Hangup()
include =>kaigai-ban
include =>outgoing-mobile
[kaigai-ban]
exten => _010.,1,NoOp(${CALLERID(num)})
same  =>    n,Hangup()
;softbank
exten => _0046010.,1,NoOp(${CALLERID(num)})
same  =>    n,Hangup()
;AU
exten => _005345.,1,NoOp(${CALLERID(num)})
same  =>    n,Hangup()
;DOCOMO
exten => _009130010.,1,NoOp(${CALLERID(num)})
same  =>    n,Hangup()
[outgoing-mobile]
exten => _0.,1,NoOp(${CALLERID(num)})
same  =>    n,Dial(Mobile/gratina/${EXTEN},45)
same  =>    n,Hangup()
[incoming-mobile]
exten => s,1,Dial(SIP/${HOGE}21&SIP/${HOGE}22,,tT)
exten => s,n,Hangup()



相手先に通知される番号はsip.confで
callerid=21<21>
と設定してあるので21が通知されるから問題なし。

hogehogeがばれたら全く意味はないのですが、
数字だと決め打ちしてアタックする限り突破はできないし
試行回数が増えればfail2banで弾ける確率も上がる。
hogehogeXX を hogeXhogeXのようにして${HOGE1}${EXTEN:0:1}${HOGE2}${EXTEN:1:1}
なんていうのもいいかもしれない。

ここまでたどりつかせないのが大事なんだけどね。

発信の設定は定石通りでそのまま。
海外通話を禁止するためにincludeを使って順番を強制します。

exten => _010.,1,NoOp(${CALLERID(num)})
same  =>    n,Hangup()
exten => _0.,1,NoOp(${CALLERID(num)})
same  =>    n,Dial(Mobile/gratina/${EXTEN},45)
same  =>    n,Hangup()

とフラットに書くと、ソートされて順番が入れ替わる可能性がある。。。はず。
010以外の発信方法があることにも注意ですが、気にしなくていい気もします。

これで、完成なのですが、外に持ち出す場合SIPというのはいささか不便。
また、このままなんの防御策もなしでポートを出すのも問題です。

クライアントが限定されてしまいますが、
外に出すのはIAX2を使ったほうが良いでしょう。
次はIAX2の設定をしてみよう。
以上でSIPサーバ側の設定は完了です。

2016年2月6日土曜日

raspbx で chan_mobileを使う その1






 SCPクライアント(winscp)
SSHクライアント(,teraterm,)
テキストエディタ(サクラエディタ)
などのインストールは済んでいると仮定します。
そこから”なにそれ?”な人は
ココの記事は見なかったことにしてください。




※携帯はあらかじめ、
周辺のすべてに表示 タイムアウトしない設定にしておきましょう


ドングルを差し電源をいれてroot:raspberryでログオンします。
apt-get update
apt-get install bluez bluez-tools usbutils
apt-get upgrade



そこまで容量を使いませんが

raspi-config

でExpand Filesystemをするとちょっぴり得した気分になれます。

これだけでインストールは終了。
2016年現在バグなどの問題がない限り、
わざわざ依存関係やら全部ぶち壊してコンパイルだどうのというのは、必要のない古い情報です。
debian7までは、それらが必要だったのですが、8ではbluez5が採用されているのでその必要ないんですね。

asteriskのコンパイルにしてもRASPBXは11or13ですし、ひかり電話対応も認証の問題なので
MACアドレス認証を選べばパスワードを無視して認証してくれるので必要ない・・らしいです。
遊べる回線がオフィスタイプだけなので、よく知りませんけどね。



LF改行対応のエディタを設定するように
次にwinscpを起動します。
あらかじめエディタにサクラエディタやらを
指定しておくほうが無難です。
confファイルはCRLFっぽいですけど。

右クリックしファイルを新規作成ファイル名を

chan_mobile.conf

しましょう。そこに以下をコピペ






[general]
interval=30             ; Number of seconds between trying to connect to devices.
[adapter]
id=blue
address= ;dongle
;forcemaster=yes        ; attempt to force adapter into master mode. default is no.
;alignmentdetection=yes ; enable this if you sometimes get 'white noise' on asterisk side of the call
                        ; its a bug in the bluetooth adapter firmware, enabling this will compensate for it.
                        ; default is no.
[gratina]
address= ;phone
port=4
context=incoming-mobile
group=1                         ; this phone is in channel group 1 also.
adapter=blue


まだ保存する必要はありません。ひらいたままのteratermで


lsusb | grep "0a12:0001"


Bus 001 Device 004: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
こう出てくれば、CSRチップのコントローラを認識しています。
他チップならgrepせずに確認です。

bluetoothctl

でbluetoothユーティリティの対話モードに入るとドングルのidが出てきます。

[NEW] Controller 00:09:DD:40:AD:XX raspbx [default]

00:09:DD:40:AD:XXをコピーして開いたままのテキストファイル
address=;dongle
の=と;の間にコピペしましょう。

address=00:09:DD:40:AD:XX ;dongle

次に、携帯との対向試験を行います。

power on
scan on

[NEW] Device 5E:42:46:65:72:2X PRO3523

お目当ての機器が発見されたらidをテキストファイル
address=;phone
の=と;の間にコピペ

address=5E:42:46:65:72:2X;phone

pair <ここでTABを押す> この場合 5 を押して
<TAB>を押すとオートコンプリートしてくれます。親切設計ですね。

pair 5E:42:46:65:72:2X
パーミッション変更

携帯にペアリング要請が出るので許可しましょう
出なかったら・・・あきらめてください。同様の手順で

trust 5E:42:46:65:72:2X
exit
chan_mobile.confを作る


ここまででテキストファイルを一旦上書き保存して終了すると勝手にアップロードしてくれます。
chan_mobile.confで右クリック プロパティを選びgroup とownerをasteriskにしましょう。

次にポートの変更を行います。
以下のコマンドを入力しましょう。

amportal restart
asterisk -rx "mobile search"


Address           Name                           Usable Type    Port
5E:42:46:65:72:2X PRO3523                        Yes    Phone   2


しばらくすると上記のような返答が返ってくるはずです。

もう一度chan_mobile.confを開き
port=4
になっているところを表示されたポート…この場合2に書き換えます。
port=2
上書き保存して終了したら完了です。再起動と確認してみます。

amportal restart
asterisk -rx "mobile show devices"


ID              Address           Group Adapter         Connected State      SMS
gratina         5E:42:46:65:72:2X 1     blue            Yes       No Service No


こう表示されたら成功でincoming-mobileコンテキストに収容されています。
ここから先がわかる人はここまででお別れです。おつかれさまでした。

2016年2月3日水曜日

orange pi PC で IPSET

IPSETが使えないのでカーネルを再コンパイルしてみた。
ソースはクロス環境前提らしいのでとりあえず空いてるマシンでx64対応は・・・

ATOM D2550! そんな装備で大丈夫か イーノック?
ああ、問題ない。わけねぇぇ ばっちり画面が出ない。VGAは出るけど、ってやつです。

さらにx64でクロスコンパイラが動かない。
いったいgitで引いてくるコンパイラは何用のものなのだ?
そしてどうにかこうにか、動くものと差し替えてエラーも出なくなった。

って遅っ。
orange pi 実機でコンパイルするのとほとんどかわらないかむしろ遅い。


コンパイル終わったので導入してみるが・・画面が出ない・・・・orz

IPSETは使えるし普段からモニタは繋げていないから困りはしないがなぜだ?
http://ppl.ug/VCuA_qwYYAM/

画面でた
http://ppl.ug/xcs2WcrY364/



いちおーおいておく。とりあえず
IPSETをイネーブル
最高クロックを960MHzに制限&電圧下げ


debianのランドにraspbxを無理やりあてたものを作成中。

2GB超えそうな勢いだしconf直接編集するほうが楽なんだけどほぼ完成
FreePBXって使ってる人いるんだろうか?

2016年2月2日火曜日

ASUSWRT,DD-WRTでWAN側ポートを増やす

複数のプロバイダと契約して物理的にLANを分割したりレンタルのルータを素直に使わないケースでは、二重ルータにするかONUの直下にハブを入れるしかない。古いハブってわりと消費電力が高く(といっても10数ワット程度だけど)なくなるならそれに越したことはない。10ワット減れば月に170円は違うのだ・・・? なんだかどうでもいい金額な気がしてきたぞ?
ハブをなくす

ハブを使った構成

ASUSWRTの場合

ASUSWRTの場合は一工夫必要だ。
  1. DUAL WAN設定にする
  2. WAN2 をLANポートの何れかに割り当てる

設定が終わったところでシェルでルータにログインする

robocfg show


いろいろ出るが
   1: vlan1: 0 1 2 5t
   2: vlan2: 4 5t
   3: vlan3: 3 5t

vlan2(プライマリWAN)vlan3(セカンダリWAN)にポート4と3が振り分けられていることに注目。これを3,4 なし にするとプライマリWANが2つになりハブと同じ効果を持つようになるわけだ。

/jffs/scripts/init-start に

robocfg vlan 3 ports "5t"
robocfg vlan 2 ports "3 4 5t"

と書けば起動時に変更してくれる。

DD-WRTの場合


これは簡単。


チェックボックスのチェックを変えるだけ。
ここではVLANの配置と実際の配置が=とは限らないのに注意すること。

W1234と並んでいるけど物理的にはW4321となっていたりするのだ。




あとは振り分けたポートとつなげたい機器を接続するだけだ。
ひかり電話をラズパイやらおっぱいで直レジストする場合、USBLANをWAN側、内蔵LANをLAN側そして、電源をUSBに刺せばすっきり・・・といいたいのだが、ルータを再起動すると無慈悲に電源を落とされるので注意。

機器によっては電源垂れ流しで根元から切らない限り大丈夫なものもあるが・・・

Asterisk11 on ASUSWRT, DD-WRT with chan_dongle

色々な下準備ができること前提
可能な機種 RT-AC68U他ASUSのルータ,NETGEARR6300,R7000
ちょっと面倒だけど可能な機種 DD-WRTをインストールした
WZR-600DHP2,900DHP,1166DHP,1750DHP,DHP2 WXR-1900DHP

ドングルの確保 

確実に使えるもの
標準で 12d1:1001のIDを持つもの
E169 E230(voice enableにする必要あり)など
U2DIAG=0でIDを 12d1:1001に変えられるもの
E1552 など


  • entwareインストール
mkdir -p /jffs/entware.arm
ln -nsf /jffs/entware.arm /tmp/opt
cd /tmp
wget -c -O entware.arm-setup.sh http://goo.gl/Drwhrb
cat entware.arm-setup.sh | sed -e "s/ext2/jffs|ext2/" > entware.a
rm-setup.mod.sh
chmod +x ./entware.arm-setup.mod.sh
./entware.arm-setup.mod.sh

      • インストールが終わったら /jffs/scripts/init-start に追記

ln -nsf /jffs/entware.arm /tmp/opt
/opt/etc/init.d/rc.unslung start

  • パッケージインストール
    • 何がいるのかわかっていれば簡単

opkg update
opkg install ar asterisk11 asterisk11-app-authenticate asterisk11-app-chanisavail asterisk11-app-chanspy asterisk11-app-directed_pickup asterisk11-app-disa asterisk11-app-exec asterisk11-app-mixmonitor asterisk11-app-read asterisk11-app-readexten asterisk11-app-record asterisk11-app-sayunixtime asterisk11-app-senddtmf asterisk11-app-sms asterisk11-app-stack asterisk11-app-system asterisk11-app-verbose asterisk11-app-waituntil asterisk11-app-while asterisk11-chan-dongle asterisk11-chan-iax2 asterisk11-codec-a-mu asterisk11-codec-alaw asterisk11-codec-g729 asterisk11-codec-gsm asterisk11-codec-ilbc asterisk11-codec-resample asterisk11-curl asterisk11-format-g729 asterisk11-format-gsm asterisk11-format-sln asterisk11-format-wav asterisk11-format-wav-gsm asterisk11-func-blacklist asterisk11-func-channel asterisk11-func-cut asterisk11-func-db asterisk11-func-devstate asterisk11-func-extstate asterisk11-func-global asterisk11-func-groupcount asterisk11-func-shell asterisk11-func-uri asterisk11-pbx-dundi asterisk11-pbx-spool asterisk11-res-adsi asterisk11-res-agi asterisk11-res-clioriginate asterisk11-res-fax asterisk11-res-fax-spandsp asterisk11-res-smdi asterisk11-res-srtp asterisk11-res-timing-pthread asterisk11-res-timing-timerfd asterisk11-sounds asterisk11-voicemail bcg729 bzip2 coreutils findutils glibc-opt grep hostip iperf knockd libacl libattr libbfd libbz2 libc libcurl libgcc libiconv-full libjpeg liblzma libncurses libopenssl libpcap libpcre libpopt libpthread librt libsodium libspandsp libsqlite3 libsrtp libstdcpp libtiff libusb-1.0 libuuid libwrap locales msmtp nmap tar tcpdump terminfo usbutils zlib zoneinfo-asia 


いらないものも色々入っているけど気にしないでOK
これだけ入れても40MB程度 圧縮されて22MBとかなので今時のルータなら余裕
ブロードコムが異常なだけだけどね


あとは普通にconf の設定をすればよい。
そこが面倒だという突っ込みはなし!ていうか、
exten => hoge,1,NoOp(${CALLERID})
same =>         n,・・・・・
って感じで書く癖をつけておけば使いまわしが楽になるのに正直に書く人大杉

/opt/etc/asterisk/dongle.conf

[dongle0]
imei=SIMのIMEI
imsi=ドングルのIMSI
;↑どちらか片方
context=dongle0
;exten=s ;ソースでパッチ当ててないと電話番号のextenに入るので意味なし
group=0
resetdongle=yes
u2diag=0
disablesms=no
smsaspdu=yes

/opt/etc/asterisk/extentions.conf

[dongle0]
exten => 携帯番号,1,Noop()
same  =>   n,Dial(SIP/内線1&SIP/内線2&IAX2/IAXの番号,60)
same  =>   n,Hangup()

発信は
exten => _0.,1,Dial(Dongle/dongle0/${EXTEN},60)
same  =>    n,Congestion
same  =>    n,Hangup()

でOK


取れる防護策に限りがあるので外からレジストして使う場合

  • 端末にDDNSクライアントを入れる
  • ルータにDDNSの設定をする
  • ルータで定期的にhostipで端末のIP取得&iptablesで穴をあけるスクリプトをつくる
くらいのことはしておこう。DDNSIPは

DDNSHOSTNAME=DDNSのホスト名
DDNSIP=` hostip $DDNSHOSTNAME | egrep -s "^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" `
if [ $? -ne 0 ] ; then
return 1
fi

で取得でき、異常だったら終了にできる。

ローカルアドレスかどうかは
addr1=`echo $DDNSIP|cut -d . -f 1`
addr2=`echo $DDNSIP|cut -d . -f 2`
addr3=`echo $DDNSIP|cut -d . -f 3`
addr4=`echo $DDNSIP|cut -d . -f 4`

if [ "$DDNSIP" = "127.0.0.1" ]; then
        return 1
elif [ $addr1 -eq 10 ]; then
        return 1
elif [ $addr1 -eq 172 ] && [ $addr2 -ge 16 ] && [ $addr2 -le 31 ]; then
        return 1
elif [ $addr1 -eq 192 ] && [ $addr2 -eq 168 ]; then
        return 1
fi

こんな感じで判定できるはず。
スクリプト全文だせよって気もするけど、あまりに酷い作りなのでさらし者になりたくない罠

もう一つの方法としてポートノッキングでドアを開けてもらう方法もあるが、これもこれで長くなるので別の機会に。


グローバルなIPアドレスをもらえない場合は・・・・しらん

家に帰ってもクライアントを使いたい場合



/jffs/configs/dnsmasq.conf.add

ファイルを作成するとdnsmasqのオプションを指定できる


expand-hosts
address=/hoge.hoge.jp/hoge.hoge.jp/192.168.1.1(ルータのIP)

とルータに設定しておけば、家でも外でも設定を変えることなくSIPクライアントを使える・・と思う。
ちゃんとローカルのアドレスひけていれば・・・


できること できないこと


△ ひかり電話の子機として収容 ※ダイジェスト認証しないにできる機種限定
× ひかり電話 直接レジスト ※option 120,124,125対応してないの 
○ ブラステル収容
○ 050PLUS収容 ※オレオレ認証なファイルを持ってくる必要あり
○ 3Gドングル収容 ※ E169,E1552,E230など限定
× BT収容
○ IAX2接続 ※1ポートで済むので外からレジストする場合おすすめ
△ FAX受信 ※スクリプトを書けば
▲ FAX送信 ※やるのは面倒なのでおすすめしない

総括

とりあえず、ひかり電話や3Gを外に転送するだけ という用途であればasterisk以外の設定は簡単、RT-AC68UやR7000を持っているならばおすすめ。できるルータが限定されるし値段も張るので一からしたいというならばラズベリーパイやオレンジパイを使うほうが良いだろう。

もちろん、ポートを守るポイントが増やせるというメリットはあるが・・・・

R6300v2 ASUSWRT

安売りの時買ったR6300を持て余している人向け

http://koolshare.cn/thread-11536-1-1.html

R7000ならば
http://xvtx.ru/xwrt/index.htm

R6300で10000円 R7000だと15000円程度するので
今買うなら素直にRT-AC68Uを買うべき




こっそり