4,657
回編集
差分
→メッセージ本体
MESSAGE(custom_data) w/o
mark_all_outbound または clear_all_outbound を指定
=応用=
役に立つのか立たないのかわかりませんが、SIPメッセージで受信した内容に応じて処理する例。ブラウザフォン等のメッセージでの問い合わせに応答させる例。
==内線として実装する==
まず、この応答処理を内線として定義します。音声で呼ばれた場合は応答して切りますが、自分宛てのSIPメッセージだった場合にはメッセージ処理へ飛びます。
exten => 1000,1,NoOp
exten => 1000,n,Set(MTARGET=${EXTEN})
exten => 1000,n,GotoIf($["${CHANNEL(name)}"="Message/ast_msg_queue"]?msgdispatch,s,1)
exten => 1000,n,Answer
exten => 1000,n,Morsecode(S)
exten => 1000,n,Hangup
==メッセージ処理==
メッセージ本体(body)の最初の項目をサービス名、残りを引数と解釈するディスパッチャを用意します。あわせてメッセージの打ち返し先も組み立てておきます。各サービスからの返値は変数、RETVに入っているものとします。
[msgdispatch]
;サービス毎に分岐させ返値を送り返す
exten => s,1,NoOp
;送り先(戻し先)をfromから取得
exten => s,n,Set(SBACK=${CUT(MESSAGE(from),@,1)})
exten => s,n,Set(SBACK=${CUT(SBACK,:,2)})
;ドメインを送り元から取得
exten => s,n,Set(SDOM=${CUT(MESSAGE(from),@,2)})
exten => s,n,Set(SDOM=${CUT(SDOM,>,1)})
;メッセージ本体の頭の部分をサービス名として取得
exten => s,n,Set(SVC=${CUT(MESSAGE(body), ,1)})
exten => s,n,Set(SVC=${TOLOWER(${SVC})})
;サービスに渡す内容はスペースの後ろ
exten => s,n,Set(CONTENT=${CUT(MESSAGE(body), ,2-)})
;サービスに応じてサブルーチンコール
exten => s,n,Gosub(sub-msg-${SVC},s,1)
;返値をメッセージの本体にする
exten => s,n,Set(MESSAGE(body)=${RETV})
;メッセージを打ち返す
exten => s,n,MessageSend(pjsip:${SBACK},${MTARGET},sip:${SBACK}@${SDOM})
exten => s,n,Hangup
==各サービス処理==
各サービスは sub-msg-サービス名 というかたちでコールされるので必要な処理を用意します。<br>
以下の例ではAsteriskのMATH()、コマンドのuptimeとexprを定義しています。
[sub-msg-math]
exten => s,1,NoOp(MATH)
exten => s,n,Set(RETV=${MATH(${CONTENT},int)})
exten => s,n,Return
[sub-msg-uptime]
exten => s,1,NoOp(UPTIME)
exten => s,n,Set(RETV=${SHELL(uptime)})
exten => s,n,Return
[sub-msg-expr]
exten => s,1,NoOp(EXPR)
exten => s,n,Set(RETV=${SHELL(expr ${CONTENT})})
exten => s,n,Return