siked 1 سال پیش
کامیت
2262fd2c6e
3فایلهای تغییر یافته به همراه307 افزوده شده و 0 حذف شده
  1. 19 0
      go.mod
  2. 20 0
      go.sum
  3. 268 0
      main.go

+ 19 - 0
go.mod

@@ -0,0 +1,19 @@
+module AiotSwitchSDK
+
+go 1.19
+
+require (
+	github.com/nats-io/nats.go v1.35.0
+	github.com/vmihailenco/msgpack/v5 v5.4.1
+)
+
+require (
+	github.com/klauspost/compress v1.17.2 // indirect
+	github.com/nats-io/nkeys v0.4.7 // indirect
+	github.com/nats-io/nuid v1.0.1 // indirect
+	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
+	golang.org/x/crypto v0.18.0 // indirect
+	golang.org/x/sys v0.16.0 // indirect
+
+
+)

+ 20 - 0
go.sum

@@ -0,0 +1,20 @@
+github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
+github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
+github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/nats-io/nats.go v1.35.0 h1:XFNqNM7v5B+MQMKqVGAyHwYhyKb48jrenXNxIU20ULk=
+github.com/nats-io/nats.go v1.35.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
+github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
+github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=
+github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
+github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
+github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
+github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
+golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
+golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
+golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
+golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=

+ 268 - 0
main.go

