Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
1

Вещание данных в сеть (сервер) - что читать?

08.10.2015, 01:31. Показов 1237. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Имеется устройство с датчиками и фирменная библиотека на Пайтоне, позволяющая к нему подключаться и читать с этого устройства показания (числа от 0 до 1023) 18-ти датчиков в виде переменной, содержащей матрицу 3*6 с частотой 30 кадров/сек.

Пожалуйста, подскажите, как сделать так, чтобы скрипт на Пайтоне бесконечно "вещал" на определенном порту эту переменную с матрицей (т.е. являлся бы сервером)?

Остальная часть уже готова - а именно - программа на Си (клиент), которая будет подключаться к IP:Port и единоразово считывать матрицу, чтобы потом обрабатывать её по моему алгоритму.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2015, 01:31
Ответы с готовыми решениями:

Клиент-Сервер приложение что читать?
Хочу написать клиент-серверное приложение. Чтобы сервер висел на каком то порту и слушал его. А...

Необходимо вещание в сеть видео.
Или не очень видео. Уважаемые форумчане, появилась необходимость, вещать в сеть потоком видео,...

IceCast2 + Traktor и вещание радио в локальную сеть
Доброго времени суток! Захотелось сделать локальное радио, но столкнулся с проблемой. Вещание...

Как настроить VLC на потоковое вещание через bluetooth сеть (PAN)?
Доброго (утра/обеда/вечера/ночи) всем! Пытаюсь сэкономить несколько ТЫРов на покупке...

8
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,133
Записей в блоге: 6
08.10.2015, 07:03 2
Для начала определитесь с протоколом.
Можно низкоуровневый echo-сервер, можно http. Можно и ещё что-нибудь придумать.
1
Эксперт по компьютерным сетям
5898 / 3355 / 1035
Регистрация: 03.11.2009
Сообщений: 10,003
08.10.2015, 09:26 3
Цитата Сообщение от Daemon2017 Посмотреть сообщение
Имеется устройство с датчиками
Цитата Сообщение от Daemon2017 Посмотреть сообщение
фирменная библиотека на Пайтоне, позволяющая к нему подключаться и читать
и
Цитата Сообщение от Daemon2017 Посмотреть сообщение
программа на Си (клиент), которая будет подключаться
не хватает только... а, погодите, все есть
или серверная после того, как отдаст значения завершает работу?
1
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
08.10.2015, 10:36  [ТС] 4
Цитата Сообщение от dondublon Посмотреть сообщение
Для начала определитесь с протоколом.
Можно низкоуровневый echo-сервер, можно http. Можно и ещё что-нибудь придумать.
Полагаю, что мне нужен UDP, верно? - как раз он может слать поток из данных в сторону клиента без подтверждений и остановок: просто по мере получения данных с датчиков.

Если я ошибаюсь в понимании принципа действия UDP, пожалуйста, поправьте.

Добавлено через 10 минут
Цитата Сообщение от Jabbson Посмотреть сообщение
не хватает только... а, погодите, все есть
или серверная после того, как отдаст значения завершает работу?
Боюсь, что я неправильно изъяснился - фирменная библиотека позволяет подключаться к датчикам только с ПК, физически подключенного к устройству. А мне то, как раз, хочется подключаться из абы какого места нашей локальной сети

Т.е. к моему нынешнему коду на Пайтоне (читающему, с помощью библиотеки, данные с подключенного к нему физически устройства с датчиками) как раз не хватает функционала вещания этих данных в локаль.

Нет, очень желательно, чтобы серверная не прекращала работу после передачи одной матрицы со значениями датчиков В идеале бы иметь возможность с программы на Си считать последовательно идущие 5/10/15 пачек с матрицами, но это я уже жирую. Сейчас бы понять, как это запустить, а там уж разберусь как-нибудь.

Добавлено через 17 минут
В Пайтон Вики (https://wiki.python.org/moin/UdpCommunication) имеется пример кода:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import socket
 
UDP_IP = "127.0.0.1" #Объявляю IP-адрес, на который буду слать данные
UDP_PORT = 5005 #Объявляю порт, на который буду слать данные
MESSAGE = "Hello, World!" #Объявляю строку, которая будет передана
 
print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE
 
sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
У меня вопрос:
пусть у ПК, на котором будет программа на Си, всегда будет один и тот же IP, MESSAGE будет хранить матрицу со значениями датчиков, а последняя строка будет отрабатывать всякий раз, когда код на Пайтоне считывает данные с устройства. Будет ли работать, или я плохо понял процесс?

Грубо говоря, я вижу это так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import socket
 
UDP_IP = "192.168.1.128" 
UDP_PORT = 5005 
 
sock = socket.socket(socket.AF_INET,
                     socket.SOCK_DGRAM)
 
#Здесь - мой зацикленный код чтения данных и запись в переменную dataMatrix
 
MESSAGE = dataMatrix
 
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,133
Записей в блоге: 6
08.10.2015, 11:43 5
Цитата Сообщение от Daemon2017 Посмотреть сообщение
Полагаю, что мне нужен UDP, верно? - как раз он может слать поток из данных в сторону клиента без подтверждений и остановок: просто по мере получения данных с датчиков.
Тогда это уже не сервер в узком смысле слова, а спам-рассылка
Порядок такой: сервер слушает, клиент подключается, клиент делает запрос, сервер принимает запрос, что-то и отдаёт ответ, клиент получает ответ.
С udp не работал, но для простого echo-сервера (небольшие текстовые сообщения) примерчик есть.
1
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
08.10.2015, 11:55  [ТС] 6
Цитата Сообщение от dondublon Посмотреть сообщение
Тогда это уже не сервер в узком смысле слова, а спам-рассылка
Порядок такой: сервер слушает, клиент подключается, клиент делает запрос, сервер принимает запрос, что-то и отдаёт ответ, клиент получает ответ.
С udp не работал, но для простого echo-сервера (небольшие текстовые сообщения) примерчик есть.
_
В некотором смысле, спам-рассылка - это то, что мне и нужно
Тот порядок, что Вы привели - для echo, так? Выглядит весьма логично.
В ПайтонВики не нашел примеров для echo - буду очень благодарен, если Вы поделитесь таковым
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,133
Записей в блоге: 6
08.10.2015, 13:19 7
У меня сервер крутился в отдельном потоке, общаясь с основным через qt-шные события. Если надо, упростите сами (без потока).
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from threading import Thread
from rex.qt.QtCore import QObject, pyqtSignal
import socket
# noinspection PyUnresolvedReferences
 
PORT = 11412
 
 
class SignalSender(QObject):
    """ Simple class for sending signals.
    """
    # finished = pyqtSignal()  # список компонентов в виде чисел
    gid_request = pyqtSignal(unicode)
 
    def __init__(self):
        super(SignalSender, self).__init__()
 
 
class ServerThread(Thread):
    sig = SignalSender()
 
    def __init__(self):
        # self.q = Queue()
        self.host = ''
        self.backlog = 1  # 5
        self.msg_size = 1024
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        super(ServerThread, self).__init__(target=self.target_func, args=())
        # self._stop = Event()
        self.daemon = True  # thread dies with the program
        # self.start()
 
    def start_srv(self):
        try:
            self.socket.bind((self.host, PORT))
            self.socket.listen(self.backlog)
            self.start()
            return 1
        except socket.error as e:
            if e[0] == 10048:
                # log.dbg("Port is bisy")
                return 0
            else:
                raise e
 
    def target_func(self):
        while True:
            client, address = self.socket.accept()
            data = client.recv(self.msg_size)
            cmd, arg = data.split('=')
            if cmd == 'gid_path':
                client.send('1 ok, accepted gid path ' + arg)
                self.sig.gid_request.emit(arg.decode('cp1251'))
            # if data:
            #    client.send(data)
            client.close()
 
    def stop(self):
        pass
Использование:
Python
1
2
3
4
5
6
7
8
9
10
11
    import server
    srv = server.ServerThread()
    if srv.start_srv():
        log.dbg("Server started, port " + str(server.PORT))
 
        def on_gid_request(path):
            log.dbg('Accepted path: ' + path)
            main_w.project._prj_model.import_from_gid(path)
        srv.sig.gid_request.connect(on_gid_request)
    else:
        log.dbg("Port {0} is bisy".format(server.PORT))
Коннект к клиента:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def try_to_send(gid_data):
    try:
        host = 'localhost'
        size = 1024
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, PORT))
        s.send('gid_path=' + gid_data)
        data = s.recv(size)
        print(data)
        s.close()
        return data[0] == '1'
    except socket.error as e:
        if e[0] == 10061:
            return False
        else:
            raise e
