首页 » 软件开发 » 出现代码限制问题(鸿蒙代码传输工具数据)

出现代码限制问题(鸿蒙代码传输工具数据)

少女玫瑰心 2024-07-24 23:01:57 0

扫一扫用手机浏览

文章目录 [+]

应一个朋友要求,使用python制作了一个图形化烧写鸿蒙OS的工具,发现目前网上开源的tftp代码存在疏漏,无法传输大文件,本文介绍了原因和修复方法。

一、鸿蒙系统烧写原理

之前参加过鸿蒙系统的推广,获得了一块基于Hi3516DV300的摄像头,也曾尝试自己编译鸿蒙系统和重新烧写。
开发环境编译系统后,得到三个文件:

Rootfs.img

出现代码限制问题(鸿蒙代码传输工具数据) 软件开发
(图片来自网络侵删)

Userfs.img

OHOS_Image.bin

将其导入板卡后,再进行一系列设置完成升级。

其关键步骤,是通过网络使用tftp将文件导入mmc。

华为官方推出的烧写工具hitool使用起来比较复杂,大部分参数需要手工计算填写,烧写完成后还需要手工更改启动参数,不少朋友表示不太适应。
故应朋友之邀,做了一个简化的烧写工具。

二、工具制作

采用python编写,主要调用了tkinter、serial、socket等库实现了工具界面和功能的开发。

图一

因为python没有直接的tftp库,因此tftp采用socket开发,借用了网上的开源代码。

在最初开发时,发现rooft.img和userfs.img文件传输都正常,但传输OHOS_Image.bin无法通过CRC验证。
找了多个出处,借鉴了不同开源代码,均存在同类问题,最终大致确定原因python下的开源tftp代码不支持大小超过33M的文件,否则会出现错误。

但事实上,使用官方工具hitool可以正常传输一个镜像,显然不是板卡问题或tftp协议本身的限制,应该还是代码引入的问题。

三、问题分析

在《TCP/IP详解卷1》章节15中介绍了TFTP,原理非常简单:数据以定长512字节传输,收到对方的应答数据包后发送下一数据包,直至数据大小小于512字节,认为传输结束。
在这个过程中,如果发送方没有收到应答,会超时重传,通信的双方都是数据的发出者与接收者,一方传输数据接收应答,另一方发出应答接收数据。

在RFC1350的Figure 5-2(https://datatracker.ietf.org/doc/rfc1350/)中,定义了数据传输格式:

图二

当Opcode为3时,表示数据传输,具有块号(Block#)和数据字段(Data)。
数据包上的块号从一个开始,每一个新的数据块增加一个。
因为块号只有2 bytes,所以只能支持0~65535的数字,再乘以Data的固定长度512字节,大约就是限制33M。
这就是网上所能找到代码无法传输大文件的根本原因!

找到原因以后,解决方法也很简单,在RFC1350中直接给出了解决方案:使用重复的Block号(“The block numbers on data packets begin with one and increase by one for each new block of data. This restriction allows the program to use a single number to discriminate between new packets and duplicates.”)在程序中也只要加上两行:

图三

完美解决该问题。

四、心得

在出现问题之前,并没有想过公开代码的网友们是否已经充分验证了代码的有效性,直接拿来引用,发现问题后,还一度认为是网线或是操作步骤的导致,没想过几万人使用也许都没有试过大文件传输,或是发现了问题也没有说;使用暴力验证可以传输的最大文件,以为定位了问题,但不读RFC文档,就没有考虑过这个33M限制是哪来的,自然也想不到解决办法。

总的说来:

1、代码加注释是好习惯,没有注释的代码读起来太痛苦。

2、一本专业的参考书应该随时放在手边,不时翻翻,总有新的体悟。

3、不能迷信已有的代码,应该自己动手,就算是经过其它人验证了的成熟模块,在使用前,也可以设置各种边界条件,多加验证,做到心中有数,不然代码重用时难免会碰到意料之外的情况。

标签:

相关文章

语言中的借用,文化交融的桥梁

自古以来,人类社会的交流与发展离不开语言的传播。在漫长的历史长河中,各民族、各地区之间的文化相互碰撞、交融,产生了许多独特的语言现...

软件开发 2025-01-01 阅读1 评论0

机顶盒协议,守护数字生活的新卫士

随着科技的飞速发展,数字家庭逐渐走进千家万户。在这个时代,机顶盒成为了连接我们与丰富多彩的数字世界的重要桥梁。而机顶盒协议,作为保...

软件开发 2025-01-01 阅读1 评论0

语言基础在现代社会的重要性及方法步骤

语言是人类沟通的桥梁,是社会发展的基础。语言基础作为语言学习的基石,对于个人、社会乃至国家的发展具有重要意义。本文将从语言基础在现...

软件开发 2025-01-01 阅读2 评论0

粤语电影,传承文化,点亮时代之光

粤语电影,作为中国电影产业的一朵奇葩,以其独特的地域特色、丰富的文化内涵和鲜明的艺术风格,赢得了广大观众的喜爱。本文将从粤语电影的...

软件开发 2025-01-01 阅读3 评论0

苹果游戏语言,塑造未来娱乐体验的基石

随着科技的飞速发展,游戏产业逐渐成为全球娱乐市场的重要支柱。在我国,游戏产业更是蓬勃发展,吸引了无数玩家和投资者的目光。而在这其中...

软件开发 2025-01-01 阅读1 评论0