Пользователь
0,0
рейтинг
9 ноября 2009 в 20:56

Разработка → Прогноз погоды по телефону

Решил я, что получится весьма полезная возможность собираясь на работу послушать прогноз погоды на громкоговорителе телефона нажав одну запрограммированную кнопку. Как я это сделал смотрите под катом.



Первое что нам потребуется это сам прогноз погоды. Я решил его брать с сайта gismeteo.ru.
Как я это сделал:
Зашел на сайт gismeteo.ru нашел свой город.
Нажал в шапке ссылку «Информеры».
На открывшейся странице нашел текст «Данные в формате XML» и взял ссылку с кнопки «получить код».
Таким образом мы теперь знаем как нам получать свежий прогноз в формате XML.

Теперь нужно его сохранить для последующей обработки:
Велосипед изобретать я не стал и написал скрипт на bash из двух строк


Copy Source | Copy HTML
  1. #!/bin/bash
  2. cd /usr/isp/weather
  3. /usr/bin/wget 'http://informer.gismeteo.ru/xml/34214_1.xml' -O ./34214_1.xml
  4.  


где informer.gismeteo.ru/xml/34214_1.xml и есть ссылка для вашего города. Команда wget скачивает наш XML и записывает его в фаил 34214_1.xml в текущем каталоге, он нам потребуется далее. Что бы прогноз был всегда свежим необходимо этот скрипт записать на выполнение в cron например вот так:

*/60 * * * * /usr/isp/weather/weather_up.sh

Алгоритм озвучивающий прогноз я решил сделать на Perl который взаимодействует с Asterisk через AGI. От нашего алгоритма требуется произвести разбор XML файла и вывести в stdout последовательность строк с командами для Asterisk на воспроизведение звуковых файлов примерно вот так:

Copy Source | Copy HTML
  1. EXEC Playback weather/Po_dannym_Gismeteo ""
  2. EXEC Playback weather/tod/dnem ""
  3. EXEC Playback weather/m/15ogo ""
  4. EXEC Playback weather/budet ""
  5. EXEC Playback weather/cloudiness/pasmurno ""
  6. EXEC Playback weather/precipitation/dozhd' ""<br/>
    EXECPlayback weather/temp_vosduha_sostavit ""<br/>EXECPlayback weather/digits/20 ""<br/>EXECPlayback weather/digits/2 ""<br/>EXECPlayback weather/Do ""<br/>EXECPlayback weather/digits/20 ""<br/>EXECPlayback weather/gradusov_C ""<br/>EXECPlayback weather/Skorost'_vetra_sostavit ""
  7. EXEC Playback weather/digits/5 ""
  8. EXEC Playback weather/Do ""
  9. EXEC Playback weather/digits/3 ""
  10. EXEC Playback weather/metrov_v_sekundu ""
  11. EXEC Playback weather/Atmosfernoe_davlenie_sostavit ""
  12. EXEC Playback weather/digits/700 ""
  13. EXEC Playback weather/digits/40 ""
  14. EXEC Playback weather/digits/7 ""
  15. EXEC Playback weather/Do ""
  16. EXEC Playback weather/digits/700 ""
  17. EXEC Playback weather/digits/40 ""
  18. EXEC Playback weather/digits/5 ""
  19. EXEC Playback weather/milimetrov_rtutnogo_stolba ""


Как вы заметели звуковых записей придётся подготовить очень много, но ведь это раз и навсегда.

В моём варианте в некоторых записанных фразах присутствует слово «от». Например: Atmosfernoe_davlenie_sostavit читать как «Атмосферное давление составит от».

Собственно для разбора XML я использовал модуль XML::Simple он мне показался самым простым в использовании. Для замены XML тэгов на необходимые мне строки для озвучивания применил списки:

Copy Source | Copy HTML
  1. my $date_name = {
  2.     1 => ["EXEC Playback weather\/m\/1ogo \"\"\n"],
  3.     2 => ["EXEC Playback weather\/m\/2ogo \"\"\n"],
  4.     3 => ["EXEC Playback weather\/m\/3ogo \"\"\n"],
  5. .....
  6.  

С алгоритмом для преобразования чисел в набор команд для воспроизведения цифр решил тоже не изобретать велосипед и взял готовый алгоритм преобразования денег в пропись (к сожалению уже не вспомню чей), заменил в нужных местах строки такие как "один" на "Playback weather\/digits\/1 \"\"\n" и алгоритм адаптирован (куча времени сэкономлена).
Думаю теперь всё будет понятно, пришло время посмотреть на скрипт:


Copy Source | Copy HTML
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use XML::Simple;
  5. use Data::Dumper;
  6.  
  7. my $date_name = {
  8.     1 => ["EXEC Playback weather\/m\/1ogo \"\"\n"],
  9.     2 => ["EXEC Playback weather\/m\/2ogo \"\"\n"],
  10.     3 => ["EXEC Playback weather\/m\/3ogo \"\"\n"],
  11.     4 => ["EXEC Playback weather\/m\/4ogo \"\"\n"],
  12.     5 => ["EXEC Playback weather\/m\/5ogo \"\"\n"],
  13.     6 => ["EXEC Playback weather\/m\/6ogo \"\"\n"],
  14.     7 => ["EXEC Playback weather\/m\/7ogo \"\"\n"],
  15.     8 => ["EXEC Playback weather\/m\/8ogo \"\"\n"],
  16.     9 => ["EXEC Playback weather\/m\/9ogo \"\"\n"],
  17.     10 => ["EXEC Playback weather\/m\/10ogo \"\"\n"],
  18.     11 => ["EXEC Playback weather\/m\/11ogo \"\"\n"],
  19.     12 => ["EXEC Playback weather\/m\/12ogo \"\"\n"],
  20.     13 => ["EXEC Playback weather\/m\/13ogo \"\"\n"],
  21.     14 => ["EXEC Playback weather\/m\/14ogo \"\"\n"],
  22.     15 => ["EXEC Playback weather\/m\/15ogo \"\"\n"],
  23.     16 => ["EXEC Playback weather\/m\/16ogo \"\"\n"],
  24.     17 => ["EXEC Playback weather\/m\/17ogo \"\"\n"],
  25.     18 => ["EXEC Playback weather\/m\/18ogo \"\"\n"],
  26.     19 => ["EXEC Playback weather\/m\/19ogo \"\"\n"],
  27.     20 => ["EXEC Playback weather\/m\/10ogo \"\"\n"],
  28.     21 => ["EXEC Playback weather\/m\/21ogo \"\"\n"],
  29.     22 => ["EXEC Playback weather\/m\/22ogo \"\"\n"],
  30.     23 => ["EXEC Playback weather\/m\/23ogo \"\"\n"],
  31.     24 => ["EXEC Playback weather\/m\/24ogo \"\"\n"],
  32.     25 => ["EXEC Playback weather\/m\/25ogo \"\"\n"],
  33.     26 => ["EXEC Playback weather\/m\/26ogo \"\"\n"],
  34.     27 => ["EXEC Playback weather\/m\/27ogo \"\"\n"],
  35.     28 => ["EXEC Playback weather\/m\/28ogo \"\"\n"],
  36.     29 => ["EXEC Playback weather\/m\/29ogo \"\"\n"],
  37.     30 => ["EXEC Playback weather\/m\/30ogo \"\"\n"],
  38.     31 => ["EXEC Playback weather\/m\/31ogo \"\"\n"]
  39. };
  40.  
  41. my $hour_name = {
  42.      0 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  43.     1 => ["EXEC Playback weather\/hour\/chas \"\"\n"],
  44.     2 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
  45.     3 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
  46.     4 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
  47.     5 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  48.     6 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  49.     7 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  50.     8 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  51.     9 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  52.     10 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  53.     11 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  54.     12 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  55.     13 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  56.     14 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  57.     15 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  58.     16 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  59.     17 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  60.     18 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  61.     19 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  62.     20 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
  63.     21 => ["EXEC Playback weather\/hour\/chas \"\"\n"],
  64.     22 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
  65.     23 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
  66. };
  67.  
  68. my $m_name = {
  69.     1 => ["EXEC Playback weather\/m\/yanvarya \"\"\n"],
  70.     2 => ["EXEC Playback weather\/m\/fevralya \"\"\n"],
  71.     3 => ["EXEC Playback weather\/m\/marta \"\"\n"],
  72.     4 => ["EXEC Playback weather\/m\/aprelya \"\"\n"],
  73.     5 => ["EXEC Playback weather\/m\/maya \"\"\n"],
  74.     6 => ["EXEC Playback weather\/m\/iunya \"\"\n"],
  75.     7 => ["EXEC Playback weather\/m\/iylya \"\"\n"],
  76.     8 => ["EXEC Playback weather\/m\/avgusta \"\"\n"],
  77.     9 => ["EXEC Playback weather\/m\/sentyabrya \"\"\n"],
  78.     10 => ["EXEC Playback weather\/m\/octyabya \"\"\n"],
  79.     11 => ["EXEC Playback weather\/m\/noyabrya \"\"\n"],
  80.     12 => ["EXEC Playback weather\/m\/decabrya \"\"\n"]
  81. };
  82.  
  83. my $tod_name = {
  84.      0 => ["EXEC Playback weather\/tod\/noch'u \"\"\n"],
  85.     1 => ["EXEC Playback weather\/tod\/utrom \"\"\n"],
  86.     2 => ["EXEC Playback weather\/tod\/dnem \"\"\n"],
  87.     3 => ["EXEC Playback weather\/tod\/vecherom \"\"\n"]
  88. };
  89.  
  90. my $cloudiness_name = {
  91.      0 => ["EXEC Playback weather\/cloudiness\/yasno \"\"\n"],
  92.     1 => ["EXEC Playback weather\/cloudiness\/malooblachno \"\"\n"],
  93.     2 => ["EXEC Playback weather\/cloudiness\/oblachno \"\"\n"],
  94.     3 => ["EXEC Playback weather\/cloudiness\/pasmurno \"\"\n"]
  95. };
  96.  
  97. my $precipitation_name = {
  98.     4 => ["EXEC Playback weather\/precipitation\/dozhd' \"\"\n"],
  99.     5 => ["EXEC Playback weather\/precipitation\/liven' \"\"\n"],
  100.     6 => ["EXEC Playback weather\/precipitation\/sneg \"\"\n"],
  101.     7 => ["EXEC Playback weather\/precipitation\/sneg \"\"\n"],
  102.     8 => ["EXEC Playback weather\/precipitation\/groza \"\"\n"],
  103.     9 => [""],
  104.     10 => ["EXEC Playback weather\/precipitation\/bez_osadkov \"\"\n"]
  105. };
  106.  
  107. my $wind_direction_name = {
  108.      0 => ["EXEC Playback weather\/wind_direction\/severnyi \"\"\n"],
  109.     1 => ["EXEC Playback weather\/wind_direction\/severo-vostochnyi \"\"\n"],
  110.     2 => ["EXEC Playback weather\/wind_direction\/vostochno-uzhnyi \"\"\n"],
  111.     3 => ["EXEC Playback weather\/wind_direction\/ugo-zapadnyi \"\"\n"]
  112. };
  113.  
  114.  
  115. my $xmlWeather = new XML::Simple(keeproot => 1,searchpath => ".", forcearray => 1, suppressempty => '');
  116. my $xmlData1 = $xmlWeather->XMLin('/usr/isp/weather/34214_1.xml');
  117. my $xmlData = $xmlData1->{MMWEATHER}[ 0]->{REPORT}[ 0]->{TOWN}[ 0]->{FORECAST};
  118.  
  119. $| = 1;
  120. while( <STDIN> ) {
  121.   chomp($_);
  122.     last if length($_) ==  0;
  123. }
  124.  
  125. # "Po dannym Gismeteo"
  126. print "EXEC Playback weather\/Po_dannym_Gismeteo \"\"\n";
  127. my $i= 0;
  128. for ($i =  0; $i < 4; $i++)
  129. {
  130. print $tod_name->{$xmlData->[$i]->{tod}}->[ 0];
  131. print $date_name->{$xmlData->[$i]->{day}}->[ 0];
  132. print $m_name->{$xmlData->[$i]->{month}}->[ 0];
  133. #
  134. print "EXEC Playback weather\/budet \"\"\n";
  135. print $cloudiness_name->{$xmlData->[$i]->{PHENOMENA}[ 0]->{cloudiness}}->[ 0];
  136. print $precipitation_name->{$xmlData->[$i]->{PHENOMENA}[ 0]->{precipitation}}->[ 0];
  137. # Temp
  138. print "EXEC Playback weather\/temp_vosduha_sostavit \"\"\n";
  139. print digit_string( $xmlData->[$i]->{TEMPERATURE}[ 0]->{max} );
  140. print "EXEC Playback weather\/Do \"\"\n";
  141. print digit_string( $xmlData->[$i]->{TEMPERATURE}[ 0]->{min} );
  142. print "EXEC Playback weather\/gradusov_C \"\"\n";
  143. # Veter
  144. print "EXEC Playback weather\/Skorost'_vetra_sostavit \"\"\n";
  145. print digit_string( $xmlData->[$i]->{WIND}[ 0]->{max} );
  146. print "EXEC Playback weather\/Do \"\"\n";
  147. print digit_string( $xmlData->[$i]->{WIND}[ 0]->{min} );
  148. print "EXEC Playback weather\/metrov_v_sekundu \"\"\n";
  149. # Atmosfernoe davlenie
  150. print "EXEC Playback weather\/Atmosfernoe_davlenie_sostavit \"\"\n";
  151. print digit_string( $xmlData->[$i]->{PRESSURE}[ 0]->{max} );
  152. print "EXEC Playback weather\/Do \"\"\n";
  153. print digit_string( $xmlData->[$i]->{PRESSURE}[ 0]->{min} );
  154. print "EXEC Playback weather\/milimetrov_rtutnogo_stolba \"\"\n";
  155.  
  156. }
  157.  
  158.  
  159. #===================================================================================================
  160. #===================================================================================================
  161. #===================================================================================================
  162. sub digit_string {
  163.     my $digit = shift;
  164.     local $_;
  165.  
  166.     my $sign = 1 if $digit =~ s/^-+//;
  167.  
  168.  
  169.     $digit =~ s#^0+##;
  170.     my ( $b_dig, $s_dig ) = ( split( m/[,.]/, $digit, 2 ) );
  171. $s_dig ="";
  172. #
  173. # Очищаем числа от `лишних' символов ( 100_000,43 )
  174. #
  175.     if ( defined $b_dig and length $b_dig ) {
  176. #        $b_dig =~ s#[^\d]##sg;
  177.     } else {
  178.         $b_dig = "";
  179.     }
  180.     if ( defined $s_dig and length $s_dig ) {
  181. #        $s_dig =~ s#[^\d]##sg;
  182.     } else {
  183.         $s_dig = "";
  184.     }
  185. #
  186. # Округляем копейки в большую сторону, если в результате округления
  187. # получаем рубль, то приплюсовываем его к b_dig ( рублям )
  188. #
  189. #    if ( sprintf('%0.2f', "0.$s_dig" ) == 1 ) {
  190. #        $b_dig ++;
  191. #        $s_dig = '00';
  192. #    } else {
  193. #        $s_dig = substr( sprintf('%0.2f', "0.$s_dig" ), 2 );
  194. #    }
  195. #
  196.     my @array = split( //, ( $b_dig || 0 ) );
  197.  
  198. #
  199. # Определяем разрядность числа.
  200. #
  201.     my $class_id = int( scalar ( @array ) / 3);
  202.     $class_id++ if ( scalar ( @array ) % 3 );
  203. #
  204. # Неподдерживаемая разрядность.
  205. #
  206.     return $digit if $class_id > 5;
  207.  
  208.     my $digits_name = {
  209.              0 => ["EXEC Playback weather\/digits\/0 \"\"\n","",""],
  210.             1 => [["EXEC Playback weather\/digits\/1 \"\"\n","EXEC Playback weather\/digits\/1a \"\"\n"],"EXEC Playback weather\/digits\/10 \"\"\n","EXEC Playback weather\/digits\/100 \"\"\n"],
  211.             2 => [["EXEC Playback weather\/digits\/2 \"\"\n","EXEC Playback weather\/digits\/2e \"\"\n"],"EXEC Playback weather\/digits\/20 \"\"\n","EXEC Playback weather\/digits\/200 \"\"\n"],
  212.             3 => ["EXEC Playback weather\/digits\/3 \"\"\n","EXEC Playback weather\/digits\/30 \"\"\n","EXEC Playback weather\/digits\/300 \"\"\n"],
  213.             4 => ["EXEC Playback weather\/digits\/4 \"\"\n","EXEC Playback weather\/digits\/40 \"\"\n","EXEC Playback weather\/digits\/400 \"\"\n"],
  214.             5 => ["EXEC Playback weather\/digits\/5 \"\"\n","EXEC Playback weather\/digits\/50 \"\"\n","EXEC Playback weather\/digits\/500 \"\"\n"],
  215.             6 => ["EXEC Playback weather\/digits\/6 \"\"\n","EXEC Playback weather\/digits\/60 \"\"\n","EXEC Playback weather\/digits\/600 \"\"\n"],
  216.             7 => ["EXEC Playback weather\/digits\/7 \"\"\n","EXEC Playback weather\/digits\/70 \"\"\n","EXEC Playback weather\/digits\/700 \"\"\n"],
  217.             8 => ["EXEC Playback weather\/digits\/8 \"\"\n","EXEC Playback weather\/digits\/80 \"\"\n","EXEC Playback weather\/digits\/800 \"\"\n"],
  218.             9 => ["EXEC Playback weather\/digits\/9 \"\"\n","EXEC Playback weather\/digits\/90 \"\"\n","EXEC Playback weather\/digits\/900 \"\"\n"],
  219.         };
  220.  
  221.     my $dec_digits = {
  222.                 11 => "EXEC Playback weather\/digits\/11 \"\"\n",
  223.                 12 => "EXEC Playback weather\/digits\/12 \"\"\n",
  224.                 13 => "EXEC Playback weather\/digits\/13 \"\"\n",
  225.                 14 => "EXEC Playback weather\/digits\/14 \"\"\n",
  226.                 15 => "EXEC Playback weather\/digits\/15 \"\"\n",
  227.                 16 => "EXEC Playback weather\/digits\/16 \"\"\n",
  228.                 17 => "EXEC Playback weather\/digits\/17 \"\"\n",
  229.                 18 => "EXEC Playback weather\/digits\/18 \"\"\n",
  230.                 19 => "EXEC Playback weather\/digits\/19 \"\"\n"
  231.             };
  232.  
  233.     my $digits_class = {
  234.             '-1'=> [ 1,"","",""],
  235.              0 => [  0,"","",""],
  236.             1 => [ 1, "EXEC Playback weather\/digits\/tysiacha \"\"\n","EXEC Playback weather\/digits\/tysiach \"\"\n","EXEC Playback weather\/digits\/tysiachi \"\"\n" ],
  237.             2 => [  0, "EXEC Playback weather\/digits\/million \"\"\n","EXEC Playback weather\/digits\/millionov \"\"\n","EXEC Playback weather\/digits\/milliona \"\"\n" ],
  238.             3 => [  0, "EXEC Playback weather\/digits\/milliard \"\"\n","EXEC Playback weather\/digits\/milliardov \"\"\n","EXEC Playback weather\/digits\/milliarda \"\"\n" ],
  239.             4 => [  0, "EXEC Playback weather\/digits\/trillion \"\"\n","EXEC Playback weather\/digits\/trillionov \"\"\n","EXEC Playback weather\/digits\/trilliona \"\"\n"],
  240.         };
  241. #
  242. # Определяем длину левой `тройки'...
  243. #
  244.     my $id =  0;
  245.     unless ( ( scalar @array ) % 3 ) {
  246.         $id = 2;
  247.     } else {
  248.         $id = ( ( scalar @array ) % 3 ) - 1;
  249.     }
  250.  
  251.     my $str = '';
  252.     my $sub_str =  0;
  253.     my $tvar =  0;
  254.  
  255.     if ( $array[ 0] ==  0 ) {
  256. #
  257. # Если рублей таки ноль, то так и пишем 'ноль рублей',
  258. # если не надо то просто закомнтировать следующую строку...
  259. #
  260.         $str .= $digits_name->{'0'}->[ 0] . ' ' . $digits_class->{'0'}->[2] . ' ';
  261.     } else {
  262.         while ( defined ( $_ = shift @array ) ) {
  263.             if ( $_ >  0 ) {
  264.                 if ( $_ == 1 and $id == 1 ) {
  265. #
  266. # Считаем сумму для использования в sub num()
  267. #
  268.                     $sub_str += $_ * 10;
  269.                     if ( defined ( $tvar = shift @array ) and $tvar >  0 ) {
  270.                         $str .= $dec_digits->{ $_ . $tvar };
  271.                         $sub_str += $tvar;
  272.                         $id--;
  273.                     } else {
  274.                         unshift @array, $tvar;
  275.                         if ( ref $digits_name->{$_}->[$id] eq 'ARRAY' ) {
  276. #                            $str .= $digits_name->{$_}->[$id]->[$digits_class->{$class_id-1}->[0]];
  277.                         } else {
  278.                             $str .= $digits_name->{$_}->[$id];
  279.                         }
  280.                     }
  281.                 } else {
  282. #
  283. # Считаем сумму для использования в sub num()
  284. #
  285.                     $sub_str += ( $_ * ( 10 ** $id ) );
  286.                     if ( ref $digits_name->{$_}->[$id] eq 'ARRAY' ) {
  287.                         $str .= $digits_name->{$_}->[$id]->[$digits_class->{$class_id-1}->[ 0]];
  288.                     } else {
  289.                         $str .= $digits_name->{$_}->[$id];
  290.                     }
  291.                 }
  292.                 $str .= ' ';
  293.             }
  294.             if ( --$id == -1 ) {
  295.                 $id = 2;
  296.                 $class_id--;
  297.                 if ( $sub_str >  0 ) {
  298.                     $str .= num( $sub_str, ( @{ $digits_class->{$class_id} } )[ 1 .. 3 ] ) . ' ';
  299.                 } elsif ( $class_id ==  0 ) {
  300.                     $str .= $digits_class->{$class_id}->[2] . ' ';
  301.                 }
  302.                 $sub_str =  0;
  303.             }
  304.         }
  305.     }
  306.  
  307.     $str .= $s_dig . ' ' . num( $s_dig, ( @{ $digits_class->{ '-1' } } )[ 1 .. 3 ] );
  308.  
  309.     if ( defined $sign ) {
  310.         $str = "EXEC Playback weather\/digits/minus \"\"\n" . $str;
  311.     }
  312.  
  313.     $s_dig = substr( $str,  0, 1 );
  314. #
  315. # В том случае где оно пользовалось оказалось проще
  316. # так, чем через use locale & ucfirst...
  317. #
  318.     if ( $s_dig =~ tr/абвгдеёжзийклмнопрстуфхцчшщъыьэюя/АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ/ ) {
  319.         substr( $str,  0, 1, $s_dig );
  320.     }
  321.  
  322.     return $str;
  323. }
  324.  
  325. #
  326. # Используется при переводе денежного числа в строку прописью..
  327. #
  328.  
  329. sub num {
  330.     my $d1 = $_[ 0] % 10;
  331.     my $d2 = int( ( $_[ 0] % 100 ) / 10 );
  332.     return $_[2] if ( ( $d2 == 1 ) or ( $d1 =~ /[05-9]/ ) );
  333.     return $_[1] if ( $d1==1 );
  334.     return $_[3];
  335. }
  336.  


Далее нам необходимо научить Asterisk пользваться этим скриптом. Для этого в файле extensions.conf в нужном контексте прописываем вот так:


Copy Source | Copy HTML
  1. exten => XXXX,1,Wait(1)
  2. exten => XXXX,n,Answer()
  3. exten => XXXX,n,Agi(/usr/isp/weather/weather.pl)
  4. exten => XXXX,n,Hangup()
  5.  

Где XXXX номер который вы хотите присвоить сервису «Погода». У меня к примеру стоит плата Digium, через которую все желающие могут узнать погоду позвонив с любого телефона.
Вот и всё!
Чебукин Сергей @WiTPHG
карма
15,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (31)

  • 0
    Спасибо, полезно!
    А поделитесь готовыми звуковыми файлами? :)
    • +1
      Если четко поставите ТЗ, можно будет бесплатно записать в студии ivrvoice.ru.
  • +2
    Голос записан не мой, а владелец голоса будет против :)
    Но все желающие могу его послушать по номеру 8(4722) 784801.
    Или загляните на sip.magistraly.ru и пройдите регистрацию.
    • 0
      habra эффект goes offline :)
    • +3
      Ух ты, мне даже не понадобилось набирать первые пять цифр номера, чтобы дозвониться :)
    • 0
      а в этом ужасном программном телефоне надо только 784801 набирать?
      иначе он молчит, а с таким номером — разговор типа идет, только подогоды в Белгороде не слышу))
      • 0
        Чрез SIP клиент достаточно 784801.
        Настройки программы проверьте на странице помощи.
  • 0
    >Зашел на сайт gismetio.ru нашел свой город.

    На этом сайте, конечно, можно поискать свой город, но вряд ли это будет чем-то полезно.
  • +1
    А ведь есть речевой синтезатор festival
  • 0
    решение прекрасное.
    но мне удобнее воспринимать информацию зрительно — поэтому я просто гляжу на экран своего телефона, а он уже обновил по вай-фаю информацию о погоде.

    вам за решение — поклон )
  • 0
    прошу прощения, а зачем
    </span>
    в смене директории? предполагаю, немного съехала разметка…
    • 0
      Спасибо. +1
  • +2
    а можно подробнее, что за плата у вас такая?
  • 0
    Чорт…
  • 0
    идея — использовать ubot для чтения погоды, полученной через rss
    • 0
      буду скачивать и парсить питоном. потом вставлю осадки в приглашение командной строки или в статус мессенджера )
  • 0
    скрипт про погоду, а в комментах рубли :-)
  • –3
    Не люблю астериск. Да, можно делать такие ивращения, однако sipx нравится больше
  • +1
    ух ты, а у меня есть аналогичная разработка :-) правда в виде python-модуля к Sems, а в качестве sip-прокси Openser, работает в городе Оренбурге, номер 8 (3532) 405-505, голос женский и приятный :)
    • 0
      Эх, для Москвы бы, и по SIP снаружи… ;)
  • 0
    Надо бы стартапчик делать: привязать бота-говоруна ubot.ru к данным по прогнозам gismeteo.ru и выдавать готовые mp3-шки кому надо.
  • 0
    Я не спец в телефонии, но стоит задача сделать прозвонку абонентов. Есть обычный Voice-модем ZyXEL. Можно ли организовать с помощью Астерикса подобное. Или подскажите другую бесплатную прогу, желательно (но не обязательно) для Linux.
    • 0
      Вот тут пишут что можно использовать модем, сам не проверял. Нет таких модемов у меня.
      P.S.: Вообще всю серию статей «Asterisk и Linux: миссия IP-телефония» рекомендую к прочтению.
      • 0
        Спасибо, я читал эту статью, и именно абзац, где говорится о модемах, меня и заинтересовал. Но там нужно специальные модемы.

        Порылся в интернете — что-то простое можно реализовать на vgetty (дозвон и проигрывание файло с записью)
  • 0
    А для Москвы нет готового прогноза по SIP? Неохота астериск поднимать из-за этого, а позвонить на SIP URI и послушать прогноз хочется. :)
    • 0
      Отвечу сам себе: 100@sipnet.ru.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.