|
@@ -4,10 +4,13 @@ import (
|
|
"encoding/hex"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"encoding/json"
|
|
"fmt"
|
|
"fmt"
|
|
|
|
+ "github.com/gogf/gf/encoding/gjson"
|
|
"log"
|
|
"log"
|
|
|
|
+ "math/rand"
|
|
"net"
|
|
"net"
|
|
"os"
|
|
"os"
|
|
"sparrow/pkg/coap"
|
|
"sparrow/pkg/coap"
|
|
|
|
+ "sparrow/pkg/klink"
|
|
"sparrow/pkg/protocol"
|
|
"sparrow/pkg/protocol"
|
|
"sparrow/pkg/server"
|
|
"sparrow/pkg/server"
|
|
"sparrow/pkg/tlv"
|
|
"sparrow/pkg/tlv"
|
|
@@ -167,36 +170,46 @@ func (d *Device) DoLogin() error {
|
|
func (d *Device) reportStatus(client *MQTT.Client) {
|
|
func (d *Device) reportStatus(client *MQTT.Client) {
|
|
for {
|
|
for {
|
|
time.Sleep(2 * time.Second)
|
|
time.Sleep(2 * time.Second)
|
|
- payloadHead := protocol.DataHead{
|
|
|
|
- Flag: 0,
|
|
|
|
- Timestamp: uint64(time.Now().Unix() * 1000),
|
|
|
|
|
|
+ rand.Seed(time.Now().UnixNano())
|
|
|
|
+ r := rand.Intn(100)
|
|
|
|
+ dd := &klink.DevSend{
|
|
|
|
+ Action: "devSend",
|
|
|
|
+ MsgId: 1,
|
|
|
|
+ SubDeviceId: "1",
|
|
|
|
+ Timestamp: time.Now().Unix(),
|
|
|
|
+ DeviceCode: "5566",
|
|
|
|
+ Data: &klink.DevSendData{
|
|
|
|
+ Cmd: "powerOn",
|
|
|
|
+ Params: gjson.New(fmt.Sprintf(`{"power":%d}`, r)),
|
|
|
|
+ },
|
|
}
|
|
}
|
|
- param := []interface{}{uint16(1), uint16(2)}
|
|
|
|
- params, err := tlv.MakeTLVs(param)
|
|
|
|
|
|
+ payload, err := dd.Marshal()
|
|
if err != nil {
|
|
if err != nil {
|
|
- fmt.Println(err)
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- sub := protocol.SubData{
|
|
|
|
- Head: protocol.SubDataHead{
|
|
|
|
- SubDeviceid: uint16(1),
|
|
|
|
- PropertyNum: uint16(1),
|
|
|
|
- ParamsCount: uint16(len(params)),
|
|
|
|
- },
|
|
|
|
- Params: params,
|
|
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
|
|
+ client.Publish("s", 1, false, payload)
|
|
|
|
+ }
|
|
|
|
|
|
- status := protocol.Data{
|
|
|
|
- Head: payloadHead,
|
|
|
|
- SubData: []protocol.SubData{},
|
|
|
|
|
|
+}
|
|
|
|
+func (d *Device) reportStatus2(client *MQTT.Client) {
|
|
|
|
+ for {
|
|
|
|
+ time.Sleep(2 * time.Second)
|
|
|
|
+ rand.Seed(time.Now().UnixNano())
|
|
|
|
+ r := rand.Intn(100)
|
|
|
|
+ dd := &klink.DevSend{
|
|
|
|
+ Action: "devSend",
|
|
|
|
+ MsgId: 1,
|
|
|
|
+ SubDeviceId: "1",
|
|
|
|
+ Timestamp: time.Now().Unix(),
|
|
|
|
+ DeviceCode: "5566",
|
|
|
|
+ Data: &klink.DevSendData{
|
|
|
|
+ Cmd: "status",
|
|
|
|
+ Params: gjson.New(fmt.Sprintf(`{"fanlevel":%d}`, r)),
|
|
|
|
+ },
|
|
}
|
|
}
|
|
-
|
|
|
|
- status.SubData = append(status.SubData, sub)
|
|
|
|
-
|
|
|
|
- payload, err := status.Marshal()
|
|
|
|
|
|
+ payload, err := dd.Marshal()
|
|
if err != nil {
|
|
if err != nil {
|
|
- fmt.Println(err)
|
|
|
|
- return
|
|
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
client.Publish("s", 1, false, payload)
|
|
client.Publish("s", 1, false, payload)
|
|
}
|
|
}
|
|
@@ -255,29 +268,24 @@ func (d *Device) coapReportStatus(conn *net.UDPConn) {
|
|
|
|
|
|
func (d *Device) reportEvent(client *MQTT.Client) {
|
|
func (d *Device) reportEvent(client *MQTT.Client) {
|
|
for {
|
|
for {
|
|
- time.Sleep(3 * time.Second)
|
|
|
|
-
|
|
|
|
- event := protocol.Event{}
|
|
|
|
|
|
+ time.Sleep(2 * time.Second)
|
|
|
|
|
|
- params, err := tlv.MakeTLVs([]interface{}{"hello event."})
|
|
|
|
- if err != nil {
|
|
|
|
- fmt.Println(err)
|
|
|
|
- return
|
|
|
|
|
|
+ dd := &klink.DevSend{
|
|
|
|
+ Action: "devSend",
|
|
|
|
+ MsgId: 1,
|
|
|
|
+ SubDeviceId: "1",
|
|
|
|
+ Timestamp: time.Now().Unix(),
|
|
|
|
+ DeviceCode: "5566",
|
|
|
|
+ Data: &klink.DevSendData{
|
|
|
|
+ Cmd: "temperatureEvent",
|
|
|
|
+ Params: gjson.New(`{"temperature":100, "reason": 0}`),
|
|
|
|
+ },
|
|
}
|
|
}
|
|
-
|
|
|
|
- event.Params = params
|
|
|
|
- event.Head.No = 1
|
|
|
|
- event.Head.SubDeviceid = 1
|
|
|
|
- event.Head.ParamsCount = uint16(len(params))
|
|
|
|
-
|
|
|
|
- payload, err := event.Marshal()
|
|
|
|
|
|
+ payload, err := dd.Marshal()
|
|
if err != nil {
|
|
if err != nil {
|
|
- fmt.Println(err)
|
|
|
|
- return
|
|
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
-
|
|
|
|
client.Publish("e", 1, false, payload)
|
|
client.Publish("e", 1, false, payload)
|
|
-
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -300,20 +308,11 @@ func (d *Device) statusHandler(client *MQTT.Client, msg MQTT.Message) {
|
|
}
|
|
}
|
|
|
|
|
|
func (d *Device) commandHandler(client *MQTT.Client, msg MQTT.Message) {
|
|
func (d *Device) commandHandler(client *MQTT.Client, msg MQTT.Message) {
|
|
- cmd := protocol.Command{}
|
|
|
|
-
|
|
|
|
- err := cmd.UnMarshal(msg.Payload())
|
|
|
|
|
|
+ j, err := gjson.DecodeToJson(msg.Payload())
|
|
if err != nil {
|
|
if err != nil {
|
|
- fmt.Println(err)
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- switch cmd.Head.No {
|
|
|
|
- case commonCmdGetStatus:
|
|
|
|
- d.reportStatus(client)
|
|
|
|
- default:
|
|
|
|
- fmt.Printf("received command : %v: %v", cmd.Head.No, cmd.Params)
|
|
|
|
|
|
+ panic("错误的报文格式")
|
|
}
|
|
}
|
|
|
|
+ fmt.Printf("%v", j.MustToJsonString())
|
|
}
|
|
}
|
|
|
|
|
|
func (d *Device) messageHandler(client *MQTT.Client, msg MQTT.Message) {
|
|
func (d *Device) messageHandler(client *MQTT.Client, msg MQTT.Message) {
|
|
@@ -389,8 +388,10 @@ func (d *Device) doMQTTAccess() error {
|
|
}
|
|
}
|
|
}()
|
|
}()
|
|
go d.reportStatus(c)
|
|
go d.reportStatus(c)
|
|
|
|
+ go d.reportStatus2(c)
|
|
|
|
+ go d.reportEvent(c)
|
|
// we just pause here to wait for messages
|
|
// we just pause here to wait for messages
|
|
- <-make(chan int)
|
|
|
|
|
|
+ <-make(chan int)
|
|
|
|
|
|
defer c.Disconnect(250)
|
|
defer c.Disconnect(250)
|
|
|
|
|