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")
}
关键点说明
- 设备身份信息:需要提供设备ID、注册表名称、区域位置和项目ID
- 证书认证:使用RSA证书和私钥进行身份验证
- 日志配置:可以设置调试、信息和错误日志处理器
- 配置处理:当设备配置更新时会调用ConfigHandler
- 事件发布:支持向不同层级的事件主题发布消息
注意事项
- 必须导入
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的框架插件。
准备工作
- 在Google Cloud Console中创建IoT Core注册表
- 创建设备并生成密钥对(RSA或EC)
- 启用必要的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)
}
}
最佳实践
- 错误处理:实现重试逻辑处理连接中断
- 安全:定期轮换设备密钥
- 资源管理:合理设置QoS级别(通常遥测数据用QoS1,配置更新用QoS0)
- 日志记录:记录设备连接状态和消息传输情况
- 资源清理:确保设备断开连接时释放资源
总结
这个框架提供了Google IoT Core设备连接的基本功能,包括:
- 使用JWT进行设备认证
- MQTT协议通信
- 设备管理API
- 消息发布/订阅
你可以在此基础上扩展更多功能,如设备影子、OTA更新等。