手把手教你如何实现自动固件更新-服务器篇

博客
※已刊登在“无线电”06月刊上手把手教你如何实现自动固件更新 - 服务器篇   作者:常席正,张博 常见的嵌入式设备的固件更新有两种方式:上位机工具更新和HTTP嵌入式网页更新但两种方式都无法批量更新,都需要用户手动操作,如果用户有大量模块需要更新固件,绝不可能像“把大象放进冰箱”那样三步就可以解决问题,而且很多厂商的固件因为保密的问题是不开放给客户的。即使所有问题都不是问题,而用户更新失败以及更新错误的固件,所造成设备变“砖”的风险也是设备开发者不得不考虑的。        下面给大家介绍一种嵌入式设备批量实现固件更新的方法----通过固件服务器自动更新。只需要有一台云服务器,一些HTML / PHP和数据库方面的知识,然后再在模块里植入HTTP客户端固件更新的相关代码。之后用户只需要将模块联网,固件更新就能自动完成。        本人思路如图1所示。 首先,模块需要给客户开放一个可选配置项,即是否允许模块自动进行固件更新操作。 然后,当模块自动进行固件更新被允许时,模块作为HTTP客户端通过HTTP POST的方式将验证信息(一般为模块的MAC地址)以JSON的格式发送至云服务器。 接着,服务器解析JSON以获取模块的MAC地址,跟数据库中预先保存的MAC地址列表进行对比验证。如果验证通过,服务器将通过HTTP POST回复关于最新固件版本的必要信息(包括固件版本号,下载路径,文件长度,文件校验HASH值)发给模块;如果验证通过,但服务器端出现异常,则服务器给模块报错;如果验证不通过,服务器告诉模块“该设备未注册”。 最后,模块通过解析服务器回复的JSON格式的报文,获取最新固件版本的信息,并与自身固件版本作比对,如果设备本身固件不是最新固件,则进一步完成下载最新固件并完成更新。 图1自动固件更新流程 通过以上流程描述可知,实现这套方案同时需要服务器端和嵌入式模块两部分的配合,这篇先给大家教一下服务器端需要做哪些工作。 网站服务器环境搭建和网站的建立 首先,需要拥有一个域名和一台云服务器。关于域名的解析,备案等大家可以自行了解。国内做云服务器的厂商众多,易迈云,阿里云,腾讯云等等,我们要实现的这个功能非常简单,对服务器开销不大,根据实际需要选一款即可。我用的是阿里云服务器Windows Sever 2008标准版SP2 32位中文版,配置是1核2G内存2Mbps带宽挂载40G的系统盘和40G的数据盘。 搭建服务器主要包括3个核心环境,即Web服务器软件(常用的有IIS服务器和Apache等),PHP和数据库(常用的有MySQL和SQL Server)。由于这3种核心的软件更新很快,版本众多,且相互之间有版本要求的限制,因此推荐使用建站集成软件包XAMPP.XAMPP集成了Apache的+ PHP + MySQL的,简单实用,配置灵活,非常利于快速实现一些简单的服务器功能.XAMPP软件界面如图2所示。 图2 XAMPP软件界面        XAMPP软件的安装很简单,需要提醒大家的是服务器需要提前安装最新VC运行库,否则会导致安装失败。安装好后如图2所示安装的Apache和MySQL的服务模块(绿色√),分别点击“开始“按钮启动Apache Web服务器和MySQL。 网络服务器搭建完毕,域名也完成了解析和备案,就可以通过浏览器访问到用户的默认网站。接下来要做的需要将自动固件更新服务器端的一整套代码,包括HTML和PHP文件替换原有的默认网页,服务器端环境和网站就搭建完毕了。下面进行详细说明。   关系数据库搭建 固件的所有关键信息都是通过数据库保存的,PHP文件只是用于对数据库进行必要操作脚本,因此完善,清晰的数据库内容和结构对于后续的PHP代码编写非常重要。接下来我们需要先完成数据库的搭建。 点击MySQL的模块同行的“管理”按钮,进入数据库。 如下表1所示,新建一个数据库“fw_update”,排序规则为utf8_general_ci。该数据库下新建3个数据表,分别是“fw_list”,“device_list”以及“DEVICE_TYPE”。 device_type:设备类型数据表,厂商的产品可以有多种型号(默认每种设备类型只有一种固件)。下设2个字段,包括一个自增长的主键uId和设备类型名称uName。 fw_list:固件清单数据表,记录厂商上传至服务器的每一个固件的详细信息,包括typeId(设备类型名称编号),uPath(固件大小),uHash(固件哈希校验值) ,哈希的作用是文件在传输前和传输后分别计算一个校验值,如果两个校验值相同,则说明文件传输没有发生错误),版本号(3分段,v1.v2.v3) 。其中,TYPEID字段需要设置为同DEVICE_TYPE中的的uId相关联。 device_list:设备列表,记录出厂模块的MAC地址和设备类型,typeId字段也需要设置为同device_type中的uId相关联。 表1数据库结构        该数据库的理解是:每一个设备对应唯一的一个MAC地址,也对应一种设备类型,而每一种设备类型对应有多个版本的同一类固件这样,关系数据库就建好了,目前还是一个空的数据库,后续需要管理员通过固件上传操作,将不同设备类型,不同版本的固件上传至服务器即可。   固件上传部分 固件上传网页如图3所示,管理员上传固件时需要选择设备类型,选择需要上传的固件以及填写固件版本号,然后点击“确定”,上传的固件信息将会交给服务器脚本PHP去处理。 图3固件上传界面 HTML代码如下: 01 < html > 02 <头> 03      < meta http-equiv = “Content-Type”content = “text / html ; charset = utf-8” /> 04      < title >远程自动固件更新系统</ title > 05 </ head > 06 <身体> 07 < BR > < BR > 08 < H1对齐= “中心” >远程自动固件更新系统</ H1 > < BR > 09 < H2对齐= “中心” >固件上传</ H2 > < BR > 10 < form method = “post”enctype = “multipart / form-data” > <! -用POST方式- >…
Read More