Телефони SIP дар STM32F7-Discovery

Ҳама хонед

Чанде пеш мо навиштааст дар бораи чӣ гуна мо тавонистем телефони SIP-ро дар STM32F4-Discovery бо 1 МБ ROM ва 192 КБ RAM оғоз кунем) дар асоси Пахш. Дар ин ҷо бояд гуфт, ки ин версия ҳадди ақалл буд ва ду телефонро мустақиман бидуни сервер ва бо интиқоли овоз танҳо дар як самт пайваст мекард. Аз ин рӯ, мо тасмим гирифтем, ки телефони мукаммалро бо занг тавассути сервер, интиқоли овоз дар ҳар ду самт оғоз кунем, аммо дар айни замон дар андозаи хурдтарини хотира нигоҳ дорем.


Барои телефон, қарор дода шуд, ки барнома интихоб карда шавад simple_pjsua ҳамчун қисми китобхонаи PJSIP. Ин як барномаи ҳадди аққалест, ки метавонад дар сервер сабти ном шавад, зангҳоро қабул ва посух диҳад. Дар зер ман фавран тавсифи онро дар бораи STM32F7-Discovery иҷро мекунам.

Чӣ тавр давидан

  1. Танзимоти Embox
    make confload-platform/pjsip/stm32f7cube
  2. Ҳисоби зарурии SIP-ро дар файли conf/mods.config насб кунед.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    ки сервер сервери SIP аст (масалан, sip.linphone.org), Логин и гузарвожа - номи корбар ва пароли ҳисоб.

  3. Ҷамъоварии Embox ҳамчун як даста кунад. Дар бораи нармафзори тахтае, ки мо дорем wiki ва дар мақола.
  4. Фармони "simple_pjsua_imported" -ро дар консоли Embox иҷро кунед
    
    00:00:12.870    pjsua_acc.c  ....SIP outbound status for acc 0 is not active
    00:00:12.884    pjsua_acc.c  ....sip:[email protected]: registration success, status=200 (Registration succes
    00:00:12.911    pjsua_acc.c  ....Keep-alive timer started for acc 0, destination:91.121.209.194:5060, interval:15s
    

  5. Дар ниҳоят, гузоштани баландгӯякҳо ё гӯшмонакҳо ба баромади аудио ва бо ду микрофони хурди MEMS дар паҳлӯи экран сухан гуфтан боқӣ мемонад. Мо аз Linux тавассути замимаи simple_pjsua, pjsua занг мезанем. Хуб, ё шумо метавонед ягон намуди дигари телефонро истифода баред.

Ҳамаи ин дар мо тасвир шудааст wiki.

Чӣ тавр мо ба он ҷо расидем

Ҳамин тавр, дар аввал савол дар бораи интихоби платформаи сахтафзор ба миён омад. Азбаски маълум буд, ки STM32F4-Discovery аз хотира мувофиқат намекунад, STM32F7-Discovery интихоб карда шуд. Вай дорои 1 МБ флешдор ва 256 КБ хотираи оперативӣ мебошад (+ 64 хотираи махсуси зуд, ки мо онро низ истифода хоҳем кард). Инчунин барои зангҳо тавассути сервер зиёд нест, аммо мо қарор додем, ки кӯшиш кунем, ки ба он мувофиқат кунем.

Шартӣ барои худ, вазифа ба якчанд марҳила тақсим карда шуд:

  • Иҷрои PJSIP дар QEMU. Он барои ислоҳ кардан қулай буд, илова бар он мо аллакай кодеки AC97-ро дастгирӣ мекардем.
  • Сабт ва навозиш дар QEMU ва STM32.
  • Интиқоли барнома simple_pjsua аз PJSIP. Он ба шумо имкон медиҳад, ки дар сервери SIP сабти ном шавед ва занг занед.
  • Сервери худро дар асоси ситорача ҷойгир кунед ва дар он озмоиш кунед, пас серверҳои беруна, ба монанди sip.linphone.org -ро санҷед.

Садо дар Embox тавассути Portaudio кор мекунад, ки он дар PISIP низ истифода мешавад. Мушкилоти аввал дар QEMU пайдо шуданд - WAV дар 44100 Гц хуб бозӣ кард, аммо дар 8000 чизе ба таври равшан хато кард. Маълум шуд, ки сухан дар бораи муқаррар кардани басомад меравад - ба таври нобаёнӣ он дар таҷҳизот 44100 буд ва ин ба таври барномавӣ тағир наёфтааст.

Дар ин ҷо, шояд, каме шарҳ додан лозим аст, ки чӣ гуна садо умуман садо медиҳад. Корти садоиро метавон ба ягон ишоракунанда ба порчаи хотирае, ки шумо мехоҳед дар басомади пешакӣ муайяншуда бозӣ кунед ё сабт кунед, насб кунед. Пас аз ба итмом расидани буфер, танаффус тавлид мешавад ва иҷро бо буфери навбатӣ идома меёбад. Гап дар сари он аст, ки ин буферҳо ҳангоми бозӣ кардани бозии қаблӣ бояд пешакӣ пур карда шаванд. Мо бо ин мушкилот минбаъд дар STM32F7 рӯбарӯ хоҳем шуд.

Баъдан, мо серверро иҷора гирифтем ва дар он Asterisk ҷойгир кардем. Азбаски бисёр ислоҳ кардан лозим буд, аммо ман намехостам бо микрофон зиёд сухан гӯям, лозим буд, ки навозиш ва сабти автоматӣ анҷом дода шавад. Барои ин, мо simple_pjsua-ро часпондем, то шумо ба ҷои дастгоҳҳои аудиоӣ файлҳоро лағжонед. Дар PJSIP, ин хеле содда анҷом дода мешавад, зеро онҳо консепсияи портро доранд, ки метавонад дастгоҳ ё файл бошад. Ва ин бандарҳоро метавон ба дигар портҳо чандир пайваст кард. Шумо метавонед кодро дар pjsip мо бубинед анборҳо. Дар натиҷа, схема чунин буд. Дар сервери Asterisk, ман ду ҳисобро оғоз кардам - ​​барои Linux ва барои Embox. Баъдан, фармон дар Embox иҷро карда мешавад simple_pjsua_imported, Embox дар сервер сабти ном мекунад, ки пас аз он мо Embox-ро аз Linux даъват мекунем. Дар лаҳзаи пайвастшавӣ мо дар сервери Asterisk тафтиш мекунем, ки пайвастшавӣ барқарор шудааст ва пас аз чанд вақт мо бояд садоро аз Linux дар Embox шунавем ва дар Linux файлеро, ки аз Embox навохта мешавад, захира мекунем.

Пас аз он ки он дар QEMU кор кард, мо ба интиқол ба STM32F7-Discovery гузаштем. Мушкилоти аввал дар он аст, ки онҳо ба 1 МБ ROM бе оптимизатсияи компилятори фаъол "-Os" барои андозаи тасвир мувофиқ набуданд. Барои ҳамин мо "-Os"-ро дохил кардем. Ғайр аз он, ямоқи дастгирии C ++-ро ғайрифаъол кардааст, бинобар ин он танҳо барои pjsua лозим аст ва мо simple_pjsua -ро истифода мебарем.

Баъди гузоштан simple_pjsua, карор дод, ки холо барои ба кор андохтани он имконият мавчуд аст. Аммо аввал бояд бо сабт ва навохтани овоз сару кор дошт. Савол ин аст, ки дар куҷо нависед? Мо хотираи беруниро интихоб кардем - SDRAM (128 МБ). Шумо метавонед инро худатон санҷед:

Стерео WAV бо басомади 16000 Гц ва давомнокии 10 сония эҷод мекунад:


record -r 16000 -c 2 -d 10000 -m C0000000

Мо аз даст медиҳем:


play -m C0000000

Дар ин ҷо ду мушкилот вуҷуд дорад. Аввалин бо кодек - WM8994 истифода мешавад ва он дорои як чиз ба монанди слот аст ва 4-тои ин слот вуҷуд дорад. Ҳамин тавр, ба таври нобаёнӣ, агар ин танзим карда нашуда бошад, пас ҳангоми навозиш аудио дар ҳама чор слотҳо бозӣ мекунанд. . Аз ин рӯ, дар басомади 16000 Гц, мо 8000 Гц гирифтем, аммо барои 8000 Гц, бозӣ танҳо кор накард. Вақте ки танҳо ҷойи 0 ва 2 интихоб карда шуданд, он тавре кор мекард, ки лозим буд. Мушкилоти дигар ин интерфейси аудио дар STM32Cube буд, ки дар он баромади аудио тавассути SAI (Serial Audio Interface) бо вуруди аудио ҳамоҳанг кор мекунад (ман тафсилотро нафаҳмидам, аммо маълум шуд, ки онҳо як соати умумӣ доранд ва вақте ки баромади аудио оғоз карда мешавад, аудио ба ягон тариқ ба даромадгоҳи он пайваст карда мешавад). Яъне, шумо онҳоро алоҳида иҷро карда наметавонед, аз ин рӯ мо амалҳои зеринро анҷом додем - вуруди аудио ва баромади аудио ҳамеша кор мекунанд (аз ҷумла таваққуфҳо тавлид мешаванд). Аммо вақте ки дар система ҳеҷ чиз навохта намешавад, мо танҳо як буфери холӣ ба баромади аудио мегузорем ва вақте ки бозӣ оғоз мешавад, мо ростқавлона ба пур кардани он шурӯъ мекунем.

Баъдан, мо бо он вохӯрдем, ки садо ҳангоми сабти овоз хеле ором буд. Ин ба он вобаста аст, ки микрофонҳои MEMS дар STM32F7-Discovery ба гунае дар басомадҳои камтар аз 16000 Гц хуб кор намекунанд. Аз ин рӯ, мо 16000 Гц муқаррар кардем, ҳатто агар 8000 Гц ояд. Барои ин кор, ҳарчанд зарур буд, ки табдили нармафзори як басомад ба дигараш илова карда шавад.

Баъдан, ба ман лозим омад, ки андозаи тӯдаро, ки дар RAM ҷойгир аст, зиёд кунам. Тибқи ҳисобҳои мо, pjsip тақрибан 190 КБ лозим буд ва мо танҳо тақрибан 100 КБ боқӣ мондаем. Дар ин ҷо ман маҷбур будам, ки хотираи беруна - SDRAM (тақрибан 128 KB) -ро истифода барам.

Пас аз ин ҳама таҳрирҳо ман бастаҳои аввалинро байни Linux ва Embox дидам ва садоро шунидам! Аммо садо даҳшатнок буд, на ба мисли QEMU, чизеро фаҳмидан ғайриимкон буд. Пас аз он мо фикр кардем, ки ин чӣ метавонад бошад. Debugging нишон дод, ки Embox танҳо барои пур / бор кардани буферҳои аудио вақт надорад. Дар ҳоле ки pjsip як чаҳорчӯбаро коркард мекард, дар бораи анҷоми коркарди буферӣ 2 танаффус вақт дошт, ки ин хеле зиёд аст. Аввалин фикр дар бораи суръат оптимизатсияи компилятор буд, аммо он аллакай ба PJSIP дохил карда шуда буд. Дуюм нуқтаи шинокунандаи сахтафзор аст, ки мо дар бораи он сӯҳбат кардем мақола. Аммо чи тавре ки амалия нишон дод, ФПУ суръатро чандон зиёд на-кард. Қадами навбатӣ афзалият додани риштаҳо буд. Embox стратегияҳои гуногуни банақшагирӣ дорад ва ман якеро дохил кардам, ки афзалиятҳоро дастгирӣ мекунад ва ҷараёнҳои аудиоиро ба афзалияти баландтарин муқаррар мекунад. Ин ҳам кӯмак накард.

Идеяи навбатӣ ин буд, ки мо бо хотираи беруна кор карда истодаем ва хуб мебуд, ки сохторҳоеро ба он ҷо интиқол диҳем, ки хеле зуд дастрасанд. Ман таҳлили пешакии кай ва дар зери чӣ анҷом додам simple_pjsua хотира ҷудо мекунад. Маълум шуд, ки аз 190 Кб аввал 90 Кб барои эҳтиёҷоти дохилии PJSIP ҷудо шудааст ва ба онҳо чандон дастрас нестанд. Ғайр аз он, ҳангоми занги даромад, функсияи pjsua_call_answer даъват карда мешавад, ки дар он буферҳо барои кор бо фоторамкаҳои воридотӣ ва содиротӣ ҷудо карда мешаванд. Он ҳанӯз тақрибан 100 Kb буд. Ва он гоҳ мо корҳои зеринро анҷом додем. То лаҳзаи занг мо маълумотро дар хотираи беруна ҷойгир мекунем. Ҳамин ки занг занед, мо фавран теппаро бо дигараш иваз мекунем - дар RAM. Ҳамин тариқ, ҳама маълумоти «гарм» ба хотираи тезтар ва пешгӯинашаванда интиқол дода шуданд.

Дар натиҷа, ҳамаи ин якҷоя имкон дод, ки ба кор андохта шаванд simple_pjsua ва тавассути сервери худ занг занед. Ва он гоҳ тавассути серверҳои дигар ба монанди sip.linphone.org.

натиҷаҳои

Дар натиҷа, ба кор андохтан имконпазир шуд simple_pjsua бо интиқоли овоз дар ду самт тавассути сервер. Мушкилоти бо 128 КБ SDRAM-и иловагиро бо истифода аз каме пурқувваттар Cortex-M7 (масалан, STM32F769NI бо 512 КБ RAM) ҳал кардан мумкин аст, аммо дар айни замон мо то ҳол аз умеди ворид шудан ба 256 даст накашидаем. KB 🙂 Мо шод хоҳем шуд, агар касе манфиатдор бошад, Ё беҳтараш онро санҷед. Хамаи манбаъхо, чун одат, дар мост анборҳо.

Манбаъ: will.com

Илова Эзоҳ