С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12

Программа для связи между Raspberry Pi

27.08.2019, 07:08. Показов 3494. Ответов 11

Студворк — интернет-сервис помощи студентам
Господа, доброго времени суток. Прошу помощи.
На руках имеется две Raspberry Pi 3 model B+, ОС Raspbx (сборка сразу с установленным Asterisk). Задача стоит такая: необходимо создать аналоговую связь между двумя "малинками" по средствам интернета. Соответственно, так как на "малинке" отсутствует аналоговый вход - использую обычную звуковую карту.
Так как задача не совсем понятная, я распишу: требуется создать связь между "малинками" по принципу раций, то есть, условно, я нажимаю кнопку на одной "малинке", говорю в микрофон, а на другой "малинке" меня сразу слышно без нажатия каких-либо кнопок. При этом, "малинки" должны быть подключены по сети к маршрутизатору. Возможно ли такое провернуть?
Дело в том, что в Python вообще не силен, от слова "совсем". В поисках ответа на передачу звука между "малинками" смог нагуглить только код для передачи на стриминговый сервер.
Код для сервера:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import pyaudio, socket
 
port = 5000
chunk = 256
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
 
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, output = True, frames_per_buffer = chunk)
 
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # create the socket
server_socket.bind(('', port)) # listen on port 5000
server_socket.listen(5) # queue max 5 connections
client_socket, address = server_socket.accept()
 
print "Your IP address is: ", socket.gethostbyname(socket.gethostname())
print "Server Waiting for client on port ", port
 
while True:
 
    # test string
    #data = bytearray('DEADBEEF'.decode('hex'))
    #client_socket.sendall(data)
   
   try:
      client_socket.sendall(stream.read(chunk))
   except IOError,e:
      if e[1] == pyaudio.paInputOverflowed:
         print e
         x = '\x00'*16*256*2 #value*format*chunk*nb_channels
 
stream.stop_stream()
stream.close()
server_socket.close()
client_socket.close()
p.terminate()
Код для клиента:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pyaudio, socket
 
port = 5000
ip = "192.168.1.77"
 
chunk = 512
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
 
p = pyaudio.PyAudio().get_def
stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True,output = True, frames_per_buffer = chunk)
 
#Create a socket connection for connecting to the server:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ip, port))
 
while True:
 
   #Recieve data from the server:
   data = client_socket.recv(1024)
   stream.write(data,chunk)
   #print data
   
   
socket.close()
Так как с Python незнаком, а задача есть, попробовал написать код в "малинке" и запустить программу, но она выдает вот такое сообщение:


Подскажите, пожалуйста, возможно вообще создать такого рода связь между Raspberry? Если возможно, то куда копать? Что посмотреть? Возможно есть какой-то вариант сделать это через Asterisk? Была мысль попробовать установить Wtware и, подключившись к серверу, просто установить софтфоны на "малинки", однако, будут ли "малинки" с одного сервера связываться между собой по средствам связи? Да, и в будущем необходимо будет развести эти "малинки" в разные места возможно и будет необходимость добавить еще несколько "малинок", необходимо будет, чтобы они работали сразу при подключении, как быть в этом случае?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.08.2019, 07:08
Ответы с готовыми решениями:

Кросс компиляция для Raspberry Pi 4 (Raspberry Pi OS 10 Buster)
Привет всем! Как установить qt c toolchain -ом для кросс компиляции в Raspberry Pi OS 10 Buster потому как для Raspberry Pi 4 ? На...

Связи между таблицами для БД сети кинотеатров
Ребята, делаю курсач "БД сети кинотеатров". Помогите правильно связать таблицы, пожалуйста) Буду очень благодарна

Программа для голосовой связи
Всем привет! У меня такая идея. Можно ли создать программу для голосовой связи через интернет в C++ Builder. подскажите идею, с чего ...

11
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,181
Записей в блоге: 6
27.08.2019, 11:46

