Proton 连接到 azure iot hub amqp 端点

Proton connection to azure iothub amqps endpoints

我正在尝试在 google 云上的 Debian 4.8.4-1 上使用 python 2.7 qpid 质子 (0.17.0) 连接到 服务 Azure IoT 中心上的 AMQPS 1.0 端点。

我正在为 SASL PLAIN 使用共享访问策略和 SAS 令牌对(在 C# 下的 ampq net lite 中成功运行)。对于 azure iothub,您将共享访问策略引用为格式为 policyName@sas.root.IoTHubName

的用户名

当我将这些(混淆的)凭据与 qpid 质子一起使用时,如下所示

import sys
from proton import Messenger, Message

base = "amqps://iothubowner@sas.root.HubName:SharedAccessSignature sr=HubName.azure-devices.net%2fmessages&sig=PERCENT_ENCODED_SIG&se=1493454429&st=1490861529&skn=iothubowner@HubName.azure-devices.net:5671"

entityName = "/messages/servicebound/feedback"

messenger = Messenger()
messenger.subscribe("%s%s" % ( base, entityName))
messenger.start()

我收到以下错误

(debug print of connection string being passed) amqps://iothubowner@sas.root.HubName:SharedAccessSignature sr=HubName.azure-devices.net%2fmessages&sig=PERCENT_ENCODED_SIG&se=1493454429&st=1490861529&skn=iothubowner@HubName.azure-devices.net:5671

Traceback (most recent call last): File "readProton2.py", line 27, in messenger.subscribe("%s%s" % ( base, entityName)) File "/usr/lib/python2.7/dist-packages/proton/__init__.py", line 496, in subscribe self._check(pn_error_code(pn_messenger_error(self._mng))) File "/usr/lib/python2.7/dist-packages/proton/__init__.py", line 300, in _check raise exc("[%s]: %s" % (err, pn_error_text(pn_messenger_error(self._mng))))

proton.MessengerException: [-2]: CONNECTION ERROR (sas.root.HubName:SharedAccessSignature sr=HubName.azure-devices.net%2fmessages&sig=PERCENT_ENCODED_SIG&se=1493454429&st=1490861529&skn=iothubowner@HubName.azure-devices.net:5671): getaddrinfo(sas.root.HubName, SharedAccessSignature sr=HubName.azure-devices.net%2fmessages&sig=PERCENT_ENCODED_SIG&se=1493454429&st=149086152 9&skn=iothubowner@HubName.azure-devices.net:5671): Servname not supported for ai_socktype

最后的错误消息看起来像是连接字符串的解析被破坏了(快速看一下,qpid-proton/messenger.c 中的 pni_default_rewrite 似乎使用第一次出现的 @ 来拆分可能是问题的连接字符串)

但是,我是 AMQP 和 proton 的新手,所以在我提出错误之前,想检查一下其他人是否已经成功地使用 proton 到 iothub,或者我是否遗漏了什么??

您需要对amqp用户名和密码进行编码。

iothubowner@sas.root.HubName

iothubowner%40sas.root.HubName

SharedAccessSignature sr=HubName.azure-devices.net%2fmessages&sig=PERCENT_ENCODED_SIG&se=1493454429&st=1490861529&skn=iothubowner

SharedAccessSignature%20sr%3DHubName.azure-devices.net%252fmessages%26sig%3DPERCENT_ENCODED_SIG%26se%3D1493454429%26st%3D1490861529%26skn%3Diothubowner

服务器名称应为 HubName.azure-devices.net:5671,但正如您在错误消息中看到的那样,服务器名称已更改为 sas.root.HubName, SharedAccessSignature sr=HubName.azure-devices.net%2fmessages&sig=PERCENT_ENCODED_SIG&se=1493454429&st=149086152 9&skn=iothubowner@HubName.azure-devices.net:5671