USBモデムhuawei e1550を介した音声通話通知を生成するperlスクリプト

か぀おは出匵に倚くの時間を費やしおいたので、すばらしいおもちゃ、Huawei e1550 usbモデムを賌入したした。 しかし、da烈な若者の時代は過ぎ去り、意図された目的のためにこのデバむスを䜿甚する必芁はなくなりたした。 それで圌は数幎の間私の棚にちりばめた。 そしお、それはさらに塵を払っおいたでしょうが、タスクは譊告システムを䜜るために起こりたした。 それから、モデムに぀いお思い出したした。 タスクを怜蚎するず、SMSの読み取りに関する通知を受信できないため、音声ダむダルを優先しおSMS通知を拒吊せざるを埗たせんでした。 アスタリスクベヌスの゜リュヌションは私には少し面倒に思えたので、モデムのドックを読んだ埌、自分でダむダラヌを曞くこずにしたした。



出版の理由。


USSDおよびSMSリク゚ストの凊理に関する豊富な蚘事があるにもかかわらず、スクリプト蚀語Perl、PHP、Node.jsなどでの音声呌び出しの実装は芋぀かりたせんでした。 この蚘事が皆様のお圹に立おば幞いです。



開発環境


オペレヌティングシステムLinux

配垃openSUSE 12.3

カヌネル3.7.10-1.16-desktop1 SMP PREEMPT Fri May 31 20:21:23 UTC 201397c14bai686 i686 i386 GNU / Linux

プログラミング蚀語Perl

usbモデムHuawei e1550



ちょっずした理論。


ほずんどのLinuxディストリビュヌションでは、このモデムを/ devに接続するず、3぀のusbむンタヌフェむスが䜜成されたす。 これは通垞

/ dev / ttyUSB0-モデムコマンドラむンむンタヌフェむス

/ dev / ttyUSB1-音声音声モヌドがオンの堎合モデムむンタヌフェむス

/ dev / ttyUSB2-モデムコマンドラむンむンタヌフェむス。 / dev / ttyUSB0ずは異なり、コマンドに察するモデムの応答だけでなく、サヌビスメッセヌゞも読み取るこずができたす。 信号品質デヌタ、^ CEND出力など。



モデムの操䜜を開始するには、ファむルずしお読み曞きするためのコマンドむンタヌフェむスの1぀を開くだけです。

モデムにコマンドを送信するには、開いおいるむンタヌフェむスファむルにコマンドを曞き蟌む必芁がありたす。

このコマンドに察するモデムの応答を取埗するには、開いおいるむンタヌフェむスファむルから読み取る必芁がありたす。



モデムに䞎えるこずができるコマンドはATコマンドです

Huawei e1550モデムのコマンドずそれらで取埗できる回答は、仕様に蚘茉されおいたす。

HUAWEI CDMAデヌタカヌドモデムATコマンドむンタヌフェむス仕様

HUAWEI UMTSデヌタカヌドモデムATコマンドむンタヌフェむス仕様



モデムの音声機胜を有効にするには、コマンドAT ^ CVOICE = 0を発行する必芁がありたす

音声機胜は、コマンドAT ^ CVOICE = 1によっお無効になるたで有効になりたす



オヌディオ情報のモデムぞの送受信を開始するには、各呌び出しでAT ^ DDSETEX = 2コマンドを䜿甚しおモデムオヌディオポヌトのモヌドを切り替える必芁がありたす。



モデムに送信するための音声デヌタは次の圢匏である必芁がありたす

デゞタル化呚波数8000ヘルツ。

チャンネル数1モノ。

デゞタル化ビット笊号付き16。



オヌディオデヌタは、0.02秒ごずに320バむトの郚分でモデムのオヌディオポヌトに入力する必芁がありたす。



通話の終わりに、モデムは2番目のコマンドむンタヌフェむスを介しお、CENDメッセヌゞの圢匏で通話に関する情報を提䟛したす。

^ CEND出力圢匏call_index、duration、end_status、cc_cause

ここで

call_index-䞀意の呌び出し識別子

duration-秒単䜍の通話時間

end_status-通話終了埌のデバむスステヌタスコヌド

cc_cause-コヌル終了理由コヌド



だから。 始めたしょう。


ダむダラヌは3぀のファむルで構成されたす。

huawey_voice_call.pl-音声ダむダラヌスクリプト自䜓。

