IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> GO-PI-OTA创新设计【待定】 -> 正文阅读

[开发工具]GO-PI-OTA创新设计【待定】

项目OTA的需求 前面的文章完成了一个文件的设计 对于传统MCU项目已然足够
但是当前我们还有一些前端的文件 倘若这些文件需要改动 那是鞭长莫及的
怎么办?
很容易想到的思路一
把需要修改的文件 统统放在一个文件夹?
那么就还需要 准备一个描述各个文件改动的情况(增/删/改)?
然后集体压缩打包
然后收到压缩包以后解压?
然后根据描述文件 执行相应的文件操作
那么就还需要 准备一个动态的解析文件描述的脚本

思路是没有问题 但是山高水远 我断然不会上路

凡是不要慌
先想好 再编程

继续思考 我果然想到一个非常创新的idea!
这些让人头疼的 增/删/改 其实已经有工具管理了?
利用git工具 开始反弹琵琶的设计
模拟情况如下:

荷兰有一个PI 它的文件夹我本地有一个1:1的模型

此时我们都是这个样子

D1


D2

需要做OTA的 我本地一定要认真验证的 假设本地的改动如下


1--删除D:\KuGou\Y\dashboard\css\bootstrap\mixins 里面一个文件

2--增加一个TXT

3--改动2个文件

上面的修改都是再Y里面

我再X里面git init

然后把X里面的.git 放到Y

直接git status

?全部出来了!!

再Y里面提交一次

然后把Y里面的。git 复制到X里面就好了!

怎么复制的 我套一个壳子

假设我做成了GIT.ZIP

我i再X里面执行

删除一个目录下部分类型之外的所有文件的三种方法

?rm -i !(*.zip)

win 无法执行了

就只有这个ZIP文件了

然后加压 就只有。git文件

然后git reset --hard HEAD 就和Y一样了

第一步准备好提交

第二部把本地的。git文件做成压缩包

第三步 把压缩包上报到平台

第四步把压缩包下载到树莓派

第五步验证没有问题 把文件夹里面除了ZIP的全部del? rm -rf -v !(*.mod)? 删除处理。mod以外的一切

然后解压 然后git reset --hard HEAD 然后del这个zip

全部更新完成

还可以回滚!!!

怎么处理。git文件的压缩

它其实是文件夹

1--重命名 就可以

2--解压可以回来的?

3怎么加密?没有实现

代码如下

package main

import (
	"archive/zip"
	"io"
	"log"
	"os"
	"path/filepath"
)

func zipDir(dir, zipFile string) {

	fz, err := os.Create(zipFile)
	if err != nil {
		log.Fatalf("Create zip file failed: %s\n", err.Error())
	}
	defer fz.Close()

	w := zip.NewWriter(fz)
	defer w.Close()

	filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if !info.IsDir() {
			fDest, err := w.Create(path[len(dir)+1:])
			if err != nil {
				log.Printf("Create failed: %s\n", err.Error())
				return nil
			}
			fSrc, err := os.Open(path)
			if err != nil {
				log.Printf("Open failed: %s\n", err.Error())
				return nil
			}
			defer fSrc.Close()
			_, err = io.Copy(fDest, fSrc)
			if err != nil {
				log.Printf("Copy failed: %s\n", err.Error())
				return nil
			}
		}
		return nil
	})
}

func unzipDir(zipFile, dir string) {

	r, err := zip.OpenReader(zipFile)
	if err != nil {
		log.Fatalf("Open zip file failed: %s\n", err.Error())
	}
	defer r.Close()

	for _, f := range r.File {
		func() {
			path := dir + string(filepath.Separator) + f.Name
			os.MkdirAll(filepath.Dir(path), 0755)
			fDest, err := os.Create(path)
			if err != nil {
				log.Printf("Create failed: %s\n", err.Error())
				return
			}
			defer fDest.Close()

			fSrc, err := f.Open()
			if err != nil {
				log.Printf("Open failed: %s\n", err.Error())
				return
			}
			defer fSrc.Close()

			_, err = io.Copy(fDest, fSrc)
			if err != nil {
				log.Printf("Copy failed: %s\n", err.Error())
				return
			}
		}()
	}
}

func main() {
	os.Rename("C:\\Users\\Koson.Gong\\Desktop\\XX\\.git", "C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG")
	zipDir("C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG", "C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG.zip")
	unzipDir("C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG.zip", "D:\\adb\\.git")
}

?golang 进行文件夹的压缩与解压 - Go语言中文网 - Golang中文社区

这个也可以

package main

import (
	"archive/zip"
	"io"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	//Zip("C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG", "IMG.ZIP")
	//Zip(`C:\Users\Koson.Gong\Desktop\XX\IMG`, `IMG.ZIP`)
	//Zip("C:/Users/Koson.Gong/Desktop/XX/IMG", "IMG.ZIP")
	Zip("./IMG", "IMG.ZIP")
}

// 打包成zip文件
func Zip(src_dir string, zip_file_name string) {

	// 预防:旧文件无法覆盖
	os.RemoveAll(zip_file_name)

	// 创建:zip文件
	zipfile, _ := os.Create(zip_file_name)
	defer zipfile.Close()

	// 打开:zip文件
	archive := zip.NewWriter(zipfile)
	defer archive.Close()

	// 遍历路径信息
	filepath.Walk(src_dir, func(path string, info os.FileInfo, _ error) error {

		// 如果是源路径,提前进行下一个遍历
		if path == src_dir {
			return nil
		}

		// 获取:文件头信息
		header, _ := zip.FileInfoHeader(info)
		header.Name = strings.TrimPrefix(path, src_dir+`/`)

		// 判断:文件是不是文件夹
		if info.IsDir() {
			header.Name += `/`
		} else {
			// 设置:zip的文件压缩算法
			header.Method = zip.Deflate
		}

		// 创建:压缩包头部信息
		writer, _ := archive.CreateHeader(header)
		if !info.IsDir() {
			file, _ := os.Open(path)
			defer file.Close()
			io.Copy(writer, file)
		}
		return nil
	})
}


怎么加密?



https://segmentfault.com/q/1010000018149446

GitHub - yeka/zip: Fork of Go's archive/zip to add reading/writing of password protected zip files.

有空在研究

++++放弃加密 就ZIP文件以后 就不是文件夹了 就是一个文件 做它的MD5++

package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"io"
	"os"
)

// 获取文件的md5码
func getFileMd5(filepath string) string {
	// 文件全路径名
	//path := fmt.Sprintf("./%s", filename)
	pFile, err := os.Open(filepath)
	if err != nil {
		fmt.Errorf("打开文件失败,filepath=%v, err=%v", filepath, err)
		return ""
	}
	defer pFile.Close()
	md5h := md5.New()
	io.Copy(md5h, pFile)
	fmt.Printf("file:[%s] MD5:[%s]\r\n", filepath, hex.EncodeToString(md5h.Sum(nil)))
	return hex.EncodeToString(md5h.Sum(nil))
}

func main() {
	getFileMd5("./IMG.ZIP")
}

方案3:本地有git了

平台下发url

本地执行git pull即可!我现在是自己把。git拿过去更新 它也可以自己拉新的img

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:19:41  更:2022-03-06 13:20:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:45:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码