一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

使用Java中的代理参考设计将1线范围扩展到接近无穷大的极限

来源:analog 发布时间:2023-12-04

摘要: 本文档将介绍一种方法,使用Java中的代理参考设计将1线范围扩展到接近无穷大的极限。

本文将介绍一种使用代理将1线范围扩展到接近无穷大极限的方法。描述基本代理的最佳方式是想象大多数公司中的代理服务器(有时称为公司防火墙)。在这种设置中,只有一台计算机(代理)具有到Internet的实际连接,其余的用户计算机只能访问代理。LAN上所有打算发给LAN外计算机的网络数据包在WAN上重复,反之亦然。这个想法也适用于1-Wire网络。通过代理连接到1-Wire网络需要两个软件模块:客户端模块和主机模块。主机模块是在1-Wire代理服务器(PC, MxTNI 或微控制器)上运行的代码,该服务器具有对1-Wire网络的硬件访问。客户端模块是在远程机器上运行的代码,这些机器只能通过网络访问主机模块。主机模块可能没有对1-Wire网络的硬件访问权限,而是可以访问客户机模块,客户机模块将引用另一个主机模块。通过这种方式,可以将连接到1-Wire网络的代理连接在一起。

介绍

1线协议的最初设计源于在短连接上与附近设备通信的愿望。尽管经过仔细考虑,有可能将这种连接的长度延长到比最初预期的更远,但限制仍然是非常现实的。有关限制,最坏情况考虑和可能解决方案的更多信息,请参阅应用说明148,“可靠长线1线 网络指南”和应用说明159,“实现稳健1线 通信的软件方法”按钮 应用程序。”
本文将介绍一种使用代理将1线范围扩展到接近无穷大极限的方法。描述基本代理的最佳方式是想象大多数公司中的代理服务器(有时称为公司防火墙)。一般来说,公司为员工提供局域网(LAN),用于连接彼此的计算机和共享文件。公司通常有必要提供一种访问Internet(非常广域网)的方法。在这种设置中,只有一台计算机(代理)具有到Internet的实际连接,其余机器只能访问代理。代理代表局域网上的所有计算机发出对因特网数据的所有请求。在本例中,代理充当WAN和LAN之间的接口。LAN上所有打算发给LAN外计算机的网络数据包都在WAN上“重复”,反之亦然。

图1所示 代理服务器示例
图1说明代理服务器提供的基本服务,即访问内部计算机通常无法访问的网络。更具体地说,内部计算机可以通过LAN到达代理,如果没有代理的帮助,就没有其他方法到达WAN。通过代理服务器路由信息请求,现在可以访问以前无法访问的外部服务器。尽管有很多细节变化,但同样的基本思想可以应用于1线网络。图2说明此应用程序的基础。

图2 1线代理示例
图2中的应用程序表示任何想要访问1-Wire Network,但(无论出于何种原因)不能直接访问它的应用程序。原因可能是它们离网络太远,或者它们在不允许硬件访问的环境中运行(例如,在Java驱动的移动电话上运行Java 应用程序)。由于电气限制,使用1-Wire网络的应用程序通常运行在距离1-Wire从设备不到200米的硬件上。在图2所示的场景中,应用程序所需要的只是访问网络介质和合适的1线代理服务器。网络媒介可以是任何东西,例如RF无线网络、IR点对点链路或TCP/IP以太网络。由于被称为Internet的巨大的广域网,外部计算机和实际的1线网络之间的距离不再是一个问题。

概述

通过代理连接到1-Wire网络需要两个模块:客户机模块和主机模块。主机模块是在1线代理服务器(PC, MxTNI或微控制器)上运行的代码,该服务器具有对1线网络的硬件访问。客户端模块是在远程机器上运行的代码,这些机器只能通过网络访问主机模块。主机模块可能没有对1线网络的硬件访问权限,而是可以访问客户机模块,客户机模块将引用另一个主机模块。通过这种方式,可以将连接到1线网络的代理连接在一起。图3说明了1-Wire应用程序、客户机模块、主机模块和1-Wire网络之间的交互性。

图3 客户端/主机配置
PC通常在1线网络上通信的方式是通过使用适配器,通常使用合适的1线主机来产生正确的时序。例如,DS9097U适配器使用DS2480B串行1线驱动芯片。PC机已通过串口与DS9097U相连。通过串行端口发送的命令到达DS2480B,然后被转换成1线网络命令。DS2480B通过PC的串口返回任何1线网络命令的输出。然而,当通过1线代理与1线网络通信时,PC将转而调用客户端模块向主机模块发送命令。这些命令将通过网络媒介(例如因特网)传送到主机模块。然后,主机模块将通过1线主机与物理1线网络进行通信。1-Wire通信的结果将在缓冲区中通过网络介质返回给客户端模块。

实现

重复发生的软件应用层可以是许多地方中的任何一个。1-Wire应用程序本质上由以下几层组成:
  • 应用程序维护有关如何使用1线数据的知识(即,如何将1线通信块转换为以华氏度为单位的温度结果)。

  • 表示—维护有关不同数据格式的知识,并将其封装到可能有用的API中。

  • 传输—维护如何在单线网络之间传输数据块的知识。

  • 链路维护如何重置1-Wire网络和传输1或0的知识。

在链路层安装代理需要通过网络传输串行或并行端口命令。例如,如果在一个串行端口上有一个带有DS9097U适配器的主机,那么客户机模块将直接向DS2480B主控芯片发送命令。的串口转以太网示例按钮网站(见链接节)准确地说明了这一原则。这个例子允许PC有一个虚拟COM端口。发送到这个虚拟COM端口的所有命令都通过网络传输到另一个设备(PC或MxTNI)。如果主机设备的串行端口上有DS9097U,则客户端可以将DS9097U视为直接连接。
在传输层安装代理的想法由IEEE 1451.4协议规范处理。在这一层,客户机模块将不关心用于连接到1线网络的实际硬件,而是理所当然地将链路层视为主机处理的东西。客户端将主要向主机发送重置命令和数据块。
最高的层,也可能是最有效的,是表示层。这种类型的代理包含在Java Kit的1-Wire API中。在Java的1-Wire API中,每个适合1-Wire连接的适配器都由DSPortAdapter的一个子类表示。在面向对象语言中,这意味着各种适配器(串行、并行或USB)的所有实例都可以被视为它们的父类DSPortAdapter的实例。这是一种从表示中隐藏实现的情况,面向对象程序员应该非常熟悉这种情况。由于在1-Wire API中选择了这种设计,所以很容易添加DSPortAdapter的新子类,该子类仅实现上面讨论的客户机模块。的类图中描述了该客户端模块及其与主机模块的关系图4

图4 类交互图
使用1线代理的最大问题是数据包延迟。如果网络介质的数据包周转时间为1秒,那么大多数实时应用程序根本不可能实现。理想情况下,网络数据包延迟(有时称为PING时间)应该小于PC连接外部硬件时产生的延迟。例如,如果向串行端口发送和从串行端口读取的任何数据的数据包周转时间为20ms,那么5ms的网络数据包延迟几乎不会被注意到。如果网络数据包延迟明显更高,则可能需要更高层的实现来提高应用程序的实时响应能力。为了说明这一点,下面是一个链路层代理的数据包交换示例:
客户端模块发送串行写命令复位DS2480B数据包= {XMIT_SERIAL, DS2480B_COMMAND_MODE, DS2480B_CMD_RESET}服务器模块向串口写入字节。客户端模块发送一个串行读取命令,其中包含要读取的字节数包= {RECV_SERIAL, NUM_BYTES_TO_RECV}服务器模块发送从串口读取的字节,表示复位命令的返回值包= {NUM_BYTES_TO_RECV,无论多少字节…}客户端模块解释返回值
对于每个发送的数据包,为数据包延迟增加一个乘数。如果以这种方式连续多次调用DS9097U,很明显,它会很快增加大量的网络流量。在表示层,完全相同的1-Wire活动可以复制如下:
客户端模块发送复位命令包= {ADAPTER _CMD_RESET}服务器模块将复位命令发送到串口。然后从串口读取回字节,并解释reset命令的返回值。服务器模块发送返回值包= {RET_SUCCESS}
将1线代理实现移到应用层可以显著减少数据包延迟问题。但是由于这一层的实现是高度不可移植的(也就是说,应用程序层的实现本质上是与特定的应用程序绑定在一起的),所以目前没有可用的参考实现。为了便于说明,让我们来研究一个特定应用程序的区别:温度轮询。为温度转换而进行的可能的网络数据包交换将在链路层和表示层生成大量数据包。有必要传输“1-Wire Reset”命令,“Match ROM”命令和“Do Temperature Convert”命令。客户端模块将负责解释从主机模块接收到的网络数据包形式的每个命令的返回值。如果在应用层实现1线代理,则只需要客户端模块传输“执行完全温度转换”命令。在单个数据包中,服务器返回的值可能只是温度转换的结果。

软件接口示例