list.01.pl-サブスクラむバヌデヌタを含むファむル。

test.voice.raw-音声メッセヌゞが必芁な圢匏で蚘録されたファむル。



たた、蚘事2の最埌に、远加のファむルが衚瀺されたす。

cc_cause.pl-呌び出しの終了理由のコヌドが含たれおいたすcc_cause

end_status.pl-コヌル終了埌のデバむスステヌタスコヌドが含たれたすend_status



1぀のアヌカむブ内のすべおのファむル 私のコンピュヌタヌに投皿され、時々コンピュヌタヌの電源が切れたす



huawey_voice_call.plを怜蚎する

  1. / usr / bin / perl
  2. モゞュヌルTimeプラグむン:: HiResおよびむンポヌト
  3. 珟圚のネヌムスペヌス関数sleep
  4. この関数の機胜は、指定する機胜です
  5. 1秒未満の遅延
  6. Time :: HiRes qw  sleep を䜿甚し たす。
  7. コヌド切断原因コヌドを含むcc_cause.plファむルを含める
  8. これらのコヌドは、通話終了の理由を瀺しおいたす
  9. このスクリプトは䜿甚されたせんが、曞き蟌み甚
  10. 完党なダむダラヌはこれを分析する必芁がありたす
  11. 出力のパラメヌタ^ CENDcall_index、duration、end_status、cc_cause
  12. mycc_cause = do 'cc_cause.pl';
  13. コヌドを含むファむルend_status.plをむンクルヌドしたすendind原因コヌドを呌び出したす
  14. これらのコヌドは、通話終了埌のデバむスのステヌタスを衚瀺したす
  15. このスクリプトは䜿甚されたせんが、曞き蟌み甚
  16. 完党なダむダラヌはこれを分析する必芁がありたす
  17. 出力のパラメヌタ^ CENDcall_index、duration、end_status、cc_cause
  18. myend_status = do 'end_status.pl';
  19. 詳现
  20. CENDタむプのメッセヌゞは、通話が終了するずモデムによっお発行されたす
  21. および通話に関する情報、通話終了の理由に関する情報を含む
  22. およびデバむスのステヌタスに぀いお。
  23. 出力圢匏^ CENDcall_index、duration、end_status、cc_cause
  24. ここで
  25. call_index-䞀意の呌び出し識別子
  26. duration-秒単䜍の通話時間
  27. end_status-通話終了埌のデバむスステヌタスコヌド
  28. cc_cause-通話を終了する理由コヌド
  29. モデムをOS Linuxを搭茉したコンピュヌタヌに接続する堎合
  30. 3 USBむンタヌフェむスは、モデムずのデヌタ亀換のために䜜成されたす
  31. 通垞これ
  32. / dev / ttyUSB0-モデムコマンドむンタヌフェむス
  33. / dev / ttyUSB1-音声音声モヌドがオンの堎合モデムむンタヌフェむス
  34. / dev / ttyUSB2-モデムコマンドラむンむンタヌフェむス。 その点で/ dev / ttyUSB0ずは異なりたす
  35. モデムのコマンドに察する応答だけでなく、サヌビスに察する応答も読むこずができる
  36. メッセヌゞ。 信号品質デヌタ、^ CEND出力など。
  37. モデムにサりンドを送信するポヌトを瀺したす
  38. $ VOICE_PORT = "/ dev / ttyUSB1" ;
  39. モデムコマンドを提䟛するポヌトを瀺したす
  40. $ COMMAND_PORT = "/ dev / ttyUSB2" ;
  41. 蚭定
  42. 0-デバッグ出力を無効にする
  43. 1-デバッグ出力を有効にする
  44. $ VERBOSE = 1 ;
  45. 読み取りおよび曞き蟌み甚にモデムコマンドポヌトを開く
  46. $ SENDPORT 、 '+ <' 、 $ COMMAND_PORTを 開くか、「 '$ COMMAND_PORT'を開けたせん$ \ n 」 ;
  47. 読み取りず曞き蟌みのためにモデムの音声ポヌトを開きたす
  48. ポヌトからのオヌディオストリヌムの読み取りは、このプログラムでは䜿甚されたせん
  49. ただし、このスクリプトを留守番電話に倉えるこずを劚げるものは䜕もありたせん。たずえば、
  50. $ SENDPORT_WAV 、 '+ <' 、 $ VOICE_PORTを開く か 、 「 '$ VOICE_PORT'を開けたせん$ \ n 」 ;
  51. サブスクラむバヌに関するデヌタを含むファむルlist.01.plを含めたす
  52. 私の @user_list = do 'list.01.pl' ;
  53. 2぀のパラメヌタヌを送信する呌び出し関数を呌び出したす。
  54. 1-ボむスメッセヌゞファむル名
  55. 2-サブスクラむバヌデヌタ配列
  56. call_list  "test.voice.raw" 、 \ @user_list  ;
  57. 呌び出しの最埌に、開いおいるすべおのファむル/ポヌトを閉じたす
  58. exit_call   ;
  59. この関数はリスト䞊のサブスクラむバヌを呌び出したす
  60. sub call_list {
  61. 音声メッセヌゞでファむル名を取埗
  62. 私の $ l_file = shift ;
  63. 賌読者に関するデヌタを含むリストぞのリンクを取埗
  64. 私の $ l_list = shift ;
  65. 音声メッセヌゞでファむルからデヌタをロヌド
  66. 私の $ l_voice = load_voice  $ l_file  ;
  67. このサむクルは、サブスクラむバヌのリストを実行したす
  68. ダむダルしようずする
  69. foreach $ l_info  @ { $ l_list }  {
  70. 加入者にダむダルする機胜を呌び出す
  71. 私の $ l_msg = call_one  $ l_info 、 $ l_voice  ;
  72. 受信したメッセヌゞを衚瀺する
  73. print $ l_msg ;
  74. 次の人に電話する前
  75. 3秒埅ちたす。
  76. 睡眠 3 ;
  77. }
  78. }
  79. この関数は、指定された番号の呌び出しを詊みたす
  80. および成功した堎合-音声メッセヌゞをブロヌドキャストしたす
  81. sub call_one {
  82. 私の $ l_info = shift ; 珟圚のサブスクラむバデヌタを䜿甚したハッシュ
  83. 私の $ l_bufer = shift ; ヘッダヌメッセヌゞの320バむトチャンクの配列
  84. このコマンドには、モデムの音声モヌドが含たれたす
  85. 䞀床有効にするず、削陀/再枬定できたす
  86. このコマンド。 モデムは状態を蚘憶したす。
  87. #at_send 'AT ^ CVOICE = 0';
  88. モデムに番号を呌び出す$ l_info-> {phone}
  89. モデムからの応答を期埅
  90. OK-正垞にダむダルされたした
  91. NO CARRIER-セルラヌネットワヌクぞの接続なし
  92. my $ l_rec = at_send  "ATD $ l_info-> {phone};" 、 qr /  OK | NO CARRIER  /  ;
  93. ダむダルアップが発生しなかった堎合、関数を終了しお察応するメッセヌゞを返したす
  94. return "賌読者$ l_info-> {name} [$ l_info-> {phone}]通知なし。ネットワヌクなし\ n " if $ l_rec eq 'NO CARRIER' ;
  95. 加入者が電話に出るずきを期埅する
  96. CONN....-加入者が電話を取りたした
  97. CEND....-サブスクラむバヌが利甚できない、通話䞭、たたは通話を切断した
  98. $ l_rec = at_rec  qr / \ ^CONN \1 \、0 | CEND \ :) /  ;
  99. 加入者が電話に出ない堎合、機胜を終了しお察応するメッセヌゞを返す
  100. return "賌読者$ l_info-> {名前} [$ l_info-> {phone}]は通知されたせん。アクセス䞍可たたはリセット\ n " if $ l_rec eq 'CEND' ;
  101. モデムを音声受信/送信モヌドに切り替えたす
  102. OK-切り替えは成功したした
  103. ゚ラヌ-切り替えに倱敗したした
  104. CEND....-サブスクラむバヌが利甚できない、通話䞭、たたは通話を切断した
  105. $ l_rec = at_send  'AT ^ DDSETEX = 2' 、 qr /  OK | ERROR | CEND \ :) /  ;
  106. 音声モヌドぞの切り替えに倱敗した堎合、たたはサブスクラむバヌが発生しなかった堎合
  107. ハンドセット-関数を終了し、察応するメッセヌゞを返す
  108. return "賌読者$ l_info-> {name} [$ l_info-> {phone}]通知なし。アクセス䞍可たたはリセット\ n " if $ l_rec ne 'OK' ;
  109. ここに着いた堎合、通話が確立されおおり、加入者が電話に出たこずを意味したす
  110. モデムぞの音声は、0.02秒ごずに320バむトの郚分で送信される必芁がありたす
  111. サヌビス倉数を蚭定したす$ | ナニットごずに、これはバッファリングを無効にしたす。
  112. このようにしお、デヌタはすぐにサりンドポヌトに送信されたす。
  113. $ | = 1 ;
  114. 音声メッセヌゞの320バむトチャンクによるバッファルヌプ
  115. foreach my $ c  @ { $ l_bufer }  {
  116. 次のピヌスをモデムの音声ポヌトに蚘録したす
  117. syswrite $ SENDPORT_WAV 、 $ c 、 320 ;
  118. サむクルを続行する前に0.02秒埅機したす
  119. 睡眠  0.02  ;
  120. }
  121. 受話噚を眮きたす。
  122. at_send  'AT + CHUP'  ;
  123. 成功した通知に関するメッセヌゞを返したす。
  124. return "賌読者$ l_info-> {name} [$ l_info-> {phone}]成功通知\ n " ;
  125. }
  126. この関数は、音声メッセヌゞを320バむトの断片の配列にロヌドしたす
  127. 1぀のパラメヌタヌを取りたす-ファむル名
  128. オヌディオデヌタ圢匏-pcm、mono、8000ヘルツ、16ビット、眲名あり
  129. sub load_voice {
  130. 私の $ l_file_name = shift ;
  131. my $ l_fh = new IO :: ファむル "<$ l_file_name" たたは die "$ l_file_nameを開けたせん$" ;
  132. binmode  $ l_fh  ;
  133. 私の @l_bufer =   ;
  134. while  read  $ l_fh 、 $ l_bufer [ $ i ] 、 320   { $ i ++; }
  135. close $ l_fh ;
  136. return \ @l_bufer ;
  137. }
  138. この関数は、コマンドをモデムコマンドポヌトに送信したす
  139. 正芏衚珟で瀺された応答を埅぀
  140. 2぀のパラメヌタヌを取りたす
  141. 1-チヌム
  142. 2-予想される回答のオプションを蚘述する正芏衚珟デフォルトはOK
  143. sub at_send {
  144. 私の $ l_cmd = shift ;
  145. 私の $ l_rx = シフト || qr /OK/ ;
  146. print $ SENDPORT "$ l_cmd \ r " ;
  147. print "SEND[$ l_cmd] \ n " if $ VERBOSE ;
  148. return at_rec  $ l_rx  ;
  149. }
  150. この関数は、モデムからのモデム応答を期埅したす
  151. 1぀のパラメヌタヌを受け取る-予想される回答のオプションを説明する正芏衚珟デフォルトはOK
  152. sub at_rec {
  153. 私の $ l_rx = シフト || qr / OK / ;
  154. 私の $ recive = '' ;
  155. while    $ recive =〜 $ l_rx   {
  156. $ recive = < $ SENDPORT >;
  157. $ recive = 〜s / [ \ n \ r ] + // msg ;
  158. print "RECIVE[$ recive] \ n " if $ VERBOSE && $ recive ;
  159. }
  160. $ recive =〜 $ l_rx ;
  161. print "END RECIVE[$ recive] [$ 1] [$ l_rx] \ n " if $ VERBOSE ;
  162. リタヌン $ 1 ;
  163. }
  164. この関数は、以前に開いたモデムポヌトを閉じたす
  165. sub exit_call {
  166. 印刷 "通知が終了したした\ n " ;
  167. $ SENDPORT_WAVを閉じ たす。
  168. at_send  'AT + CHUP'  ;
  169. $ SENDPORTを閉じ たす。
  170. }




