Browse Source

first commit

siked 1 year ago
commit
59aae99432
4 changed files with 572 additions and 0 deletions
  1. 70 0
      GTime.go
  2. 291 0
      YunIot.go
  3. 113 0
      demo.go
  4. 98 0
      mode.go

+ 70 - 0
GTime.go

@@ -0,0 +1,70 @@
+package SDK
+
+import (
+	"encoding/json"
+	"fmt"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type Time struct {
+	time.Time
+}
+
+// MarshalJSON 序列化为JSON
+func (t Time) MarshalJSON() ([]byte, error) {
+	if t.IsZero() {
+		return []byte("\"\""), nil
+	}
+	stamp := fmt.Sprintf("\"%s\"", t.Format("2006-01-02 15:04:05"))
+	return []byte(stamp), nil
+}
+
+// UnmarshalJSON 反序列化为JSON
+func (t *Time) UnmarshalJSON(data []byte) error {
+	var err error
+	t.Time, err = time.Parse("2006-01-02 15:04:05", string(data)[1:20])
+	return err
+}
+
+func (t *Time) String() string {
+	data, _ := json.Marshal(t)
+	return string(data)
+}
+
+func (t *Time) FieldType() int {
+	return orm2.TypeDateTimeField
+}
+
+func (t *Time) SetRaw(value interface{}) error {
+	switch value.(type) {
+	case time.Time:
+		t.Time = value.(time.Time)
+	}
+	return nil
+}
+
+func (t *Time) RawValue() interface{} {
+	str := t.Format("2006-01-02 15:04:05")
+	if str == "0001-01-01 00:00:00" {
+		return nil
+	}
+	return str
+}
+
+func (t *Time) NowDbTime() Time {
+	dbTime := Time{}
+	dbTime.Time = time.Now()
+	return dbTime
+}
+func (t *Time) AddDates(years int, months int, days int) Time {
+	dbTime := Time{}
+	dbTime.Time = t.Time.AddDate(years, months, days)
+	return dbTime
+}
+func TimeParse(value string) (Time, error) {
+	dbTime := Time{}
+	times, err := time.Parse("2006-01-02 15:04:05", value)
+	dbTime.Time = times
+	return dbTime, err
+}

+ 291 - 0
YunIot.go

@@ -0,0 +1,291 @@
+package SDK
+
+import (
+	"errors"
+	"fmt"
+	"github.com/nats-io/nats.go"
+	"github.com/vmihailenco/msgpack/v5"
+	"time"
+)
+
+const Success = 200
+const Error = 201
+
+type Client struct {
+	Host     string
+	NatsConn *nats.Conn
+}
+
+func NewYunIot(Host string) (*Client, error) {
+	if len(Host) == 0 {
+		Host = "127.0.0.1"
+	}
+	Client_ := &Client{Host: Host}
+	var err error
+	// 连接Nats服务器
+	Client_.NatsConn, err = nats.Connect("nats://"+Host+":6503", nats.MaxReconnects(10), nats.ReconnectWait(10*time.Second),
+		nats.DisconnectErrHandler(func(nc *nats.Conn, err error) {
+			// handle disconnect error event
+			fmt.Println("natsS.DisconnectErrHandler 断开 ", err)
+		}),
+		nats.ReconnectHandler(func(nc *nats.Conn) {
+			// handle reconnect event
+			fmt.Println("natsS.ReconnectHandler, 已经重新连接 ")
+		}))
+	if err != nil {
+		fmt.Println("YunIot 连接失败!")
+		return Client_, err
+	}
+
+	if err != nil {
+		fmt.Println("YunIot 连接失败!")
+		return Client_, err
+	}
+	fmt.Println("YunIot OK!")
+
+	return Client_, err
+}
+
+func (c *Client) GetNameByGet(name string) (data interface{}, err error) {
+	return "名字是" + name, nil
+}
+
+func (c *Client) GetDevice(T_sn string) (Device, error) {
+
+	Device_r := Device{T_sn: T_sn}
+	b, err := msgpack.Marshal(&Device_r)
+	if err != nil {
+		return Device{}, err
+	}
+
+	// 请求-响应
+	msg, err := c.NatsConn.Request("/Device/Device/Get", b, 3*time.Second)
+	if err != nil {
+		return Device{}, err
+	}
+	JSONR_R := JSONR{}
+	err = msgpack.Unmarshal(msg.Data, &JSONR_R)
+	if err != nil {
+		return Device{}, err
+	}
+	if JSONR_R.Code != 200 {
+		return Device{}, errors.New(JSONR_R.Msg)
+	}
+	b, err = msgpack.Marshal(JSONR_R.Data)
+	if err != nil {
+		return Device{}, err
+	}
+	err = msgpack.Unmarshal(b, &Device_r)
+	if err != nil {
+		return Device{}, err
+	}
+
+	return Device_r, nil
+}
+
+func (c *Client) GetDeviceList(T_ProductID, T_sn string, T_online, PageIndex, PageSize int) (JSONS_Device, error) {
+
+	Device_r := Device_Form{T_ProductID: T_ProductID, T_sn: T_sn, T_online: T_online, PageIndex: PageIndex, PageSize: PageSize}
+	b, err := msgpack.Marshal(&Device_r)
+	if err != nil {
+		return JSONS_Device{}, err
+	}
+
+	// 请求-响应
+	msg, err := c.NatsConn.Request("/Device/Device/List", b, 3*time.Second)
+	if err != nil {
+		return JSONS_Device{}, err
+	}
+	JSONR_R := JSONS_Device{}
+	err = msgpack.Unmarshal(msg.Data, &JSONR_R)
+	if err != nil {
+		return JSONS_Device{}, err
+	}
+	if JSONR_R.Code != 200 {
+		return JSONS_Device{Code: Error, Msg: JSONR_R.Msg}, errors.New(JSONR_R.Msg)
+	}
+
+	return JSONR_R, nil
+}
+
+func (c *Client) GetDeviceData(T_sn, T_jointTab, T_jsonFind, T_jsonSort string, PageIndex, PageSize int) (JSONS_Data, error) {
+
+	DeviceData_Form_r := DeviceData_Form{T_sn: T_sn, T_jointTab: T_jointTab, T_jsonFind: T_jsonFind, T_jsonSort: T_jsonSort, PageIndex: PageIndex, PageSize: PageSize}
+	b, err := msgpack.Marshal(&DeviceData_Form_r)
+	if err != nil {
+		return JSONS_Data{}, err
+	}
+	if len(DeviceData_Form_r.T_sn) < 1 {
+		return JSONS_Data{Code: Error, Msg: "T_sn !"}, errors.New("T_sn !")
+	}
+
+	if len(DeviceData_Form_r.T_jointTab) < 1 {
+		return JSONS_Data{Code: Error, Msg: "T_jointTab !"}, errors.New("T_jointTab !")
+	}
+	// 请求-响应
+	msg, err := c.NatsConn.Request("/Device/Device/Data", b, 3*time.Second)
+	if err != nil {
+		return JSONS_Data{Code: Error, Msg: "请求异常 !"}, err
+	}
+	JSONR_R := JSONS_Data{}
+	err = msgpack.Unmarshal(msg.Data, &JSONR_R)
+	if err != nil {
+		return JSONS_Data{Code: Error, Msg: "解析异常 !"}, err
+	}
+	if JSONR_R.Code != 200 {
+		return JSONS_Data{Code: Error, Msg: JSONR_R.Msg}, errors.New(JSONR_R.Msg)
+	}
+
+	return JSONR_R, nil
+}
+
+func (c *Client) GetDevicePush(T_sn, T_data string) error {
+
+	Device_r := Device{T_sn: T_sn, T_data: T_data}
+	b, err := msgpack.Marshal(&Device_r)
+	if err != nil {
+		return err
+	}
+
+	// 请求-响应
+	msg, err := c.NatsConn.Request("/Device/Device/Push", b, 3*time.Second)
+	if err != nil {
+		return err
+	}
+	JSONR_R := JSONR{}
+	err = msgpack.Unmarshal(msg.Data, &JSONR_R)
+	if err != nil {
+		return err
+	}
+	if JSONR_R.Code != 200 {
+		return errors.New(JSONR_R.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) GetProductType(T_ProductID string) (ProductType, error) {
+
+	ProductType_r := ProductType{T_ProductID: T_ProductID}
+	b, err := msgpack.Marshal(&ProductType_r)
+	if err != nil {
+		return ProductType{}, err
+	}
+
+	// 请求-响应
+	msg, err := c.NatsConn.Request("/Product/ProductType/Get", b, 3*time.Second)
+	if err != nil {
+		return ProductType{}, err
+	}
+	JSONR_R := JSONR{}
+	err = msgpack.Unmarshal(msg.Data, &JSONR_R)
+	if err != nil {
+		return ProductType{}, err
+	}
+	if JSONR_R.Code != 200 {
+		return ProductType{}, errors.New(JSONR_R.Msg)
+	}
+	b, err = msgpack.Marshal(JSONR_R.Data)
+	if err != nil {
+		return ProductType{}, err
+	}
+	err = msgpack.Unmarshal(b, &ProductType_r)
+	if err != nil {
+		return ProductType{}, err
+	}
+
+	return ProductType_r, nil
+}
+
+func (c *Client) GetProductTypeList(T_uuid, T_name string) ([]ProductType, error) {
+
+	ProductType_r := ProductType{T_uuid: T_uuid, T_name: T_name}
+	b, err := msgpack.Marshal(&ProductType_r)
+	if err != nil {
+		return []ProductType{}, err
+	}
+
+	// 请求-响应
+	msg, err := c.NatsConn.Request("/Product/ProductType/List", b, 3*time.Second)
+	if err != nil {
+		return []ProductType{}, err
+	}
+	JSONR_R := []ProductType{}
+	err = msgpack.Unmarshal(msg.Data, &JSONR_R)
+	if err != nil {
+		return []ProductType{}, err
+	}
+
+	return JSONR_R, nil
+}
+
+func (c *Client) GetProductProt(Id int) (ProductProt, error) {
+
+	ProductProt_r := ProductProt{Id: Id}
+	b, err := msgpack.Marshal(&ProductProt_r)
+	if err != nil {
+		return ProductProt{}, err
+	}
+
+	// 请求-响应
+	msg, err := c.NatsConn.Request("/Product/ProductProt/Get", b, 3*time.Second)
+	if err != nil {
+		return ProductProt{}, err
+	}
+	JSONR_R := JSONR{}
+	err = msgpack.Unmarshal(msg.Data, &JSONR_R)
+	if err != nil {
+		return ProductProt{}, err
+	}
+	if JSONR_R.Code != 200 {
+		return ProductProt{}, errors.New(JSONR_R.Msg)
+	}
+	b, err = msgpack.Marshal(JSONR_R.Data)
+	if err != nil {
+		return ProductProt{}, err
+	}
+	err = msgpack.Unmarshal(b, &ProductProt_r)
+	if err != nil {
+		return ProductProt{}, err
+	}
+
+	return ProductProt_r, nil
+}
+
+func (c *Client) GetProductProtList(T_uuid string, T_mode int, T_name string) ([]ProductProt, error) {
+
+	ProductProt_r := ProductProt{T_uuid: T_uuid, T_mode: T_mode, T_name: T_name}
+	b, err := msgpack.Marshal(&ProductProt_r)
+	if err != nil {
+		return []ProductProt{}, err
+	}
+
+	// 请求-响应
+	msg, err := c.NatsConn.Request("/Product/ProductProt/List", b, 3*time.Second)
+	if err != nil {
+		return []ProductProt{}, err
+	}
+	JSONR_R := []ProductProt{}
+	err = msgpack.Unmarshal(msg.Data, &JSONR_R)
+	if err != nil {
+		return []ProductProt{}, err
+	}
+
+	return JSONR_R, nil
+}
+
+func (c *Client) GetProductModeList() ([]ProductMode, error) {
+
+	// 请求-响应
+	msg, err := c.NatsConn.Request("/Product/ProductModeLists/List", []byte(""), 3*time.Second)
+	if err != nil {
+		return []ProductMode{}, err
+	}
+	JSONR_R := []ProductMode{}
+	err = msgpack.Unmarshal(msg.Data, &JSONR_R)
+	if err != nil {
+		return []ProductMode{}, err
+	}
+
+	return JSONR_R, nil
+}

+ 113 - 0
demo.go

@@ -0,0 +1,113 @@
+package SDK
+
+import (
+	"fmt"
+	YunIot "gogs.baozhida.cn/bzdadmin/YunIot_SDK"
+	"testing"
+)
+
+//git add .
+//git commit -m "1.2v"
+//git push -u origin master
+
+func TestYunIot(t *testing.T) {
+
+	YunIot_r, err := YunIot.NewYunIot("192.168.11.112")
+	if err != nil {
+		panic(any(err))
+	}
+	// 获取设备信息
+	// T_sn string 设备Sn
+	Device_r, err := YunIot_r.GetDevice("2023468279548912")
+	if err != nil {
+		println("没找到SN")
+	}
+	fmt.Println(Device_r)
+
+	// 获取设备列表
+	// T_ProductID string 产品类型
+	// T_sn string 设备Sn
+	// T_online int 在线状态 0所有  1在线   2离线   3未激活
+	// PageIndex int 页码
+	// PageSize int  每页数量 默认为10
+	DeviceList_r, err := YunIot_r.GetDeviceList("", "", 0, 0, 0)
+	if err != nil {
+		println(err)
+	}
+	fmt.Println(DeviceList_r)
+
+	// 推送设备数据
+	// T_sn string 设备Sn
+	// T_data string 发送内容 json 数据
+	err = YunIot_r.GetDevicePush("2023456942857102", "{\"AAAA\":[{\"BBBB\":[{\"name\":\"TempSet\",\"value\":\"266666\"}]}]}")
+	if err != nil {
+		println("推送失败!")
+	} else {
+		println("推送成功!")
+	}
+
+	// 获取设备数据
+	// T_sn string 产品sn
+	// T_jointTab string 参数  AAAA.CCCC 拼接符.
+	// jsonFind string 条件 {"$or":[{"name":"TempSet"},{"value":"26"}]}
+	// jsonSort string 排序  {"value": 1}
+	// PageIndex int 页码
+	// PageSize int  每页数量 默认为10
+	DeviceData_r, err := YunIot_r.GetDeviceData("2023456942857102", "AAAA.CCCC", "", "", 0, 0)
+	if err != nil {
+		println(err)
+	}
+	for _, v := range DeviceData_r.List {
+		d := v.(map[string]interface{})
+		fmt.Println(d["name"], ":", d["value"])
+	}
+
+	// 获取产品
+	// T_ProductID string 产品型号
+	ProductType_r, err := YunIot_r.GetProductType("ujRXdIYz")
+	if err != nil {
+		println(err)
+	}
+	fmt.Println(ProductType_r)
+
+	// 获取产品列表
+	// T_uuid string 用户识别码(8位)
+	// T_name string 产品名称
+	ProductTypeList_r, err := YunIot_r.GetProductTypeList("", "")
+	if err != nil {
+		println(err)
+	}
+	for _, v := range ProductTypeList_r {
+		fmt.Println(v)
+	}
+
+	//获取协议
+	//T_ProductID string 产品型号
+	ProductProt_r, err := YunIot_r.GetProductProt(31)
+	if err != nil {
+		println(err)
+	}
+	fmt.Println(ProductProt_r)
+
+	//获取协议列表
+	//T_uuid string 用户识别码(8位)
+	//T_mode int 根据 网关列表
+	//T_name string 产品名称
+	ProductProtList_r, err := YunIot_r.GetProductProtList("", 0, "")
+	if err != nil {
+		println(err)
+	}
+	for _, v := range ProductProtList_r {
+		fmt.Println(v)
+	}
+
+	//获取网关列表
+	ProductModeList_r, err := YunIot_r.GetProductModeList()
+	if err != nil {
+		println(err)
+	}
+	for _, v := range ProductModeList_r {
+		fmt.Println(v)
+	}
+
+}

+ 98 - 0
mode.go

@@ -0,0 +1,98 @@
+package SDK
+
+// 表单
+type Device_Form struct {
+	T_ProductID string  // Sn
+	T_sn        string  // 标签路径
+	T_online    int     // 当前页码
+	PageIndex   int     // 当前页码
+	PageSize    int     // 每页文档数量
+}
+
+// 表单
+type DeviceData_Form struct {
+	T_sn       string  // Sn
+	T_jointTab string  // 标签路径
+	T_jsonFind string  // 条件
+	T_jsonSort string  // 排序
+	PageIndex  int     // 当前页码
+	PageSize   int     // 每页文档数量
+}
+
+type JSONR struct {
+	//必须的大写开头
+	Code int16
+	Msg  string
+	Data interface{} // 泛型
+}
+type JSONS_Device struct {
+	//必须的大写开头
+	Code int16
+	Msg  string
+	List      []Device
+	Total     int16
+	PageIndex int
+	PageSize  int
+}
+type JSONS_Data struct {
+	//必须的大写开头
+	Code int16
+	Msg  string
+	List      []interface{}
+	Total     int16
+	PageIndex int
+	PageSize  int
+}
+// 产品协议
+type ProductMode struct {
+	Id         int    `json:"Id"`
+	T_name     string `json:"T_name"`     // 协议名称  Mqtt
+	T_address  string `json:"T_address"`  //接入地址    bj-3-mqtt.iot-api.com:1883
+	T_describe string `json:"T_describe"` // 描述内容
+	T_state    int    `json:"T_state"`    //状态
+}
+
+// 产品类型
+type ProductType struct {
+	T_ProductID     string                   `orm:"size(8);pk" json:"T_ProductID" form:"T_ProductID"`               // 产品型号 随机生成(8位)
+	T_uuid          string                   `orm:"size(8);index" json:"T_uuid" form:"T_uuid"`                      // 用户识别码(8位) ,管理员可以为空
+	T_name          string                   `orm:"size(256);" json:"T_name" form:"T_name"`                         // 产品名称
+	T_img           string                   `orm:"size(200);" json:"T_img" form:"T_img"`                           // 图片
+	T_akey          string                   `orm:"size(56);" json:"T_akey" `                                       // 授权密钥
+	T_prot          int                      `orm:"size(10);default(0)" json:"T_prot" form:"T_prot"`                //接入协议ID  0:统一协议
+	T_TabData       string                   `orm:"type(text);default('{}')" json:"T_TabData" form:"T_TabData"`     // 产品模型
+	T_TabDataJson   []map[string]interface{} `orm:"-" json:"T_TabDataJson"`                                         // 产品模型 json
+	T_RelayData     string                   `orm:"type(text);default('{}')" json:"T_RelayData" form:"T_RelayData"` // 消息转发
+	T_RelayDataJson map[string]interface{}   `orm:"-" json:"T_RelayDataJson"`                                       // 消息转发 json
+	CreateTime      Time                     `orm:"column(create_time);type(timestamp);auto_now_add" json:"CreateTime"`
+	UpdateTime      Time                     `orm:"column(update_time);type(timestamp);auto_now" json:"UpdateTime"`
+}
+// 产品协议
+type ProductProt struct {
+	Id      int    `orm:"column(ID);size(11);auto;pk" json:"Id" form:"Id"`
+	T_uuid string `orm:"size(8);index" json:"T_uuid" form:"T_uuid"`    // 用户识别码(8位) ,管理员可以为空
+	T_name  string `orm:"size(256);" json:"T_name" form:"T_name"`         // 协议名称
+	T_mode  int    `orm:"size(1);default(0)" json:"T_mode" form:"T_mode"` //接入方式  0:Mqtt  1:http  2:tcp  3:CoAP  4:websocket
+	//T_prot     int    `orm:"size(1);default(0)" json:"T_Prot" form:"T_prot"`                              //接入协议ID  0:统一协议
+	T_lang     int    `orm:"size(1);default(1)" json:"T_lang" form:"T_lang"`                                  //编程语言 0: 无解析 1: go   2: C
+	T_analysis string `orm:"size(100);default('')" json:"T_analysis" form:"T_analysis"` //数据解析
+	T_text     string `orm:"type(text);default('')" json:"T_text" form:"T_text"`                              // 代码内容
+	T_describe string `orm:"type(text);default('')" json:"T_describe" form:"T_describe"`                      // 描述内容
+	//T_reply    string `orm:"size(100);default(_reply)" json:"T_reply" form:"T_reply"`                       //返回后缀  _reply
+
+}
+// 设备
+type Device struct {
+	T_sn          string                 `orm:"size(256);pk" json:"T_sn" form:"T_sn"`                     // Sn
+	T_password    string                 `orm:"size(256);" json:"T_password" form:"T_password"`           // 密码
+	T_online      int                    `orm:"size(1);index;default(3)" json:"T_online" form:"T_online"` // 在线状态  1 在线  2 离线   3 未激活
+	T_project     string                 `orm:"size(256);default('')" json:"T_project" form:"T_project"`  // 项目地址
+	T_ProductID   string                 `orm:"size(8);index" json:"T_ProductID" form:"T_ProductID"`      // 产品类型
+	T_ProductJson ProductType            `orm:"-" json:"T_ProductJson"`                                   // 产品类型 json
+	T_data        string                 `orm:"column(t_data);type(text);default('')" json:"T_data" `     // 设备数据
+	T_dataJson    map[string]interface{} `orm:"-" json:"T_dataJson"`                                      // 设备数据
+	T_state       int                    `orm:"size(2);default(1);index" json:"T_state" form:"T_state"`   //  1 正常  2 禁用\删除   3 无效
+	CreateTime    Time                   `orm:"column(create_time);type(timestamp);auto_now_add" json:"CreateTime"`
+	UpdateTime    Time                   `orm:"column(update_time);type(timestamp);auto_now" json:"UpdateTime"`
+}
+