2017-03-29 11 views
0

私は日食の私のPythonコードを実行しようとしていたとき、私はこのエラーを取得しています:ここでトレースバック(最新の呼び出しの最後):Pythonの

Traceback request error

が私のコードです:

""" 
Module Name: deviceManager.py 
Project:  IoTHubRestSample 
Copyright (c) Microsoft Corporation. 

Using [Device Indentities REST APIs](https://msdn.microsoft.com/en-us/library/azure/mt548489.aspx) to create a new device identity, retrieve a device identity, and list device identities. 

This source is subject to the Microsoft Public License. 
See http://www.microsoft.com/en-us/openness/licenses.aspx#MPL 
All other rights reserved. 

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, 
EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. 
""" 

import base64 
import hmac 
import hashlib 
import time 
import requests 
import urllib 

class DeviceManager: 
    API_VERSION = '2016-02-03' 
    TOKEN_VALID_SECS = 365 * 24 * 60 * 60 
    TOKEN_FORMAT = 'SharedAccessSignature sr=%s&sig=%s&se=%s&skn=%s' 

    def __init__(self, connectionString=None): 
     if connectionString != None: 
      iotHost, keyName, keyValue = [sub[sub.index('=') + 1:] for sub in connectionString.split(";")] 
      self.iotHost = iotHost 
      self.keyName = keyName 
      self.keyValue = keyValue 

    def _buildExpiryOn(self): 
     return '%d' % (time.time() + self.TOKEN_VALID_SECS) 

    def _buildSasToken(self): 
     targetUri = self.iotHost.lower() 
     expiryTime = self._buildExpiryOn() 
     toSign = '%s\n%s' % (targetUri, expiryTime) 
     key = base64.b64decode(self.keyValue.encode('utf-8')) 
     signature = urllib.quote(
      base64.b64encode(
       hmac.HMAC(key, toSign.encode('utf-8'), hashlib.sha256).digest() 
       ) 
     ).replace('/', '%2F') 
     return self.TOKEN_FORMAT % (targetUri, signature, expiryTime, self.keyName) 

    def createDeviceId(self, deviceId): 
     sasToken = self._buildSasToken() 
     url = 'https://%s/devices/%s?api-version=%s' % (self.iotHost, deviceId, self.API_VERSION) 
     body = '{deviceId: "%s"}' % deviceId 
     r = requests.put(url, headers={'Content-Type': 'application/json', 'Authorization': sasToken}, data=body) 
     return r.text, r.status_code 

    def retrieveDeviceId(self, deviceId): 
     sasToken = self._buildSasToken() 
     url = 'https://%s/devices/%s?api-version=%s' % (self.iotHost, deviceId, self.API_VERSION) 
     r = requests.get(url, headers={'Content-Type': 'application/json', 'Authorization': sasToken}) 
     return r.text, r.status_code 

    def listDeviceIds(self, top=None): 
     if top == None: 
      top = 1000 
     sasToken = self._buildSasToken() 
     url = 'https://%s/devices?top=%d&api-version=%s' % (self.iotHost, top, self.API_VERSION) 
     r = requests.get(url, headers={'Content-Type': 'application/json', 'Authorization': sasToken}) 
     return r.text, r.status_code 

    def deleteDeviceId(self, deviceId): 
     sasToken = self._buildSasToken() 
     url = 'https://%s/devices/%s?api-version=%s' % (self.iotHost, deviceId, self.API_VERSION) 
     r = requests.delete(url, headers={'Content-Type': 'application/json', 'Authorization': sasToken, 'If-Match': '*' }) 
     # If-Match Etag, but if * is used, no need to precise the Etag of the device. The Etag of the device can be seen in the header requests.text response 
     return r.text, r.status_code 

if __name__ == '__main__': 
    connectionString = 'HostName=<iot-hub-name>.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<iothubowner-policy-key>' 
    dm = DeviceManager(connectionString) 
    deviceId='iotdevice1' 
    print(dm.createDeviceId(deviceId)) 
    print(dm.retrieveDeviceId(deviceId)) 
    print(dm.listDeviceIds()) 

これを修正するには?

+0

このJavaはどのように関係していますか?エラーから、要求ライブラリが持つ再試行の制限を超えているようです。私はあなたが例外をキャッチし、いくつかの時間をスリープすることをお勧めします5秒とあなたの要求を再試行 – johnII

+0

私はこのコードを実行するためにEclipseを使用しているので.Pythonはそれと統合されています。私はデバッグを試みましたが、このエラーを見つけることができませんでした。 プログラムコードとエラースクリーンショットを試してみてください。解決策を教えてください。 –

+0

私が言及したように、例外をキャッチしようとするとtry-exceptの中で55行目にコールを入れ、しばらくの間スリープした後、同じメソッドを呼び出した後、それが通過するかどうかを確認します – johnII

答えて

0

あなたのリンクコードは、hereから来て、hereにあるAzureのコードサンプルです。あなたのエラーのスクリーンショットによると、コードconnectionString = 'HostName=<iot-hub-name>.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<iothubowner-policy-key>'は変更されていません。オフィシャルチュートリアルCreate an IoT hub using the Azure portalに従って、IoTHubを作成していない場合はそれを作成して、& <iothubowner-policy-key>の代わりに&キー(下記)をコピーしてください。

enter image description here

関連する問題