go 连接阿里云mqtt消息队列实现mqtt后台管理
package albaba import ( "fmt" openapi "github.com/alibabacloud-go/darabonba-openapi/client" onsmqtt20200420 "github.com/alibabacloud-go/onsmqtt-20200420/client" "github.com/alibabacloud-go/tea/tea" "os" "src/goProject1/config" ) var ( addr string AccessKey_ID string AccessKey_Secret string InstanceId string token string client *onsmqtt20200420.Client ) func init() { addr = config.ENV["alibaba_mq"]["addr"] AccessKey_ID = config.ENV["alibaba_mq"]["AccessKey_ID"] AccessKey_Secret = config.ENV["alibaba_mq"]["AccessKey_Secret"] InstanceId = config.ENV["alibaba_mq"]["InstanceId"] client, _ = CreateClient(tea.String(AccessKey_ID), tea.String(AccessKey_Secret)) _, _ = applyToken() } func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *onsmqtt20200420.Client, _err error) { config_ := &openapi.Config{ // 您的AccessKey ID AccessKeyId: accessKeyId, // 您的AccessKey Secret AccessKeySecret: accessKeySecret, } // 访问的域名 config_.Endpoint = tea.String(addr) _result = &onsmqtt20200420.Client{} _result, _err = onsmqtt20200420.NewClient(config_) return _result, _err } func applyToken() (string, error) { _, err := queryToken(token) if err == nil { return "", err } //timeUnixNano:=time.Now().UnixNano() applyTokenRequest := &onsmqtt20200420.ApplyTokenRequest{ InstanceId: tea.String(InstanceId), ExpireTime: tea.Int64(324000000000000000), Resources: tea.String("mao"), Actions: tea.String("R,W"), } // 复制代码运行请自行打印 API 的返回值 res, _err := client.ApplyToken(applyTokenRequest) if _err != nil { fmt.Println("ApplyToken", " err") return "", _err } token = *res.Body.Token return *res.Body.Token, nil } func queryToken(token string) (*onsmqtt20200420.QueryTokenResponse, error) { queryTokenRequest := &onsmqtt20200420.QueryTokenRequest{ InstanceId: tea.String(InstanceId), Token: tea.String(token), } // 复制代码运行请自行打印 API 的返回值 res, _err := client.QueryToken(queryTokenRequest) if _err != nil { //fmt.Println("queryToken", " err") return res, _err } return res, nil } func sendMessage(topic, payload string) (*onsmqtt20200420.SendMessageResponse, error) { //queryToken(token) //} sendMessageRequest := &onsmqtt20200420.SendMessageRequest{ InstanceId: tea.String(InstanceId), MqttTopic: tea.String(topic), Payload: tea.String(payload), } //fmt.Println(sendMessageRequest) //复制代码运行请自行打印 API 的返回值 res, _err := client.SendMessage(sendMessageRequest) if _err != nil { fmt.Println("是否违法") return nil, _err } return res, _err } func _main(args []*string) (_err error) { a, _ := sendMessage("mao", "hello sd") fmt.Println(a) //fmt.Println(a.Body) fmt.Println("=== sucessful ===") return _err } func send() { } func Main() { err := _main(tea.StringSlice(os.Args[1:])) if err != nil { fmt.Println(err) //panic(err) } } //批量查询客户端在线状态 func QueryClientsOnline(clientIdList []string) (*onsmqtt20200420.BatchQuerySessionByClientIdsResponse, error) { var clientIdList_ = make([]*string, len(clientIdList)) for i, s := range clientIdList { clientIdList_[i] = tea.String(s) } batchQuerySessionByClientIdsRequest := &onsmqtt20200420.BatchQuerySessionByClientIdsRequest{ InstanceId: tea.String(InstanceId), ClientIdList: clientIdList_, } // 复制代码运行请自行打印 API 的返回值 res, _err := client.BatchQuerySessionByClientIds(batchQuerySessionByClientIdsRequest) if _err != nil { return nil, _err } //fmt.Println(res) return res, nil } //查询设备连接信息 func QueryClientOnline(clientId string) (*onsmqtt20200420.QuerySessionByClientIdResponse, error) { querySessionByClientIdRequest := &onsmqtt20200420.QuerySessionByClientIdRequest{ ClientId: tea.String(clientId), InstanceId: tea.String(InstanceId), } // 复制代码运行请自行打印 API 的返回值 res, _err := client.QuerySessionByClientId(querySessionByClientIdRequest) if _err != nil { return nil, _err } //fmt.Println(res) return res, nil } //向微消息队列 MQTT 版发送单条消息 func SendMessage(topic, payload string) (*onsmqtt20200420.SendMessageResponse, error) { sendMessageRequest := &onsmqtt20200420.SendMessageRequest{ tea.String(topic), tea.String(InstanceId), tea.String(payload), } // 复制代码运行请自行打印 API 的返回值 res, _err := client.SendMessage(sendMessageRequest) if _err != nil { return nil, _err } //fmt.Println(res) return res, nil } //校验 Token 的有效性 //queryTokenRequest := &onsmqtt20200420.QueryTokenRequest{ //Token: tea.String("fvdf"), //InstanceId: tea.String("gdb"), //} 复制代码运行请自行打印 API 的返回值 //_, _err = client.QueryToken(queryTokenRequest) //if _err != nil { //return _err //} //吊销 Token func RevokeToken(token string) error { revokeTokenRequest := &onsmqtt20200420.RevokeTokenRequest{ Token: tea.String(token), InstanceId: tea.String(InstanceId), } // 复制代码运行请自行打印 API 的返回值 res, _err := client.RevokeToken(revokeTokenRequest) if _err != nil { return _err } fmt.Println(res) return nil } //创建临时访问 Token //applyTokenRequest := &onsmqtt20200420.ApplyTokenRequest{ // Resources: tea.String("cvdf"), // InstanceId: tea.String("cxvb"), // Actions: tea.String("r"), // ExpireTime: tea.Int64(1), // } // // 复制代码运行请自行打印 API 的返回值 // _, _err = client.ApplyToken(applyTokenRequest) // if _err != nil { // return _err // } //创建 Group ID func CreateGroupID(groupID string) (*onsmqtt20200420.CreateGroupIdResponse, error) { createGroupIdRequest := &onsmqtt20200420.CreateGroupIdRequest{ GroupId: tea.String(groupID), InstanceId: tea.String(InstanceId), } // 复制代码运行请自行打印 API 的返回值 res, _err := client.CreateGroupId(createGroupIdRequest) if _err != nil { return nil, _err } //fmt.Println(res) return res, nil } //删除 Group ID func DeleteGroupID(groupID string) (*onsmqtt20200420.DeleteGroupIdResponse, error) { deleteGroupIdRequest := &onsmqtt20200420.DeleteGroupIdRequest{ tea.String(groupID), tea.String(InstanceId), } // 复制代码运行请自行打印 API 的返回值 res, _err := client.DeleteGroupId(deleteGroupIdRequest) if _err != nil { return nil, _err } return res, nil } //查看某实例下的所有 Group ID func QueryGroupID() (*onsmqtt20200420.ListGroupIdResponse, error) { listGroupIdRequest := &onsmqtt20200420.ListGroupIdRequest{ InstanceId: tea.String(InstanceId), } //复制代码运行请自行打印 API 的返回值 res, _err := client.ListGroupId(listGroupIdRequest) if _err != nil { return nil, _err } return res, nil } //查询设备的访问凭证 func GetDeviceCredential(clientId string) (*onsmqtt20200420.GetDeviceCredentialResponse, error) { getDeviceCredentialRequest := &onsmqtt20200420.GetDeviceCredentialRequest{ ClientId: tea.String(clientId), InstanceId: tea.String(InstanceId), } // 复制代码运行请自行打印 API 的返回值 return client.GetDeviceCredential(getDeviceCredentialRequest) } //更新设备的访问凭证 func UpdateDeviceCredential(clientId string) (*onsmqtt20200420.RefreshDeviceCredentialResponse, error) { refreshDeviceCredentialRequest := &onsmqtt20200420.RefreshDeviceCredentialRequest{ ClientId: tea.String(clientId), InstanceId: tea.String(InstanceId), } // 复制代码运行请自行打印 API 的返回值 return client.RefreshDeviceCredential(refreshDeviceCredentialRequest) } //为某个设备注册访问凭证 func SetDeviceCredential(clientId string) (*onsmqtt20200420.RegisterDeviceCredentialResponse, error) { registerDeviceCredentialRequest := &onsmqtt20200420.RegisterDeviceCredentialRequest{ ClientId: tea.String(clientId), InstanceId: tea.String(InstanceId), } // 复制代码运行请自行打印 API 的返回值 return client.RegisterDeviceCredential(registerDeviceCredentialRequest) } //注销设备的访问凭证 func DeleteDeviceCredential(clientId string) (*onsmqtt20200420.UnRegisterDeviceCredentialResponse, error) { unRegisterDeviceCredentialRequest := &onsmqtt20200420.UnRegisterDeviceCredentialRequest{ ClientId: tea.String(clientId), InstanceId: tea.String(InstanceId), } // 复制代码运行请自行打印 API 的返回值 return client.UnRegisterDeviceCredential(unRegisterDeviceCredentialRequest) } func GetClientAccessKey(clientID string) (DeviceAccessKeyId, DeviceAccessKeySecret string) { res, err := GetDeviceCredential(clientID) if err != nil || res == nil { res2, err := SetDeviceCredential(clientID) if err != nil { return "", "" } DeviceAccessKeyId = *res2.Body.DeviceCredential.DeviceAccessKeyId DeviceAccessKeySecret = *res2.Body.DeviceCredential.DeviceAccessKeySecret return } DeviceAccessKeyId = *res.Body.DeviceCredential.DeviceAccessKeyId DeviceAccessKeySecret = *res.Body.DeviceCredential.DeviceAccessKeySecret return }