STM32F7-டிஸ்கவரியில் SIP ஃபோன்

அனைவருக்கும் வணக்கம்.

சிறிது காலத்திற்கு முன்பு நாங்கள் எழுதினார் STM32F4-டிஸ்கவரியில் 1 MB ROM மற்றும் 192 KB RAM உடன் ஒரு SIP தொலைபேசியை எவ்வாறு அறிமுகப்படுத்தினோம் என்பது பற்றி) எம்பாக்ஸ்அந்த பதிப்பு மிகக் குறைவாக இருந்தது, சர்வர் இல்லாமல் இரண்டு போன்களை நேரடியாக இணைத்து, ஒரு வழி குரல் பரிமாற்றத்துடன் மட்டுமே இணைக்கப்பட்டது என்பது குறிப்பிடத்தக்கது. எனவே, நினைவக தடயத்தை முடிந்தவரை சிறியதாக வைத்திருக்கும் அதே வேளையில், சர்வர் அடிப்படையிலான அழைப்பு மற்றும் இருவழி குரல் பரிமாற்றத்துடன் கூடிய முழுமையான அம்சங்களுடன் கூடிய தொலைபேசியை அறிமுகப்படுத்த முடிவு செய்தோம்.

வீடியோவை இயக்கு

தொலைபேசிக்கு ஒரு பயன்பாட்டைத் தேர்வு செய்ய முடிவு செய்யப்பட்டது. எளிய_பிஜேசுவா PJSIP நூலகத்தின் ஒரு பகுதியாக, இது சர்வரில் பதிவுசெய்து அழைப்புகளைப் பெற்று பதிலளிக்கக்கூடிய ஒரு குறைந்தபட்ச பயன்பாடாகும். கீழே, STM32F7-Discovery இல் இதை எவ்வாறு இயக்குவது என்பதை நான் விவரிக்கிறேன்.

எப்படி தொடங்குவது

  1. எம்பாக்ஸை உள்ளமைத்தல்
    make confload-platform/pjsip/stm32f7cube
  2. conf/mods.config கோப்பில், தேவையான SIP கணக்கைக் குறிப்பிடுகிறோம்.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    எங்கே சர்வர் — இது ஒரு SIP சேவையகம் (எடுத்துக்காட்டாக, sip.linphone.org), பயனர்பெயர் и கடவுச்சொல் — கணக்கிற்கான பயனர்பெயர் மற்றும் கடவுச்சொல்.

  3. கட்டளையுடன் எம்பாக்ஸை நாங்கள் ஒன்று சேர்ப்போம் செய்யபோர்டு ஃபார்ம்வேர் பற்றிய தகவல்கள் எங்களிடம் உள்ளன விக்கி மற்றும் உள்ளே கட்டுரை.
  4. Embox கன்சோலில் “simple_pjsua_imported” கட்டளையை இயக்கவும்.
    
    00:00:12.870    pjsua_acc.c  ....SIP outbound status for acc 0 is not active
    00:00:12.884    pjsua_acc.c  ....sip:alexk2222@sip.linphone.org: 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 மைக்ரோஃபோன்களில் பேசுவது மட்டுமே மீதமுள்ளது. simple_pjsua அல்லது pjsua பயன்பாட்டைப் பயன்படுத்தி லினக்ஸிலிருந்து அழைப்போம். அல்லது நீங்கள் லின்ஃபோன் போன்ற வேறு எந்த பயன்பாட்டையும் பயன்படுத்தலாம்.

இவை அனைத்தும் எங்கள் விக்கி.

நாங்கள் எப்படி இங்கு வந்தோம்

எனவே, ஆரம்பக் கேள்வி வன்பொருள் தளத்தைத் தேர்ந்தெடுப்பது பற்றியது. நினைவகத்தைப் பொறுத்தவரை STM32F4-டிஸ்கவரி பொருத்தமானதாக இருக்காது என்பது தெளிவாகத் தெரிந்ததால், நாங்கள் STM32F7-டிஸ்கவரியை தேர்வு செய்தோம். இது 1 MB ஃபிளாஷ் மெமரி மற்றும் 256 KB ரேம் (பிளஸ் 64 KB பிரத்யேக வேகமான மெமரி, இதை நாங்கள் பயன்படுத்துவோம்) கொண்டுள்ளது. சர்வர் அழைப்புகளுக்கு இது அதிக நினைவகம் இல்லை, ஆனால் அதை முயற்சித்துப் பார்க்க முடிவு செய்தோம்.