list.01.plを怜蚎しおください

サブスクラむバヌのリスト。

これは、各゚ントリに含たれるハッシュ配列の配列です

加入者デヌタ

電話-加入者の電話

name-サブスクラむバヌの名前

加入者に関する他のデヌタを保存するこずも可胜です



{電話=> '+79111234567' 、名前=> 'Petrov Petr Petrovich' } 、

{電話=> '+79117654321' 、名前=> 'Vasilyev Vasily Vasilyevich' }

 ;




test.voice.rawを怜蚎しおください

このファむルを䜜成するために、写真に瀺すようにAudacityオヌディオ゚ディタヌを䜿甚したした。



画像



画像



画像



画像



画像



たた、远加のファむルcc_cause.plおよびend_status.plを提䟛したす。 これらは、スクリプトの提瀺されたバヌゞョンでは䜿甚されたせんが、改善する堎合に圹立ちたす。



cc_cause.pl

切断原因ccコヌド

英語http://www.eversoft.net/dcc.html

ロシア語http://ru.wikipedia.org/wiki/Q.931

Huaweiのマナ

HUAWEI CDMAデヌタカヌドモデムATコマンドむンタヌフェむス仕様

 "http://www.letswireless.com.cn/asp_bin/downfile/2009929121443234.pdf"



HUAWEI UMTSデヌタカヌドモデムATコマンドむンタヌフェむス仕様

 "http://www.net139.com/UploadFile/menu/HUAWEI%20UMTS%20Datacard%20Modem%20AT%20Command%20Interface%20Specification_V2.3.pdf"



'1' => 'UNASSIGNED_CAUSE' 、

'3' => 'NO_ROUTE_TO_DEST' 、

'6' => 'CHANNEL_UNACCEPTABLE' 、

'8' => 'OPERATOR_DETERMINED_BARRING' 、

'16' => 'NORMAL_CALL_CLEARING' 、

'17' => 'USER_BUSY' 、

'18' => 'NO_USER_RESPONDING' 、

'19' => 'USER_ALERTING_NO_ANSWER' 、

'21' => 'CALL_REJECTED' 、

'22' => 'NUMBER_CHANGED' 、

'26' => 'NON_SELECTED_USER_CLEARING' 、

'27' => 'DESTINATION_OUT_OF_ORDER' 、

'28' => 'INVALID_NUMBER_FORMAT' 、

'29' => 'FACILITY_REJECTED' 、

'30' => 'RESPONSE_TO_STATUS_ENQUIRY' 、

'31' => 'NORMAL_UNSPECIFIED' 、

'34' => 'NO_CIRCUIT_CHANNEL_AVAILABLE' 、

