全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
阿里云物联网套件

基于TCP连接

更新时间:2017-12-19 21:42:59

本篇文档主要讲解基于TCP的MQTT连接,并且提供了两种设备认证模式。

  1. MQTT客户端域名直连(资源受限设备推荐)
  2. 先HTTPS发送授权后再连接MQTT(一些特殊增值服务,比如设备级别的引流)

需要注意的事项

在进行MQTT CONNECT协议设置的时候,

  1. Connect指令中的KeepAlive有效范围[60秒,300秒],否则会拒绝连接。
  2. 如果同一个设备多个连接可能会导致客户端互相上下线,MQTT默认开源SDK会自动重连,您可以通过日志服务看到设备行为。

一 使用MQTT域名连接模式

您可以使用我们的DEMO进行快速移植,如果不用我们DEMO,完全使用开源MQTT包自主接入(若使用第三方代码, 阿里云不提供技术支持),可以参考以下流程:

  1. 如果使用TLS,需要 下载根证书
  2. 使用MQTT客户端连接服务器,如果您自主接入可以使用开源MQTT客户端参考,如果您对MQTT不了解,可以参考 http://mqtt.org 相关文档。(若使用第三方代码, 阿里云不提供技术支持)

  3. MQTT 连接使用说明

    1. 连接域名:
    2. 华东2节点:${productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883
    3. 美西节点:${productKey}.iot-as-mqtt.us-west-1.aliyuncs.com:1883
    4. 新加坡节点:${productKey}.iot-as-mqtt.ap-southeast-1.aliyuncs.com:1883
    5. ${productKey}请替换为您的产品keymqttConnect报文参数如下:
    6. mqttClientId: clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"
    7. mqttUsername: deviceName+"&"+productKey
    8. mqttPassword: sign_hmac(deviceSecret,content)sign签名需要把以下参数按字典序排序后,再根据signmethod加签。
    9. content=提交给服务器的参数(productKey,deviceName,timestamp,clientId), 按照字母顺序排序, 然后将参数值依次拼接
    10. 其中clientId是客户端自表示id,建议macsn64字符内;timestamp当前时间毫秒值,仅做混淆,可以不传递;mqttClientId格式中||内为扩展参数,signmethod代表签名算法类型,securemode代表目前安全模式,可选值有2 TLS直连模式)、3TCP直连模式),参考以下示例:
  4. 举例:

    1. 如果clientId = 12345deviceName = device productKey = pk timestamp = 789signmethod=hmacsha1deviceSecret=secret,那么使用tcp方式提交给mqtt参数分别如下:
    2. mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789|
    3. username=device&pk
    4. password=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString(); //最后是二进制转16制字符串,大小写不敏感。 这个例子结果为 FAFD82A3D602B37FB0FA8B7892F24A477F851A14
    5. 注意上面3个参数分别是mqtt Connect登录报文的mqttClientId,mqttUsername,mqttPasswrod

二 使用HTTPS认证再连接模式

设备认证流程:

  • 设备认证走https,认证域名为https://iot-auth.cn-shanghai.aliyuncs.com/auth/devicename
  • 认证请求参数信息:

    productKey必选productKey,从iot套件控制台获取
    deviceName必选deviceName,从iot套件控制台获取
    sign必选签名,hmacmd5(deviceSecret,content), content = 将所有提交给服务器的参数(version,sign,resources,signmethod除外), 按照字母顺序排序, 然后将参数值依次拼接,无拼接符号
    signmethod 可选 算法类型,hmacmd5或hmacsha1
    clientId 必选 客户端自表示Id,64字符内
    timestamp 可选 时间戳,目前时间戳并不做窗口校验,只起到加盐的作用
    resources 可选 希望获取的资源描述,如mqtt。 多个资源名称用逗号隔开.

    • 响应参数

      iotId必选服务器颁发的一个连接标记,用于赋值给MQTT connect报文中的username
      iotToken必选token有效期为7天,赋值给MQTT connect报文中的password
      [resources]可选资源信息,扩展信息比如mqtt服务器地址、CA证书信息等
    • x-www-form-urlencoded请求举例

    1. POST /auth/devicename HTTP/1.1
    2. Host: iot-auth.cn-shanghai.aliyuncs.com
    3. Content-Type: application/x-www-form-urlencoded
    4. Content-Length: 123
    5. productKey=123&sign=123&timestamp=123&version=default&clientId=123&resouces=mqtt&deviceName=test
    6. sign = hmac_md5(deviceSecret, clientId123deviceNametestproductKey123timestamp123)
    • 请求响应
    1. HTTP/1.1 200 OK
    2. Server: Tengine
    3. Date: Wed, 29 Mar 2017 13:08:36 GMT
    4. Content-Type: application/json;charset=utf-8
    5. Connection: close
    6. {
    7. "code" : 200,
    8. "data" : {
    9. "iotId" : "42Ze0mk3556498a1AlTP",
    10. "iotToken" : "0d7fdeb9dc1f4344a2cc0d45edcb0bcb",
    11. "resources" : {
    12. "mqtt" : {
    13. "host" : "xxx.iot-as-mqtt.cn-shanghai.aliyuncs.com",
    14. "port" : 1883
    15. }
    16. }
    17. },
    18. "message" : "success"
    19. }

    连接MQTT:

    • 下载IoT根证书 root.crt, 建议使用TLS1.2。
    • 指定阿里云MQTT服务器地址(认证返回的MQTT地址和端口)进行通信。
    • 采用TLS建立连接,客户端验证服务器通过CA证书完成,而服务器验证客户端通过MQTT协议体内connect报文中的username=iotId,password=iotToken,clientId=自定义设备标记(建议MAC或SN);如果iotId或iotToken非法,mqtt connect失败,收到的connect ack为3。

    错误码

    1. 401: request auth error,在这个场景里面通常在签名匹配不通过时返回
    2. 460: param error,参数异常
    3. 500: unknow error,一些未知异常
    4. 5001: meta device not found,指定的设备不存在
    5. 6200: auth type mismatch,未授权认证类型错误
本文导读目录