0

私は問題があります。

センサー ネットワークにコマンドを送信するページがあります。

コードのこの部分をクリックすると

<a href='javascript:void(send_command_to_network("{{net.id}}", "restartnwk"));'>Restart Network <i class="icon-repeat"></i> </a>

私はjs関数を呼び出します。これは次のとおりです。

function send_command_to_network(net, command) {
    $.ajax({url: "/networks/" + net + "/send?command=" + command,
    type: "GET",
    async: true,
    dataType: "json",
    success: function(json_response) { 
         var err = json_response['error'];
     if (err) {
       show_alert('error', err);
       return;
     }
     var success = json_response['success'];
     if (success) {
       show_alert('success', success);
       return;
     }
     show_alert('alert', "This should not happen!");
       }
     }); 
    }

この関数は、Python で記述された Tornado Web サーバーのハンドラーを呼び出す URL を作成します。ハンドラーは次のとおりです。

class NetworkSendHandler(BaseHandler):
    # Requires authentication 
    @tornado.web.authenticated
    def get(self, nid):
        # Get the command 
        command = self.get_argument('command').upper(); 

        # The dictionary to return
        ret = {}

        #Check if the command is available
        if command not in ['RESTARTNWK']:
            raise tornado.web.HTTPError(404, "Unknown command: " + str(command))


        #Command ZDP-RestartNwk.Request
        if command == 'RESTARTNWK':
            op_group = "A3"
            op_code = "E0"
            packet_meta = "*%s;%s;%s;#"
            pkt_len = hextransform(16, 2)

            packet = packet_meta % (op_group, op_code, pkt_len)
            packet = packet.upper()

            op_group_hex=0xA3
            op_code_hex=0xE0

            cmdjson = packet2json(op_group_hex,op_code_hex, packet)

        self.finish()

Tornado デバッグ コンソールに次のエラーが表示されます。

Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/tornado/web.py", line 988, in _execute
    getattr(self, self.request.method.lower())(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/tornado/web.py", line 1739, in wrapper
    return method(self, *args, **kwargs)
  File "./wsn.py", line 859, in get
    cmdjson = packet2json(op_group_hex,op_code_hex, packet)
  File "./wsn.py", line 188, in packet2json
    fcs = fcs ^ int('0x' + payload[(i - 1):(i + 1)], 16)
ValueError: invalid literal for int() with base 16: '0x*A'

エラーは、packet2json の呼び出しの後であると思います。そして、エラーは「0x * A」が有効なintではないことを示しているため、関数内の変換にあると思います。「*」がエラーだと思います...どうすれば解決できますか?

編集

すみません、関数を忘れました:

# Transform an integer into a string with HEX symbols in the format that is
# understandable by Quantaservd
def hextransform(data, length):
    data = hex(data).lstrip('0x').rstrip('L')
    assert(len(data) <= length)
    # zero-padding
    data = ('0' * (length - len(data))) + data
    print data
    # Swap 'bytes' in the network ID
    data = list(data)
    for i in range(0, length, 2):
        tmp = data[i]
        data[i] = data[i + 1]
        data[i + 1] = tmp
    # Reverse the whole string (TODO: CHECK) 
    data.reverse()
    data = "".join(data)
    return data


def packet2json(op_group, op_code, payload): 
    #op_group =
    #op_code =
    #payload=""    # stringa ascii 2 char per byte, senza checksum 
    lun = len(payload) / 2
    fcs = op_group ^ op_code ^ lun #fcs = XOR of op_groip, op_code, lenght and  payload
    for i in range(len(payload)):
    if ((i % 2) == 1):
        fcs = fcs ^ int('0x' + payload[(i - 1):(i + 1)], 16)
        print int('0x' + payload[(i - 1):(i + 1)], 16)
    s=cmd_payload(op_group,op_code, lun, payload, fcs)
    #p = r '{"data": "' + s + r '"}'
    p=r'{"data": "'+s+r'"}'
    return p
4

1 に答える 1

0

問題はpacket2json()関数にあります:

for i in range(len(payload)):
    if ((i % 2) == 1):
        fcs = fcs ^ int('0x' + payload[(i - 1):(i + 1)], 16)

プログラムでは、この関数を次のように呼び出します。

packet2json(0xa3, 0xe0, '*A3;E0;10;#')

上記のループは最初の文字 (インデックス 0) から始まり、インデックスが奇数ではないため無視してから、インデックスが奇数 (1%2 == 1) である 2 番目の文字 (インデックス 1) に移動します。ifステートメントの本体は、常にクラッシュする、つまりint('0x' + payload[(i-1):(i+1)], 16)、つまり を使用しています...int('0x' + payload[0:2], 16)int('0x*A',16)

正しい文字列インデックスを使用するようにこの関数を書き直すか、ペイロードpacket2json()の先頭なしで正しく呼び出す必要があります。*

于 2013-02-19T17:14:08.413 に答える