'38' => 'NETWORK_OUT_OF_ORDER' 、

'41' => 'TEMPORARY_FAILURE' 、

'42' => 'SWITCHING_EQUIPMENT_CONGESTION' 、

'43' => 'ACCESS_INFORMATION_DISCARDED' 、

'44' => 'REQUESTED_CIRCUIT_CHANNEL_NOT_AVAILABLE' 、

'47' => 'RESOURCES_UNAVAILABLE_UNSPECIFIED' 、

'49' => 'QUALITY_OF_SERVICE_UNAVAILABLE' 、

'50' => 'REQUESTED_FACILITY_NOT_SUBSCRIBED' 、

'55' => 'INCOMING_CALL_BARRED_WITHIN_CUG' 、

'57' => 'BEARER_CAPABILITY_NOT_AUTHORISED' 、

'58' => 'BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE' 、

'63' => 'SERVICE_OR_OPTION_NOT_AVAILABLE' 、

'65' => 'BEARER_SERVICE_NOT_IMPLEMENTED' 、

'68' => 'ACM_GEQ_ACMMAX' 、

'69' => 'REQUESTED_FACILITY_NOT_IMPLEMENTED' 、

'70' => 'ONLY_RESTRICTED_DIGITAL_INFO_BC_AVAILABLE' 、

'79' => 'SERVICE_OR_OPTION_NOT_IMPLEMENTED' 、

'81' => 'INVALID_TRANSACTION_ID_VALUE' 、

'87' => 'USER_NOT_MEMBER_OF_CUG' 、

'88' => 'INCOMPATIBLE_DESTINATION' 、

'91' => 'INVALID_TRANSIT_NETWORK_SELECTION' 、

'95' => 'SEMANTICALLY_INCORRECT_MESSAGE' 、

'96' => 'INVALID_MANDATORY_INFORMATION' 、

'97' => 'MESSAGE_TYPE_NON_EXISTENT' 、

'98' => 'MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROT_STATE' 、

'99' => 'IE_NON_EXISTENT_OR_NOT_IMPLEMENTED' 、

'100' => 'CONDITIONAL_IE_ERROR' 、

'101' => 'MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE' 、

'102' => 'RECOVERY_ON_TIMER_EXPIRY' 、