நாங்கள் பணியை பல கட்டங்களாகப் பிரித்தோம்:

  • QEMU இல் PJSIP ஐ இயக்குதல். இது பிழைத்திருத்தத்திற்கு வசதியாக இருந்தது, மேலும் எங்களிடம் ஏற்கனவே AC97 கோடெக் ஆதரவு இருந்தது.
  • QEMU மற்றும் STM32 இல் குரல் பதிவு மற்றும் பின்னணி.
  • பயன்பாட்டை போர்ட் செய்தல் எளிய_பிஜேசுவா PJSIP இன் ஒரு பகுதி. இது ஒரு SIP சேவையகத்தில் பதிவுசெய்து அழைப்புகளைச் செய்ய உங்களை அனுமதிக்கிறது.
  • உங்கள் சொந்த ஆஸ்டரிஸ்க் அடிப்படையிலான சேவையகத்தை நிறுவி அதைச் சோதித்துப் பாருங்கள், பின்னர் sip.linphone.org போன்ற வெளிப்புற சேவையகங்களை முயற்சிக்கவும்.

எம்பாக்ஸ் ஆடியோவிற்கு போர்டாடியோவைப் பயன்படுத்துகிறது, இது PISIP-யிலும் பயன்படுத்தப்படுகிறது. QEMU-வில்தான் முதல் சிக்கல்கள் தோன்றின: WAV கோப்புகள் 44100 Hz இல் நன்றாக இயங்கின, ஆனால் 8000 Hz இல் ஏதோ தெளிவாகத் தவறு இருந்தது. இது அதிர்வெண் அமைப்பு சிக்கலாக மாறியது - வன்பொருள் இயல்புநிலை 44100 Hz ஆக இருந்தது, மேலும் அதை மென்பொருளில் மாற்ற முடியவில்லை.

இங்கே, ஒலி பின்னணி எவ்வாறு செயல்படுகிறது என்பதை சுருக்கமாக விளக்குவது மதிப்புக்குரியது. முன்னமைக்கப்பட்ட அதிர்வெண்ணில் இயக்க அல்லது பதிவு செய்ய வேண்டிய நினைவகத்தின் ஒரு பகுதிக்கு ஒலி அட்டைக்கு ஒரு சுட்டிக்காட்டி கொடுக்கப்படலாம். இடையகம் நிரம்பியவுடன், ஒரு குறுக்கீடு உருவாக்கப்படுகிறது, மேலும் அடுத்த இடையகத்துடன் செயல்படுத்தல் தொடர்கிறது. சிக்கல் என்னவென்றால், முந்தையது இயங்கும் போது இந்த இடையகங்களை முன்கூட்டியே நிரப்ப வேண்டும். STM32F7 உடன் இந்த சிக்கலை பின்னர் சந்திப்போம்.

