2013-02-18 3 views
0

Исправлено. См. Ответ на мой вопрос ниже.Интерфейс Python для Alien RFID-считывателя

Я пытаюсь связаться с читателем Alien RFID 9800 через интерфейс TCP/IP с Python 2.7.
Однако прилагаемый тестовый код не выходит за пределы регистрационного имени читателя, и читатель не обрабатывает команду «Получить имя читателя».
Я использую имя пользователя по умолчанию (чужой) и пароль (пароль). Все отлично работает с интерфейсом 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() 

ответ

0

У вас есть несколько команд print response. Печатает что-нибудь или нет?

+0

Я получаю заголовок считывателя чужих. Однако я ничего не получаю. При проверке кода Java в Интернете используется ограничитель '\ n' [LR], а не документированный '\ r \ n' [CR] [LF]. Является ли ограничитель TCP/IP «\ n» [LF]? – EMS

0

После дальнейших экспериментов я могу подтвердить, что терминатор команды просто «\ n» [LF], а не «\ r \ n» [CR] [LR] для интерфейса TCP. Поэтому, если приведенный выше код исправлен до:

CmdDelim = '\n' 

Теперь все работает нормально.

К сожалению, документация Alien была очень специфичной, что [CR] [LF] является терминатором команды. Возможно, это верно для последовательного интерфейса, но это не работает для TCP.