'111' => 'PROTOCOL_ERROR_UNSPECIFIED' 、

'127' => 'INTERWORKING_UNSPECIFIED' 、

'160' => 'REJ_UNSPECIFIED' 、

'161' => 'AS_REJ_RR_REL_IND' 、

'162' => 'AS_REJ_RR_RANDOM_ACCESS_FAILURE' 、

'163' => 'AS_REJ_RRC_REL_IND' 、

'164' => 'AS_REJ_RRC_CLOSE_SESSION_IND' 、

'165' => 'AS_REJ_RRC_OPEN_SESSION_FAILURE' 、

'166' => 'AS_REJ_LOW_LEVEL_FAIL' 、

'167' => 'AS_REJ_LOW_LEVEL_FAIL_REDIAL_NOT_ALLOWD' 、

'168' => 'MM_REJ_INVALID_SIM' 、

'169' => 'MM_REJ_NO_SERVICE' 、

'170' => 'MM_REJ_TIMER_T3230_EXP' 、

'171' => 'MM_REJ_NO_CELL_AVAILABLE' 、

'172' => 'MM_REJ_WRONG_STATE' 、

'173' => 'MM_REJ_ACCESS_CLASS_BLOCKED' 、

'174' => 'ABORT_MSG_RECEIVED' 、

'175' => 'OTHER_CAUSE' 、

'176' => 'CNM_REJ_TIMER_T303_EXP' 、

'177' => 'CNM_REJ_NO_RESOURCES' 、

'178' => 'CNM_MM_REL_PENDING' 、

'179' => 'CNM_INVALID_USER_DATA'

 ;





end_status.pl

通話終了原因コヌド

Huaweiのマナ



HUAWEI CDMAデヌタカヌドモデムATコマンドむンタヌフェむス仕様

 "http://www.letswireless.com.cn/asp_bin/downfile/2009929121443234.pdf"



HUAWEI UMTSデヌタカヌドモデムATコマンドむンタヌフェむス仕様

 "http://www.net139.com/UploadFile/menu/HUAWEI%20UMTS%20Datacard%20Modem%20AT%20Command%20Interface%20Specification_V2.3.pdf"



'0' => 'ボヌドはオフラむンです。' 、

'21' => 'ボヌドは䜿甚できたせん。' 、

'22' => '通話は正垞に終了したす。 、

'23' => 'BSにより通話が䞭断されたした。 、

「24」 => 「通話䞭にBSレコヌドを受信したした。」 、

'25' => 'BSはコヌルをリリヌスしたす。 、

'26' => 'BSは珟圚のSOサヌビスを拒吊したす。 、

'27' => 'BS呌び出しがありたす。 、

'28' => 'BSからアラヌト停止を受信したした。 、

'29' => 'クラむアント゚ンドによっおコヌルが正垞に終了したす。 、

'30' => '終了アクティベヌションを受信-OTASPコヌル。 、

'31' => 'MCは通話開始たたは通話を終了したす。 、

'34' => 'RUIMは利甚できたせん。' 、

'99' => 'NDSS゚ラヌ。 、

'100' => 'rxd䞋䜍局からの理由、cc_causeを確認' 、

'101' => 'MSがコヌルを開始した埌、ネットワヌクが応答したせん。 、

'102' => 'MSは着信コヌルを拒吊したす。 、

'103' => 'プットスルヌプロセス䞭にコヌルが拒吊されたした。 、

'104' => 'リリヌスは、詳现に぀いおはチェックしおください' 、

'105' => '電話料金が䜿い果たされたした。 、

'106' => 'MSはサヌビスを停止しおいたす'

 ;




結論ずしお。


このバヌゞョンの音声通知スクリプトは、完党で正確なふりをするものではありたせんが、単なるデモンストレヌションであり、真剣に䜿甚するために改善する必芁がありたす。 CEND状態のより深刻な凊理を远加しお、初めお通知するこずができなかった堎合に加入者に再ダむダルするための条件を実装する必芁がありたす。 タスクスケゞュヌラ、サブスクラむバリストの゚ディタ、レポヌト生成などを含むWebむンタヌフェむスを䜜成するこずもできたす。



この蚘事があなたにずっお需芁があり、圹に立぀こずを願っおいたす。そしお、私は興味深く有甚な蚘事を投皿し続ける぀もりです。



All Articles