அடுத்து, நாங்கள் ஒரு சேவையகத்தை வாடகைக்கு எடுத்து அதில் ஆஸ்டரிஸ்கைப் பயன்படுத்தினோம். எங்களுக்கு நிறைய பிழைத்திருத்தம் தேவைப்பட்டதாலும், மைக்ரோஃபோனில் அதிகம் பேச விரும்பாததாலும், தானியங்கி பிளேபேக் மற்றும் பதிவுசெய்தலை செயல்படுத்த வேண்டியிருந்தது. இதைச் செய்ய, ஆடியோ சாதனங்களுக்குப் பதிலாக கோப்புகளைப் பயன்படுத்த அனுமதிக்க simple_pjsua ஐ பேட்ச் செய்தோம். PJSIP இல் இது மிகவும் எளிதானது, ஏனெனில் அவை போர்ட்களின் கருத்தைக் கொண்டுள்ளன, அவை சாதனங்களாகவோ அல்லது கோப்புகளாகவோ இருக்கலாம். இந்த போர்ட்களை மற்ற போர்ட்களுடன் நெகிழ்வாக இணைக்க முடியும். எங்கள் pjsip இல் குறியீட்டைப் பார்க்கலாம். களஞ்சியங்கள். В итоге, схема была следующая. На сервере Asterisk я завел два аккаунта — для Linux и для Embox. Далее на Embox выполняется команда எளிய_பிஜேசுவா_இறக்குமதி செய்யப்பட்டதுEmbox சேவையகத்தில் பதிவுசெய்து, பின்னர் Linux இலிருந்து Embox ஐ அழைக்கிறது. இணைக்கும்போது, ​​இணைப்பு நிறுவப்பட்டதா என்பதை Asterisk சேவையகத்தில் சரிபார்க்கவும். சிறிது நேரத்திற்குப் பிறகு, Embox இல் Linux இலிருந்து ஒலியைக் கேட்க வேண்டும், மேலும் Linux இல் Embox இலிருந்து இயக்கப்பட்ட கோப்பை சேமிக்க வேண்டும்.

QEMU-வில் வேலை செய்ய ஆரம்பித்த பிறகு, நாங்கள் STM32F7-Discovery-க்கு போர்ட்டிங் செய்யத் தொடங்கினோம். முதல் பிரச்சனை என்னவென்றால், பட அளவிற்கு "-Os" கம்பைலர் ஆப்டிமைசேஷன் இயக்கப்படாமல் 1 MB ROM-ல் பொருத்த முடியாது. எனவே, "-Os"-ஐ இயக்கினோம். அடுத்து, pjsua-விற்கு மட்டுமே தேவைப்படும் C++ ஆதரவை பேட்ச் செய்து, simple_pjsua-வைப் பயன்படுத்துகிறோம்.

அது வைக்கப்பட்ட பிறகு எளிய_பிஜேசுவாஇப்போது அதைச் செயல்படுத்த ஒரு வாய்ப்பு இருப்பதாக நாங்கள் முடிவு செய்தோம். ஆனால் முதலில், குரல்களை எவ்வாறு பதிவு செய்வது மற்றும் இயக்குவது என்பதைக் கண்டுபிடிக்க வேண்டியிருந்தது. கேள்வி என்னவென்றால், எங்கே பதிவு செய்வது? நாங்கள் வெளிப்புற நினைவகத்தைத் தேர்ந்தெடுத்தோம்—SDRAM (128 MB). நீங்களே இதை முயற்சி செய்யலாம்:

16000 ஹெர்ட்ஸ் அதிர்வெண் மற்றும் 10 வினாடிகள் கால அளவு கொண்ட ஸ்டீரியோ WAV ஐ உருவாக்குகிறது:


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

நாம் இழக்கிறோம்:


play -m C0000000

