简易物联网

Home / 博客 / 简易物联网

uC/Probe 是一个PC端程序,Micrium公司设计用来给嵌入式系统做可视的应急援救。uC/Probe可以轻松的监控并控制目标单片机,通过一个“仪表盘”(由视觉对象组成比如表盘,折线图,滑块等),被映射到应用程序变量上。

uC/Probe仪表盘(www.micrium.com)

uC/Probe 可通过多种物理连接与目标单片机通信,比如JTAG调试器、UART、以太网或者Wi-Fi。无论物理连接是什么,协议都一样;uC/Probe只是发送命令到目标,来读写单片机内存位置。

构造一个“仪表盘”屏幕很简单,第一步是要下载目标程序的符号表(比如ELF文件)到uC/Probe“符号浏览器”上,如此的话uC/Probe就获知了每个目标变量的物理内存地址。接下来所需的可视对象可从“工具箱”中被拖拽出来,在仪表盘屏幕上确定位置和大小。可视对象可以进一步配置属性,比如颜色,范围,缩放等等。最后每个在仪表盘上的可视对象被映射到一个特定的目标程序变量,通过把变量从符号浏览器中拖动并将其置于可视对象上。

给仪表盘可视化对象指定一个应用程序变量 (www.micrium.com)

 一旦可视对象被定义并指定符号地址,仪表盘就可通过点击“Run(运行)”来启动。现在uC/Probe循环发送命令到目标来访问被映射的符号(比如读/写单片机内存)并相应的推动仪表盘上可视对象显示。

两用调试器

作为一个援救调试器,uC/Probe超越基于文本显示工具链的典型单片机的限制。例如,用uC/Probe你可以将变量值图形化随着目标程序运行的时间推移。这比沉闷的一步步通过断点和观察变量或者是这破译在屏幕上飞奔的PRINTF数字流容易的多。

除了调试,多亏的以太网连接选项,uC/Probe可以在物联网应用中有双重用途,通过在网上提供简易途径监控和控制一个嵌入式应用。

唯一的警告是使用以太网选项要求: 目标单片机执行一个以太网驱动和UDP服务器来与uC/Probe通信。实际情况是以太网选项是一个用于很多内存和MIPS的大型单片机才是可行的,当同样运行目标应用时支持一个网络堆栈。然而,利用WIZnet以太网智能芯片的优势,uC/Probe使小单片机(比如8-16位)用于物联网应用成为可能。WIZnet内置“硬件协议栈”卸载网络负担并极大程度上减少了应用程序的干扰。让我们演示一下这个概念,通过展示用uC/Probe通过Arduino在网络上的工作是多么简单。

将硬件方式联网

Arduino已经得到了基于WIZnet硬件和软件的很棒的支持。硬件选择包括来自WIZnet的和许多其他供应商的扩展以太网插板(开源设计),WIZnet Wiz820io模块(集成了WIZnet芯片和RJ45 Magjack)和组合Arduino+以太网SBC,例如Seeed Studio 的Seeeduino Ethernet.

Wiznet W5200 以太网插板和Wiz820io模块 (www.shopwiznet.com), Seeed Studio的 Seeeduino Ethernet (www.seeedstudio.com)

更棒的是,大量的久经时间考验的软件,贡献来自Arduino社区,尤其包括一个来自WIZnet以太网芯片的UDP驱动器。

所有这些都需要一些代码加到你的Arduino应用程序上 ,来处理uC/Probe的对话。这不是大问题因为这只关乎读写内存位置。

虚拟化

使用符号表来将视觉对象映射到你的应用程序变量上,这对于调试很有意义。每次程序修改(新的更改) 都改变了内存地址被指定到变量上的时候,它不需要重载uC/Probe符号浏览器。

对于物联网的应用,一个便捷的选择是采用了一个“虚拟”地址计划。从技术上讲,它意味着在一个uC/Probe视觉对象与Arduino应用变量的映像 被应用在运行本身时决定而不是在编译时的编译器决定。

