当前位置: 首页 > 知识库问答 >
问题:

azure iothub直接方法未按预期工作

程正阳
2023-03-14

我能够在iothub消息(从云到设备的消息)上打开一个侦听器,但我无法订阅direct方法。我尝试使用mqtt支持,而不是iothub库

我已经跟踪https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-direct-methods#mqtt但一定有一个小细节我还没有设法做到正确

这是我的代码(python)

from paho.mqtt import client as mqtt
import ssl
import token_generator #a script that exports the token , it is working fine for device messages

path_to_root_cert = "cert.cer"
device_id = "mydevice_id "
endpoint ="myiot_hub_name.azure-devices.net/devices/mydevice_id "
policyKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
sas_token =  token_generator.generate_sas_token(endpoint ,policyKey ,None)
iot_hub_name = "myiot_hub_name"

def on_connect(client, userdata, flags, rc):
  print ("Device connected with result code: " + str(rc))
def on_disconnect(client, userdata, rc):
  print ("Device disconnected with result code: " + str(rc))
def on_publish(client, userdata, mid):
  print ("Device sent message")
def on_message(client, userdata, msg):
    print("Message received at: " + msg.topic+" with payload: "+str(msg.payload))

client = mqtt.Client(client_id=device_id, protocol=mqtt.MQTTv311)

client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_publish = on_publish
client.on_message = on_message

client.username_pw_set(username=iot_hub_name+".azure-devices.net/" + device_id, password=sas_token)

client.tls_set(ca_certs=path_to_root_cert, certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1, ciphers=None)
client.tls_insecure_set(False)

client.connect(iot_hub_name+".azure-devices.net", port=8883 )

client.subscribe("iothub/methods/POST/")

client.loop_forever()

共有2个答案

柴彬
2023-03-14

我也面临这样的问题。花了一段时间后,我发现实际问题在python示例中。

根据留档,用户名应该是{iothubhost name}/{device_id}/?api-version=2018-06-30但在示例中缺少版本。因此,如果您尝试订阅从$iothub开始的任何主题,它都不起作用。

在修复用户名后,一切对我来说都很好。

万俟经纶
2023-03-14

客户端应该订阅以下主题:

$iothub/methods/POST/#

以下是订阅的其他主题:

$iothub/twin/res/#
$iothub/twin/PATCH/properties/desired/#
devices/{myDeviceId}/messages/devicebound/#
devices/{myDeviceId}/modules/{myModuleId}/messages/devicebound/#

和设备流(当前在预览中)

$iothub/streams/POST/#
 类似资料:
  • 根据以下文档:http://testng.org/doc/documentation-main.html “如果测试类上有一个方法tearDown(),那么在每个测试方法之前和之后都会调用它”(JUnit 3) 我使用的是JUnit版本:3.8.1 这里的这个是在我的测试之前运行的,但我希望它会在测试之后。它在测试后没有运行: 我可以通过将第一行更改为: 但是,下一个类(下面)的表示法与第一个类完

  • 问题内容: Font font = Font(“Arial”, Font.BOLD, 35); 这将创建一个JLabel,在其上方和下方都有一个额外的空间。我试过了,但是没有用。同样,我不想将JLabel对齐到顶部,但是JLabel内的文本应该对齐到 顶部。 问题答案: 标签中的文本实际上已经与顶部对齐。即使您设置 了以下三个条件: 您仍然会发现差距。 问题与字体指标有关。字体留给变音符号使用的空

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括: