Perl скриптосъществяване на гласово повикване (известяване) чрез usb модем huawei e1550

По едно време, тъй като прекарах много време в командировки, закупих прекрасна играчка - usb модем Huawei e1550. Но дните на бързата младост отминаха и необходимостта от използване на това устройство по предназначение изчезна. Така той събираше прах на рафта ми няколко години. И още щеше да събира прах, но възникна задачата да се направи система за предупреждение. Тогава се сетих за модема. След като обмислих задачата, бях принуден да се откажа от SMS известията в полза на гласово набиране поради невъзможността да получа известие за четене на SMS. Решенията, базирани на Asterisk, ми се сториха малко тромави и след като прочетох дока на модема, реших сам да напиша дайлер.

Среда за разработка

операционна система: Linux Разпространение: openSuSe 12.3 Ядро: 3.7.10-1.16-desktop #1 SMP PREEMPT петък, 31 май 20:21:23 UTC 2013 (97c14ba) i686 i686 i386 GNU/Linux Език за програмиране: Perl usb модем: Huawei e1 5 50

Малко теория.

За да започнете работа с модема е достатъчно да отворите един от командните интерфейси за четене и запис като файл. За да изпратите команда към модема, трябва да я запишете в отворен интерфейсен файл. За да получите отговора на модема на тази команда, трябва да я прочетете от отворения интерфейсен файл.

Командите, които могат да бъдат дадени на модема, са AT команди Команди за модема Huawei e1550 и отговорите към тях са описани в неговата спецификация: HUAWEI CDMA Datacard Modem AT Command Interface Specification HUAWEI UMTS Datacard Modem AT Command Interface Specification

За да активирате гласовите функции на модема, трябва да подадете командата AT^CVOICE=0 Гласовите функции ще бъдат активирани, докато не бъдат деактивирани от командата AT^CVOICE=1

За да започнетеприемане / предаване на аудио информация към модема, трябва да превключите режима на работа на аудио порта на модема с командата AT ^ DDSETEX = 2 при всяко повикване

Аудио данните, които трябва да бъдат предадени към модема, трябва да имат следния формат: Честота на дискретизация: 8000 Hertz. Брой канали: 1 (моно). бита на цифровизация: 16 без знак.

Аудио данните трябва да се изпращат към аудио порта на модема на парчета от 320 байта на всеки 0,02 секунди.

След завършване на повикването модемът изпраща информация за повикването през втория команден интерфейс под формата на CEND съобщение изходен формат ^CEND:call_index, duration, end_status, cc_cause където: call_index е уникален идентификатор на повикването duration е продължителността на повикването в секунди end_status е кодът на състоянието на устройството след приключване на повикването cc_ca използване е кодът на причината за края на разговора

Така. Да започваме.

дайлерът ще се състои от 3 файла: huawey_voice_call.pl - директно самият скрипт за гласово набиране. list.01.pl — файл с данни за абонати. test.voice.raw — файл с гласово съобщение, записано в необходимия формат.

също така в края на статията ще бъдат представени 2 допълнителни файла: cc_cause.pl - съдържа кодовете на причините за края на разговора (cc_cause) end_status.pl - съдържа кодовете за състояние на устройството след края на разговора (end_status)

всички файлове в един архив (публикувах го на компютъра си, понякога компютърът е изключен)

$l_rx ))

  • $recive = $SENDPORT >;
  • $получи =
  • s / [n r] +// msg;

  • отпечатайте "RECIVE: [$recive] n " ако $VERBOSE && $получи;
  • >
  • $получи =
  • $l_rx ;

  • print "END RECIVE: [$recive] [$1] [$l_rx] n " if $VERBOSE ;
  • върнете $1;
  • >
  • # тази функция затваря предварително отворени модемни портове
  • sub exit_call
  • отпечатайте "ПРЕДУПРЕЖДЕНИЕТО ПРИКЛЮЧИ n ";
  • затваряне на $SENDPORT_WAV;
  • at_send ('AT+CHUP');
  • затваряне на $SENDPORT;
  • >
  • скриптосъществяване

    гласово

    скриптосъществяване

    perl

    perl

    Предоставям също допълнителни файлове cc_cause.pl и end_status.pl. Те не се използват в представената версия на скрипта, но в случай на усъвършенстване ще бъдат полезни.

    # кодове за причина за прекъсване на връзката (cc) # английски http://www.eversoft.net/dcc.html # български http://ru.wikipedia.org/wiki/Q.931 # huawei mana # HUAWEICDMADatacard ModemAT команден интерфейс спецификация # "http://www.letswireless.com.cn/asp_bin/downfile/200992912 144323 4.pdf" # # Спецификация на командния интерфейс на HUAWEICDMADatacard ModemAT # "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' );

    # коды Кодове за причина за край на повикване # маны по huawei # # Спецификация на командния интерфейс на HUAWEICDMADatacard ModemAT # "http://www.letswireless.com.cn/asp_bin/downfile/2009929121443234.pdf" # # Спецификация на командния интерфейс на HUAWEICDMADatacard ModemAT # "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 е извън услугата“ );

    В завършение.