@@ -0,0 +1,268 @@
+package AiotSwitchSDK
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/nats-io/nats.go"
+	"github.com/vmihailenco/msgpack/v5"
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"time"
+)
+
+type Switch struct {
+}
+
+// 协议基础信息
+
+var SwitchName string     // 连接地址
+var SwitchConnect string  // 连接地址
+var SwitchDescribe string // 协议描述
+
+// 参数配置模版
+var SwitchConfig = map[string]map[string]string{}
+var ns *nats.Conn
+
+var funPullHandleStruct func(T_topic string, T_data []byte) error
+
+/*
+name:服务名称  默认 程序名
+nats: NATS 地址   默认 nats://127.0.0.1:6503
+funPH: 平台-> Switch网关方法
+*/
+func AiotSwitchInit(name, nats string, funPH func(T_topic string, T_data []byte) error) {
+	funPullHandleStruct = nil
+	if len(name) == 0 {
+		name = filepath.Base(os.Args[0]) // 程序名
+	}
+	SwitchName = name
+
+	if len(nats) == 0 {
+		nats = "nats://127.0.0.1:6503" // 程序名
+	}
+	funPullHandleStruct = funPH
+	initNats(nats)
+	initConfig(SwitchName)
+	funPullHandle(SwitchName)
+
+}
+
+// 初始化 NATS 服务
+func (s *Switch) initNats(url string) {
+	var err error
+	// 连接Nats服务器
+	ns, err = nats.Connect(url, 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, 已经重新连接 ", err)
+		}))
+	if err != nil {
+		fmt.Println("natsS 连接失败!", err)
+		panic(any("natsS 连接失败!" + url))
+	}
+
+	if err != nil {
+		fmt.Println("nats 连接失败!", err)
+		panic(any(err))
+	}
+	fmt.Println("nats OK!")
+}
+func initNats(url string) {
+	var err error
+	// 连接Nats服务器
+	ns, err = nats.Connect(url, 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, 已经重新连接 ", err)
+		}))
+	if err != nil {
+		fmt.Println("natsS 连接失败!", err)
+		panic(any("natsS 连接失败!" + url))
+	}
+
+	if err != nil {
+		fmt.Println("nats 连接失败!", err)
+		panic(any(err))
+	}
+	fmt.Println("nats OK!")
+}
+
+// 配置文件
+func initConfig(name string) {
+	Configjson := "./" + name + "json"
+	_, err := os.Stat(Configjson) // 用你的文件路径替换"/path/to/your/file"
+	if os.IsNotExist(err) {
+		fmt.Println("文件不存在")
+		jsonData, err := json.Marshal(SwitchConfig)
+		if err != nil {
+			fmt.Println(err)
+		}
+		err = ioutil.WriteFile(Configjson, jsonData, 0644)
+		if err != nil {
+			fmt.Println("Error unmarshalling JSON:", err)
+		}
+
+	} else {
+		fmt.Println("文件存在")
+		jsonData, err := ioutil.ReadFile(Configjson)
+		if err != nil {
+			fmt.Println(err)
+		}
+		err = json.Unmarshal(jsonData, &SwitchConfig)
+		if err != nil {
+			fmt.Println("Error unmarshalling JSON:", err)
+		}
+	}
+
+	// nats 注册 服务
+	type Struct struct {
+		T_name         string
+		T_SwitchConfig map[string]map[string]string
+	}
+	b, _ := msgpack.Marshal(&Struct{T_name: SwitchName, T_SwitchConfig: SwitchConfig})
+
+	// 请求-响应, 向 test3 发布一个 `help me` 请求数据,设置超时间3秒,如果有多个响应,只接收第一个收到的消息
+	ns.Request("/Switch/Init", b, 3*time.Second)
+	if err != nil {
+		fmt.Println(err)
+		panic(any("nats 注册失败!"))
+	}
+
+}
+
+// 设备->平台  设备状态 1 在线  2 离线
+func AiotSwitchState(T_sn, T_password string, T_State int, T_Reason string) error {
+
+	type Struct struct {
+		T_sn       string
+		T_password string
+		T_State    int
+		T_Reason   string
+	}
+	b, _ := msgpack.Marshal(&Struct{T_sn: T_sn, T_password: T_password, T_State: T_State, T_Reason: T_Reason})
+
+	// 请求-响应, 向 test3 发布一个 `help me` 请求数据,设置超时间3秒,如果有多个响应,只接收第一个收到的消息
+	msg, err := ns.Request("/Switch/State", b, 3*time.Second)
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("通讯异常")
+	}
+	if len(msg.Data) != 0 {
+		return errors.New(string(msg.Data))
+	}
+
+	return nil
+}
+
+// 设备->平台  验证
+func AiotSwitchVerify(T_sn, T_password string) error {
+
+	type Struct struct {
+		T_sn       string
+		T_password string
+	}
+	b, _ := msgpack.Marshal(&Struct{T_sn: T_sn, T_password: T_password})
+
+	// 请求-响应, 向 test3 发布一个 `help me` 请求数据,设置超时间3秒,如果有多个响应,只接收第一个收到的消息
+	msg, err := ns.Request("/Switch/Verify", b, 3*time.Second)
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("通讯异常")
+	}
+	if len(msg.Data) != 0 {
+		return errors.New(string(msg.Data))
+	}
+
+	return nil
+
+}
+
+// 设备->平台  添加设备
+func AiotSwitchAdd(T_ProductID, T_ProductKey, T_sn, T_password string) error {
+	type Struct struct {
+		T_ProductID  string
+		T_ProductKey string
+		T_sn         string
+		T_password   string
+	}
+	b, _ := msgpack.Marshal(&Struct{T_sn: T_sn, T_password: T_password, T_ProductID: T_ProductID, T_ProductKey: T_ProductKey})
+
+	// 请求-响应, 向 test3 发布一个 `help me` 请求数据,设置超时间3秒,如果有多个响应,只接收第一个收到的消息
+	msg, err := ns.Request("/Switch/Add", b, 3*time.Second)
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("通讯异常")
+	}
+	if len(msg.Data) != 0 {
+		return errors.New(string(msg.Data))
+	}
+
+	return nil
+
+}
+
+// 设备->平台
+func AiotSwitchPush(T_sn, T_password, T_topic string, T_data []byte) error {
+
+	type Struct struct {
+		T_sn       string
+		T_password string
+		T_topic    string
+		T_data     []byte
+	}
+	b, _ := msgpack.Marshal(&Struct{T_sn: T_sn, T_password: T_password, T_topic: T_topic, T_data: T_data})
+
+	// 请求-响应, 向 test3 发布一个 `help me` 请求数据,设置超时间3秒,如果有多个响应,只接收第一个收到的消息
+	msg, err := ns.Request("/Switch/Pull", b, 3*time.Second)
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("通讯异常")
+	}
+	if len(msg.Data) != 0 {
+		return errors.New(string(msg.Data))
+	}
+
+	return nil
+
+}
+
+// 平台->设备
+func funPullHandle(T_name string) {
+	ns.Subscribe("/Switch/"+T_name, func(m *nats.Msg) {
+		go func(m *nats.Msg) {
+			type Struct struct {
+				T_topic string
+				T_data  []byte
+			}
+			var date_r Struct
+			err := msgpack.Unmarshal(m.Data, &date_r)
+			if err != nil {
+				fmt.Println("Nats:", err)
+				ns.Publish(m.Reply, []byte("Unmarshal 错误!"))
+				return
+			}
+			// 防止 没有给方法报错
+			if funPullHandleStruct != nil {
+				err = funPullHandleStruct(date_r.T_topic, date_r.T_data)
+				if err != nil {
+					ns.Publish(m.Reply, []byte(err.Error()))
+					return
+				}
+			}
+			ns.Publish(m.Reply, []byte(""))
+
+		}(m)
+
+	})
+
+}