4,723
回編集
差分
→使い方
[[画像:BP SIP MSG241030.png | 640px]]<br>
こんな感じで、Asteriskを使ってメッセージ処理をすることができます。
=応用2:グループチャットを実装する=
少し難しい例になりますが、グループチャットをつくってみましょう。これもAsteriskがメッセージ交換をすることで実装できます。
==内線をつくる==
こちらも内線をつくっておきます。この番号めがけてメッセージを飛ばすことを前提とします。
exten => 1100,1,NoOp
exten => 1100,n,Set(MTARGET=${EXTEN})
exten => 1100,n,GotoIf($["${CHANNEL(name)}"="Message/ast_msg_queue"]?grp-chat,s,1)
exten => 1100,n,Answer
exten => 1100,n,Morsecode(S)
exten => 1100,n,Hangup
この番号に音声ダイヤルしてもプププといって切られるだけですが、メッセージを投げられた場合にはgrp-chatの処理を行います。
==グループチャット本体==
[grp-chat]
exten => s,1,NoOp(Group Chat)
;グループのメンバ(エンドポイント)をカンマ区切りで
;この部分はAstDBなり外部DB化するなどお好みで
exten => s,n,Set(MYGRP=phone3,phone33,phone34)
;MTARGETに元のextenが入っている(チャットの打ち先)
exten => s,n,NoOp(${MTARGET})
;「誰」が発言したかわからなくなるので元のFromを保存
exten => s,n,Set(OFROM=${MESSAGE(from)})
;元の送信者をメッセージ本体に結合
exten => s,n,Set(MESSAGE(body)=${OFROM} : ${MESSAGE(body)})
;送信元エンドポイント名だけ取り出し(コロンの後ろかつ@の前)
exten => s,n,Set(OENDP=${CUT(OFROM,:,2)})
exten => s,n,Set(OENDP=${CUT(OENDP,@,1)})
;Toからアドレス以降だけ取り出し
exten => s,n,Set(TTO=${MESSAGE(to)})
exten => s,n,Set(DSTA=${CUT(TTO,@,2)})
;取り出しの初期位置は1
exten => s,n,Set(CNT=1)
;グループからカンマ区切りを1つずつ取り出す
exten => s,n(loop),Set(ENDP=${CUT(MYGRP,\,,${CNT})})
;要素がなくなったら終了
exten => s,n,GotoIf($["${ENDP}"=""]?endlp)
;自分から自分へは送らない
exten => s,n,GotoIf($["${ENDP}"="${OENDP}"]?cont)
;送信先CONTACTに変換
exten => s,n,Set(DESTA=${PJSIP_DIAL_CONTACTS(${ENDP})})
;CONTACTSの頭部分を修正(最初のPJSIP/を取る)
exten => s,n,Set(DESTA=${CUT(DESTA,/,2-)})
;送信先組み立て
exten => s,n,Set(DESTB=sip:${ENDP}@${DSTA})
exten => s,n,MessageSend(pjsip:${DESTA},${MTARGET},${DESTB})
;取り出し位置を+1する
exten => s,n(cont),Set(CNT=${INC(CNT)})
exten => s,n,Goto(loop)
exten => s,n(endlp),Hangup
少し難しくなっていますが、カンマ区切りれ列挙されたエンドポイントをグループメンバーとし、それらに同じ内容をSIP MESSAGEで送信します。この際、発信元をAsteriskの『内線』番号としますが、誰が発言したかわからなくなるのでメッセージ本体(body)に元のコンタクトを付加します。一斉送信ではなく順次送信ですが、よほどの数を登録しない限り、まあこれで大丈夫でしょう。