இரண்டு சிக்கல்கள் எழுந்தன. முதலாவது கோடெக்கில் இருந்தது - இது ஸ்லாட் எனப்படும் ஒரு கருத்தைக் கொண்ட WM8994 ஐப் பயன்படுத்துகிறது, மேலும் அவற்றில் நான்கு உள்ளன. இயல்பாக, நீங்கள் இதை உள்ளமைக்கவில்லை என்றால், நான்கு ஸ்லாட்டுகளிலும் ஆடியோ பிளேபேக் நிகழ்கிறது. எனவே, 16000 Hz இல், எங்களுக்கு 8000 Hz கிடைத்தது, ஆனால் 8000 Hz இல், பிளேபேக் வெறுமனே வேலை செய்யவில்லை. நாங்கள் 0 மற்றும் 2 ஸ்லாட்டுகளை மட்டும் தேர்ந்தெடுத்தபோது, ​​அது எதிர்பார்த்தபடி வேலை செய்தது. மற்றொரு சிக்கல் STM32Cube இல் உள்ள ஆடியோ இடைமுகம், இதில் ஆடியோ வெளியீடு SAI (சீரியல் ஆடியோ இடைமுகம்) வழியாக ஆடியோ உள்ளீட்டுடன் ஒத்திசைவாக இயங்குகிறது (நான் விவரங்களைப் பார்க்கவில்லை, ஆனால் அவை ஒரு பொதுவான கடிகாரத்தைப் பகிர்ந்து கொள்கின்றன, மேலும் ஆடியோ வெளியீடு துவக்கப்படும்போது, ​​ஆடியோ உள்ளீடு எப்படியோ அதனுடன் இணைக்கப்பட்டுள்ளது). இதன் பொருள் அவற்றை தனித்தனியாக இயக்க முடியாது, எனவே நாங்கள் பின்வருவனவற்றை செயல்படுத்தினோம்: ஆடியோ உள்ளீடு மற்றும் வெளியீடு எப்போதும் செயலில் இருக்கும் (குறுக்கீடுகளை உருவாக்குவது உட்பட). ஆனால் கணினியில் எதுவும் இயங்காதபோது, ​​ஆடியோ வெளியீட்டை ஒரு வெற்று இடையகமாக நிரப்புகிறோம், மேலும் பிளேபேக் தொடங்கும் போது, ​​அதை நேர்மையாக நிரப்பத் தொடங்குகிறோம்.

பின்னர் குரல் பதிவு மிகவும் அமைதியாக இருப்பதில் எங்களுக்கு ஒரு சிக்கல் ஏற்பட்டது. ஏனென்றால் STM32F7-டிஸ்கவரியில் உள்ள MEMS மைக்ரோஃபோன்கள் 16000 Hz க்கும் குறைவான அதிர்வெண்களில் சிறப்பாகச் செயல்படாது. எனவே, 8000 Hz கிடைத்தாலும், அதை 16000 Hz ஆக அமைத்தோம். இதற்கு மென்பொருள் அதிர்வெண் மாற்றத்தைச் சேர்க்க வேண்டியிருந்தது.

அடுத்து, RAM-ல் அமைந்துள்ள ஹீப் அளவை அதிகரிக்க வேண்டியிருந்தது. எங்கள் கணக்கீடுகளின்படி, pjsip-க்கு சுமார் 190 KB தேவைப்பட்டது, மேலும் எங்களிடம் சுமார் 100 KB மட்டுமே மீதமுள்ளது. இதற்கு சில வெளிப்புற நினைவகத்தைப் பயன்படுத்த வேண்டியிருந்தது - SDRAM (சுமார் 128 KB).

இந்த எல்லா திருத்தங்களுக்கும் பிறகு, லினக்ஸ் மற்றும் எம்பாக்ஸுக்கு இடையிலான முதல் பாக்கெட்டுகளைப் பார்த்தேன், எனக்கு ஒலி கேட்டது! ஆனால் ஒலி பயங்கரமாக இருந்தது, QEMU இலிருந்து முற்றிலும் வேறுபட்டது; எதையும் கண்டுபிடிக்க முடியவில்லை. பின்னர் என்ன பிரச்சனையாக இருக்கும் என்று யோசிக்க ஆரம்பித்தோம். பிழைத்திருத்தம் எம்பாக்ஸால் ஆடியோ பஃபர்களை போதுமான அளவு வேகமாக நிரப்பவோ இறக்கவோ முடியவில்லை என்பதைக் காட்டியது. pjsip ஒரு சட்டகத்தை செயலாக்கும்போது, ​​பஃபர் நிறைவுக்காக இரண்டு குறுக்கீடுகள் தூண்டப்பட்டன, அது மிக அதிகம். விஷயங்களை விரைவுபடுத்துவதற்கான முதல் யோசனை கம்பைலர் உகப்பாக்கம், ஆனால் அது ஏற்கனவே PJSIP இல் சேர்க்கப்பட்டுள்ளது. இரண்டாவது வன்பொருள் மிதக்கும் புள்ளி, இதைப் பற்றி நாங்கள் விவாதித்தோம் கட்டுரைஆனால் நடைமுறையில் காட்டியுள்ளபடி, FPU குறிப்பிடத்தக்க வேக ஊக்கத்தை வழங்கவில்லை. அடுத்த படி நூல் முன்னுரிமைகளை அமைப்பதாகும். எம்பாக்ஸில் வெவ்வேறு திட்டமிடல் உத்திகள் உள்ளன, மேலும் முன்னுரிமைகளை ஆதரிக்கும் ஒன்றை நான் இயக்கி, ஆடியோ நூல்களை அதிக முன்னுரிமைக்கு அமைத்தேன். இதுவும் உதவவில்லை.

