基于 HTTP的远程配置和固件更新

博客
(已在《无线电》杂志第10期刊登) 对于HTTP的思考 你也许会问,既然通过一个上位机程序可以完成这个任务,为什么还要通过浏览器实现呢?其实这两个方法各有优缺点,用上位机程序,用户可以自己定制协议,但是用户不仅需要安装该上位机程序,而且还要考虑面对不同的操作系统下的兼容情况。然而通过网页更新的话,只需要设备内嵌一个HTTP服务器,便省去了编写上位机程序的负担,并无须考虑去兼容不同的操作系统。当然,上位机程序可以实现UDP广播寻址终端,无需知道终端IP地址即可找到同一网段下的多个终端。而使用网页的话就只能是预先知道终端IP地址并逐一配置。 其实,对于通过网页配置相信大家并不陌生,家里有无线路由器的朋友估计都有实践经验。通过浏览器键入路由器的默认IP,然后根据网页提示就可以一步步地实现设备信息配置,诸如WiFi密码、SSID等。今天,我们就是来探究一下这个应用的原理,在单片机里实现一个HTTP服务器,通过这个HTTP服务器来配置设备信息,并实现了设备固件更新。 当然,我这里的这个HTTP服务器没有家里的路由器那样的功能强大,在这里也只是抛砖引玉,希望大家能够从中获取启发,设计出更出色的产品。方便起见,我们仍旧延续上一篇文章的平台——基于Cortex-M3的W5200评估板(STM32F108C8 + W5200)。   图1 W5200评估板 该评估板单片机的系统资源:64KB的闪存和20KB的SRAM。 (W5200可以和任何单片机配合使用,如果用户想使用其他单片机+W5200来实现的话,需要您自行修改代码,这里暂不提供其他库。)   功能演示 在我们展开谈论基于HTTP的远程配置和固件更新的原理之前,先给大家看一下我们这个程序小样的功能演示。感兴趣的朋友可以在接下来的文章中,了解到具体该功能是如何实现的。 步骤1: 用ISP工具烧录Boot(评估板SW2 调至PROP),不了解的话,可以参考我们上一个主题内容。   图2用FlashLoader烧录boot.bin 步骤2: 将评估板上SW2 调到RUN模式,打开ConfigTool。点击按钮,可查找到当前设备,并可通过按钮,将app.bin程序上传至评估板中,右侧可看到当前设备的IP地址及版本号等信息,此时版本号为1.0,如图: 图3配置工具烧录app.bin成功 ConfigTool这里的工作也很简单,就是在第一次Boot启动时,把App传给单片机。当App运行时,ConfigTool就无用武之地了,因为用浏览器就可以完成ConfigTool的工作了。 (注:以上途径并不是必须的,仅为了方便演示,保证boot和app程序已经烧录好即可。) 步骤3: 在浏览器中输入W5200评估板的IP地址,回车后出现Web界面。 如图可看到,界面分为Device Settings和Firmware Updating两部分,其中Device Settings中依次列出W5200评估板的硬件版本号、MAC地址、IP地址、子网掩码以及默认网关基本配置。 用户可以配置其他IP地址,子网掩码及网关,并点击’Save settings and Reboot’,设置并重启生效; 图4 Web配置界面 如: 在WEB界面上,将IP地址192.168.1.2改为192.168.1.20。更改后保存,等待后更改成功: 图5更改IP成功 步骤4: 下面针对固件更新,点击“浏览”按钮,选择好要更新文件。;选好后开始上传,出现以下界面,更新过程需要6s. 图6等待升级完成 更新完成,可以看到新成功,版本号更改为5.0,IP地址以及界面颜色都进行了更新,如下图:   图7升级成功 是不是很简单?马上动手,也给你的设备加入一个HTTP服务器,实现远程配置升级功能吧。当然,配置和升级只是应用的一小部分,你也完全可以通过模拟/数字输入接入几个传感器,比如温度、湿度和PM2.5,这样打开浏览器就可以监视这些传感器数据了。 这个小样只是一个简单的功能及原理演示,下面就让我们来看一下这个基于 HTTP的远程配置和固件更新实现的思路及原理。 应用原理 1.        方框图 图8 HTTP远程更新固件框图 每次重启,均从首地址开始执行程序: 1启动进入BOOT区,若BOOT检测APP区的不为空,则跳转到APP区的首地址执行主程序; 2浏览器访问APP区的网页服务器 配置网络参数:即将浏览器中键入的参数通过APP更新到Configure Information区 远程更新固件:即进入到以下步骤3 3浏览器访问APP主程序的网页服务器,并通过浏览器将即将更新的APP写入到Backup区; 4当APP检测到Backup区域已经有新的APP程序后,跳转到BOOT区,执行更新操作; 5BOOT将APP区擦除,并将新APP从Backup区写入到APP区; 重启,重新执行程序。 2.        内存图 图9 W5200评估板内存空间分配   在我们要演示的程序中,将MCU闪存划分成了四个区: 3.        各分区的主要功能 了解了空间分配之后,我们再来看一下我们这个演示中各部分的主要功能: BOOT区: 清空APP区,为新APP写入做准备; 把暂存在Backup区的新版本程序拷贝到APP区; 与上位机程序通信,获取App; 备注:其实,这里Boot不必具备这个功能,只是我们编译完两个固件后,不想合并两个二进制文件,然后再通过ISP工具烧录,所以偷个懒,沿用了上次的上位机程序。 APP区 APP区是应用程序运行区域,实现了HTTP服务器,并集成了一个简单的网页。 配置网络参数; 在线固件升级; 上电启动后,进入Boot区,若判断上层APP区的状态量成功,则直接从Boot区跳转到APP区,运行主程序。 备注:想修改网页的话,可以参考webpage.h,所有的HTML代码都在这个头文件里面。 Backup区 接收并备份需要更新的新App 备注:由于Backup区的大小为23K,所以意味着APP的大小最大为23K;APP区为24K,其实有1K是无数据存放的; Configure Information区 存放IP地址,MAC地址,子网掩码等网络参数,以供App调用; App可以再写入,更新该区域存放的网络配置参数; 程序开发 我们将App程序主要分为5个文件: main.c实现HTTP固件更新的主流程; httputil.c文件用于实现HTTP协议响应报文的发送; httpd.c文件用于实现对HTTP请求报文的解析; device.c文件用于实现W5200的初始化及单片机的基本配置; webpage.h文件定义web界面的html语言。 这里我们重点介绍一下http()函数: http()函数实现了Web服务器接受请求和回复响应的全过程,由于Web服务器在和浏览器通信时使用TCP协议工作,根据SOCK_HTTP之间状态的不同,执行不同的操作。 图10 HTTP服务器通信过程示意图 HTTP服务器的通信过程大致分为三步: 连接:W5200分配socket到HTTP服务器,打开socket并监听。 通信:连接建立了。W5200在接收到来自客户端的HTTP请求后发送HTTP应答。 关闭:HTTP 请求/应答完成后关闭连接。   voiddo_http(void) { uint8 ch=SOCK_HTTP;                      //定义HTTP通信的socket端口变量 uint16len; st_http_request *http_request; memset(rx_buf,0x00,MAX_URI_SIZE); http_request = (st_http_request*)rx_buf;       // 定义HTTP请求报文的结构指针 /* HTTP Server 状态之间的转换 */ switch(getSn_SR(ch)) {…
Read More

为你的设备实现远程固件更新

博客
写在前面 以往在烧写芯片时,往往需要将芯片主板从系统中取出,离开电路后,才能用编程器烧写程序。也就是说芯片不能脱离系统而进行写入。 这个在众多应用环境中带来了很多的不便及困扰。比如:一些早期的STB机顶盒,还未有操作系统的涉入,但是如果系统程序需要做优化升级,但是产品早已发给客户端,挨家挨户的取做升级,显然是不太可能的事情。 这就引发了人们对于在线编程的探讨。   关键字:在线编程,ISP,IAR,固件更新,程序烧写,远程,TCP/IP,CATV;   应用探讨 很多时候, 我们很难将设备取下来并对其进行更新 : 气象站,交通控制系统,CATV光纤收/发器。 再或我们一些Arduino爱好者, 做的一些远程监控家中空气湿度、温度的小应用等等太多的设备,那么如能都应用远程更新固件就再方便不过了。   在室外,某些放置于高处的气象站的设备,不便于取下来, 而又不想丢失一部分气象数据;用于高压站或是不便操作地点附近的监控系统,或是交通系统中的道路监控;CATV的光纤收/发器,渐渐也走进千家万户,这么多的设备更新起来太麻烦了。 那么今天就为大家介绍我们开发的这款远程固件更新应用,为您解决这些问题!   那么如何能够实现‘不离线’,远程更新固件程序呢? 有关在线编程 常见的有两种在线编程技术——ISP和IAP ISP(在系统可编程),即逻辑器件不用脱离系统,就可以进行程序写入。 ISP实现起来相对容易,通常的做法是利用上位机软件通过串口来改写单片机的内部存储器。条件是单片机需要具备非易失性存储器,用来存储由上位机传来的程序和数据。实现ISP的硬件接口支持JTAG、串口、无线等等。该接口通常固化在单片机所在的电路板上,芯片烧写时无需返厂或技术人员亲临现场,用户只需要通过计算机上的RS232接口或者USB接口就可以自行改写程序。 IAP(在应用可编程),即逻辑器件不用脱离应用,就可以进行程序写入。 IAP实现起来相对要复杂一些,单片机内部需要有两个存储区,一块被称为BOOT区,一块被称为APP区。单片机上电后,首先运行在BOOT区,满足改写程序的条件时,则对APP区的程序进行改写操作,程序改写完成后,单片机重新启动;如果不满足改写程序的条件时,程序指针直接跳转到APP区,开始执行存放在APP区的程序。实现IAP的硬件接口支持串口、无线、网口等等。由于网口的原因,一方面工作人员可以不用亲临现场即可实现固件的远程更新,另一方面,可以通过以太网的广播、组播数据包实现多个用户的同时全部更新,节省人力物力资源。   远程固件更新程序应用原理 由于一些类型模块被固化在其他设备当中,因此我们想到开发这款应用程序——Nuri,来实现对该模块固件的远程更新,避免了繁琐复杂的手动连接。只要设备连接到网络,就能够对其进行设置或重置。同时,通过网络的广播和组播,还可实现对多个设备的同时更新,省时省力。 那么以 W5200E01-M3为例,给大家讲解一下在线更新固件的应用原理。 在W5200E01-M3中,通过ISP的方式来烧写BOOT程序。之后由BOOT程序远程更新APP程序时,采用的是IAP方式。 注:W5200E01-M3模块是一款嵌入W5200 (使用全硬件TCP/IP协议)开发板,单片机使用的是STM32F103CB(有128KB的FLASH存储空间),可以将固件程序存储在该存储器中。 上位机通过电缆与下位机相连。下位机进行数据预处理,组成一定的数据格式,通过RS-232串行口,将数据送到上位机,上位机采用串口终端方式接收数据,保证采集数据的实时处理。 那么在远程固件更新的过程中。PC机作为上位机,接收数据,进行固件程序的更新。 操作过程 操作过程就十分容易: (W5200E01-M3中已装载有固件boot.bin) 利用[email protected][email protected]电源适配器通过USB数据线为W5200E01-M3模块供电(或者直接通过USB数据线连接至电脑,为W5200E-M3模块提供稳定的5V电源)。同时,利用网线将该模块连接到以太网中。 然后,打开我们开发的应用程序ConfigTool_Nuri.exe,出现如下界面: 1  主程序界面 点击“Search”图标,进行设备搜索。找到设备后 设备信息即更新到“Device”,“Connection”和“Option”标签下。点开左侧串口转以太网下面的设备MAC地址前面的“加号”,可以查看该硬件设备的固件版本信息,如图所示,当前版本信息为0.1。 2  查看固件版本 接下来进行基本操作:更改设备IP地址和恢复出厂设置。 更改设备IP地址: 修改Device IP address中的内容为192.168.11.101,然后点击“Setting”图标,即完成了硬件设备的IP地址更改操作。设备的IP地址被设置为192.168.11.101。如下图所示 3  设置IP地址 恢复出厂设置: 点击“Factory Reset”图标,实现恢复出厂设置的功能,再点击“Search”图标更新界面信息,发现Device IP address又恢复为192.168.11.100,即完成了恢复出厂设置的操作。 4  恢复出厂设置 点击“Firmware Upload”图标,弹出窗口,要求选择固件。 选定新版本的固件后,确认升级。耐心等待固件升级完成。固件升级完成后会出现提示。 升级完成后,点击“Search”图标,更新显示信息:可以看到固件版本从0.1升级为1.0。 5  更新显示信息 需要注意的内容: 远程更新固件时,主机与设备必须处于同一网段内,否则更新将不被允许。 远程更新固件时,W5200硬件开关必须处于“RUN”运行模式下,而不是“PROM”编程模式,否则更新将不被允许。 感谢您的关注! 应用程序下载:http://pan.baidu.com/share/link?shareid=593485&uk=1930353891   更多信息请关注WIZnet官方微博: http://weibo.com/wiznet2012
Read More

【科研论文】基于ODMA和L-PLC技术的楼宇自动化系统的设计和研究(W7100A)

博客
论文来自:知网 【作者】 王亮; 【导师】 王振朝; 【作者基本信息】 河北大学, 通信与信息系统, 2013, 硕士 【摘要】 机会驱动多址接入(ODMA,Opportunity Driven MultipleAccess)是一种无线自组网技术,通过无线多跳的方式传输数据。由于ODMA技术具有较高的经济性和组网便利性,因此它的应用范围非常广泛。电力线载波通信(PLC, Power Line Communication)是指利用电力线作为传输媒介,使用载波方式传输语音信号和数据的一种通信形式。本文提出一种将ODMA和L-PLC技术应用于楼宇自动化系统的设计方案。本方案综合利用有线(L-PLC)和无线(ODMA)组网技术构建楼宇控制网络,在保证通信可靠性的前提下,大大降低了组网成本。本研究的主要工作与成果如下:1、在楼宇控制网络的基础上,加入网络摄像头及相关上位机软件,实现楼宇视频监控的功能。2、以W7100A芯片为核心设计智能节点,使用单片机编写智能节点的程序,采用VC++编写管理PC机的上位机软件,实现楼宇内远程温度采集的功能。3、通过VC++编写了ODMA接入设备信道匹配程序,不仅大大减少了人工进行信道匹配的工作量,也使得本方案可以在楼宇内搭建多个ODMA子网(各子网之间工作互不干扰),管理PC机可以采用分时机制获取各子网的信息,既保证了信息传输的质量,也提高了信息传输的安全性。本方案对整个系统和相关设备(ODMA设备,L-PLC设备)进行了性能测试。测试结果表明,本系统通信可靠性高,数据传输速率快,组网快速灵活且不需要重新布线,能够满足楼宇自动化系统的要求。   注:关于WIZnet 微处理器W7100A的介绍: W7100A iMCU是一个单片机以太网嵌入式控制芯片,它的的结构是:内嵌8051单片机 + TCP/IP协议栈 + 10/100 高速以太网络MAC/PHY W7100A 增加了一些新功能,如记忆锁定功能(Memory Lock)、休眠模式、最高支持16M字节外部存储空间、特别功能寄存器(SFR)和GPIO上拉/下拉的控制(Pull-Up/Down Control)。另有64QFN封装可供小型嵌入式装置使用. >>更多W7100A信息 关注WIZnet官方微博:http://www.e.weibo.com/wiznet2012
Read More

W5500问题集锦(一)

博客
最近大家对W5500的关注度日渐提高,对于这款WIZnet新推出的以太网芯片,用户在使用中也遇到了很多问题,为了能给大家提供更便捷的技术支持,小编特此整理出一份W5500的问答帖,看看你的问题是不是可以迎刃而解了? 1. W5500不支持自动极性变换,有点失望…… 答: 其实,只要对方支持极性变换就可以实现,现在的设备不支持极性变换的很少的。 你要是碰到个别老设备连不上,再换交叉线也不迟。基本上2000年以后的设备都没问题的啦~ 原帖来自:9MCU 2. W5500+STM32F0无法通信 问题描述1:我现在做毕设,老师推荐买了W5500这款芯片,与STM32F0进行通信。但是根据收集到的资料,修改的例程找不到问题所在。对于网络这部分,本人小白一个,附上程序,希望大家指导一下! 谢谢! 答1:先附上  W5500的例程 问题描述2:如果ping 不通,TCP连接不能建立是代码的问题吗?loopback的程序步骤是怎样的 答2: W5500 若想Ping通的话需要保证以下2点: 1)物理信道通信正常:初步判定Link 灯及状态灯指示正常。 2)配置了W5500的IP,网关,子网掩码,MAC地址这些特殊寄存器 由于W5500内部硬件逻辑电路实现了ARP协议。所以,一旦收到ping包请求的话,会自动回复。以上的设置不过是为了保证基本信道及通讯能够建立的而已。 反向而言,如果Ping不通,也可以先从这两方面着手。 原帖来自:9MCU 3. W5500没指明接收缓冲数据格式,和W5100一样? 问题描述:习惯码字和调试分离,虽然待会调试就知道了,也不妨提出来沟通下。 答:注意SPI帧的不同。 W5100: W5500: 原帖来自:9MCU 4. 关于w5500程序的几个问题 问题描述: 有几个关于w5500程序的问题想请教大家: void Reset_W5500(void) { WIZ_RESET_0; //低电平 Delay_us(50); //这个的时间如果设为500us,貌似指示灯就全暗了?? WIZ_RESET_1; Delay_ms(200); } while(( (getPHYCFGR()) & PHYCFGR_LNK_ON) == PHYCFGR_LNK_OFF); //PHYCFGR_LNK_OFF是0x00,PHYCFGR_LNK_ON是0x01。代码在这里死循环了!绿色的灯常亮,黄色的闪烁。 相关代码:uint8   getPHYCFGR(void) { return WIZCHIP_READ(PHYCFGR); } uint8  WIZCHIP_READ(uint32 AddrSel) { uint8 ret; WIZCHIP_CRIS_enter(); WIZCHIP_CS_select(); AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_); /* //RWB #define _W5500_SPI_READ_            (0x00 << 2) //OM [1:0] #define _W5500_SPI_VDM_OP_          0x00 //BSB [4:0] #define WIZCHIP_CREG_BLOCK          (0x00)         //< Common register block 通用寄存器 #define PHYCFGR                     ((0x002E << 8) + (WIZCHIP_CREG_BLOCK << 3))  //16位地址段+8位控制段 */ WIZCHIP_SPI_write_byte((AddrSel & 0x00FF0000) >>  16); WIZCHIP_SPI_write_byte((AddrSel & 0x0000FF00) >>  8); WIZCHIP_SPI_write_byte((AddrSel…
Read More

WIZnet将参加2013年MDCC首届智能硬件展

博客
WIZnet将参加2013年MDCC(移动开发者大会)中首届智能硬件展。 地点:国家会议中心·北京。时间:11月13日-11月14日(本周三、四)。展位号:S13  MDCC是由CSDN和创新工场联合主办的中国最大的移动开发者会议,致力于推动中国移动互联网生态系统的成长。 大会自2010年开始已连续举办三届, 2012年参会人员超过8000人次。 2013的MDCC除了以上专场讲座之外,新增三大展览和峰会:智能硬件、移动娱乐、微信应用,参会者从移动行业专业人士扩展到科技发烧友、游戏玩家以及传统行业的变革者,预计参会人员超过10000人。     MDCC重磅推出首届智能硬件峰会与首届智能硬件展览,70+国内外顶尖智能硬件公司参展,创国内科技展会之最。主办方近日披露了展商名单、现场互动、硬件促销等展会细节,以飨硬件发烧友。 硬件产品覆盖可穿戴、3D打印、人体工学设备、飞行器、智能电动车、智能盒子、智能家居等类别,大到智慧城市系统、电动汽车、无人机,小到智能手环、智能芯片 其中Dfrobot,Seeedstudio,Microduino,Yeelink,乐高,北京及国内几大创客空间等 都有出席。 智能开源硬件近一年来迅速发展的趋势不可小视, 相信此次首届智能硬件展会是一个与各开源硬件知名厂商交流与沟通的好机会!   WIZnet此次展出的产品:W5500开发板,Arduino相关插板:WizFi 插板,W5200以太网插板,ioShield-K,ioShield-L,ioShield-A。(后三款嵌入W5500) 另会在现场演示使用W5500开发板相关智能应用。
Read More

用Arduino将DS18B20的温度上传至xively.com

博客
这个教程会为你讲解: *连接一个DS18B20温度传感器到Arduino *用单线接口从传感器读取数据 *直接通过Arduino发送数据至xively.com *在网络上查看到 结果图 http://xively.com是一个物联网主机,可以基于你提供的数据来生成图片。 在这个例子中我会去监控我房间里的温度。 第一步:材料清单 * 带以太网插板的Arduino 我有一个Arduino Uno clone 和一个WIZnet W5100 插板 * 电源供给(可以通过一个USB口) 我很幸运因为我的路由器上有USB端口可以提供5V的输出,这意味着无论路由器在哪都可以给Arduino供电。 * DS18B20温度传感器 * RJ45 网线连接Arduino和你的路由器 步骤2:原理图   * Arduino gnd接地端 接DS18B20两个外部引脚 * Arduino 5V 接4.7k 电阻 * 4.7k电阻的另一个引脚接DS18B20中间引脚 * Arduino 数字引脚2 接DS18B20 中间引脚 * RJ45 电缆连接Arduino和路由器 * Arduino电源线(通过USB或电源插头,我用USB接的路由器) 步骤3:预备知识 要求的Arduino的三个库: onewire库来自 http://www.pjrc.com/teensy/td_libs_OneWire.html [wpdm_package template='link-template-default-wdc' id='13685'] httpclient库来自 https://github.com/amcewen/HttpClient [wpdm_package template='link-template-default-wdc' id='13687'] Xively来自https://github.com/xively/xively_arduino [wpdm_package template='link-template-default-wdc' id='13690'] 在你的Arduino/库目录中 安装这些库 一个在http://xively.com上申请的账户(之前的pachebe.com和cosm.com) 在https://xively.com/get_started/上申请一个免费的开发者账户 选择一个用户名,密码,设置你的地址和时区等等。你会收到一个确认邮件,点击激活链接激活你的账户。 你可以选择test drive测试驱动来学习xively或者跳过,这完全取决于你。 正在做测试驱动?我等待一下~ 做完啦?让我们继续 步骤4:在Xively上增加一个新的设备   你现在应该在xively的开发设备页。这是兴趣的开始。 点击+ADD Device 给新设备名称如Arduino DS18B20温度记录器。 填写关于这个设备的描述,他的位置如我的创客空间。我喜欢在这加一个我家的网页链接,尽管在之后的指令里有一个专用的web地址区域。 选择数据是否公开。 你真的想让世界知道你的创客空间有多热嘛?我选择空开除非我做的是个闹钟之类的。 点击页面底部的增加设备按钮。 步骤5:你新设备的xively 界面,以及所有的访问代码   你现在的页面有大量的信息,不要有压力。 这个页面可以分成8个部分: * 产品ID,产品秘密,串口号,激活代码 * 状态(已激活),源ID,源网址URL链接(它会显示图片数据),API端点 * “Add channels to your device!” -- Arduino会在代码中处理它 * 请求日志--这个是为了调试和确认 Arduino端的运行。 * 位置--地理位置传感器(可选) * API keys-- 我们之后再Arduino代码中需要这个 * 元数据--可编辑 * 触发器-- 当一些事情发生时 ping一个网页(例如温度掉到零度以下 ) 步骤6:Arduino代码 <code> #include <SPI.h> #include <Ethernet.h> #include <HttpClient.h> #include <Xively.h> #include <OneWire.h> // MAC address for your Ethernet…
Read More