# 订阅推送相关问题
 #### 调用订阅接口时，回调地址如何获取？
以业务应用订阅设备数据变化通知为例，订阅和推送的流程如下：
图1订阅推送流程图   
![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001546970100.png "点击放大")
1. 应用服务器通过调用物联网平台的订阅接口订阅设备数据变化通知（携带回调地址和通知类型），物联网平台将业务应用的回调地址和订阅的通知类型存储到订阅列表中以便向业务应用推送设备数据变化消息。
2. 设备上报数据给物联网平台。
3. 物联网平台根据订阅时设置的回调地址，将设备数据主动推送给业务应用。
**什么是回调地址？**
回调地址（callbackUrl）是指业务应用自定义的，供外部访问的RESTful接口地址。当物联网平台向业务应用推送消息时，实际是调用业务应用的RESTful接口把数据发给业务应用。
![](https://support.huaweicloud.com/iothub_faq/public_sys-resources/note_3.0-zh-cn.png)
回调地址的请求方式必须为POST。
**怎样获取回调地址？**
回调地址由通信方式、业务应用的访问地址和RESTful接口的URL组成，如https://server:port/URL。
通信方式建议使用https协议，保证业务应用与物联网平台的通信安全。使用https协议通信时，物联网平台需要加载证书，制作证书参考[证书制作](https://support.huaweicloud.com/usermanual-iothub/iot_01_0001.html#section3)。
由于业务应用所在的网络不同，业务应用的访问地址也不同。
- 业务应用部署在公网时，业务应用的访问地址就是业务应用的公网IP:端口（或域名:端口）。
- 业务应用部署在局域网时，需要在业务应用配置网络穿透，生成业务应用的公网访问地址，具体配置自行从网上获取网络穿透工具的配置步骤。
![](https://support.huaweicloud.com/iothub_faq/public_sys-resources/note_3.0-zh-cn.png)
不同通知类型的订阅，回调地址可以相同也可以不同，根据业务需求自定义。
#### 应用服务器如何收到命令状态变化的通知？
应用服务器调用创建设备命令接口时，配置callbackUrl参数（该参数的IP和端口需要和订阅回调地址的IP和端口一致），每次命令状态发生变化时，物联网平台将会向该地址推送消息。
#### 回调地址可以使用域名吗？
可以，IP和域名都支持。使用域名时，如果域名绑定多个IP，需要做好DNS解析，确保DNS解析后的IP地址可达。这种情况下，推荐使用IP地址作为回调地址。
#### 应用服务器只有内网地址，能否订阅成功？
企业版支持使用内网地址进行订阅。应用服务器需与购买IoTDA企业版时选择的VPC一致。
非企业版不支持使用内网地址进行订阅。在使用公司或校园的内网网络时，需要进行NAT穿透。您可使用NAT穿透软件将内网地址转换为公网地址。
#### 调用订阅接口时，提示回调地址不合法？
回调地址需要包含公网IP（或域名）、端口和文件路径：
- 正确示例：http://IP:PORT/filePath或http://IP:PORT/。
- 错误示例：http://IP:PORT或http://IP/filePath。
 
#### 回调地址必须为https的吗？
平台支持http和https的推送，建议使用https加密传输。
#### 回调地址可以修改吗？
可以。如果回调地址的IP和端口号更换，需要调用"批量删除订阅"接口，删除之前的回调地址后，并上传新的CA证书，再重新订阅。
#### 回调地址的证书必须是权威机构签发的吗？
建议由权威机构签发，平台也支持自定义证书。
#### 推送证书失效怎么处理？
如果是自己制作的调测证书，请重新制作并上传至物联网平台。
如果是厂家提供的证书，请联系厂家重新制作
#### 调用删除单个订阅接口时，subscriptionId如何获取？
subscriptionId在调用订阅接口时，由物联网平台返回。如果遗忘，可以通过调用"批量查询订阅"接口进行查看。
#### 应用服务器如何获取物联网平台推送消息时使用的地址？
应用服务器设置防火墙策略时，可向物联网平台支撑人员获取平台推送消息的地址。
#### 在同一个应用下，平台可以将不同设备上报的数据，推送到两个服务器吗？
可以。只要回调地址不同，均可以接收到平台推送的数据。
#### NB-IoT设备已订阅"消息确认"和"命令响应"通知，为何应用服务器收不到推送消息？
"消息确认"通知和"命令响应"通知不适用于NB-IoT场景（CoAP和LWM2M）。在NB-IoT场景中，响应命令通知可以调用创建设备命令接口时，通过配置callbackUrl参数实现。
#### 设备属性上报通知中无设备属性的单位，怎么获取？
可以根据设备对应的产品模型通过查询产品接口获取设备属性的单位，获取方式请参考[查询产品](https://support.huaweicloud.com/api-iothub/iot_06_v5_0052.html)。
 #### 订阅后消息推送失败如何处理？
**问题描述**
订阅后，应用服务器未正确接收到推送消息，或参考"[连通性测试](https://support.huaweicloud.com/usermanual-iothub/iot_01_0036.html)"，在设备接入管理控制台中使用连通性测试功能测试"第三方应用服务（HTTP推送）"，结果为推送失败。
图2转发目标-连通性测试结果   
![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001951249578.png "点击放大")
**可能原因**
1. 如果订阅地址是HTTPS地址，可能是服务端的证书制作有问题或者服务端证书对应的CA证书未上传至物联网平台
2. 订阅地址对应的服务端口未开放。
3. 若订阅地址为域名，并且域名绑定多个IP，可能是DNS解析问题。
**解决方法**
1. 如果订阅地址是HTTPS地址，商用时，推荐向证书机构申请证书，然后进行证书上传。如果是调测时请先确保[证书制作](https://support.huaweicloud.com/usermanual-iothub/iot_01_0001.html#section3)过程无误。上传证书时如果打开了"是否检查CNAME "开关，需要确保应用服务器的域名地址和证书中的CNAME一致；证书中的CNAME可通过[证书校验工具](https://www.chinassl.net/ssltools/decoder-ssl.html)查看。
2. 请确认订阅地址对应的服务端口是否开放。可在其他外网机器上使用telnet命令验证下您的IP和端口是否已开放，若未开放，请将其开放或修改订阅的IP和端口。
3. 若订阅地址为域名，并且域名绑定多个IP，请确认DNS解析后的IP地址是否正确且可达。
4. 使用设备接入管理控制台提供的"[设备消息跟踪](https://support.huaweicloud.com/usermanual-iothub/iot_01_0030_0.html)"功能，触发推送后，查看消息跟踪的数据，确认平台是否触发订阅推送，以及是否推送成功。
5. 请在应用服务器抓包确认是否接收到设备接入平台推送的消息。
 
#### 应用服务器收到数据，但是平台显示推送失败？
**问题描述**
应用服务器收到数据，但是消息跟踪详情显示推送失败。
图3消息跟踪-HTTP推送失败详情   
![](https://support.huaweicloud.com/iothub_faq/figure/zh-cn_image_0000001952845874.png "点击放大")
**可能原因**
应用服务器收到数据后未向物联网平台返回200 OK状态码，平台在推送15秒后未收到应用服务器状态码，则会认为消息推送失败。
**解决方法**
应用服务器收到数据后需要返回200 OK状态码。
#### 设备数据变化通知和批量设备数据变化通知的区别是什么？
设备数据变化通知和批量设备数据变化通知接口都是订阅设备的数据变化，只是封装的数据格式不一样。
例如：一款水表设备有Battery和Connectivity两种服务类型，每次上报数据都会上报这两个服务的数据。
- 如果订阅deviceDatachanged（设备数据变化通知），则物联网平台分两次将数据推送到应用服务器，第一次推送Battery服务数据，第二次推送Connectivity服务数据。例如：
  ```
  {
      "notifyType":"deviceDataChanged",
      "deviceId":"********",
      "gatewayId":"********",
      "requestId":null,
      "service":{
          "serviceId":"battery",
          "serviceType":"battery",
          "data":{
              "batteryLevel":66
          },
          "eventTime":"20170211T034003Z"
      }
  }
  ```
  ```
  {
      "notifyType":"deviceDataChanged",
      "deviceId":"********",
      "gatewayId":"********",
      "requestId":null,
      "service":{
          "serviceId":"Connectivity",
          "serviceType":"Connectivity",
          "data":{
              "signalStrength":72,
              "cellId":4022250974,
              "tac":61374,
              "mnc":91,
              "mcc":235
          },
          "eventTime":"20170211T092317Z"
      }
  }
  ```
  
- 如果订阅deviceDataschanged（批量设备数据变化通知），则物联网平台将两次服务的数据封装在一起发送到应用服务器。
  ```
  {
      "notifyType":"deviceDatasChanged",
      "requestId":null,
      "deviceId":"********",
      "gatewayId":"********",
      "services":[
          {
              "serviceId":"battery",
              "serviceType":"battery",
              "data":{
                  "batteryLevel":66
              },
              "eventTime":"20170211T034003Z"
          },
          {
              "serviceId":"Connectivity",
              "serviceType":"Connectivity",
              "data":{
                  "signalStrength":72,
                  "cellId":4022250974,
                  "tac":61374,
                  "mnc":91,
                  "mcc":235
              },
              "eventTime":"20170211T034003Z"
          }
      ]
  }
  ```
  
 
#### 为什么设备上报一条数据后应用服务器会收到多条推送？
可能有以下几种情况：
- 如果订阅的"notifyType"为"deviceDataChanged"，且多条消息推送的内容不同，可能是因为设备上报的数据包含了多个service（即"data"参数内包括多个JSON对象），物联网平台会将其拆成多条消息推送。
- 如果是接到两条消息，且一条消息的"notifyType"为"deviceDataChanged"，另一条消息的"notifyType"为"deviceDatasChanged"，说明您同时订阅了设备数据变化和设备数据批量变化，这种情况下设备上报数据物联网平台会推送两条消息。
- 如果是相同的消息反复推送，可能是因为应用服务器没有及时对推送消息返回响应，物联网平台认为推送失败了，启动了重推机制反复推送相同的消息。
 
