golang实现Google IoT Core设备连接的物联网框架插件iot的使用

Golang实现Google IoT Core设备连接的物联网框架插件iot的使用

这是一个用于实现Google IoT设备的简单框架。该包使用context包来处理请求取消、超时和截止时间。

示例代码

下面是一个完整的示例,展示如何使用这个库连接Google IoT Core:

package main

import (
	"context"
	"log"
	"github.com/vaelen/iot"
	// 你的客户端必须包含paho包
	// 才能使用默认的Eclipse Paho MQTT客户端
	_ "github.com/vaelen/iot/paho"
)

func main() {
	ctx := context.Background()

	// 设备身份信息配置
	id := &iot.ID{
		DeviceID:  "deviceName",    // 设备名称
		Registry:  "my-registry",   // 注册表名称
		Location:  "asia-east1",    // 区域位置
		ProjectID: "my-project",    // 项目ID
	}

	// 加载RSA证书和私钥
	credentials, err := iot.LoadRSACredentials("rsa_cert.pem", "rsa_private.pem")
	if err != nil {
		panic("无法加载证书")
	}

	// 设置默认选项
	options := iot.DefaultOptions(id, credentials)
	options.DebugLogger = log.Println  // 调试日志
	options.InfoLogger = log.Println   // 信息日志
	options.ErrorLogger = log.Println  // 错误日志
	
	// 配置处理函数
	options.ConfigHandler = func(thing iot.Thing, config []byte) {
		// 在这里处理更新的配置并创建更新后的状态字符串
		state := []byte("ok")
		thing.PublishState(ctx, state)
	}

	// 创建新的IoT设备实例
	thing := iot.New(options)

	// 连接到Google IoT Core MQTT服务器
	err = thing.Connect(ctx, "ssl://mqtt.googleapis.com:443")
	if err != nil {
		panic("无法连接到服务器")
	}
	defer thing.Disconnect(ctx)  // 确保在程序结束时断开连接

	// 发布事件到/events
	thing.PublishEvent(ctx, []byte("顶层遥测事件"))
	// 发布事件到/events/a
	thing.PublishEvent(ctx, []byte("子文件夹遥测事件"), "a")
	// 发布事件到/events/a/b
	thing.PublishEvent(ctx, []byte("子文件夹遥测事件"), "a", "b")
}

关键点说明

  1. 设备身份信息:需要提供设备ID、注册表名称、区域位置和项目ID
  2. 证书认证:使用RSA证书和私钥进行身份验证
  3. 日志配置:可以设置调试、信息和错误日志处理器
  4. 配置处理:当设备配置更新时会调用ConfigHandler
  5. 事件发布:支持向不同层级的事件主题发布消息

注意事项

  • 必须导入github.com/vaelen/iot/paho包才能使用默认的MQTT客户端
  • 需要提前准备好RSA证书和私钥文件
  • 连接地址固定为ssl://mqtt.googleapis.com:443

这个框架简化了与Google IoT Core的交互,使得设备连接和消息发布变得更加简单。


更多关于golang实现Google IoT Core设备连接的物联网框架插件iot的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现Google IoT Core设备连接的物联网框架插件iot的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang实现Google IoT Core设备连接的物联网框架插件

Google IoT Core是Google Cloud提供的物联网设备管理平台,下面我将介绍如何使用Golang实现设备连接Google IoT Core的框架插件。

准备工作

  1. 在Google Cloud Console中创建IoT Core注册表
  2. 创建设备并生成密钥对(RSA或EC)
  3. 启用必要的Google Cloud API

核心代码实现

1. 设备认证连接

package iotcore

import (
	"context"
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"io/ioutil"
	"time"

	mqtt "github.com/eclipse/paho.mqtt.golang"
	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	"google.golang.org/api/cloudiot/v1"
)

// DeviceConfig 设备配置
type DeviceConfig struct {
	ProjectID  string
	Region     string
	RegistryID string
	DeviceID   string
	PrivateKey []byte
	Algorithm  string // "RS256" 或 "ES256"
}

// Connect 连接到Google IoT Core
func (d *DeviceConfig) Connect() (mqtt.Client, error) {
	// 创建JWT token
	token, err := d.createJWT()
	if err != nil {
		return nil, fmt.Errorf("failed to create JWT: %v", err)
	}

	// MQTT配置
	broker := fmt.Sprintf("ssl://mqtt.googleapis.com:8883")
	clientID := fmt.Sprintf("projects/%s/locations/%s/registries/%s/devices/%s",
		d.ProjectID, d.Region, d.RegistryID, d.DeviceID)

	opts := mqtt.NewClientOptions()
	opts.AddBroker(broker)
	opts.SetClientID(clientID)
	opts.SetUsername("unused") // 用户名必须设置但不会被使用
	opts.SetPassword(token)    // 密码设置为JWT token

	// TLS配置
	certpool := x509.NewCertPool()
	pemCerts, err := ioutil.ReadFile("roots.pem") // Google根证书
	if err == nil {
		certpool.AppendCertsFromPEM(pemCerts)
	}

	opts.SetTLSConfig(&tls.Config{
		RootCAs:            certpool,
		ClientAuth:         tls.NoClientCert,
		InsecureSkipVerify: true,
	})

	client := mqtt.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil {
		return nil, fmt.Errorf("failed to connect: %v", token.Error())
	}

	return client, nil
}

// createJWT 创建JWT token
func (d *DeviceConfig) createJWT() (string, error) {
	conf := &jwt.Config{
		PrivateKey: d.PrivateKey,
		Algorithm:  d.Algorithm,
		TokenExp:   24 * time.Hour,
		Audience:   d.ProjectID,
	}
	return conf.Create()
}

2. 设备管理

// DeviceManager 设备管理
type DeviceManager struct {
	service *cloudiot.Service
}

// NewDeviceManager 创建设备管理器
func NewDeviceManager(credentialsFile string) (*DeviceManager, error) {
	ctx := context.Background()
	
	data, err := ioutil.ReadFile(credentialsFile)
	if err != nil {
		return nil, fmt.Errorf("failed to read credentials: %v", err)
	}

	config, err := google.JWTConfigFromJSON(data, cloudiot.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("failed to create JWT config: %v", err)
	}

	service, err := cloudiot.New(config.Client(ctx))
	if err != nil {
		return nil, fmt.Errorf("failed to create IoT service: %v", err)
	}

	return &DeviceManager{service: service}, nil
}

// CreateDevice 创建设备
func (dm *DeviceManager) CreateDevice(projectID, region, registryID, deviceID string, publicKey []byte) error {
	parent := fmt.Sprintf("projects/%s/locations/%s/registries/%s", projectID, region, registryID)
	
	device := &cloudiot.Device{
		Id: deviceID,
		Credentials: []*cloudiot.DeviceCredential{
			{
				PublicKey: &cloudiot.PublicKeyCredential{
					Format: "RSA_X509_PEM",
					Key:    string(publicKey),
				},
			},
		},
	}

	_, err := dm.service.Projects.Locations.Registries.Devices.Create(parent, device).Do()
	return err
}

3. 消息发布与订阅

// Publish 发布消息
func Publish(client mqtt.Client, topic string, payload []byte) error {
	token := client.Publish(topic, 1, false, payload)
	token.Wait()
	return token.Error()
}

// Subscribe 订阅主题
func Subscribe(client mqtt.Client, topic string, callback mqtt.MessageHandler) error {
	token := client.Subscribe(topic, 1, callback)
	token.Wait()
	return token.Error()
}

使用示例

func main() {
	// 1. 初始化设备配置
	config := &iotcore.DeviceConfig{
		ProjectID:  "your-project-id",
		Region:     "us-central1",
		RegistryID: "your-registry",
		DeviceID:   "device-001",
		PrivateKey: []byte("-----BEGIN RSA PRIVATE KEY-----\n..."),
		Algorithm:  "RS256",
	}

	// 2. 连接设备
	client, err := config.Connect()
	if err != nil {
		log.Fatalf("Failed to connect: %v", err)
	}
	defer client.Disconnect(250)

	// 3. 订阅配置更新
	err = iotcore.Subscribe(client, "/devices/device-001/config", func(c mqtt.Client, m mqtt.Message) {
		log.Printf("Received config: %s", m.Payload())
	})
	if err != nil {
		log.Printf("Failed to subscribe: %v", err)
	}

	// 4. 发布遥测数据
	for {
		data := fmt.Sprintf(`{"temp": %.1f, "humidity": %.1f}`, 25.5, 60.2)
		err := iotcore.Publish(client, "/devices/device-001/events", []byte(data))
		if err != nil {
			log.Printf("Failed to publish: %v", err)
		}
		time.Sleep(10 * time.Second)
	}
}

最佳实践

  1. 错误处理:实现重试逻辑处理连接中断
  2. 安全:定期轮换设备密钥
  3. 资源管理:合理设置QoS级别(通常遥测数据用QoS1,配置更新用QoS0)
  4. 日志记录:记录设备连接状态和消息传输情况
  5. 资源清理:确保设备断开连接时释放资源

总结

这个框架提供了Google IoT Core设备连接的基本功能,包括:

  • 使用JWT进行设备认证
  • MQTT协议通信
  • 设备管理API
  • 消息发布/订阅

你可以在此基础上扩展更多功能,如设备影子、OTA更新等。

回到顶部