物联网平台支持基于WebSocket的MQTT协议。您可以首先使用WebSocket建立连接,然后在WebSocket通道上使用MQTT协议进行通信,即MQTT over
WebSocket。
背景信息
使用WebSocket方式主要有以下优势:
- 使基于浏览器的应用程序可以像普通设备一样,具备与服务端建立MQTT长连接的能力。
- WebSocket方式使用443端口,消息可以顺利穿过大多数防火墙。
操作步骤
- 准备证书。
WebSocket可以使用ws和wss两种方式,ws是普通的WebSocket连接,wss是增加了TLS加密。如果使用wss方式进行安全连接,需要使用和TLS直连相同的根证书。
- 选择客户端。
直接使用官方客户端,仅需替换连接URL。其他语言版本客户端或者是自主接入,请参见开源MQTT客户端。使用前请阅读相关客户端的说明,是否支持WebSocket方式。
- 连接说明。
使用WebSocket方式进行连接,区别主要在MQTT连接URL的协议和端口号,MQTT连接参数和TCP直接连接方式完全相同,其中要注意securemode参数,使用wss方式连接时,配置securemode=2
,使用ws方式连接时,配置securemode=3
。
- 接入域名:格式为
wss://${MQTT接入地址}
或ws://${MQTT接入地址}
。公共实例和企业版实例中设备的MQTT接入地址信息,请参见查看实例终端节点。
- 端口:443。
- 可变报头(variable header):Keep Alive。
Connect指令中需包含Keep Alive(保活时间)。保活心跳时间取值范围为30至1200秒。如果心跳时间不在此区间内,物联网平台会拒绝连接。建议取值300秒以上。如果网络不稳定,将心跳时间设置高一些。
设备端在保活时间间隔内,至少需要发送一次报文,包括PING请求。
如果物联网平台在保活时间内无法收到任何报文,物联网平台会断开连接,设备端需要进行重连。
- MQTT的Connect报文参数如下:
mqttClientId: clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"
mqttUsername: deviceName+"&"+productKey
mqttPassword: sign_hmac(deviceSecret,content)
其中:
- mqttClientId:格式中
| |
内为扩展参数。
- clientId:表示客户端ID,可自定义,长度不可超过64个字符。建议使用设备的MAC地址或SN码,方便您识别区分不同的客户端。
- securemode:表示目前安全模式,可选值有2(wss协议)和3(ws协议)。
- signmethod:表示签名算法类型。支持hmacmd5,hmacsha1和hmacsha256,默认为hmacmd5。
- timestamp:表示当前时间毫秒值,可以不传递。
- mqttPassword:sign签名需把提交给服务器的参数按字典排序后,根据signmethod加签。签名计算示例,请参见MQTT连接签名示例。
- content的值为提交给服务器的参数(productKey、deviceName、timestamp和clientId),按照参数名称首字母字典排序, 然后将参数值依次拼接。
重要 此处productKey和deviceName为必填参数,timestamp和clientId为可选参数。若传入timestamp或clientId,必须与mqttClientId中的设置相同。
连接示例以企业版实例(实例ID为iot-06****9)下设备为例,预置前提如下:clientId = 12345,deviceName = device, productKey = pk, timestamp = 789,signmethod=hmacsha1,deviceSecret=secret
连接参数如下:
- 使用ws方式:
- 连接域名:
ws://iot-06****9.mqtt.iothub.aliyuncs.com:443
- 连接参数:
mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789|
mqttUsername=device&pk
mqttPasswrod=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString();
- 使用wss方式:
- 连接域名:
wss://iot-06****9.mqtt.iothub.aliyuncs.com:443
- 连接参数:
mqttclientId=12345|securemode=2,signmethod=hmacsha1,timestamp=789|
mqttUsername=device&pk
mqttPasswrod=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString();
建议您使用设备端SDK接入物联网平台。如果您自行开发接入,请参见MQTT连接签名示例。