2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Приём телефонных звонков на 3G роутер
Сообщение25.06.2019, 09:09 


07/10/15

2400
Доброго времени суток. Возникла интересная задача:
Есть простейший Wi-Fi роутер с возможностью подключения 3G модема, используемый для раздачи мобильного интернета в локальную сеть. Эта функция более-менее работает. Но есть ещё необходимость совершать с номера SIM голосовые вызовы, по крайней мере, хотя бы принимать.
С этой целью, через USB разветвитель, в роутер была установлена USB звуковая карта. Привходящем вызове - сигнал есть (жужжание), с прекращением вызова сигнал исчезает. Т.е. вызов как бы проходит. Но тут возникает проблема, как "снять трубку"? т.е. как принять вызов?
пробовали замыкать микрофонный вход звуковой карты, и подобные манипуляции - ничего не помогает.

Может кто знает какможно решить проблему? Роурер работает под OpenWrt, для звуковой карты установлены модули kmod-sound-core и
kmod-usb-audio. Может нужно поставить ещё какие то программные модули?
Вообще, хотелось бы подключить к роутеру проводной телефон. Может есть какие нибудь USB адаптеры для этой цели.

О том, что существуют роутеры с Voip выходом, как раз для этого, я осведомлён, например Huawei B315s22 5700. Но задача состоит в том, чтобы организовать такую функцию с имеющимся оборудованием, т.к. оно уже много где задействовано.

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение02.07.2019, 07:15 


07/10/15

2400
Появились некоторые сдвиги.
В сети пишут, что модем определяется как 3 виртуальных порта. USB0 и USB2 служат для AT команд, а USB1 для передачи звука.
Через Putty я обнаружил 3 устройства: ttyUSB0, ttyUSB1, ttyUSB2. Команды посылал в USB2, с него же считывал ответ.
Вызов и приём звонков работают.
При входящих в USB2 появляются сообщения RING. Снятие трубки осуществляется записью в этот порт команды АТА. После этого, для того чтобы получить звуковые данные, в этот же порт нужно записать команду AT^DDSETEX=2. После её выполнения, звуковые данные входящего вызова поступают в порт USB1.

В сети есть информация, что звук 3g модема идёт одноканальный, в формате PCM 8кГц, 16 бит, signed.
Чтобы послушать, вместо Putty пришлось писать простенькую консольную программу. Работает она так: создаётся 4 звуковых буфера, размеров 4096 байт, фиксируются в памяти и передаются в поток, где они последовательно заполняются данными с USB1 и передаются в очередь звукового драйвера. В общем, звук появился, но о качестве и говорить не приходится. Слышится какое то жужжанье - скрипение, интенсивность которого явно находится в строгой зависимости от громкости голоса исходящего вызова. Но саму речь разобрать невозможно. Может ошибка в программе, привожу код функции потока, в которой происходит вся обработка
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
static DWORD  __stdcall  put_audio(void*  param) {

                WAVEHDR* whdr = reinterpret_cast<WAVEHDR*>(param);

                Telnet*  pSOC = reinterpret_cast<Telnet*>(whdr[0].dwUser);
                HWAVEOUT*  phWO = reinterpret_cast<HWAVEOUT*>(whdr[1].dwUser);
               
                static int n_play=0, n_set=0, pos=0;

                static char buffer[BUFFER_LENGTH];                       // буфер для чтения данных порта USB
                char uu[100];
                int ds=0;                                               // число неумещающихся семплов

                while(1) {
       
                        int  n_byte  = pSOC->read_data(buffer);
                        if (n_byte == 0) continue;

                        _itoa(n_byte,uu,10);         // вывод числа считанных бит
                        printf(uu); printf("/n");

                       
                        if(n_byte == SOCKET_ERROR)
                                {puts("\nПроизошёл сброс при чтение данных сервером !!!"); break;}
                        if (pos+n_byte <= 4096){
                                memcpy(whdr[n_set].lpData+pos, buffer, n_byte);
                                pos+=n_byte; if (pos==4096)
                                                                {waveOutWrite(*phWO, &whdr[n_set], sizeof(whdr[n_set])); pos=0; n_set++; if (n_set==4) n_set=0; }
                        }
                        else {
                                ds=pos+n_byte-4096;
                                memcpy(whdr[n_set].lpData+pos, buffer, n_byte-ds);
                                waveOutWrite(*phWO, &whdr[n_set], sizeof(whdr[n_set]));

                                n_set++; if (n_set==4) n_set=0;
                                memcpy(whdr[n_set].lpData, buffer+n_byte-ds, ds);
                                pos+=n_byte; pos-=4096;
                        }
                        if (pos%2!=0) pos--;   // контроль чётности

                }
                return 0U;
     }
 


Но может быть дело и не в программе, а проблемы с кодировкой. В сети пишут, что для передачи звука нужно записывать в USB1 каждые 0,2 сек по 320 байт звука вышеуказанного формата. Этого я понять не могу. Ведь 320/2/0,2=800 Гц, а не 8000. Что же получается, нужно записывать с пропусками, или как? Может тогда и при чтении данные нужно как то модифицировать?

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение02.07.2019, 21:21 


07/10/15

2400
Записал сигнал. На первый взгляд нормальный
Изображение
но при детальном рассмотрении становится видно такое
Изображение
Частота дискретизации 8000 Гц глубина 16 бит, signed, всё как написано,
но форма сигнала явно искажена. Причём, речь можно даже разобрать, но очень плохо.

Что характерно, на сигнале отчётливо прослеживаются сменяющие друг друга высокочастотные и низкочастотные сегменты. Их длительность составляет 20 мс, т.е. 320 байт - как раз длинна пакета. Может это такая кодировка?

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение02.07.2019, 22:45 
Заслуженный участник


20/08/14
11787
Россия, Москва
Andrey_Kireew в сообщении #1402615 писал(а):
В сети пишут, что для передачи звука нужно записывать в USB1 каждые 0,2 сек по 320 байт звука вышеуказанного формата. Этого я понять не могу. Ведь 320/2/0,2=800 Гц, а не 8000.
Возможно тупая опечатка и время 20мс (не все в сети научились нолики подсчитывать после запятой), тогда скорость сходится. Да и вообще время 200мс как-то слишком велико для realtime звука, а вот 20мс задержку человек вроде бы (емнип) не улавливает.

По детальному графику, попробуйте unsigned, а также unsigned с проинвертированным старшим битом.

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 01:00 


14/01/11
3041
Andrey_Kireew в сообщении #1402748 писал(а):
но при детальном рассмотрении становится видно такое

А на спектрограмме сигнала ничего подозрительного не видно? Наверняка в канале присутствует какая-то служебная субтональная сигнализация, какая именно - надо, видимо, искать в гостах по электросвязи. Например, в аналоговом радио для этого используются частоты, меньшие 300 Гц.

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 01:42 


07/10/15

2400
Спасибо, что откликнулись!
На счёт 20мс я уже догадался (поделил объём принятого пакета на реальное время передачи - получилось примерно 16000, как раз 2 байта на семпл, при частоте дискретизации 8 кГц).
С кодировкой пока ничего не выходит. unsigned я уже пробовал, получается только хуже - весь сигнал оказывается на границах. Старший бит, тоже попробовал менять - толку нет. Но, надеюсь всё дело в этом, данные ведь цифровые, не могли же они так исказиться с канале Wi-fi.
В общем буду думать дальше ...

Sender в сообщении #1402809 писал(а):
А на спектрограмме сигнала ничего подозрительного не видно?

Видно:
Изображение
есть большой максимум на 300 Гц, явно какая то помеха.
Фильтровать я пробовал - получается только хуже. Спектры у них перекрываются.
В общем, оказывается всё не так то просто.

-- 03.07.2019, 02:44 --

Sender в сообщении #1402809 писал(а):
видимо, искать в гостах по электросвязи

если только в китайских, модем то ведь Huawei

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 09:26 


14/01/11
3041
Andrey_Kireew в сообщении #1402817 писал(а):
если только в китайских, модем то ведь Huawei

А, меня смутила фраза
Andrey_Kireew в сообщении #1401372 писал(а):
Вообще, хотелось бы подключить к роутеру проводной телефон.

Тогда всё ещё проще, изучайте стандарт GSM. :-)

-- Ср июл 03, 2019 09:30:38 --

Кстати, заметна симметрия спектра относительно 4 кГц. Хм, ладно бы относительно нуля.

-- Ср июл 03, 2019 09:45:55 --

А, так у нас дискретизация 8 кГц. Похоже на алиасинг.

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 10:05 
Аватара пользователя


11/12/16
13877
уездный город Н
Sender в сообщении #1402849 писал(а):
А, так у нас дискретизация 8 кГц. Похоже на алиасинг.


+1

ИМХО, при частоте дискретизации 8 кГц надо фильтровать высокие с частой среза фильтра не выше 3-4 кГц.

Есть большие сомнения, что там 8кГц, 16 бит.
Пик около 300 Гц весьма подозрителен. Такое впечатление, что в потоке не "чистый" PCM, а что-то с заголовками или синхронизацией.

Andrey_Kireew
А точную марку модема можете сообщить?

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 10:23 


07/10/15

2400
На счёт спектра - это просто модуль fft, просто построил по быстрому. Всё что выше 4000Гц это зеркальное отражение, на него обращать внимание не нужно.
Высокие частоты в спектре действительно есть, причём только на отрицательных полуволнах сигнала, см. картинка сверху. Но есть подозрение, что это проблема кодировки. Сигнал то цифровой, откуда там возьмутся помехи? Ну и некоторые семплы будто бы искусственно "занулены", собственно от этого ВЧ составляющая и наблюдается. Похоже на проблемы с порядком байт, которые периодически то появляются то пропадают. В общем не знаю, что это такое.

Модем E173, но у них там, кажется система одинаковая у всех

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 12:37 
Аватара пользователя


11/12/16
13877
уездный город Н
Andrey_Kireew

какой результат команд
Код:
AT^CVOICE=?
и
Код:
AT^CVOICE?


-- 03.07.2019, 12:42 --

Для информации:

Тут pdf AT-командами, наиболее полный из тех, что нашел.

тут похожая проблема, но оказалось, что файл не бинарный писали. В остальном все заработало.

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 13:09 


07/10/15

2400
Спасибо EUgeneUS, сейчас почитаю. На счёт AT команд проблем вроде нет, всё работает как надо. Это я уже давно проверил. Иначе небыло бы звука вообще наверное, не плохого, не хорошего.

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 13:30 
Аватара пользователя


11/12/16
13877
уездный город Н
Andrey_Kireew

Вы все таки посмотрите, что Вам выдаст команда, которая без знака равно.
Написано, что должна выдать параметры PCM, которые модем использует.

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 13:48 


07/10/15

2400
Ответ ^CVOICE:0,8000,16,20
я так понимаю, 8000Гц, 16бит, 20 мс. Ноль пока не знаю, что означает, а остальное всё так как я и думал.

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 13:58 
Аватара пользователя


11/12/16
13877
уездный город Н
Andrey_Kireew в сообщении #1402939 писал(а):
Ноль пока не знаю, что означает

это mode, которая выставилась командой
Код:
AT^CVOICE=0
, т.е. ноль и должен быть.

Из того, что нашел, поток от модема - безо всяких "оберток", а вот, что нужно подавать в карту - это нужно смотреть в документацию на API к аудио софту.
Кстати, как параметры PCM указываются для того, чтобы карточка поняла, что они именно такие?

-- 03.07.2019, 13:59 --

А еще, Вы можете сохранить примерно 50 пакетов по 320 байт и куда-нибудь выложить?

 Профиль  
                  
 
 Re: Приём телефонных звонков на 3G роутер
Сообщение03.07.2019, 15:13 


07/10/15

2400
В общем я попробовал считывать сразу пакетами по 320 байт, в формате int16. Всё то же самое, вот 1 пакет
код: [ скачать ] [ спрятать ]
  1. -1 
  2. -1 
  3. -3 
  4. -513 
  5. -1 
  6. -1 
  7. -1 
  8. -1 
  9. -1 
  10. -3 
  11. 255 
  12. -512 
  13. -1 
  14. -1 
  15. -1 
  16. -1 
  17. -1 
  18. -3 
  19. 255 
  20. 768 
  21. 768 
  22. 768 
  23. -256 
  24. -1 
  25. -769 
  26. -1 
  27. -2 
  28. 767 
  29. 512 
  30. -512 
  31. -1 
  32. -1 
  33. -1 
  34. -1 
  35. -1 
  36. -3 
  37. -1 
  38. -1 
  39. 255 
  40. -256 
  41. -1 
  42. 255 
  43. 512 
  44. -256 
  45. -1 
  46. -513 
  47. -1 
  48. -1 
  49. -1 
  50. -3 
  51. 511 
  52. 512 
  53. -256 
  54. -1 
  55. -1 
  56. -1 
  57. -257 
  58. -1 
  59. -1 
  60. -1 
  61. -1 
  62. -1 
  63. -3 
  64. -1 
  65. -1 
  66. -257 
  67. -1 
  68. -2 
  69. 255 
  70. -768 
  71. -1 
  72. -2 
  73. -513 

Это момент тишины. Я заметил, что числа "пляшут" возле 0, 255, 512 и т.д. Явно, что то с кодировкой.

-- 03.07.2019, 16:16 --

Вообще, там повсюду фигурирует число 255, уж не знаю почему. Вроде как старший бит char откуда то вылезает.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group