虚拟方法简化了应用程序&仪表盘的开发,由于uC/Probe符号浏览器最初只需要加载一次,并不随着每次程序(符号地址)的变化。应用程序也获得了动态分配的能力,像变量(单片机内存地址)被映射到仪表盘的视觉对象。虚拟的映像计划也可用其他的编程语言(比如BASIC,Forth),并不生成一个用户可访问的或者适当格式的符号表文件。

服务于人

让我们看一下uC/Probe在以太网上与Arduino一起工作是多么统一。

首先打开在Arduino IDE上打开‘uCProbe_Server_Arduino’程序,更改网络参数(MAC地址,IP地址和端口号)来匹配你的局域网设置。

uCProbe4

设置演示MAC地址,IP地址和端口号

编译程序并下载到你的Arduino上,然后打开一个终端窗口来坚持程序运行。当程序开始显示一条‘Waiting for uCProbe packet…’信息时,并循环继续显示滑块变量值时。你可以通过ping 你指定的IP地址来核实以太网的连接。

接下来前往 www.micrium.com 去下载并安装uC/Probe的评估版本,运行它然后File->Open ‘Arduino_uCProbe_Demo.wspx’.这个.wspx(工作区)文件定义了一个带有可视对象变量的仪表盘,包括一个表盘和滑块,以及有图形,按钮,数字字段等等。

你可以点击对象去检查并修改他们的内容。同时,点击‘Symbol Browser’去看下‘ArduinoMap.out’虚拟地址的符号表。在这个演示中是个Arduino应用变量(每个类型byte,word或者long)可被映射到仪表盘变量VAR01_type 到VAR10_type之间(type = 08u, 16u or 32s)。

 uCProbe5

虚拟地址变量被定义在 ArduinoMap.out 符号文件中

为了完成设置点击uC/Probe“Settings”图标并键入你指定给Arduino的TCP/IP网络参数(IP地址和端口号)

uCProbe6

设置‘Remote Host’和‘Remote Port’来匹配你的Arduino设置

现在点击uC/Probe ‘Run’图标,关闭评估版本警告,仪表盘开始监控Arduino应用变量。扭动不用的仪表盘按钮盒滑块(都映射到单个变量)Arduino会在终端上显示活动。也要注意面板灯和交通灯图像是怎样激活并基于他们所相关的变量值来改变颜色的。

 uCProbe7

演示应用仪表盘工作中

盖子的下面

让我们仔细看一下Arduino应用时怎样连接uC/Probe的。在这个例子中,应用归结为…

uCProbe8

演示应用

在Arduino应用中,一个“虚拟地址”表在uC/Probe ArduinoMap.out符号文件中映射应用变量(滑块或者表盘)到变量,反过来在仪表盘屏幕上链接可视化对象。

uCProbe9

映射应用变量到在ArduinoMap.out 符号表中被定义的uC/Probe变量。

虚拟到物理的映射被定位。在虚拟地址表(va[0])中第一个条目与ArduinoMap.out (比如VAR01_08u, VAR01_16u o或者VAR01_32s)中第一个变量(组)一致。记得uC/Probe和应用链接是通过Arduino内存参考。在应用虚拟地址表中的条目定义了内存地址当ArduinoMap.out变量类型,指定到一个仪表盘可视化对象定义被转换的字节数(分别是1,2或者4)。

玩起来

你可以用这个演示作为你自己的uC/Probe连接Arduino应用的模板。这有些裁代码用于你自己要求的 办法。

为了看清楚幕后工作室怎样的,你可以取消代码注释并在Arduino和uC/Probe之间显示UDP 传输 。

uCProbe10

uC/Probe 请求和应答包交换

你可以看到uC/Probe请求读0×0004字节从地址0×00000044开始,是应用“表盘”变量的虚拟地址。Arduino应答0x000002A7,是679的十进制。

注意使包显示显著的减少了服务器的吞吐量。一旦你做实验,为了加快速度你可以注释掉包显示代码。这也减少了代码大小,仅有8,248字节,还有32KB变量的四分十一多一点。

