0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12
1

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

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

Author24 — интернет-сервис помощи студентам
Господа, доброго времени суток. Прошу помощи.
На руках имеется две 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 Pi


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

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

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

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

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

11
Эксперт Python
4630 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,131
Записей в блоге: 6
27.08.2019, 11:46 2

Не по теме:

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


Цитата Сообщение от Yousuke_Otoha Посмотреть сообщение
код для передачи на стриминговый сервер.
Как вариант, поднимите на одной малинке такой сервер.
0
923 / 686 / 268
Регистрация: 10.12.2016
Сообщений: 1,689
27.08.2019, 13:55 3
Цитата Сообщение от Yousuke_Otoha Посмотреть сообщение
Подскажите, пожалуйста, возможно вообще создать такого рода связь между Raspberr
ну по структуре это тот же чат реального времени, тока вместо текста - бинарный звуковой файл. чатов на питоне полно.
чат или через чат-сервер идет или через p2р
https://github.com/tornadoweb/... demos/chat
попробуйте с этого начать
0
0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12
28.08.2019, 08:31  [ТС] 4
Цитата Сообщение от vic5710 Посмотреть сообщение
ну по структуре это тот же чат реального времени, тока вместо текста - бинарный звуковой файл. чатов на питоне полно.
За помощь спасибо.
В Python я, откровенно говоря, слаб. И допустим, если я разберусь с созданием, чата, а выбора другого все равно нет, то может Вы мне подскажите, как туда бинарный звуковой файл запихать?
Соответственно, сразу возникают вопросы: "малинка" должна работать без графического интерфейса, по принципу, я ее настроил, отцепил, унес в другую сеть с такими же "малинками", подцепил и она сразу функционирует, как мне надо, такое возможно? А возможность передачи звука через нажатие кнопки я оформить смогу? А задержки не будет, мне необходимо, чтобы связь передавалась здесь и сейчас?
То есть, я правильно понимаю если, то в текстовом чате сообщение отправляется по нажатию клавиши (условно Enter), а в том, что необходимо сделать мне, у меня через нажатие клавиши сразу пойдет прямая передача звука. Тогда мне непонятно, как быть с тем, что в текстовом чате сначала ведь набирается сообщение, а потом уже отправляется. Следовательно, из кода чата мне необходимо будет убрать пункты с написанием сообщения, точнее вставить вместо нее запись (ну, как запись, прямую передачу звука) звукового файла и использовать часть с отправкой, верно?
0
0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12
28.08.2019, 13:01  [ТС] 5
Цитата Сообщение от 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  [ТС] 6
Цитата Сообщение от dondublon Посмотреть сообщение
Не по теме:
"посредством". Сорри за оффтоп.

Не по теме:


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


А по теме:
Выше указал код, все вроде коннектиться, но ALSA выдает ошибки и нет звука при передаче, отдельно звук на каждой Raspberry есть, тестовые команды воспроизводит и звук пишет с микрофона.
0
4284 / 964 / 138
Регистрация: 29.01.2013
Сообщений: 5,666
28.08.2019, 13:58 7
Yousuke_Otoha, вы пробовали на одной машине записать и воспроизвести звуки?
0
0 / 0 / 0
Регистрация: 07.08.2019
Сообщений: 12
28.08.2019, 14:09  [ТС] 8
Alli_Lupin, на обоих пробовал. Звук записывается и воспроизводится.
0
4284 / 964 / 138
Регистрация: 29.01.2013
Сообщений: 5,666
28.08.2019, 14:29 9
Yousuke_Otoha, если вы копируете файлик с одной малинки на другую, воспроизводится?
0
dondublon
28.08.2019, 14:47
  #10

Не по теме:

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

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

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

Не по теме:

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

0
0 / 0 / 0
Регистрация: 10.12.2017
Сообщений: 5
18.02.2020, 14:04 12
Добрый день! Подскажите, пожалуйста, по поводу Raspberry PI 3: Как можно смоделировать ситуацию между двумя расбери? Клиент RPi подключается к точке доступа WiFi через WiFi и действует как устройство IoT. Gateway RPi, который подключается к точке доступа через Ethernet служит шлюзом MQTT-SN. Нужно проанализировать производительность зашифрованной связи ко времени, путем шифрования сообщения на клиент и отправка пакетов по сети на шлюз на две секунды.
0
18.02.2020, 14:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2020, 14:04
Помогаю со студенческими работами здесь

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

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

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

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

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

Макрос для копировани формул без потери связи между ячейками
Такая проблема есть макрос который копирует с одного листа две формулы и вставляет на разные листы...

Нужна программа для связи микроконтроллера и модема
оплата 1000$.


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru