Quellcode durchsuchen

更新ota升级

liuxiulin vor 8 Monaten
Ursprung
Commit
f1e4940a0b

+ 67 - 5
services/emqx-agent/agent.go

@@ -1,8 +1,14 @@
 package main
 package main
 
 
 import (
 import (
+	"bytes"
 	"context"
 	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
 	"github.com/gogf/gf/encoding/gjson"
 	"github.com/gogf/gf/encoding/gjson"
+	"github.com/gogf/gf/util/gconv"
+	"github.com/gogf/gf/v2/encoding/gbinary"
 	"sparrow/pkg/klink"
 	"sparrow/pkg/klink"
 	"sparrow/pkg/models"
 	"sparrow/pkg/models"
 	"sparrow/pkg/protocol"
 	"sparrow/pkg/protocol"
@@ -15,6 +21,12 @@ type Access struct {
 	client SubDev
 	client SubDev
 }
 }
 
 
+func NewAgent(client SubDev) *Access {
+	return &Access{
+		client: client,
+	}
+}
+
 // Message 收到设备上报消息处理
 // Message 收到设备上报消息处理
 func (a *Access) Message(topic string, payload []byte) error {
 func (a *Access) Message(topic string, payload []byte) error {
 
 
@@ -173,8 +185,7 @@ func processDeviceUpgrade(deviceId string, message *gjson.Json) error {
 			Size:     params.GetInt64("size"),
 			Size:     params.GetInt64("size"),
 			Offset:   params.GetInt("offset"),
 			Offset:   params.GetInt("offset"),
 		}
 		}
-
-		err := server.RPCCallByName(nil, rpcs.MQTTAccessName, "Access.ChunkUpgrade", args, &reply)
+		err := chunkUpgrade(*args)
 		if err != nil {
 		if err != nil {
 			server.Log.Errorf("分片下载发送失败:%v", err)
 			server.Log.Errorf("分片下载发送失败:%v", err)
 		}
 		}
@@ -294,10 +305,61 @@ func (a *Access) GetStatus(args rpcs.ArgsGetStatus, reply *rpcs.ReplyGetStatus)
 	return a.SendCommand(cmdArgs, &cmdReply)
 	return a.SendCommand(cmdArgs, &cmdReply)
 }
 }
 
 
-func NewAgent(client SubDev) *Access {
-	return &Access{
-		client: client,
+func chunkUpgrade(params rpcs.ChunkUpgrade) error {
+	server.Log.Infof("4G模组OTA升级:%s", params.DeviceId)
+	reply := new(rpcs.ReplyEmptyResult)
+	cmd := &klink.CloudSend{
+		Action:     "cloudSend",
+		MsgId:      0,
+		DeviceCode: params.DeviceId,
+		Timestamp:  time.Now().Unix(),
+		Data: &klink.CloudSendData{
+			Cmd: "devUpgrade",
+			Params: map[string]interface{}{
+				"fileId":   params.FileId,
+				"fileSize": params.FileSize,
+				"size":     params.Size,
+				"offset":   params.Offset,
+			},
+		},
 	}
 	}
+
+	byteCmd, err := json.Marshal(cmd)
+	if err != nil {
+		return err
+	}
+
+	buf := bytes.NewBuffer(gbinary.BeEncodeUint16(gconv.Uint16(len(byteCmd))))
+
+	server.Log.Infof("1----------填充数据长度:%2X", buf.Bytes())
+
+	buf.Write(byteCmd)
+	server.Log.Infof("2----------填充响应数据:%2X", buf.Bytes())
+	var fileArgs rpcs.ArgsOtaFile
+	fileArgs.FileId = params.FileId
+
+	var fileReply rpcs.ReplyOtaFile
+	err = server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetFile", fileArgs, &fileReply)
+	if err != nil {
+		server.Log.Errorf("OTA升级文件保存失败:%v", err)
+		return err
+	}
+	server.Log.Infof("获取到OTA文件:%v", fileReply)
+	if fileReply.File == nil {
+		return errors.New(fmt.Sprintf("文件:%s 获取失败", params.FileId))
+	}
+	buf.Write(fileReply.File[params.Offset : params.Offset+int(params.Size)])
+	server.Log.Infof("3----------填充文件:%2X", buf.Bytes())
+	var mCrc crc
+	checkSum := mCrc.reset().pushBytes(buf.Bytes()).value()
+	buf.Write([]byte{byte(checkSum), byte(checkSum >> 8)})
+	server.Log.Infof("4----------填充CRC:%2X", buf.Bytes())
+	var SendByteArgs rpcs.ArgsSendByteData
+	SendByteArgs.DeviceId = params.DeviceId
+	SendByteArgs.Data = buf.Bytes()
+	err = server.RPCCallByName(nil, rpcs.EmqxAgentServiceName, "Access.SendByteData", SendByteArgs, &reply)
+
+	return nil
 }
 }
 
 
 // SendByteData rpc 发送byte数组
 // SendByteData rpc 发送byte数组

+ 0 - 0
services/mqttaccess/crc.go → services/emqx-agent/crc.go


+ 31 - 30
services/knowoapi/services/device.go

@@ -2,6 +2,7 @@ package services
 
 
 import (
 import (
 	"github.com/gogf/gf/encoding/gjson"
 	"github.com/gogf/gf/encoding/gjson"
+	"github.com/gogf/gf/util/guid"
 	"sparrow/pkg/models"
 	"sparrow/pkg/models"
 	"sparrow/pkg/rpcs"
 	"sparrow/pkg/rpcs"
 	"sparrow/pkg/server"
 	"sparrow/pkg/server"
@@ -157,42 +158,42 @@ func (a deviceservice) GetDevicesCountByVenderId(vendorid string) (map[string]in
 
 
 func (a deviceservice) Upgrade(param *models.UpgradeParams) error {
 func (a deviceservice) Upgrade(param *models.UpgradeParams) error {
 
 
-	//var fileArgs rpcs.ArgsOtaFile
-	//fileArgs.FileData = param.File
-	//fileArgs.FileId = guid.S()
-	//var reply rpcs.ReplyEmptyResult
-	//
-	//err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.SavaFile", fileArgs, &reply)
-	//if err != nil {
-	//	server.Log.Errorf("OTA升级文件保存失败:%v", err)
-	//	return err
-	//}
-	//
-	//var args rpcs.ArgsUpgrade4G
-	//args.DeviceId = param.DeviceID
-	//args.FileId = fileArgs.FileId
-	//args.FileSize = param.FileSize
-	//
-	//err = server.RPCCallByName(nil, rpcs.MQTTAccessName, "Access.UpgradeFor4G", args, &reply)
-	//if err != nil {
-	//	server.Log.Errorf("4G模组OTA升级失败:%v", err)
-	//	return err
-	//}
+	var fileArgs rpcs.ArgsOtaFile
+	fileArgs.FileData = param.File
+	fileArgs.FileId = guid.S()
+	var reply rpcs.ReplyEmptyResult
+
+	err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.SavaFile", fileArgs, &reply)
+	if err != nil {
+		server.Log.Errorf("OTA升级文件保存失败:%v", err)
+		return err
+	}
+
+	var args rpcs.ArgsUpgrade4G
+	args.DeviceId = param.DeviceID
+	args.FileId = fileArgs.FileId
+	args.FileSize = param.FileSize
+
+	err = server.RPCCallByName(nil, rpcs.MQTTAccessName, "Access.UpgradeFor4G", args, &reply)
+	if err != nil {
+		server.Log.Errorf("4G模组OTA升级失败:%v", err)
+		return err
+	}
 	server.Log.Debugf("ota升级请求成功")
 	server.Log.Debugf("ota升级请求成功")
 	return nil
 	return nil
 }
 }
 
 
 func (a deviceservice) GetUpgradeProgress(deviceId string) (rpcs.ReplyOtaProgress, error) {
 func (a deviceservice) GetUpgradeProgress(deviceId string) (rpcs.ReplyOtaProgress, error) {
-	//var args rpcs.ArgsOtaProgress
-	//args.DeviceId = deviceId
-	//
+	var args rpcs.ArgsOtaProgress
+	args.DeviceId = deviceId
+
 	var reply rpcs.ReplyOtaProgress
 	var reply rpcs.ReplyOtaProgress
-	//
-	//err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetProgress", args, &reply)
-	//if err != nil {
-	//	server.Log.Errorf("OTA升级进度获取失败:%v", err)
-	//	return reply, err
-	//}
+
+	err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetProgress", args, &reply)
+	if err != nil {
+		server.Log.Errorf("OTA升级进度获取失败:%v", err)
+		return reply, err
+	}
 	server.Log.Debugf("获取升级进度请求成功")
 	server.Log.Debugf("获取升级进度请求成功")
 	return reply, nil
 	return reply, nil
 }
 }

+ 0 - 60
services/mqttaccess/access.go

@@ -1,13 +1,7 @@
 package main
 package main
 
 
 import (
 import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"fmt"
 	MQTT "github.com/eclipse/paho.mqtt.golang"
 	MQTT "github.com/eclipse/paho.mqtt.golang"
-	"github.com/gogf/gf/v2/encoding/gbinary"
-	"github.com/gogf/gf/v2/util/gconv"
 	"sparrow/pkg/klink"
 	"sparrow/pkg/klink"
 	"sparrow/pkg/mqtt"
 	"sparrow/pkg/mqtt"
 	"sparrow/pkg/protocol"
 	"sparrow/pkg/protocol"
@@ -139,57 +133,3 @@ func (a *Access) UpgradeFor4G(args rpcs.ArgsUpgrade4G, reply *rpcs.ReplyEmptyRes
 	}
 	}
 	return a.MqttBroker.SendMessageToDevice(args.DeviceId, "c", msg, 5*time.Second)
 	return a.MqttBroker.SendMessageToDevice(args.DeviceId, "c", msg, 5*time.Second)
 }
 }
-
-func (a *Access) ChunkUpgrade(args rpcs.ChunkUpgrade, reply *rpcs.ReplyEmptyResult) error {
-	server.Log.Infof("4G模组OTA升级:%s", args.DeviceId)
-
-	cmd := &klink.CloudSend{
-		Action:     "cloudSend",
-		MsgId:      0,
-		DeviceCode: args.DeviceId,
-		Timestamp:  time.Now().Unix(),
-		Data: &klink.CloudSendData{
-			Cmd: "devUpgrade",
-			Params: map[string]interface{}{
-				"fileId":   args.FileId,
-				"fileSize": args.FileSize,
-				"size":     args.Size,
-				"offset":   args.Offset,
-			},
-		},
-	}
-
-	byteCmd, err := json.Marshal(cmd)
-	if err != nil {
-		return err
-	}
-
-	buf := bytes.NewBuffer(gbinary.BeEncodeUint16(gconv.Uint16(len(byteCmd))))
-	buf.Write(byteCmd)
-
-	var fileArgs rpcs.ArgsOtaFile
-	fileArgs.FileId = args.FileId
-
-	var fileReply rpcs.ReplyOtaFile
-	err = server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetFile", fileArgs, &reply)
-	if err != nil {
-		server.Log.Errorf("OTA升级文件保存失败:%v", err)
-		return err
-	}
-
-	if fileReply.File == nil {
-		return errors.New(fmt.Sprintf("文件:%s 获取失败", args.FileId))
-	}
-	buf.Write(fileReply.File[args.Offset : args.Offset+int(args.Size)])
-
-	var mCrc crc
-	checkSum := mCrc.reset().pushBytes(buf.Bytes()).value()
-	buf.Write([]byte{byte(checkSum), byte(checkSum >> 8)})
-
-	var SendByteArgs rpcs.ArgsSendByteData
-	SendByteArgs.DeviceId = args.DeviceId
-	SendByteArgs.Data = buf.Bytes()
-	err = server.RPCCallByName(nil, rpcs.EmqxAgentServiceName, "Access.SendByteData", SendByteArgs, &reply)
-
-	return nil
-}