使用Java Kit的1-Wire API中的客户机模块非常简单,只需创建NetAdapter的实例并将连接字符串传递给初始化方法即可。连接字符串的格式为:
& lt; hostname&gt: & lt; port&gt: & lt;共享secret>
主机名是运行主机模块的PC(或MxTNI)的主机名,或者是该计算机的IP地址。端口是主机正在侦听的TCP/IP端口。共享密钥用于一种简单的身份验证形式。当客户端模块连接到主机模块时,主机向客户端发出随机质询。然后客户端找到随机质询字节的CRC-16和共享密钥。然后将CRC-16发送回主机进行验证。如果CRC-16匹配主机计算的结果,则认为用户已通过身份验证。请注意,在NetAdapter中有一个额外的初始化方法,它允许通过接受一个已经建立的TCP/IP套接字(可能是一个加密的连接)来进一步保护连接。
在Java Kit的1-Wire API中,有一个示例程序可以方便地使用主机模块。该应用程序将主机模块的所有参数作为命令行参数,并使用这些参数创建NetAdapterHost实例。桌面和MxTNI都包含了预构建的二进制文件。图5说明使用COM1串口上的DS9097U适配器启动桌面主机模块的命令行。当前工作目录是Java Kit的1-Wire API中StartNetAdapterHost的应用程序文件夹。
Java -cp ".;<路径到onewireapi.jar>"StartNetAdapterHost -adapterName DS9097U -adapterPort COM1 -listenPort 6161 -secret“这是我的秘密”
图5 在PC机上启动主机模块
在PC上执行图5所示的行将启动NetAdapterHost,它将在端口6161上创建一个侦听TCP/IP套接字。用于简单身份验证的共享秘密是“这是我的秘密”。在MxTNI上启动主机模块几乎是相同的。只需ftp StartNetAdapterHost。ini文件到MxTNI机器。然后登录并使用命令行图6
java StartNetAdapterHost。tini -adapterName - TINIExternalAdapter -adapterPort serial1 -listenPort 6161 -secret“这是我的秘密”
图6 启动MxTNI上的主机模块
一旦主机模块启动,将接受来自客户端模块的传入连接。Figure8显示了一个远程温度演示,演示了如何连接到主机并与1-Wire设备交互。此应用程序将连接到指定的主机并查找任何温度设备。然后,它轮询每个设备,并以摄氏度和华氏度显示当前温度。使用示例应用程序,只需将代码复制并粘贴到一个名为remotetemperaturedemo .java的文件中,更改类顶部的常量以反映实际设置(即,确保hostnamevvariable具有启动NetAdapterHost的计算机的主机名)。然后执行中显示的命令图7编译并执行这个类。
Javac -classpath ".;<路径到onewireapi.jar>"RemoteTemperatureDemo。Javajava -classpath ".;<路径到onewireapi.jar>"RemoteTemperatureDemo
图7 编译和运行远程温度演示
该程序的输出应该是找到的每个温度设备的64位1线地址,后跟当前温度。如果没有找到设备,将显示一条错误消息。
有关使用NetAdapter和NetAdapterHost的更多信息,请参阅这些类的javadoc。所有1-Wire类的javadoc都包含在Java Kit的1-Wire API中。
导入java.util.Enumeration;公共类RemoteTemperatureDemo{//更新这些变量以反映您的设置公共静态最终字符串hostname = "shughes.dalsemi.com";Public static final int port = 6161;public static final String secret = "这是我的秘密";public static void main (String[] args) {OneWireContainer owc = null;温度容器tc = null;//创建NetAdapter对象NetAdapter adapter = new NetAdapter 尝试{//连接到NetAdapterHost适配器。selectPort(hostname + ":" + port + ":" + secret);adapter.beginExclusive(真正的);//查找第一个温度设备枚举e = adapter.getAllDeviceContainers ;While (tc==null &&)e.hasMoreElements ){//获取下一个容器owc = (OneWireContainer)e.nextElement ;//检查是否为温度设备if(owc instanceof TemperatureContainer) {tc = (TemperatureContainer)owc;system . out。println("Device: " + owc.getAddressAsString );//轮询温度设备byte[] state = tc.readDevice ;tc.doTemperatureConvert(状态);double temp = tc.getTemperature(state);//显示温度结果print(" " + temp + " C (");System.out.println(Convert.toFahrenheit(temp) + " F ");}} //如果没有找到温度设备if(tc==null) System.out。println("没有找到温度器件!");} catch (Exception e) {System.out.println(e.getMessage );} finally {adapter.endExclusive ;try {adapter.freePort ;} catch(异常e) {;}}}}
图8 远程温度演示

参考文献

  1. 通用的微控制器

  2. 应用笔记704,“异步串行到以太网设备服务器”

  3. 1-Wire Java API

  4. IEEE 1451.4透明协议(PDF, 147kB)

声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: