LINUX.ORG.RU

Python работа с сокетами (RFID считыватель)

 , ,


0

1

Привет.

Подскажите пожалуйста как автоматизировать вот такой кейс:

  1. У меня есть устройство (rfid считыватель) которое подключено к модему.
  2. И на мой vds поступают id карт которые считывает это устройство (rfid считыватель)
  3. Я слушая 500 порт на сервере вижу такие сообщения (nc -nvlp 500) :

A000000001 A000000001 A000000002

Они идут постоянно потоком один айди за другим (каждый с новой строки)

Я хочу автоматизировать это все - чтобы реализовать примерно такую логику:

Сделаю БД, занесу айдишники в базу данных и для некоторых разрешу вход а для некоторых нет.

Пока будет достаточно вывода в консоль сообщений : Ок и НЕТ

Как я понял мне нужно работать с сокетами. Вот нашел, поправил два скрипта: server.py http://paste.org.ru/?rlsg79 client.py http://paste.org.ru/?5hvlgq

Но они не видят похоже что приходит на 500 порт - потому что не отдают айдишники на клиент обратно. Сейчас скрипты видят что подключились к сокету и все. Может быть нужно как-то пробросить порт или что то такое?

Подскажите пожалуйста как реализовать данный механизм?

Ответ на: комментарий от eternal_sorrow

Конечно убрал айпи при копипасте. Скрипт на адрес вида 168.225.168.15 смотрит . Может быть я могу убедиться что server.py получает хоть что-то ? (Попробую убрать проверки на длинну сообщений в client.py ) Я так понимаю он тогда станет ретранслировать все данные с порта . Print(data)

feltramt
() автор топика
Ответ на: комментарий от feltramt

client.py для твоей задачи не нужен. но может пригодиться для тестирования. настрой server.py слушать локалхост посылай клиентом на локалхост что нибудь и посмотри, увидит ли сервер

eternal_sorrow ★★★★★
()

Клиент не нужен.

Если запускаешь на VPS, то учитывай, что не всегда IP интерфейса «внутри» сопадает с внешним IP, для проверки попробуй забиндить на все server_socket.bind(('0.0.0.0', 500)).

vvn_black ★★★★★
()

Я питон не знаю, но возможно тут блокирующее чтение?

client_socket.recv(512)

Может лучше читать до получения '\n'? А как обрабатывается таймаут на чтение?

Miha
()

Спасибо большое всем. Причесал скрипт по советам - помогло. Как раз надо было сменить адрес сервера на 0.0.0.0

Скрипт сейчас выглядит:

import socket
from sqlite3 import dbapi2 as sqlite

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 500))
server_socket.listen(5)

print('TCPServer waiting for client on port')

while True:
    (client_socket, address) = server_socket.accept()
    print('Got a connection from'), address

    while True:
        #access = 0
        msg = 'Access denied'
        data = client_socket.recv(512)
        # print IDs
        print(data)

        client_socket.send(msg.encode())
        print('test')

server_socket.close()

И получаю ID в таком виде: тут из важного 2 моих ID A000000001, A000000002

# python server_edit.py
TCPServer waiting for client on port
Got a connection from
b'www.usr.cn'
test
b'\x02A000000001\r\n\x03\x02A000000002\r\n\x03'
test
b'\x02A000000001\r\n\x03'
test
b'\x02A000000001\r\n\x03\x02A000000001\r\n\x03'
test
b'\x02A000000002\r\n\x03'
test
b'\x02A000000001\r\n\x03\x02A000000001\r\n\x03\x02A000000002\r\n\x03'
test
b'\x02A000000001\r\n\x03'
test
b'\x02A000000001\r\n\x03\x02A000000001\r\n\x03\x02A000000002\r\n\x03'

И я не пойму как дальше с этим работать, чтобы проверять каждый id на наличие в БД.

0. Может быть можно как-то вывод упростить? (тут наверное придется все парсить)

1. У меня есть «пакет» в котором в одном витке цикла сразу три айди идут, с этим ничего наверное не сделать , но их тоже надо как обработать и не потерять id из строки.

2. Приличный алгоритм получится по сложности вроде) может быть есть какие-то готовые направления в какую сторону смотреть?

feltramt
() автор топика
Ответ на: комментарий от feltramt

Приличный алгоритм получится по сложности вроде)

Чем он сложный? Делай постепенно:

  • «выдрать» id из полученной строки;
  • проверить id;
  • какое-то действие, разрешить/запретить.

Может быть для новичка это будет сильно сложнее, но рекомендовал бы разобраться и на asyncio делать

https://docs.python.org/3/library/asyncio-stream.html#asyncio-tcp-echo-server-streams

https://docs.python.org/3/library/asyncio-protocol.html#tcp-echo-server

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black

Спасибо! Буду пробывать - с асинхронностью не работал, наверное макет сперва сделаю простой, и потом на async переписывать буду при необходимости

feltramt
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.