Не по теме:

"посредством". Сорри за оффтоп.


Цитата Сообщение от Yousuke_Otoha Посмотреть сообщение
код для передачи на стриминговый сервер.
Как вариант, поднимите на одной малинке такой сервер.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,762
27.08.2019, 13:55
Цитата Сообщение от Yousuke_Otoha Посмотреть сообщение
Подскажите, пожалуйста, возможно вообще создать такого рода связь между Raspberr
ну по структуре это тот же чат реального времени, тока вместо текста - бинарный звуковой файл. чатов на питоне полно.
чат или через чат-сервер идет или через p2р
https://github.com/tornadoweb/... demos/chat
попробуйте с этого начать
0
0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12
28.08.2019, 08:31  [ТС]
Цитата Сообщение от vic5710 Посмотреть сообщение
ну по структуре это тот же чат реального времени, тока вместо текста - бинарный звуковой файл. чатов на питоне полно.
За помощь спасибо.
В Python я, откровенно говоря, слаб. И допустим, если я разберусь с созданием, чата, а выбора другого все равно нет, то может Вы мне подскажите, как туда бинарный звуковой файл запихать?
Соответственно, сразу возникают вопросы: "малинка" должна работать без графического интерфейса, по принципу, я ее настроил, отцепил, унес в другую сеть с такими же "малинками", подцепил и она сразу функционирует, как мне надо, такое возможно? А возможность передачи звука через нажатие кнопки я оформить смогу? А задержки не будет, мне необходимо, чтобы связь передавалась здесь и сейчас?
То есть, я правильно понимаю если, то в текстовом чате сообщение отправляется по нажатию клавиши (условно Enter), а в том, что необходимо сделать мне, у меня через нажатие клавиши сразу пойдет прямая передача звука. Тогда мне непонятно, как быть с тем, что в текстовом чате сначала ведь набирается сообщение, а потом уже отправляется. Следовательно, из кода чата мне необходимо будет убрать пункты с написанием сообщения, точнее вставить вместо нее запись (ну, как запись, прямую передачу звука) звукового файла и использовать часть с отправкой, верно?
0
0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12
28.08.2019, 13:01  [ТС]
Цитата Сообщение от vic5710 Посмотреть сообщение
попробуйте с этого начать
В общем, наделал вот такую штуку:
Сервер:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import socket, select
 
 
class ChatServer:
    def __init__(self):
 
        self.CONNECTION_LIST = []
        self.chat_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.chat_server_socket.bind(("192.168.1.77", 5000))
        self.chat_server_socket.listen(5)
 
        self.CONNECTION_LIST.append(self.chat_server_socket)
 
        print "Server Started!"
 
    def broadcast(self, sock, data):
        for current_socket in self.CONNECTION_LIST:
            if current_socket != self.chat_server_socket and current_socket != sock:
                try:
                    current_socket.send(data)
                except:
                    pass
 
    def run(self):
        while True:
            rlist, wlist, xlist = select.select(self.CONNECTION_LIST, [], [])
 
            for current_socket in rlist:
                if current_socket is self.chat_server_socket:
                    (new_socket, address) = self.chat_server_socket.accept()
                    self.CONNECTION_LIST.append(new_socket)
                    print "%s connected to the server" % str(address)
                else:
                    try:
                        data = current_socket.recv(1024)
                        self.broadcast(current_socket, data)
                    except socket.error:
                        print "%s left the server" % str(address)
                        current_socket.close()
                        self.CONNECTION_LIST.remove(current_socket)
 
 
if __name__ == "__main__":
    ChatServer().run()
Клиент:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import socket
import pyaudio
import wave
import thread
 
# record
CHUNK = 1024 # 512
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 20000
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.1.77", 5000))
 
p = pyaudio.PyAudio()
 
receive_stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, output=True, frames_per_buffer=CHUNK)
send_stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
 
print("Voice chat running")
 
def receive_data():
    while True:
        try:
            data = s.recv(1024)
            receive_stream.write(data)
        except:
            pass
 
 
def send_data():
    while True:
        try:
            data = send_stream.read(CHUNK)
            s.sendall(data)
        except:
            pass
 
thread.start_new_thread(receive_data, ())
thread.start_new_thread(send_data, ())
 
while True:
    pass
И все вроде коннектиться друг с дружечкой, но с какой-бы "малинки" я не пытался подключиться к другой он выдает вот такого рода ошибки:
Миниатюры
Программа для связи между Raspberry Pi  
0
0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12
28.08.2019, 13:08  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Не по теме:
"посредством". Сорри за оффтоп.

Не по теме:


Я имел ввиду средства связи во множественном числе.


А по теме:
Выше указал код, все вроде коннектиться, но ALSA выдает ошибки и нет звука при передаче, отдельно звук на каждой Raspberry есть, тестовые команды воспроизводит и звук пишет с микрофона.
0
5025 / 1054 / 147
Регистрация: 29.01.2013
Сообщений: 6,188
28.08.2019, 13:58
Yousuke_Otoha, вы пробовали на одной машине записать и воспроизвести звуки?
0
0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12
28.08.2019, 14:09  [ТС]
Alli_Lupin, на обоих пробовал. Звук записывается и воспроизводится.
0
5025 / 1054 / 147
Регистрация: 29.01.2013
Сообщений: 6,188
28.08.2019, 14:29
Yousuke_Otoha, если вы копируете файлик с одной малинки на другую, воспроизводится?
0
28.08.2019, 14:47

Не по теме:

Цитата Сообщение от Yousuke_Otoha Посмотреть сообщение
Я имел ввиду средства связи во множественном числе.
"посредством интернета". Единственное число.

0
0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12
28.08.2019, 15:00  [ТС]
Цитата Сообщение от Alli_Lupin Посмотреть сообщение
если вы копируете файлик с одной малинки на другую, воспроизводится?
Записал файлик звуковой на одной "малинке", скопировал его при помощи WinSCP на другую "малинку", воспроизвел - играет.

Добавлено через 2 минуты
Цитата Сообщение от dondublon Посмотреть сообщение
"посредством интернета". Единственное число.

Не по теме:

Там в контексте мелькает слово софтфоны, так я их "средствами связи" обозвал. В момент написания это нормально в голове звучало.

0
0 / 0 / 0
Регистрация: 10.12.2017
Сообщений: 5
18.02.2020, 14:04
Добрый день! Подскажите, пожалуйста, по поводу Raspberry PI 3: Как можно смоделировать ситуацию между двумя расбери? Клиент RPi подключается к точке доступа WiFi через WiFi и действует как устройство IoT. Gateway RPi, который подключается к точке доступа через Ethernet служит шлюзом MQTT-SN. Нужно проанализировать производительность зашифрованной связи ко времени, путем шифрования сообщения на клиент и отправка пакетов по сети на шлюз на две секунды.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2020, 14:04
Помогаю со студенческими работами здесь

Программа для связи с телефоном.
Добрый день! Допустим на телефон приходит СМС, программа должна отреагировать и занести СМС в свою БД. Можно ли сделать такую...

Связи между таблицами для базы данных Oracle: Авиация
помогите в схеме сделать связи между таблицами надо связать эти таблицы (т.е. сделать связи: один ко многим или один к одному) а то я...

Соединение между Raspberry PI и ПК
Подскажите как реализовать подключение через кабель интерфейс eth0 Raspbery и ПК под Windows, чтобы у Raspberry был свой ip например...

Программа для установки связи с модемом
Никто случайно не писал программы для работы с модемом? А именно, интересует как грамотно написать программку, чтобы установить связь с...

Программа для оператора мобильной связи
Разработать программу для оператора мобильной связи, позволяющую для отдельно введенных значений даты и времени последнего исходящего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru