# nuciotsdk **Repository Path**: magicyu90/nuciotsdk ## Basic Information - **Project Name**: nuciotsdk - **Description**: golang版iot sdk - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-21 - **Last Updated**: 2021-12-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### Golang SDK #### 说明 提供了注册设备、上传设备运行信息、上传设备状态的接,内部封装实现了获取注册设备资源占用情况的功能。并支持设备上传文件,接收平台下发指令功能等,便于开发者二次开发。 #### SDK 获取 - 最新版本:[1.1.1](https://ossnucloud.nuctech.com/nt-device/sdk/Golang/nuciotdemo.zip) ##### 环境要求 操作系统:win7,win10,Ubuntu,Centos #### Golang SDK目录结构 ------------- ``` |--cert mqtt连接所需证书 |--client 主程序 |--utils 工具帮助类,包括数据加密工具类、格式化工具类、时间转换工具类 |--models 项目依赖实体类,包括设备运行信息类、设备状态类、设备注册类、文件信息类、基础信息类 |--demo.go 示例程序,模拟开发者基于SDK进行开发。示例包括设备注册、设备发送状态、设备发送运行信息、设备上传文件以及对应回调函数的使用 ``` #### SDK 功能列表 ------------- | **模块功能** | **功能点** | | :----------------: | :----------------------------------------------------------- | | 设备注册 | 注册设备相关平台至物联网平台 | | 自动重连 | 由于网络等原因,设备存在掉线的可能,SDK内置封装自动连接云平台 | | 状态上报 | 向特定 topic 上报设备状态数据 | | 信息上报 | 向特定 topic 上报设备运行信息 | | 文件上传 | 上传文件至物联网S3平台 | | 注册事件 | 为了满足业务开发者使用,可自行注册事件以便进行回调处理 | #### SDK API 列表 ------------- | 函数 | 功能 | | :------------------: | :----------------------------------------- | | NewIotClient | 实例化SDK Client 相关选项 | | Configure | 配置初始化 | | SendRegistration | 设备注册 | | SendDeviceData | 上报设备运行信息 | | SendDeviceStat | 上报设备状态 | | SendFileInfo | 上传文件信息 | | UploadFile2S3 | 上传文件到S3 | | RegisterEvent | 注册事件 | #### SDK 方法调用&数据类 ------------- ##### NewIotClient - 描述:新建IoT客户端实例,并初始化 - 输入参数 | 参数名称 | 参数数据类型 | 备注 | | --------------------- | --------------------- | ------------ | | DeviceReg | DeviceRegistrationReq | 注册信息 | | MqttInfo | MqttBrokerInfo | mqtt信息 | | DeviceStg | DeviceStorage | 存储信息 | - 返回值 | 返回值数据类型 | 备注 | | -------------- | -------------- | | *nucIotClient | IoT客户端实例 | ##### DeviceRegistrationReq - 描述:设备注册请求 | 成员名称 | 成员数据类型 | 备注 | | --------------- | ------------ | ------------------------------------------------------------ | | ProtocolVersion | string | 协议版本
1.1.1 | | DeveloperId | string | 开发者ID,由平台提供
| | ProductKey | string | 产品标识,如安检机、闸机、毫米波等等 | | DeviceId | string | 设备唯一标识
如芯片号、MAC地址、设备序列号,需唯一确定 | | DeviceType | string | 设备型号
| | DeviceIp | string | 设备IP地址 | ##### MqttBrokerInfo - 描述:Mqtt信息 | 成员名称 | 成员数据类型 | 备注 | | --------------------- | --------------------- | ------------ | | BrokerUrl | string | broker地址 | | MqttUsername | string | mqtt用户名 | | MqttPass | string | mqtt密码 | | Port | int | broker端口 | | IsCert | bool | 是否开启证书 | ##### DeviceStorage - 描述:设备存储信息 | 成员名称 | 成员数据类型 | 备注 | | --------------------- | --------------------- | ------------ | | S3Bucket | string | S3Bucket| | S3AccessId | string | S3AccessId | | S3AccessSecret | string | S3秘钥 | | LocalStoragePath | string | 共享目录url | | LocalStorageUserName | string | 共享目录用户名 | | LocalStoragePass | string | 共享目录密码 | ##### SendRegistration - 描述:注册设备 - 返回值 | 返回值数据类型 | 备注 | | -------------- | ------------------------------------------------------------ | | int | 返回码
0:成功
其他:失败(具体失败原因参考[错误码](#错误码)列表) | ##### SendDeviceStat - 描述:上传设备状态 - 输入参数 | 参数名称 | 参数数据类型 | 备注 | | -------- | ------------ | ------------------------------------------------------------ | | deviceId | string | 所注册设备的唯一标识 | | stat | int | 所注册设备的状态
0:初始化
1:正常
2:故障
3:诊断
4:关机
| ##### UploadFile2S3 - 描述:上传文件到S3 - 输入参数 | 参数名称 | 参数数据类型 | 备注 | | ----------- | ------------ | ------------------------------------------------------------ | | deviceId | string | 设备标识 | | filePath | string | 文件本地路径 | | contentType | string | 数据类型,可遵循 Web 数据格式,如【image/png】,【text/plain】等 | | fileType | EnumFileType | 文件类型 具体类型参考[文件类型](#文件类型)列表| ##### SendFileInfo - 描述:上传成功后上报文件信息,可通过订阅上传成功回调获取上传成功的文件属性 - 输入参数 | 参数名称 | 参数数据类型 | 备注 | | -------- | ------------ | ------------------------------------------------------------ | | deviceId | string | 所注册设备的唯一标识 | | fileName | string | 文件名称
可通过 [OnUploadComplete](#OnUploadComplete) 上传文件接口的回调方法中的 [IotFileInfo](#IotFileInfo) 获取,对应成员为 `FileName` | | fileType | EnumFileType | 文件类型
可通过 [OnUploadComplete](#OnUploadComplete) 上传文件接口的回调方法中的 [IotFileInfo](#IotFileInfo) 获取,对应成员为 `FileType` | | filePath | string | 文件路径
可通过 [OnUploadComplete](#OnUploadComplete) 上传文件接口的回调方法中的 [IotFileInfo](#IotFileInfo) 获取,对应成员为 `Url` | | fileSize | int | 文件大小
可通过 [OnUploadComplete](#OnUploadComplete) 上传文件接口的回调方法中的 [IotFileInfo](#IotFileInfo) 获取,对应成员为 `FileSize` | ------------------------------ #### 方法事件 ##### ErrorEvent - 描述:IoT 客户端调用任意接口发生错误事件 - 回调参数 | 参数名称 | 参数数据类型 | 备注 | | --------- | ------------ | -------- | | arg1 | IotErrorInfo | 错误信息 | ##### IotErrorInfo - 描述:错误信息 | 成员名称 | 成员数据类型 | 备注 | | -------- | ------------ | ------------------------------------------------------------ | | Code | int | 错误码,具体参考[错误码](#错误码)列表 | | Msg | string | 错误内容
包含封装所给出的错误相关数据信息、文件信息,找到对应出错的标识性内容。还可能包含错误发生时,运行时抛出的异常信息。 | ##### UploadCompleteEvent - 描述:IoT 客户端调用上传文件接口上传完成事件 - 回调参数 | 参数名称 | 参数数据类型 | 备注 | | -------- | ------------ | ------------------------------------------------- | | arg1 | bool | 文件上传是否成功
false:失败
true:成功 | | arg2 | IotFileInfo | 文件信息 | ##### IotFileInfo - 描述:文件信息,上传成功时应有对应的文件信息 | 成员名称 | 成员数据类型 | 备注 | | ------------ | ------------ | ------------------ | | DeviceId | string | 设备标识 | | FileName | string | 文件名称 | | FileSize | int | 文件大小 | | FileType | EnumFileType | 文件类型 | | Url | string | 文件在 S3 上的路径 | | UserData | string | 用户自定义内容 | ##### UploadRequestEvent - 描述:IoT 客户端收到文件上传请求事件 - 回调参数 | 参数名称 | 参数数据类型 | 备注 | | -------- | ------------ | ---------------------------------------------- | | uploadReq | UploadReq | 文件上传请求 | ##### UploadReq - 描述:文件信息,上传成功时应有对应的文件信息 | 成员名称 | 成员数据类型 | 备注 | | ------------ | ------------ | -----------------| | StartTime | long | 开始时间 | | EndTime | long | 结束时间 | | FileType | EnumFileType | 文件类型 | #### 错误码 封装库内所包含的数据结构 `EnumErrorType` 所对应的内容,用于枚举错误码。 | 错误码 | 错误描述 | 枚举名称 | | :----: | :----------------: | :---------------: | | 1000 | 消息订阅错误 | SubscribeError | | 1001 | 注册错误 | RegistrationError | | 1002 | 消息加密错误 | AesError | | 1003 | S3处理错误 | S3Error | | 1004 | 与云端建立通讯错误 | UnConnected | | 1005 | 消息组装错误 | SetupContentError | | 1006 | 消息反序列化错误 | DeserializeError | | 1007 | 消息队列处理错误 | QueueError | | 1008 | 本地存储错误 | LocalStorageError| | 1009 | 数据合法性错误 | DataValidityError | #### 文件类型 封装库内所包含的数据结构 `EnumFileType` 所对应的内容,用于枚举错误码。 | 文件类型 | 枚举类型 | | :----: | :----------------: | | 日志 | Log | | 图像 | Img | | 视频 | Video | | 其他 | Other | #### 代码示例 ```go package main import ( "fmt" "time" "gitee.com/magicyu90/nuciotsdk/client" "gitee.com/magicyu90/nuciotsdk/models" "gitee.com/magicyu90/nuciotsdk/utils" ) // 错误回调 func OnError(args ...interface{}) { e := args[0].(*models.IotErrorInfo) fmt.Printf("OnError,code:%d,message:%s\n", e.Code, e.Message) } // 完成上传回调 func OnUploadComplete(args ...interface{}) { fmt.Println("OnUploadComplete...") // 发送文件信息 ok := args[0].(bool) iotFileInfo := args[1].(*models.IotFileInfo) if ok { fmt.Printf("文件:%s上传1成功,上传文件信息...\n", iotFileInfo.FileName) n.SendFileInfo(iotFileInfo.DeviceId, iotFileInfo.FileName, iotFileInfo.Url, iotFileInfo.FileSize, iotFileInfo.FileType, iotFileInfo.UserData) } else { fmt.Printf("文件:%s上传失败...\n", iotFileInfo.FileName) } } var deviceId = "xxxx" // 设备信息 var deviceInfo = models.DeviceRegistrationReq{ DeveloperId: "xxx", //开发者ID ProtocolVersion: "1.1.1", DeviceId: deviceId, //设备编号 DeviceType: "xxx", //设备型号 ProductKey: "xxx", //产品类型 DeviceIp: "192.168.1.1", } // mqtt信息 var mqttInfo = models.MqttBrokerInfo{ BrokerUrl: "********", //mqtt地址 Port: 10884, //mqtt端口 MqttUsername: "****", //mqtt用户名 MqttPass: "****", //mqtt密码 IsCert: false, //是否开启证书 } // 存储信息 var storageInfo = models.DeviceStorage{ S3Bucket: "xxxx", //s3 bucket S3AccessId: "******", //s3 accessId S3AccessSecret: "********", //s3 accesstoken LocalStoragePath: "xxxx", //共享目录 LocalStorageUserName: "xxx", //共享目录用户名 LocalStoragePass: "xxxx", //共享目录密码 } // 初始化客户端 var n = client.NewIotClient(deviceInfo, storageInfo, mqttInfo) // 主函数 func main() { // 初始化配置 n.Configure() // 注册错误事件 n.RegisterEvent(models.ErrorEvent, OnError) // 注册上传完成事件 n.RegisterEvent(models.UploadCompleteEvent, OnUploadComplete) retryTimes := 1 // 设备注册 for { fmt.Printf("开始进行第%d次注册...\n", retryTimes) result := n.SendRegistration() fmt.Printf("注册结果:%d\n", result) if result == 0 { break } retryTimes += 1 time.Sleep(time.Duration(2) * time.Second) } fmt.Println("上报设备状态") go func() { for { // 发送设备状态 n.SendDeviceStat(deviceId, 1) time.Sleep(time.Duration(2) * time.Second) } }() fmt.Println("上报设备运行信息") go func() { for { // 发送设备状态 n.SendDeviceStat(deviceId, 1) dataItems := [2]models.DataItem{ {DataKey: "k1", DataValue: "10", Clock: utils.GetCurrentTimestamp()}, {DataKey: "k2", DataValue: "20", Clock: utils.GetCurrentTimestamp()}} n.SendDeviceData(deviceId, dataItems[:]) time.Sleep(time.Duration(2) * time.Second) } }() fmt.Println("上传图片至s3") n.UploadFile2S3(deviceId, "C:/xxxx/lake.jpg", models.Img, "") select {} // 阻塞 } ```