Интерфейс Python для чтения чужой RFID
Исправленный. Смотрите ответ на мой собственный вопрос ниже.
Я пытаюсь установить связь с читателем Alien RFID 9800 через интерфейс TCP/IP с Python 2.7.
Однако приложенный тестовый код не выходит за пределы входа в систему считывателя, и считыватель не обрабатывает команду "Get ReaderName".
Я использую имя пользователя по умолчанию (иностранец) и пароль (пароль). Вещи отлично работают из интерфейса Alien. Что-то не так с обменом логином? Что не правильно?
import socket
cmdHost, cmdPort = '192.168.1.106', 23
CmdDelim = '\n' # Corrected from '\n\r' to '\n'. Delimiter of Alien commands (sent to reader).
ReaderDelim = '\r\n\0' # Delimiter of Alien reader responses (received from reader).
CmdPrefix = chr(1) # Causes Alien reader to suppress prompt on response.
def getResponse( conn ):
''' Get the reader's response with correct terminator. '''
response = ''
while not response.endswith( ReaderDelim ):
more = conn.recv( 4096 )
if not more:
break
response += more
return response
def GetReaderName():
''' Log into the reader, get the reader name, then quit. '''
print 'Sending commands to the Alien reader...'
cmdSocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
try:
cmdSocket.connect( (cmdHost, int(cmdPort)) )
except Exception as inst:
log( 'Reader Connection Failed: CmdAddr=%s:%d' % (cmdHost, cmdPort) )
log( '%s' % inst )
cmdSocket.close()
return False
# Read the initial header from the reader.
response = getResponse( cmdSocket )
print response
# UserName
cmdSocket.sendall( 'alien%s' % CmdDelim )
response = getResponse( cmdSocket )
print response
# Password
cmdSocket.sendall( 'password%s' % CmdDelim )
response = getResponse( cmdSocket )
print response
# Get ReaderName command
cmdSocket.sendall( '%sGet ReaderName%s' % (CmdPrefix, CmdDelim) )
response = getResponse( cmdSocket )
print response
# Quit
cmdSocket.sendall( '%sQuit%s' % (CmdPrefix, CmdDelim) )
response = getResponse( cmdSocket )
print response
cmdSocket.close()
return True
if __name__ == '__main__':
GetReaderName()
2 ответа
У вас есть некоторые print response
команды. Печатает что-нибудь или нет?
После дальнейших экспериментов я могу подтвердить, что терминатором команды является просто "\n" [LF], а не "\r\n" [CR][LR] для интерфейса TCP. Так что, если код выше исправлен на:
CmdDelim = '\n'
Теперь все работает отлично.
К сожалению, документация Alien была очень конкретной, что [CR] [LF] является терминатором команды. Возможно, это верно для последовательного интерфейса, но он не работает для TCP.