本文介绍如何调用Go语言的Paho MQTT类库,将设备接入阿里云物联网平台,并进行消息收发。
使用前必读
本文操作步骤以普通用户权限为例。如果您在操作过程中涉及到管理员权限才能执行的操作,可尝试使用sudo
命令执行。
前提条件
已在物联网平台控制台,对应实例下,创建产品和设备,并获取MQTT接入域名和设备证书信息(ProductKey、DeviceName和DeviceSecret)。具体操作,请参见:
准备开发环境
安装Go语言包。
苹果电脑安装命令:
brew install go
Ubuntu电脑安装命令:
sudo apt-get install golang-go
Windows电脑请从Golang官网下载安装包安装。
说明在中国内地境内,Golang官网需在VPN环境下访问。
下载Go语言Paho MQTT库
请访问Eclipse Paho Downloads了解Paho项目和支持的开发语言详情。
使用以下命令下载Go语言版本的Paho MQTT库和相关依赖的库:
go get github.com/eclipse/paho.mqtt.golang
go get github.com/gorilla/websocket
go get golang.org/x/net/proxy
接入物联网平台
下载MqttSign.go,复获取阿里云提供的计算MQTT连接参数所需的源码文件MqttSign.go。
MqttSign.go文件定义了用于计算设备接入物联网平台的MQTT连接参数的函数,您开发的设备端接入物联网平台程序需调用该函数,函数说明如下:
原型:
type AuthInfo struct { password, username, mqttClientId string; } func calculate_sign(clientId, productKey, deviceName, deviceSecret, timeStamp string) AuthInfo;
功能:
用于计算设备接入物联网平台的MQTT连接参数username、password和mqttClientId。
输入参数:
参数
类型
说明
productKey
String
设备所属产品的ProductKey,该设备在物联网平台上的身份证书信息之一。
deviceName
String
设备名称,该设备在物联网平台上的身份证书信息之一。
deviceSecret
String
设备密钥,该设备在物联网平台上的身份证书信息之一。
clientId
String
设备端ID。可以设置为64字符以内的字符串。建议设置为实际设备的SN码或MAC地址。
timeStamp
String
当前时间的毫秒值时间戳。
输出参数:
该函数的返回值为
AuthInfo
结构体,包含以下参数:参数
类型
说明
username
String
MQTT连接所需的用户名。
password
String
MQTT连接所需的密码。
mqttClientId
String
MQTT客户端ID。
添加实现设备接入物联网平台的程序文件。
您需编写程序调用MqttSign.go计算MQTT连接参数,实现接入物联网平台和通信。
开发说明和代码示例如下:
设置设备信息。
// set the device info, include product key, device name, and device secret var productKey string = "a1Zd7n5***" var deviceName string = "testdevice" var deviceSecret string = "UrwclDV33NaFSmk0JaBxNTqgSrJW****" // set timestamp, clientid, subscribe topic and publish topic var timeStamp string = "1528018257135" var clientId string = "192.168.****" var subTopic string = "/" + productKey + "/" + deviceName + "/user/get"; var pubTopic string = "/" + productKey + "/" + deviceName + "/user/update";
设置MQTT连接信息。
调用MqttSign.go中定义的calculate_sign函数,根据传入的参数clientId、 productKey、deviceName、deviceSecret和timeStamp计算出username、password和mqttClientId,并将这些信息都包含在opts中。
// set the login broker url var raw_broker bytes.Buffer raw_broker.WriteString("tls://") raw_broker.WriteString(productKey) raw_broker.WriteString(".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883") opts := MQTT.NewClientOptions().AddBroker(raw_broker.String()); // calculate the login auth info, and set it into the connection options auth := calculate_sign(clientId, productKey, deviceName, deviceSecret, timeStamp) opts.SetClientID(auth.mqttClientId) opts.SetUsername(auth.username) opts.SetPassword(auth.password) opts.SetKeepAlive(60 * 2 * time.Second) opts.SetDefaultPublishHandler(f)
重要对于旧版公共实例,代码
raw_broker.WriteString(".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883")
中的地域代码(cn-shanghai),需设置为您的物联网平台设备所在地域代码。地域代码表达方法,请参见地域列表。对于新版公共实例和企业版实例,代码
opts := MQTT.NewClientOptions().AddBroker(raw_broker.String());
中的raw_broker.String()
需设置为${MQTT接入地址}:1833
。例如,opts := MQTT.NewClientOptions().AddBroker("iot-***.mqtt.iothub.aliyuncs.com:1883");
获取MQTT接入地址的具体操作,请参见查看新版公共实例和企业版实例终端节点信息。
实例的详细说明,请参见实例概述。
调用MQTT的Connect()函数接入物联网平台。
// create and start a client using the above ClientOptions c := MQTT.NewClient(opts) if token := c.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) } fmt.Print("Connect aliyun IoT Cloud Success\n");
调用Publish接口发布消息。需指定发布消息的目标Topic和消息payload。
// publish 5 messages to pubTopic("/a1Zd7n5****/deng/user/update") for i := 0; i < 5; i++ { fmt.Println("publish msg:", i) text := fmt.Sprintf("ABC #%d", i) token := c.Publish(pubTopic, 0, false, text) fmt.Println("publish msg: ", text) token.Wait() time.Sleep(2 * time.Second) }
通信Topic介绍,请参见什么是Topic。
调用Subscribe接口订阅Topic,接收云端下发的消息。
// subscribe to subTopic("/a1Zd7n5***/deng/user/get") and request messages to be delivered if token := c.Subscribe(subTopic, 0, nil); token.Wait() && token.Error() != nil { fmt.Println(token.Error()) os.Exit(1) } fmt.Print("Subscribe topic " + subTopic + " success\n");
关于设备、服务器和物联网平台的通信方式介绍,请参见通信方式概述。
编译项目。
示例代码
使用Demo代码程序接入物联网平台。
下载示例代码包,并提取文件。
aiot-go-demo中包含以下文件:
文件
说明
MqttSign.go
该文件包含以MQTT方式接入物联网平台的连接参数计算代码。iot.go运行时,会调用该文件中定义的calculate_sign函数,计算出连接参数username、password和mqttClientId。
iot.go
该文件包含设备与物联网平台连接和通信的逻辑代码。
x509
物联网平台的根证书,是设备接入物联网平台的必须证书。
说明设备通过MQTT协议云网关接入物联网平台时,设备身份可以由自定义证书认证。具体步骤,请参见步骤一:生成自定义证书。
在iot.go中,修改设备信息为您的设备信息。
可使用Linux vi等工具修改iot.go文件:
将productKey、deviceName和deviceSecret替换为您的设备证书信息。
(可选)替换timeStamp和clientId。clientId的值可以替换为您的实际设备的SN码和MAC地址。
这两个参数值不替换也能接入物联网平台,但实际使用时,建议您替换为实际信息。
修改设备接入物联网平台的MQTT连接信息。详细说明,请参见上文接入物联网平台的步骤2。
在命令行里使用以下命令运行iot.go:
go run iot.go MqttSign.go
运行成功,接入物联网平台的本地日志如下:
clientId192.168.****deviceNametestdeviceproductKeya1Zd7n5****timestamp1528018257135 1b865320fc183cc747041c9faffc9055fc45**** Connect aliyun IoT Cloud Sucess Subscribe topic /a1Zd7n5****/testdevice/user/get success publish msg: 0 publish msg: ABC #0 publish msg: 1 publish msg: ABC #1 publish msg: 2 publish msg: ABC #2 publish msg: 3 publish msg: ABC #3 publish msg: 4 publish msg: ABC #4 publish msg: 5 publish msg: ABC #5
登录物联网平台控制台,可查看设备状态和日志。
错误码
如果设备通过MQTT协议接入物联网平台失败,请根据错误码排查问题。服务端错误码说明,请参见错误排查。