MultiFiles

通过 UDP 多播分发文件(固件)的系统

下载 multifiles v0.5

许可协议:GPLv2, GPLv3 。

MultiFiles 工作原理

要分发的文件以 UDP 多播流的方式循环发送到网络中特定的多播地址(默认为 224.2.2.4,端口 2222)。若要接收固件,客户端需要发送 IGMP 请求加入多播组后,方可开始下载文件。文件下载完毕后,客户端将与组断开连接,然后验证文件的完整性。通过验证后,将解压文件(下载后的文件为 .tar.gz 格式),并启动刚才下载的文件中所包含的 customup.sh 脚本。该脚本更新所需文件并执行更新所需的其他操作。

使用多播可以只通过用一个流,动态更新任意数量的 IP 机顶盒。

如果当前固件版本与流中分发的固件版本类似或比其更新,客户端无需执行更新。但是,如果在服务器上指定“强制更新” 选项,无论软件版本的新旧,都将执行更新。

Multifiles 方案
图 1. 使用 Multifiles 网络方案

数据流规格

数据流由标头为下列格式的 UDP 数据包组成:

struct mulfiles_header{
uint32_t message_type;
uint32_t flags;
uint32_t data_size;
uint32_t sequence_no;
uint32_t file_offset;
};

message_type 可取如下两值之一:

#define MF_MTYPE_INFO 0x04030201
#define MF_MTYPE_DATA 0x04030202

MF_MTYPE_INFO 类型的数据包为信息包,包含要分发的文件信息,其数据为:

struct mulfiles_message_info{
uint32_t file_size;
uint32_t fw_version;
unsigned char md5sum[16];
char filename[1024];
};

文件大小、固件版本、文件名以及完整性校验的 MD5 Sum。信息包的默认发送间隔为 2 秒。

MF_MTYPE_DATA 类数据包包含要分发的文件内容。标头中包括了用于指示数据包中的数据相对于文件开始位置的位移信息。客户端可随时开始文件下载,无需等待下一周期开始。此逻辑使文件下载不会存在因搜索文件开始和结束位置而引起的任何额外延迟。

网络数据传输速率可以通过服务器应用程序的命令行选项进行调整。默认速率是每秒钟 100KB 。

服务器应用程序说明

服务器命令行选项:

multifiles # ./mfsrv -h
NetUP 的多播文件上传工具(服务器)。(c) 2001-2008 NetUP Inc.版权所有。
www.netup.tv. 编译日期:2008 年 11 月 3 日,13:22:49
您独自承担使用此工具的风险。
用法:
选项
[-i IP]          要使用的多播 IP 地址。默认: 224.2.2.4
[-p port]                要使用的 UDP 端口。默认: 2222
[-d]             启用调试消息。默认:disabled
[-f file]                要发送的文件名。默认:testfile.bin
[-s speed]               上传速率,Kb/秒。 默认:100 Kbytes/sec
[-t delay]               预防性消息延迟(秒)。 默认:2 sec
[-u]             设置强制更新标记。默认:force update flag not set
[-a version]             固件版本。默认: 0
[-h]             此帮助。

服务器启动的一个示例:

multifiles # ./mfsrv  -i 224.5.6.7 -p 1111 -f ./netup.tgz -s 100 -a 1104 -t 6
Using file:./netup.tgz file name:netup.tgz prophylactic_delay:6
Speed:102400 bytes/sec psleep: 13513
+ Sending file:netup.tgz sequence:1
o    Prophylactic info:1068 bytes from 1068 send to socket:3
o    Prophylactic info:1068 bytes from 1068 send to socket:3
o    Prophylactic info:1068 bytes from 1068 send to socket:3
o    Prophylactic info:1068 bytes from 1068 send to socket:3
o    Prophylactic info:1068 bytes from 1068 send to socket:3
o    Prophylactic info:1068 bytes from 1068 send to socket:3
o    Prophylactic info:1068 bytes from 1068 send to socket:3
o    Prophylactic info:1068 bytes from 1068 send to socket:3
o    File:netup.tgz successfully sent
+ Sending file:netup.tgz sequence:2

从示例中可以看到,文件 netup.tgz 以 100 Kb/秒的速度发送至多播组 224.5.6.7:1111。固件版本为 1104。

客户端应用程序说明

客户端命令行选项:

multifiles # ./mfcln -h
NetUP 的多播文件上传工具(客户端)。(c) 2001-2008 NetUP Inc.版权所有。
www.netup.tv. 编译日期:2008 年 11 月 3 日,13:22:48
您独自承担使用此工具的风险。
用法:
选项
[-i IP]          要使用的多播 IP 地址。默认: 224.2.2.4
[-p port]                要使用的 UDP 端口。默认: 2222
[-t socket wait timeout]       UDP 套接字超时(秒)。默认:10 sec.
[-d]             显示调试消息。默认:disabled
[-f file]                要保存文件的文件名。默认使用来自服务器的文件名
[-s stat_file]   要在其中保存统计信息的文件名。 默认:/tmp/mfstat.log
[-a fw_version]  当前的固件版本。仅当接收的版本比当前版本新时, 
才开始下载。默认: 0
[-h]             此帮助

客户端启动的一个示例:

multifiles # ./mfcln -i 224.5.6.7 -p 1111 -a 1100
Waiting for incoming data ...
Info message received. sequence:9240 filename:netup.tgz outfilename:netup.tgz.9240 
size:5741931 bytes
Receiving data ...
Filling file to required 5741931 bytes, blocks size is:1048576
File filled. Size is:5741931 requested size is:5741931. Starting write into
First offset:1379
Prophylactic info message received. filename:netup.tgz offset:208380 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:615480 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:1022580 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:1431060 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:1838160 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:2245260 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:2653740 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:3060840 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:3467940 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:3875040 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:4283520 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:4690620 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:5097720 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:5506200 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:69000 size:5741931 bytes 
force update:0 fw_version:1104
File 'netup.tgz.9240' received.Checking ...
e7a646426d66b5df3318ba09f1ae33d2 - our file md5. size:5741931
e7a646426d66b5df3318ba09f1ae33d2 - received md5
MD5 check success
File 'netup.tgz.9240' checked.Success.

如本例所示,正从多播组 224.5.6.7:1111 接收文件 netup.tgz。当前文件版本为 1100,服务器提供的版本为 1104。

创建固件

脚本目录:

multifiles # ls -al scripts/
total 16
drwxr-xr-x 4 root root   84 Oct 27 13:51 .
drwxr-xr-x 5 root root 4096 Oct 27 15:36 ..
-rwxr-xr-x 1 root root  115 Oct 27 13:51 createfw.sh
-rwxr-xr-x 1 root root  187 Oct 27 13:42 customup.sh
drwxr-xr-x 3 root root   35 Oct 27 13:51 firmware
-rwxr-xr-x 1 root root  889 Oct 27 13:39 update.sh

createfw.sh 脚本用于创建固件。比如,脚本可以为:

multifiles # cat scripts/createfw.sh
FWPATH="firmware"
FWNAME="mf_fw.tgz"

(cd $FWPATH; tar cvfz ../$FWNAME ./*)
echo "Firmware created.File:$FWNAME"

如示例所示,此脚本将固件文件夹中的内容归档到 mf_fw.tgz 文件中。如上所述,将通过多播提供此文件。

scripts/firmware/ 目录包含要更新的文件,以及下载后在客户端设备上执行所需操作的脚本。下面提供了这类脚本的一个简单示例:

multifiles # cat scripts/firmware/customup.sh
echo "Running custom upgrade shell script ...Please, wait"
echo "Copying new files ... "
cp stb_client/bin/stb_client /netup/stb_client/bin/stb_client

echo "Updating config files ... "

如示例所示,脚本复制新文件,并在需要时更新配置文件。

在客户端上使用固件

下面是在客户端设备上接收和处理固件的一个脚本示例(本示例用于 IP STB):

multifiles # cat scripts/update.sh
MFPATH="/mfupdater"
NEPATH="/netup"
DSTPATH=$MFPATH/dst
STATFILE="/tmp/mfstat.log"

# Show update splash screen
cat $MFPATH/updatesp.bmp > /dev/fb0 2>/dev/null

# get current ver
if [ -f $NEPATH/version ]; then
export CURVER=`cat $NEPATH/version`
else
export CURVER=0
fi


$MFPATH/mfcln -s $STATFILE -t 3 -i 224.5.6.7 -p 1111 -f $MFPATH/download.bin -a $CURVER

if [ $?-eq 0 ]; then
echo "Updating software ... "

# Create dst path
mkdir $DSTPATH 2>/dev/null

# unbzip received file into /netup
cd $DSTPATH
cat $MFPATH/download.bin | tar -xz

# run custom script in received file
cd $DSTPATH
sh customup.sh

# save new version
if [ -f $STATFILE ]; then
cat $STATFILE > $NEPATH/version
fi

# cleanup dst dir if required.You can do this in customup.sh

echo "Update done.New fw version:"
cat $NEPATH/version
fi

从上述代码中我们可以看到,脚本执行了以下操作:

  • 获取当前固件版本。将版本信息存储于 /netup/version 中
  • 开始从多播组下载固件
  • 成功下载文件后,将文件解压,并运行其中的 customup.sh 脚本。此脚本执行所需操作(复制、配置更新等)
  • 新版本数据将保存至文件 /netup/version。当从服务器接收到更新的固件版本时或在服务器上设定“强制更新”选项时,将执行下一次更新。

二进制版本

文档包含适用于下列平台的已准备好的二进制版本:

  • SH-4
  • Mipsel uclibc
  • ARM9
  • PPC
  • x86

致 IP STB 制造商

建议将客户端应用程序 (mfcln) 纳入基本 IP STB 产品中。在每次 IP STB 启动时,需要运行此应用程序,用固件检查是否存在多播流。此检查时间不超过 2 秒,如果没有发现软固件多播流或者提供的固件比较旧,则进行常规启动,不做任何更改。如果获得并安装了新版本的固件,则在下次启动时将执行所装固件提供的其他方案。这可获得特定于当前网络的固件,使新安装的 IP STB 能自动工作。


Get Adobe Flash player