一个基本的设计考虑是Arduino应用和uC/Probe活动间的时序关系。在这个演示中应用继续运行并处理uC/Probe请求。这是应用程序做任何重要局部处理的正确方法。

然而,如果应用程序的主要任务仅仅是在uC/Probe仪表盘上显示一些东西,然后应用程序代码可以在uC/Probe服务中被移动,它就只能在uC/Probe做应答的时候执行。试着用这个演示服务器并注意表盘怎样更缓慢流畅的移动。那是因为现在应用程序只是在运行,当uC/Probe做应答时而不是基于在uC/Probe应答间加和。

当uC/Probe只用于它的传统任务,作为一个调试器,尽可能快(接近实时)地跟踪目标活动。但是简单的带有更多空闲时间的物联网应用可以减少日常开支(在Arduino,PC和网络上)通过减少在uC/Probe 设置中“数据搜集”速率。

 uCProbe11

 ‘Data Collection’速率可被减少去极大减少处理和网络的入场开支。

服务器有“多用户”功能,例如多电脑运行uC/Probe可以访问单个Arduino。一个软件协议栈毫无疑问努力服务从多个uC/Probe客户端来的同步请求。但是WIZnet硬件协议栈和片上RAM缓冲让Arduino去处理多个连接

电脑也可以运行多个 访问任意混合的Arduinou的C/Probe的实例。多个仪表盘可以访问一个Arduino或者每个仪表盘可以连接到一个不同的Arduino。

 uCProbe12

两个不同的仪表盘访问一个Arduino

从局域网到广域网的扩展操作,与在uC/Probe TCP/IP设置中更改IP地址一样简单。例如,你可以在家访问一个Arduino通过你办公室电脑的uC/Probe仪表盘,通过你家里的路由器端口转发到Arduino上。

意料之中的是于局域网相比,对于WAN吞吐量的减少取决于UDP包的传输时间。在WIZnet的协助下,我在加利福尼亚的PC机上运行uC/Probe的测试可以和韩国的Arduino对话。夸WAN的吞吐量明显下降,在仪表盘屏幕上更新几赫兹(替代了LAN的几十赫兹),但是几赫兹对于简单的“表盘和开关”物联网应用已经是足够快了。

    并不是处于关心一个“可信的局域网”,由于uC/Probe没有加密或者其他复杂的安全措施,扩展uC/Probe操作到WAN确实提出安全问题。Arduino服务器确实检查了基本包的有效性,所以它会悄悄忽略UDP的探针,不正确的形成了uC/Probe的骑牛。这有一些其他方法,应用程序可以提供附加的安全。

当前服务器应答来自任何IP地址的uC/Probe请求。你的第一个插件可能会考虑是检查的IP地址传入请求,只作用于那些从授权的IP地址而给未知来源的沉默对待。

由于应用程序只是监控一个远程的系统状态,你可以很同意地修改服务器编程“只读”(仅仅注释掉写命令处理命令),所以没有黑客能黑Arduino的内存。是的,一个窃听者仍然可以看到Arduino给读命令的应答,但除非他们也有一份你的仪表盘数据。不然这毫无意义。

另一个想法是,在应用程序中使用仪表盘控制键盘的应用,来实现一个密码功能。这个应用程序会确认一个正确的密码(使用回滚代码去对抗record&playback的攻击)在允许访问之前。

DIoTY

uC/Probe使网络中的物联网数据 快速且容易可视化,无论是局域网还是更广。有一个很大的有用的工具箱拖放可视化对象去选择,仅仅花费几分钟的时间去精巧的制作一个很棒的仪表盘显示。

在另一端的导线,WIZnet“卸载”技术是一种高性能的解决方案,适用于任何单片机,尤其是小的像Arduino。这个WIZnet内置硬件协议栈协议和Ram缓存将程序从开销和侵入性网络活动隔离。

下载代码

感谢阅读!

更多信息与我们交流:

WIZnet邮箱:[email protected]

WIZnet主页:http://www.wiznet.co.kr

WIZnet企业主页:http://e.weibo.com/wiznet2012