This article describes how to use the Paho MQTT library for Go to connect and communicate with IoT Platform.

Prepare the development environment

Install the Go language package.

  • On macOS, run the following command:
    brew install go
  • On Ubuntu, run the following command:
    sudo apt-get install golang-go
  • On Windows, download the installation package from the Golang official website and install the Go language package.
    Note If you are in mainland China, you need to use a virtual private network (VPN) to visit the Golang official website.

Download the Paho MQTT library for Go

For more information about the Paho project and supported development languages, see Eclipse Paho Downloads.

Run the following commands to download the Paho MQTT library for Go and the related dependencies:

go get github.com/eclipse/paho.mqtt.golang
go get github.com/gorilla/websocket
go get golang.org/x/net/proxy

Connect the client to IoT Platform

  1. Click MqttSign.go and copy the source code that is provided by Alibaba Cloud to obtain the MQTT connection parameters. Then, create the MqttSign.go file on premises and paste the code to the file.

    The MqttSign.go file defines the function to obtain the MQTT connection parameters. You must call this function to connect your client with IoT Platform.

    • Function syntax
      type AuthInfo struct {
          password, username, mqttClientId string;
      }
      
      func calculate_sign(clientId, productKey, deviceName, deviceSecret, timeStamp string) AuthInfo;
    • Description

      This function is used to obtain the following MQTT connection parameters: username, password, and mqttClientId.

    • Input parameters
      Parameter Type Description
      productKey String The ProductKey of the product to which the device belongs. This parameter is used to identify the device in IoT Platform.
      deviceName String The DeviceName of the device. This parameter is used to identify the device in IoT Platform.
      deviceSecret String The DeviceSecret of the device. This parameter is used to identify the device in IoT Platform.
      clientId String The ID of the device. The ID can contain up to 64 characters in length. We recommend that you use the MAC address or serial number (SN) of the device as the ID.
      timeStamp String The timestamp that indicates the current time, in milliseconds.
    • Output parameters

      This function returns an AuthInfo structure that contains the following parameters.

      Parameter Type Description
      username String The username that is used to establish the MQTT connection.
      password String The password that is used to establish the MQTT connection.
      mqttClientId String The ID of the MQTT client.
  2. Add a program file that can connect a device to IoT Platform.

    To obtain MQTT connection parameters, you must write a program to call the function in the MqttSign.go file.

    This section provides the development instructions and sample code.

    • Specify the device information.
      // Specify the device information, including Productkey, DeviceName, and DeviceSecret.
          var productKey string = "a1Zd7n5***"
          var deviceName string = "testdevice"
          var deviceSecret string = "UrwclDV33NaFSmk0JaBxNTqgSrJW****"
      
          // Specify the timeStamp, clientId, subTopic and pubTopic parameters.
          var timeStamp string = "1528018257135"
          var clientId string = "192.168.****"
          var subTopic string = "/" + productKey + "/" + deviceName + "/user/get";
          var pubTopic string = "/" + productKey + "/" + deviceName + "/user/update";
    • Specify the MQTT connection information.

      Call the calculate_sign() function in MqttSign.go file. This function returns the username, password, and mqttClientId parameters based on the clientId, productKey, deviceName, deviceSecret, and timeStamp input parameters. Then, add the result to the opts structure.

          // Specify the logon URL of the broker.
          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());
      
          // Obtain the MQTT connection parameters and add the parameters to the opts structure.
          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)
      Notice

      Replace cn-shanghai in raw_broker.WriteString (".iot-as-mqtt.cn-shanghai.aliyuncs.com: 1883") with the ID of the region where your device resides. For more information about region IDs, see Regions and zones.

    • Call the Connect() function to connect the MQTT client with IoT Platform.
          // Create and start a client by using ClientOptions.
          c := MQTT.NewClient(opts)
          if token := c.Connect(); token.Wait() && token.Error() != nil {
              panic(token.Error())
          }
          fmt.Print("Connect aliyun IoT Cloud Sucess\n");
    • Call the Publish() function to publish messages. You must specify the topic to which messages are published and the payloads of the messages.
          // Publish 5 messages to the /a1Zd7n5****/deng/user/update topic.
          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)
          }

      For more information about topics, see What is a topic?.

    • Call the Subscribe() function to subscribe to the topic and receive messages from IoT Platform.
          // Subscribe to the /a1Zd7n5***/deng/user/get topic and receive the messages.
          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");
                                      

    For more information about the communication methods of devices, servers, and IoT Platform, see Overview.

  3. Compile the project.

Sample code

You can use the sample code to connect a device with IoT Platform.

  1. Download and decompress the demo package.
    The following table describes the files that are contained in the aiot-go-demo package.
    File Description
    MqttSign.go This file contains the code that is used to obtain the MQTT connection parameters. When you run the iot.go file, the calculate_sign() function is called to obtain the username, password, and mqttClientId parameters.
    iot.go This file contains the logic code that is used to connect and communicate with IoT Platform.
    x509 The root certificate of IoT Platform. This certificate is required to connect devices with IoT Platform.
  2. In the iot.go file, replace the device information with your device information.

    You can use tools such as Linux vi to modify the iot.go file.

    • Replace the values of the productKey, deviceName, and deviceSecret parameters with your device certificate information.
    • Optional. Set the timeStamp and clientId parameters. You can replace the value of the clientId parameter with the MAC address or SN of your device.

      If you do not set the two parameters, you can still connect to IoT Platform. However, we recommend that you replace them with actual values.

    • Replace cn-shanghai in raw_broker.WriteString (".iot-as-mqtt.cn-shanghai.aliyuncs.com: 1883") with the ID of the region where your device resides.

      For more information, see Step 2 in the Connect the client to IoT Platform section.

  3. Run the following command in the command-line interface to run the iot.go file:
    go run iot.go MqttSign.go 
    After you run the file, the following local logs are generated:
    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

    Log on to the IoT Platform console.View device status and logs.

Error codes

If a device fails to establish an MQTT connection to IoT Platform, you can troubleshoot the issue based on the error code. For more information about the error codes that may be returned by IoT Platform, see Troubleshooting.