1
Эксперт по компьютерным сетям
5898 / 3355 / 1035
Регистрация: 03.11.2009
Сообщений: 10,003
08.10.2015, 15:57 8
Или по-простому, без обработок, без проверок:

на сервере:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import socket
import random
 
IPAD_TO_LISTEN_ON = '192.168.16.160'
PORT_TO_LISTEN_ON = 27948
 
def read_sensors():
    """generates random 10bit binary number between (0 and 1023)"""
    # этот генератор чисел имитирует считывание данных с сенсоров
    # на выходе - строка из 10 бит: '1001010001'
    return '{:010b}'.format(random.randint(0, 1023))
 
s = socket.socket()
 
s.bind((IPAD_TO_LISTEN_ON, PORT_TO_LISTEN_ON))
s.listen(5)
 
while True:
    # ждем соединения, возвращаем данные с "сенсоров" и закрываем соединение
    c, addr = s.accept()
    print 'Got connection from', addr, '. Sending data.'
    c.send(read_sensors())
    c.close()
клиент:

Python
1
2
3
4
5
6
7
8
9
import socket
 
s = socket.socket()
host = socket.getfqdn()
port = 27948
 
s.connect((host, port))
print(list(map(int, s.recv(1024))))
s.close()
Два раза подключимся клиентом и считаем значение, для удобства - выведем на экран в виде листа.

Вывод сервера:

Код
Got connection from ('192.168.16.160', 63875) . Sending data.
Got connection from ('192.168.16.160', 63889) . Sending data.
Вывод клиента:
Код
[0, 0, 1, 1, 0, 0, 1, 0, 0, 1]
[1, 0, 0, 1, 0, 1, 1, 0, 1, 0]
1
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
12.10.2015, 12:29  [ТС] 9
Большое спасибо всем откликнувшимся! Удалось понять, как оно устроено, но в конце-концов я все же решил, что лучше мне читать одно значение по удаленному запросу - реализовал все на TCP Пайтон - великолепный язык!
0
12.10.2015, 12:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2015, 12:29
Помогаю со студенческими работами здесь

Как читать OPC сервер уже существующий?
есть Code Sys сервер там есть поля x и y типа int их надо читать существующим проектомWindows...

Отправка данных на сервер: что не так в коде
Сформулирую вопрос по-другому. Есть такой код на jquery. $(document).ready(function () { ...

Передача на дальние расстояния сигнала + домашняя сеть. Одна сеть или разделить на 2 . Что лучше подскажите!
Здравствуйте. Если есть хорошие спецы в этой теме, подскажите пожалуйста. Описание: Живу в...

Что нужно знать для построения схемы клиент-сервер-база данных
Здравствуйте. Я хочу написать небольшое сетевое приложение. Схема такова: Приложение-клиент...

Что читать по C++?
Прочитала книгу Шилдта: "C++. Руководство для начинающих". Посоветуете, что делать дальше? Возможно...

Что читать[C++]
Всем привет! Подскажите что почитать самому, самому начинающему по С++

Что читать
Приветствую всех! Изучил я давно основы PHP. Переменные, условия, циклы, массивы, некоторые...


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

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