அடுத்த யோசனை என்னவென்றால், நாங்கள் வெளிப்புற நினைவகத்துடன் பணிபுரிகிறோம், மேலும் அங்கு அடிக்கடி அணுகப்படும் கட்டமைப்புகளை நகர்த்துவது நல்லது. எப்போது, ​​எதற்காக என்பது குறித்த ஆரம்ப பகுப்பாய்வை நான் மேற்கொண்டேன். எளிய_பிஜேசுவா நினைவகத்தை ஒதுக்குகிறது. ஒதுக்கப்பட்ட 190 KB இல் முதல் 90 KB PJSIP இன் உள் தேவைகளுக்காகவும், அடிக்கடி அணுகப்படுவதில்லை என்றும் தெரியவந்தது. பின்னர், உள்வரும் அழைப்பின் போது, ​​pjsua_call_answer செயல்பாடு அழைக்கப்படுகிறது, இது உள்வரும் மற்றும் வெளிச்செல்லும் பிரேம்களைக் கையாள இடையகங்களை ஒதுக்குகிறது. இதற்கு மேலும் 100 KB தேவைப்பட்டது. நாங்கள் என்ன செய்தோம் என்பது இங்கே: அழைப்புக்கு முன், வெளிப்புற நினைவகத்தில் தரவைச் சேமிக்கிறோம். அழைப்பு வந்தவுடன், உடனடியாக குவியலை RAM இல் இன்னொன்றால் மாற்றுகிறோம். இந்த வழியில், அனைத்து "சூடான" தரவும் வேகமான மற்றும் கணிக்கக்கூடிய நினைவகத்திற்கு நகர்த்தப்பட்டது.

இதன் விளைவாக, இவை அனைத்தும் சேர்ந்து தொடங்குவதை சாத்தியமாக்கியது எளிய_பிஜேசுவா உங்கள் சர்வர் வழியாக அழைக்கவும். பின்னர் sip.linphone.org போன்ற பிற சர்வர்கள் வழியாக அழைக்கவும்.

கண்டுபிடிப்புகள்

இறுதியில், நாங்கள் அதைத் தொடங்க முடிந்தது. எளிய_பிஜேசுவா சர்வர் வழியாக இருதரப்பு குரல் பரிமாற்றத்துடன். கூடுதலாக 128 KB SDRAM இல் உள்ள சிக்கலை சற்று அதிக சக்திவாய்ந்த Cortex-M7 (உதாரணமாக, 512 KB RAM உடன் STM32F769NI) பயன்படுத்துவதன் மூலம் தீர்க்க முடியும், ஆனால் 256 KB இல் அழுத்தும் நம்பிக்கையை நாங்கள் இன்னும் கைவிடவில்லை. 🙂 யாராவது ஆர்வமாக இருந்தால், அல்லது இன்னும் சிறப்பாக, இதை முயற்சித்தால் நாங்கள் மகிழ்ச்சியடைவோம். எப்போதும் போல, அனைத்து மூலக் குறியீடும் எங்கள் இணையதளத்தில் கிடைக்கிறது. களஞ்சியங்கள்.

ஆதாரம்: www.habr.com

DDoS பாதுகாப்பு, VPS VDS சர்வர்கள் கொண்ட தளங்களுக்கு நம்பகமான ஹோஸ்டிங் வாங்கவும் 🔥 DDoS பாதுகாப்புடன் கூடிய நம்பகமான இணையதள ஹோஸ்டிங், VPS, VDS சர்வர்களை வாங்குங்கள் | ProHoster