Skip to content

Instantly share code, notes, and snippets.

@sheeley
Created May 2, 2014 01:15
Show Gist options
  • Save sheeley/278c3600f08174d6f4fb to your computer and use it in GitHub Desktop.
Save sheeley/278c3600f08174d6f4fb to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# llrp_proto.py - LLRP protocol client support
#
# Copyright (C) 2009 Rodolfo Giometti <[email protected]>
# Copyright (C) 2009 CAEN RFID <[email protected]>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# TODO: use generic functions from llrp_decoder where possible
#
import logging
import struct
from threading import *
from types import *
from socket import *
from util import *
from llrp_errors import *
#
# Define exported symbols
#
__all__ = [
# Class
"LLRPdConnection",
"LLRPdCapabilities",
"LLRPROSpec",
# Commands
"llrp_set_logging",
# Misc
"func",
]
#
# Setup logging
#
logger = logging.getLogger('sllurp')
par_header = '!HH'
par_header_len = struct.calcsize(par_header)
def decode_PerAntennaAirProtocol(data):
print data
try:
logger.debug(func())
par = {}
if len(data) == 0:
print 'no data'
return None, data
header = data[0: par_header_len]
msgtype, length = struct.unpack(par_header, header)
msgtype = msgtype & BITMASK(10)
if msgtype != Message_struct['PerAntennaAirProtocol']['type']:
print 'msg type doesn\'t match'
return (None, data)
body = data[par_header_len: length]
logger.debug('%s (type=%d len=%d)' % (func(), msgtype, length))
fmt = '!HH'
fmt_len = struct.calcsize(fmt)
id_fmt = '!H'
id_fmt_len = struct.calcsize(id_fmt)
# Decode fields
(par['AntennaID'],
par['NumProtocols']) = struct.unpack(fmt, body)
body = body[fmt_len:]
num = int(par['NumProtocols'])
for x in range(1, num + 1):
par['ProtocolID' + str(x)] = struct.unpack(id_fmt, body)
body = body[id_fmt_len:]
return par, data[length:]
except Exception as e:
import sys
import os
print e
import ipdb
exc_type, exc_obj, exc_tb = sys.exc_info()
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
print(exc_type, fname, exc_tb.tb_lineno)
ipdb.set_trace()
Message_struct = {
'PerAntennaAirProtocol': {
'type': 140,
'fields': [
'Type',
'AntennaID',
'NumProtocols',
'ProtocolIDs'
],
'decode': decode_PerAntennaAirProtocol
}
}
if __name__ == '__main__':
data = '\x00\x89\x009\x00\x02@\x00\x00\x00\x00\xa1\x00\x01!\x12\x00\x052.2.0\x00\x8b\x00\x08\x00\x00\x00\x00\x00\x8d\x00\x08\x00\x02\x00\x02\x00\x8c\x00\t\x00\x01\x00\x01\x01\x00\x8c\x00\t\x00\x02\x00\x01\x01\x00\x8e\x00\x1cX\x07\x00\x00\x00\x00\x00\x10\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x10\x00\x00\x00\x08\x00\x8f\x07-\x03H\x00\x01\x00\x90\x07%\x00\x91\x00\x08\x00\x00\x05x\x00\x91\x00\x08\x00\x01\x05\x82\x00\x91\x00\x08\x00\x02\x05\x8c\x00\x91\x00\x08\x00\x03\x05\x96\x00\x91\x00\x08\x00\x04\x05\xa0\x00\x91\x00\x08\x00\x05\x05\xaa\x00\x91\x00\x08\x00\x06\x05\xb4\x00\x91\x00\x08\x00\x07\x05\xbe\x00\x91\x00\x08\x00\x08\x05\xc8\x00\x91\x00\x08\x00\t\x05\xd2\x00\x91\x00\x08\x00\n\x05\xdc\x00\x91\x00\x08\x00\x0b\x05\xe6\x00\x91\x00\x08\x00\x0c\x05\xf0\x00\x91\x00\x08\x00\r\x05\xfa\x00\x91\x00\x08\x00\x0e\x06\x04\x00\x91\x00\x08\x00\x0f\x06\x0e\x00\x91\x00\x08\x00\x10\x06\x18\x00\x91\x00\x08\x00\x11\x06"\x00\x91\x00\x08\x00\x12\x06,\x00\x91\x00\x08\x00\x13\x066\x00\x91\x00\x08\x00\x14\x06@\x00\x91\x00\x08\x00\x15\x06J\x00\x91\x00\x08\x00\x16\x06T\x00\x91\x00\x08\x00\x17\x06^\x00\x91\x00\x08\x00\x18\x06h\x00\x91\x00\x08\x00\x19\x06r\x00\x91\x00\x08\x00\x1a\x06|\x00\x91\x00\x08\x00\x1b\x06\x86\x00\x91\x00\x08\x00\x1c\x06\x90\x00\x91\x00\x08\x00\x1d\x06\x9a\x00\x91\x00\x08\x00\x1e\x06\xa4\x00\x91\x00\x08\x00\x1f\x06\xae\x00\x91\x00\x08\x00 \x06\xb8\x00\x91\x00\x08\x00!\x06\xc2\x00\x91\x00\x08\x00"\x06\xcc\x00\x91\x00\x08\x00#\x06\xd6\x00\x91\x00\x08\x00$\x06\xe0\x00\x91\x00\x08\x00%\x06\xea\x00\x91\x00\x08\x00&\x06\xf4\x00\x91\x00\x08\x00\'\x06\xfe\x00\x91\x00\x08\x00(\x07\x08\x00\x91\x00\x08\x00)\x07\x12\x00\x91\x00\x08\x00*\x07\x1c\x00\x91\x00\x08\x00+\x07&\x00\x91\x00\x08\x00,\x070\x00\x91\x00\x08\x00-\x07:\x00\x91\x00\x08\x00.\x07D\x00\x91\x00\x08\x00/\x07N\x00\x91\x00\x08\x000\x07X\x00\x91\x00\x08\x001\x07b\x00\x91\x00\x08\x002\x07l\x00\x91\x00\x08\x003\x07v\x00\x91\x00\x08\x004\x07\x80\x00\x91\x00\x08\x005\x07\x8a\x00\x91\x00\x08\x006\x07\x94\x00\x91\x00\x08\x007\x07\x9e\x00\x91\x00\x08\x008\x07\xa8\x00\x91\x00\x08\x009\x07\xb2\x00\x91\x00\x08\x00:\x07\xbc\x00\x91\x00\x08\x00;\x07\xc6\x00\x91\x00\x08\x00<\x07\xd0\x00\x91\x00\x08\x00=\x07\xda\x00\x91\x00\x08\x00>\x07\xe4\x00\x91\x00\x08\x00?\x07\xee\x00\x91\x00\x08\x00@\x07\xf8\x00\x91\x00\x08\x00A\x08\x02\x00\x91\x00\x08\x00B\x08\x0c\x00\x91\x00\x08\x00C\x08\x16\x00\x91\x00\x08\x00D\x08 \x00\x91\x00\x08\x00E\x08*\x00\x91\x00\x08\x00F\x084\x00\x91\x00\x08\x00G\x08>\x00\x91\x00\x08\x00H\x08H\x00\x91\x00\x08\x00I\x08R\x00\x91\x00\x08\x00J\x08\\\x00\x91\x00\x08\x00K\x08f\x00\x91\x00\x08\x00L\x08p\x00\x91\x00\x08\x00M\x08z\x00\x91\x00\x08\x00N\x08\x84\x00\x91\x00\x08\x00O\x08\x8e\x00\x91\x00\x08\x00P\x08\x98\x00\x91\x00\x08\x00Q\x08\xa2\x00\x91\x00\x08\x00R\x08\xac\x00\x91\x00\x08\x00S\x08\xb6\x00\x91\x00\x08\x00T\x08\xc0\x00\x91\x00\x08\x00U\x08\xca\x00\x91\x00\x08\x00V\x08\xd4\x00\x91\x00\x08\x00W\x08\xde\x00\x91\x00\x08\x00X\x08\xe8\x00\x91\x00\x08\x00Y\x08\xf2\x00\x91\x00\x08\x00Z\x08\xfc\x00\x91\x00\x08\x00[\t\x06\x00\x91\x00\x08\x00\\\t\x10\x00\x91\x00\x08\x00]\t\x1a\x00\x91\x00\x08\x00^\t$\x00\x91\x00\x08\x00_\t.\x00\x91\x00\x08\x00`\t8\x00\x91\x00\x08\x00a\tB\x00\x91\x00\x08\x00b\tL\x00\x91\x00\x08\x00c\tV\x00\x91\x00\x08\x00d\t`\x00\x91\x00\x08\x00e\tj\x00\x91\x00\x08\x00f\tt\x00\x91\x00\x08\x00g\t~\x00\x91\x00\x08\x00h\t\x88\x00\x91\x00\x08\x00i\t\x92\x00\x91\x00\x08\x00j\t\x9c\x00\x91\x00\x08\x00k\t\xa6\x00\x91\x00\x08\x00l\t\xb0\x00\x91\x00\x08\x00m\t\xba\x00\x91\x00\x08\x00n\t\xc4\x00\x91\x00\x08\x00o\t\xce\x00\x91\x00\x08\x00p\t\xd8\x00\x91\x00\x08\x00q\t\xe2\x00\x91\x00\x08\x00r\t\xec\x00\x91\x00\x08\x00s\t\xf6\x00\x91\x00\x08\x00t\n\x00\x00\x91\x00\x08\x00u\n\n\x00\x91\x00\x08\x00v\n\x14\x00\x91\x00\x08\x00w\n\x1e\x00\x91\x00\x08\x00x\n(\x00\x91\x00\x08\x00y\n2\x00\x91\x00\x08\x00z\n<\x00\x91\x00\x08\x00{\nF\x00\x91\x00\x08\x00|\nP\x00\x91\x00\x08\x00}\nZ\x00\x91\x00\x08\x00~\nd\x00\x91\x00\x08\x00\x7f\nn\x00\x91\x00\x08\x00\x80\nx\x00\x91\x00\x08\x00\x81\n\x82\x00\x91\x00\x08\x00\x82\n\x8c\x00\x91\x00\x08\x00\x83\n\x96\x00\x91\x00\x08\x00\x84\n\xa0\x00\x91\x00\x08\x00\x85\n\xaa\x00\x91\x00\x08\x00\x86\n\xb4\x00\x91\x00\x08\x00\x87\n\xbe\x00\x91\x00\x08\x00\x88\n\xc8\x00\x91\x00\x08\x00\x89\n\xd2\x00\x91\x00\x08\x00\x8a\n\xdc\x00\x91\x00\x08\x00\x8b\n\xe6\x00\x91\x00\x08\x00\x8c\n\xf0\x00\x91\x00\x08\x00\x8d\n\xfa\x00\x91\x00\x08\x00\x8e\x0b\x04\x00\x91\x00\x08\x00\x8f\x0b\x0e\x00\x91\x00\x08\x00\x90\x0b\x18\x00\x91\x00\x08\x00\x91\x0b"\x00\x91\x00\x08\x00\x92\x0b,\x00\x91\x00\x08\x00\x93\x0b6\x00\x91\x00\x08\x00\x94\x0b@\x00\x91\x00\x08\x00\x95\x0bJ\x00\x91\x00\x08\x00\x96\x0bT\x00\x91\x00\x08\x00\x97\x0b^\x00\x91\x00\x08\x00\x98\x0bh\x00\x91\x00\x08\x00\x99\x0br\x00\x91\x00\x08\x00\x9a\x0b|\x00\x91\x00\x08\x00\x9b\x0b\x86\x00\x91\x00\x08\x00\x9c\x0b\x90\x00\x91\x00\x08\x00\x9d\x0b\x9a\x00\x91\x00\x08\x00\x9e\x0b\xa4\x00\x91\x00\x08\x00\x9f\x0b\xae\x00\x91\x00\x08\x00\xa0\x0b\xb8\x00\x92\x00\xd5\x80\x00\x93\x00\xd0\x01\x00\x002\x00\r\xf9&\x00\r\xf72\x00\r\xc8R\x00\x0e$\x1e\x00\x0e"*\x00\r\xcc:\x00\x0e&\x12\x00\x0e\n\xba\x00\x0e\x06\xd2\x00\r\xdf\xc2\x00\x0e\x04\xde\x00\x0e\x00\xf6\x00\r\xd0"\x00\r\xce.\x00\x0e\x1eB\x00\x0e\x10\x96\x00\r\xf5>\x00\r\xd5\xfe\x00\r\xf1V\x00\x0e\x12\x8a\x00\r\xe7\x92\x00\r\xe9\x86\x00\r\xcaF\x00\r\xdd\xce\x00\r\xd2\x16\x00\r\xebz\x00\r\xd4\n\x00\r\xff\x02\x00\r\xf3J\x00\r\xd7\xf2\x00\x0e\x02\xea\x00\r\xfb\x1a\x00\r\xe3\xaa\x00\r\xe5\x9e\x00\r\xd9\xe6\x00\x0e\x1cN\x00\r\xe1\xb6\x00\x0e\x08\xc6\x00\r\xfd\x0e\x00\r\xefb\x00\x0e\x18f\x00\r\xdb\xda\x00\x0e 6\x00\r\xedn\x00\x0e\x1aZ\x00\x0e\x0e\xa2\x00\x0e\x0c\xae\x00\x0e\x14~\x00\r\xc6^\x00\x0e\x16r\x01H\x01D\x01I\x00 \x00\x00\x00\x02\xc0\x02\x00\x03\x00\x00\xf4$\x00\x00\x05\xdc\x00\x00a\xa8\x00\x00a\xa8\x00\x00\x00\x00\x01I\x00 \x00\x00\x00\x00@\x00\x02\x01\x00\x00\x9c@\x00\x00\x07\xd0\x00\x00a\xa8\x00\x00a\xa8\x00\x00\x00\x00\x01I\x00 \x00\x00\x00\x01@\x01\x02\x01\x00\x018\x80\x00\x00\x07\xd0\x00\x000\xd4\x00\x000\xd4\x00\x00\x00\x00\x01I\x00 \x00\x00\x00\x02\xc0\x02\x00\x03\x00\x00\xf4$\x00\x00\x05\xdc\x00\x00a\xa8\x00\x00a\xa8\x00\x00\x00\x00\x01I\x00 \x00\x00\x00\x03\xc0\x02\x00\x03\x00\x01$\xf8\x00\x00\x05\xdc\x00\x00a\xa8\x00\x00a\xa8\x00\x00\x00\x00\x01I\x00 \x00\x00\x00\x04@\x00\x02\x01\x00\x06\x1a\x80\x00\x00\x05\xdc\x00\x00\x18j\x00\x00\x18j\x00\x00\x00\x00\x01I\x00 \x00\x00\x00\x05\xc0\x01\x00\x03\x00\x01\xe8H\x00\x00\x05\xdc\x00\x00a\xa8\x00\x00a\xa8\x00\x00\x00\x00\x01I\x00 \x00\x00\x00\x06\xc0\x03\x00\x01\x00\x00z\x12\x00\x00\x05\xdc\x00\x00a\xa8\x00\x00a\xa8\x00\x00\x00\x00\x01I\x00 \x00\x00\x00\x07\xc0\x02\x00\x03\x00\x01$\xf8\x00\x00\x05\xdc\x00\x00a\xa8\x00\x00a\xa8\x00\x00\x00\x00\x01I\x00 \x00\x00\x00\x08\xc0\x03\x00\x03\x00\x00\x92|\x00\x00\x05\xdc\x00\x00a\xa8\x00\x00a\xa8\x00\x00\x00\x00\x01G\x00\x07\xc0\x00\x08\x03\xff\x00\x11\x00\x00\x00\xa1\x00\x00\x00\x01\x00\x00\x00\x01\x80\x03\xff\x00\x11\x00\x00\x00\xa1\x00\x00\x00d\x00\x00\x00\x01\x80\x03\xff\x00\x11\x00\x00\x00\xa1\x00\x00\x00x\x00\x00\x00\x01\xc0\x03\xff\x00\x11\x00\x00\x00\xa1\x00\x00\x00\xc8\x00\x00\x00\x01\xe0\x03\xff\x00\x11\x00\x00\x00\xa1\x00\x00\x01,\x00\x00\x00\x01\xe0\x03\xff\x00\x11\x00\x00\x00\xa1\x00\x00\x01\x90\x00\x00\x00\x01\x9c\x03\xff\x00\x15\x00\x00\x00\xa1\x00\x00\x00\x82\x00\x00\x00\x01@\x00\x00\x00\x00\x03\xff\x00\x0e\x00\x00\x00\xa1\x00\x00\x01\xf7\x00\x00\x03\xff\x00N\x00\x00\x00\xa1\x00\x00\x01\xf8\x03\xff\x00$\x00\x00\x00\xa1\x00\x00\x01\x00\x00\x0eRadio Firmware\x00\x062.0.26\x03\xff\x00\x1e\x00\x00\x00\xa1\x00\x00\x01\x00\x00\tRadio OEM\x00\x051.0.0'
# data2 = b'\x00\x8c\x00\t\x00\x01\x00\x01\x01\x00\x8c\x00\t\x00\x02\x00\x01\x01'
decode_PerAntennaAirProtocol(data)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment