当前位置:文档之家› Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触

Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触

Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触

Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触

我写的.Net Remoting系列专题:

Microsoft .Net Rem oting系列专题之一:.Net Remoting基础篇

Microsoft .Net Rem oting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务前言:在Remoting中处理事件其实并不复杂,但其中有些技巧需要你去挖掘出来。正是这些技巧,仿佛森严的壁垒,让许多人望而生畏,或者是不知所谓,最后放弃了事件在Remoting 的使用。关于这个主题,在网上也有很多讨论,相关的技术文章也不少,遗憾的是,很多文章概述的都不太全面。我在研究Remoting的时候,也对事件处理发生了兴趣。经过参考相关的书籍、文档,并经过反复的试验,深信自己能够把这个问题阐述清楚了。

本文对于Remoting和事件的基础知识不再介绍,有兴趣的可以看我的系列文章,或查阅相关的技术文档。

本文示例代码下载:

Remoting事件(客户端发传真)

Remoting事件(服务端广播)

Remoting事件(服务端广播改进)

应用Remoting技术的分布式处理程序,通常包括三部分:远程对象、服务端、客户端。因此从事件的方向上看,就应该有三种形式:

1、服务端订阅客户端事件

2、客户端订阅服务端事件

3、客户端订阅客户端事件

服务端订阅客户端事件,即由客户端发送消息,服务端捕捉该消息,然后响应该事件,相当于下级向上级发传真。反过来,客户端订阅服务端事件,则是由服务端发送消息,此时,所有客户端均捕获该消息,激发事件,相当于是一个系统广播。而客户端订阅客户端事件呢?就类似于聊天了。由某个客户端发出消息,其他客户端捕获该消息,激发事件。可惜的是,我并没有找到私聊的解决办法。当客户端发出消息后,只要订阅了该事件的,都会获得该信息。

然而不管是哪一种方式,究其实质,真正包含事件的还是远程对象。原理很简单,我们想一想,在Remoting中,客户端和服务端传递的内容是什么呢?毋庸置疑,是远程对象。因此,我们

传递的事件消息,自然是被远程对象所包裹。这就像EMS快递,远程对象是运送信件的汽车,而事件消息就是汽车所装载的信件。至于事件传递的方向,只是发送者和订阅者的角色发生了改变而已。

一、服务端订阅客户端事件

服务端订阅客户端事件,相对比较简单。我们就以发传真为例。首先,我们必须具备传真机和要传真的文件,这就好比我们的远程对象。而且这个传真机上必须具备“发送”的操作按钮。这就好比是远程对象中的一个委托。当客户发送传真时,就需要在客户端上激活一个发送消息的方法,这就好比我们按了“发送”按钮。消息发送到服务端后,触发事件,这个事件正是服务端订阅的。服务端获得该事件消息后,再处理相关业务。这就好比接收传真的人员,当传真收到后,会听到接通的声音,此时选择“接收”后,该消息就被捕获了。

现在,我们就来模拟这个流程。首先定义远程对象,这个对象处理的应该是一个发送传真的业务:首先是远程对象的公共接口(Common.dll):

public delegate void FaxEventHandler(string fax);

public interface IFaxBusiness

{

void SendFax(string fax);

}

注意,在公共接口程序集中,定义了一个公共委托。

然后我们定义具体处理传真业务的远程对象类(FaxBusiness.dll),在这个类中,先要添加对公共接口程序集的引用:

public class FaxBusiness:MarshalByRefObject,IFaxBusiness

{

public static event FaxEventHandler FaxSendedEvent;

#region

public void SendFax(string fax)

{

if (FaxSendedEvent != null)

{

FaxSendedEvent(fax);

}

#endregion

public override object InitializeLifetimeService()

{

return null;

}

}

这个远程对象中,事件的类型就是我们在公共程序集Common.dll中定义的委托类型。SendFax实现了接口IFaxBusiness中的方法。这个方法的签名和定义的委托一致,它调用了事件FaxSendedEvent。

特殊的地方是我们定义的远程对象最好是重写MarshalByRefObject类的

InitializeLifetim eService()方法。返回null值表明这个远程对象的生命周期为无限大。为什么要重写该方法呢?道理不言自明,如果生命周期不进行限制的话,一旦远程对象的生命周期结束,事件就无法激活了。

接下来就是分别实现客户端和服务端了。服务端是一个Windows应用程序,界面如下:

我们在加载窗体的时候,注册通道和远程对象:

private void ServerForm_Load(object sender, System.EventArgs e)

HttpChannel channel = new HttpChannel(8080);

ChannelServices.RegisterChannel(channel);

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(FaxBusiness),"FaxBusiness.soap",WellKnownObjectMode.Singleton);

FaxBusiness.FaxSendedEvent += new FaxEventHandler(OnFaxSended);

}

我们采用的是SingleTon模式,注册了一个远程对象。注意看,这段代码和一般的Remoting 服务端有什么区别?对了,它多了一行注册事件的代码:

FaxBusiness.FaxSendedEvent += new FaxEventHandler(OnFaxSended);

这行代码,就好比我们服务端的传真机,一直切换为“自动”模式。它会一直监听着来自客户端的传真信息,一旦传真信息从客户端发过来了,则响应事件方法,即OnFaxSended方法:public void OnFaxSended(string fax)

{

txtFax.Text += fax;

txtFax.Text += System.Environment.NewLine;

}

这个方法很简单,就是把客户端发过来的Fax显示到txtFax文本框控件上。

而客户端呢?仍然是一个Windows应用程序。代码非常简单,首先为了简便其见,我们仍然让它在装载窗体的时候,激活远程对象:

private void ClientForm_Load(object sender, System.EventArgs e)

{

HttpChannel channel = new HttpChannel(0);

ChannelServices.RegisterChannel(channel);

faxBus = (IFaxBusiness)Activator.GetObject(typeof(IFaxBusiness),

"http://localhost:8080/FaxBusiness.soap");

}

呵呵,可以说客户端激活对象的方法和普通的Remoting客户端应用程序没有什么不同。该写传真了!我们在窗体上放一个文本框对象,改其Multiline属性为true。再放一个按钮,负责发

送传真:

private void btnSend_Click(object sender, System.EventArgs e)

{

if (txtFax.Text != String.Empty)

{

string fax = "来自" + GetIpAddress() + "客户端的传真:"

+ System.Environment.NewLine;

fax += txtFax.Text;

faxBus.SendFax(fax);

}

else

{

MessageBox.Show("请输入传真内容!");

}

}

private string GetIpAddress()

{

IPHostEntry ipHE = Dns.GetHostByName(Dns.GetHost Name());

return ipHE.AddressList[0].ToString();

}

在这个按钮单击事件中,只需要调用远程对象faxBus的SendFax()方法就OK了,非常简单。可是慢着,为什么你的代码有这么多行啊?其实,没有什么奇怪的,我只是想到发传真的客户可能会很多。为了避免服务端人员犯糊涂,搞不清楚是谁发的,所以要求在传真上加上各自的签名,也就是客户端的IP地址了。既然要获得计算机的IP地址,请一定要记得加上对DNS的命名空间引用:

using https://www.doczj.com/doc/d011403712.html,;

因为我们严格按照分布式处理程序的部署方式,所以在客户端只需要添加公共程序集(Common.dll)的引用就可以了。而在服务端呢,则必须添加公共程序集和远程对象程序集两者的引用。

OK,程序完成,我们来看看这个简陋的传真机:

客户端:

嘿嘿,做梦都想放假啊。好的,传真写好了,发送吧!再看看服务端,great,老板已经收到我的请假条传真了!

二、客户端订阅服务端事件

嘿嘿,吃甘蔗要先吃甜的一段,做事情我也喜欢先做容易的。现在,好日子过去了,该吃点苦头了。我们先回忆一下刚才的实现方法,再来思考怎么实现客户端订阅服务端事件?

在前一节,事件被放到远程对象中,客户端激活对象后,就可以发送消息了。而在服务端,只需要订阅该事件就可以。现在思路应该反过来,由客户端订阅事件,服务端发送消息。就这么简单吗?先不要高兴得太早。我们想一想,发送消息的任务是谁来完成的?是远程对象。而远程对象是什么时候创建的呢?我们仔细思考Remoting的几种激活方式,不管是服务端激活,还是客户端激活,他们的工作原理都是:客户端决定了服务器创建远程对象实例的时机,例如调用了远程对象的方法。而服务端所作的工作则是注册该远程对象。

回忆这三种激活方式在服务端的代码:

SingleCall激活方式:

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(BroadCastObj),"BroadCastMessage.soap",

WellKnownObjectMode.Singlecall);

SingleTon激活方式:

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(BroadCastObj),"BroadCastMessage.soap",

WellKnownObjectMode.Singleton);

客户端激活方式:

RemotingConfiguration.ApplicationName = “BroadCastMessage.soap”RemotingConfiguration.RegisterActivatedServiceType(typeof(BroadCastObj));

请注意Register这个词语,它表达的含义就是注册。也就是说,在服务端并没有显示的创建远程对象实例。没有该实例,又如何广播消息呢?

或许有人会想,在注册远程对象之后,显式实例该对象不就可以了吗?也就是说,在注册后加上这一段代码:

BroadCastObj obj = new BroadCastObj();

然而,我们要明白一个事实:就是服务端和客户端是处于两个不同的应用程序域中。因此在Remoting中,客户端获得的远程对象实际是服务端注册对象的代理。如果我们在注册后,人工去创建一个实例,而非Remoting在激活后自动创建的对象,那么客户端获得的对象与服务端人工创建的实例是两个迥然不同的对象。客户端获得的代理对象并没有指向你刚才创建的obj 实例。所以obj发送的消息,客户端根本无法捕捉。

那么,我们只有望洋兴叹,束手无策了吗?别着急,别忘了在服务器注册对象方法中,还有一种方法,即Marshal方法啊。还记得Marshal的实现方式吗?

BroadCastObj Obj = new BroadCastObj();

ObjRef objRef = RemotingServices.Marshal(Obj,"BroadCastMessage.soap");

这个方法与前不一样。前面的三种方式,远程对象是根据客户端调用的方式,来自动创建的。而Marshal方法呢?则显式地创建了远程对象实例,然后将其Marshal到通道中,形成ObjRef 指向对象的代理。只要生命周期没有结束,这个对象就一直存在。而此时客户端获得的对象,正是创建的Obj实例的代理。

OK,这个问题解决了,我们来看看具体实现。

公共程序集和远程对象与前相似,就不再赘述,只附上代码:

公共程序集:

public delegate void BroadCastEvent Handler(string info);

public interface IBroadCast

{

event BroadCastEvent Handler BroadCastEvent;

void BroadCastingInfo(string info);

}

远程对象类:

public event BroadCastEventHandler BroadCastEvent;

#region IBroadCast 成员

//[OneWay]

public void BroadCastingInfo(string info)

{

if (BroadCastEvent != null)

{

BroadCastEvent(info);

}

}

#endregion

public override object InitializeLifetim eService()

{

return null;

}

下面,该实现服务端了。在实现之前,我还想罗嗦几句。在第一节中,我们实现了服务端订阅客户端事件。由于订阅事件是在服务端发生的,因此事件本身并未被传送。被序列化的仅仅是传递的消息,即Fax而已。现在,方向发生了改变,传送消息的是服务端,客户端订阅了事件。但这个事件是放在远程对象中的,因此事件必须被序列化。而在.Net Fram ework1.1中,微软对序列化的安全级别进行了限制。有关委托和事件的序列化、反序列化默认是禁止的,所以我们应该将TypeFilterLevel的属性值设置为Full枚举值。因此在服务端注册通道的方式就发生了改变:

private void StartServer()

{

BinaryServerFormatterSinkProvider serverProvider = new

BinaryServerFormatterSinkProvider();

BinaryClientForm atterSinkProvider clientProvider = new

BinaryClientFormatterSinkProvider();

serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();

props["port"] = 8080;

HttpChannel channel = new HttpChannel(props,clientProvider,serverProvider); ChannelServices.RegisterChannel(channel);

Obj = new BroadCastObj();

ObjRef objRef = RemotingServices.Marshal(Obj,"BroadCastMessage.soap");

}

注意语句serverProvider.TypeFilterLevel = TypeFilterLevel.Full;此语句即设置序列化安全级别的。要使用TypeFilterLevel属性,必须申明命名空间:

using System.Runtim e.Serialization.Formatters;

而后面两条语句就是注册远程对象。由于在我的广播程序中,发送广播消息是放在另一个窗口中,因此我将该远程对象声明为公共静态对象:

public static BroadCastObj Obj = null;

然后在调用窗口事件中加入:

private void ServerForm_Load(object sender, System.EventArgs e)

{

StartServer();

lbMonitor.Item s.Add("Server started!");

}

来看看界面,首先启动服务端主窗口:

我放了一个ListBox控件来显示一些信息,例如显示服务器启动了。而BroadCast按钮就是广播消息的,单击该按钮,会弹出一个对话框:

BraodCast按钮的代码:

private void btnBC_Click(object sender, System.EventArgs e)

{

BroadCastForm bcForm = new BroadCastForm();

bcForm.StartPosition = FormStartPosition.CenterParent;

bcForm.ShowDialog();

}

在对话框中,最主要的就是Send按钮:

if (txtInfo.Text != string.Empty)

{

ServerForm.Obj.BroadCastingInfo(txtInfo.Text);

}

else

{

MessageBox.Show("请输入信息!");

}

但是很简单,就是调用远程对象的发送消息方法而已。

现在该实现客户端了。我们可以参照前面的例子,只是把服务端改为客户端而已。另外考虑到序列化安全级别的问题,所以代码会是这样:

private void ClientForm_Load(object sender, System.EventArgs e)

{

BinaryServerFormatterSinkProvider serverProvider = new

BinaryServerFormatterSinkProvider();

BinaryClientForm atterSinkProvider clientProvider = new

BinaryClientFormatterSinkProvider();

serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();

props["port"] = 0;

HttpChannel channel = new HttpChannel(props,clientProvider,serverProvider);

ChannelServices.RegisterChannel(channel);

watch = (IBroadCast)Activator.GetObject(

typeof(IBroadCast),"http://localhost:8080/BroadCastMessage.soap");

watch.BroadCastEvent += new BroadCastEventHandler(BroadCastingMessage); }

注意客户端通道的端口号应设置为0,这表示客户端自动选择可用的端口号。如果要设置为指定的端口号,则必须保证与服务端通道的端口号不相同。

然后是,BroadCastEventHandler委托的方法:

public void BroadCastingMessage(string m essage)

{

txtMessage.Text += "I got it:" + message;

txtMessage.Text += System.Environment.NewLine;

}

客户端界面如图:

好,下面让我们满怀期盼,来运行这段程序。首先启动服务端应用程序,然后启动客户端。哎呀,糟糕,居然出现了错误信息!

“人之不如意事,十常居八九。”不用沮丧,让我们分析原因。首先看看错误信息,它报告我们没有找到Client程序集。然而事实上,Client程序集当然是有的。那么再来调试一下,是哪一步出现的问题呢?设置好断点,进行逐语句跟踪。前面注册通道一切正常,当运行到

watch.BroadCastEvent += new BroadCastEventHandler(BroadCastingMessage)语句时,错误出现了!

也就是说,远程对象的创建是成功的,但在订阅事件的时候失败了。原因是什么呢?原来,客户端的委托是通过序列化后获得的,在订阅事件的时候,委托试图装载包含与签名相同的方法的程序集,也就是BroadCastingMessage方法所在的程序集Client。然而这个装载的过程发生在服务端,而在服务端,并没有Client程序集存在,自然就发生了上面的异常。

原因清楚了,怎么解决?首先BroadCastingMessage方法肯定是在客户端中,所以不可避免,委托装载Client程序集的过程也必须在客户端完成。而服务端事件又是由远程对象来捕获的,因此,在客户端注册的也就必须是远程对象事件了。一个要求必须在客户端,一个又要求必须在服务端,事情出现了自相矛盾的地方。

那么,让我们先想想这样一个例子。假设我们要交换x和y的值,该这样完成?很简单,引入一个中间变量就可以了。

int x=1,y=2,z;

z = x;

x = y;

y = z;

这个游戏相信大家都会玩吧,那么好的,我们也需要引入这样一个“中间”对象。这个中间对象和原来的远程对象在事件处理方面,代码完全一致:

public class EventWrapper:MarshalByRefObject

{

public event BroadCastEvent Handler LocalBroadCastEvent;

//[OneWay]

public void BroadCasting(string message)

{

LocalBroadCastEvent(m essage);

}

public override object InitializeLifetimeService()

{

return null;

}

}

不过不同之处在于:这个Wrapper类必须在客户端和服务端上都要部署,所以,这个类应该放在公共程序集Common.dll中。

现在再来修改原来的客户端代码:

watch = (IBroadCast)Activator.GetObject(

typeof(IBroadCast),"http://localhost:8080/BroadCastMessage.soap");

watch.BroadCastEvent += new BroadCastEventHandler(BroadCastingMessage);

修改为:

watch = (IBroadCast)Activator.GetObject(

typeof(IBroadCast),"http://localhost:8080/BroadCastMessage.soap"); EventWrapper wrapper = new EventWrapper();

wrapper.LocalBroadCastEvent += new

BroadCastEventHandler(BroadCastingMessage);

watch.BroadCastEvent += new BroadCastEventHandler(wrapper.BroadCasting);

为什么这样做就可以了呢?也许画一幅图就很容易说明,可惜我的艺术天分实在很糟糕,我希望以后可以改进这一点。还是用文字来说明吧。

前面说,委托要装载client程序集。现在我们把远程对象委托装载的权利移交给EventWrapper。因为这个类对象是放在客户端的,所以它要装载client程序集丝毫没有问题。语句:EventWrapper wrapper = new EventWrapper();

wrapper.LocalBroadCastEvent += new

BroadCastEventHandler(BroadCastingMessage);

实现了这个功能。

不过此时虽然订阅了事件,但事件还是客户端的,没有与服务端联系起来。而服务端的事件是放到远程对象中的,所以,还要订阅事件,这个任务由远程对象watch来完成。但此时它订阅的

不再是BroadCastingMessage了,而是EventWrapper的触发事件方法BroadCasting。

那么此时委托同样要装载程序集,但此时装载的就是BroadCasting所在的程序集了。由于装

载发生的地点是在服务端。呵呵,高兴的是,BroadCasting所在的程序集正是公共程序集(前面已说过,EventWrapper应放到公共程序集Common.dll中),而公共程序集在服务端和客户端都已经部署了。自然就不会出现找不到程序集的问题了。

注意:EventWrapper因为要重写InitializeLifetim eService()方法,所以仍然要继承MarshalByRefObject类。

现在再来运行程序。首先运行服务端;然后运行客户端,OK,客户端窗体出现了:

然后我们在服务端单击“BroadCast”按钮,发送广播消息:

单击“Send”发送,再来看看客户端,会是怎样?Fine,I got it!

怎么样,很酷吧!你也可以同时打开多个客户端,它们都将收到这个广播信息。如果你觉得这个广播声音太吵,那就请你在客户端取消广播吧。在Cancle按钮中:

private void btnCancle_Click(object sender, System.EventArgs e)

{

watch.BroadCastEvent -= new BroadCastEventHandler(wrapper.BroadCasting);

MessageBox.Show("取消订阅广播成功!");

}

当然这个时候wrapper对象应该被申明为private对象了:

private EventWrapper wrapper = null;

取消后,你试着再广播一下,恭喜你,你不会听到噪音了!

三、客户端订阅客户端事件

有了前面的基础,再来看客户端订阅客户端事件,就简单多了。而本文写到这里,我也很累了,

你也被我啰嗦得不耐烦了。你心里在喊,“饶了我吧!”其实,我又何尝不是如此。所以我只提供一个思路,有兴趣的朋友,可以自己写一个程序。

其实方法很简单,和第二种情况类似。发送信息的客户端,只需要获得远程对象后,发送消息就可以了。而接收信息的客户端,负责订阅该事件。由于事件都是放到远程对象中,因此订阅的方法和第二种情况没有什么区别!

特殊的情况是,我们可以用第三种情况来代替第二种。只要你把发送信息的客户端放到服务端就可以了。当然需要做一些额外的工作,有兴趣的朋友可以去实现一下。在我的示例程序中,已经用这种方法模拟实现了服务端的广播,大家可以去看看。

四、一点补充

我在前面的事件处理中,使用的都是默认的EventArgs。如果要定义自己的EventArgs,就不相同了。因为该信息是传值序列化,因此必须加上[Serializable],且必须放到公共程序集中,部署到服务端和客户端。例如:

[Serializable]

public class BroadcastEventArgs:EventArgs

{

private string msg = null;

public BroadcastEventArgs(string m essage)

{

m sg = message;

}

public string Message

{

get {return m sg;}

}

}

五、持续改进(经Beta的提醒,我改进了我的程序,并对文章进行了修改2004年12月13日)

也许,细心的读者注意到了,在我的远程对象类和EventWrapper类中,触发事件方法的Attribute[OneWay]被我注释掉了。我看到很多资料上写到,在Remoting中处理事件,触发事件的方法必须具有这个Attribute。这个attribute究竟有什么用?

在发送事件消息的时候,事件的订阅者会触发事件,然后响应该事件。然而当事件的订阅者发生错误的时候呢?例如,发送事件消息的时候,才发现根本没有事件订阅者;或者事件的订阅者出现故障,如断电、或异常关机。此时,发送事件一方会因为找不到正确的事件订阅者,而发生异常。以我的程序为例。当我们分别打开服务端和客户端程序的时候,此时广播信息正常。然而,当我们关闭客户端后,由于该客户端没有取消订阅,此时异常发生,提示信息如图:

(不知道为什么,这个异常与客户端连接服务端出现的异常一样。这个异常容易让人产生误会。)如果这个时候我们同时打开了多个客户端,那么其他客户端就会因为这一个客户端关闭造成的错误,而无法收到广播信息。那么让我们先做第一步改进:

1、先考虑正常情况。在我的客户端,虽然提供了取消订阅的操作,但并没有考虑用户关闭客户端的情况。即,关闭客户端时,并未取消事件的订阅,所以我们应该在关闭客户端窗体中写入:private void ClientForm_Closing(object sender, https://www.doczj.com/doc/d011403712.html,ponentModel. CancelEventArgs e)

{

watch.BroadCastEvent -=new BroadCastEvent Handler(wrapper.BroadC asting);

}

2、仅仅是这样还不够。如果客户端并没有正常关闭,而是因为突然断电而导致客户端关闭呢?此时,客户端还没有来得及取消事件订阅呢。在这种情况下,我们需要用到OneWayAttribute。前面说到,发送事件一方如果找不到正确的事件订阅者,会发生异常。也就是说,这个事件是unreachable的。幸运的是,OneWayAttribute恰好解决了这个问题。其实从该特性的命名

OneWay,大约也能猜到其中的含义。当事件不可到达,无法发送时,正常情况下,会返回一个异常信息。如果加上OneWayAttribute,这个事件的发送就变成单向的了。假如此时发生异常,那么系统会自动抛掉该异常信息。由于没有异常信息的返回,发送信息方会认为发送信息成功了。程序会正常运行,错误的客户端被忽略,而正确的客户端仍然能够收到广播信息。

因此,远程对象的代码就应该是这样:

public event BroadCastEventHandler BroadCastEvent;

IBroadCast 成员

public override object InitializeLifetim eService()

{

return null;

}

3、最后的改进

使用OneWay固然可以解决上述的问题,但不够友好。因为对于广播消息的一方来说,象被蒙上了眼睛一样,对于客户端发生的事情懵然不知。这并不是一个好的idea。在Ingo Rammer 的Advanced .NET Remoting一书中,Ingo Rammer先生提出了一个更好的办法,就是在发送信息一方时,检查了委托链。并在委托链的遍历中来捕获异常。当其中一个委托发生异常时,显示提示信息。然后继续遍历后面的委托,这样既保证了异常信息的提示,又保证了其他订阅者正常接收消息。因此,我对本例的远程对象进行了修改,注释掉[OneWay],修改了BroadCastInfo()方法:

//[OneWay]

public void BroadCastingInfo(string info)

{

if (BroadCastEvent !=null)

{

BroadCastEventHandler tem pEvent =null;

宏电DTUGPRS远传实例

GPRS信号监测装置调试 硬件接线图 一、ADAM-4117参数设置 1.将ADAM-4117模块右侧开关拨至INIT(配置状态); 2.打开调试软件https://www.doczj.com/doc/d011403712.html,Utility,选择相应的串口号,右击选择Search,出现对话框(图a),点击Start,直至搜索到模块()后点击Cancel; 图a 3.点击4117(*),配置并保存相应参数,如图(b)。点击右上角的“Applychange”保存设置到模块的芯片里。 图b

二、宏电H7710GPRSDTU模块参数设置 1.断电,打开调试软件sscom32.exe,选择相应串口号,设置相应参数如图c(修改参数的波特率一直为57600); 图c 2.按住空格键,通电,直至出现图d现象; 图d 3.按照帮助指示输入“H”,出现主菜单(图e),输入“C”,再输入密码“1234”,回车,进入DTU配置(C)菜单(图f); 图e图f图g 4.输入“3”,进入“数据服务中心设置(DSC)”菜单(图g), 输入“1”,配置“DSCIP地址”, ;输入“2”,配置“DSC域名”; (注:若已配置固态IP地址,则无需配置域名,即配置域名时按回车键即可;若使用动态IP地址,则将IP地址设为0.0.0.0,域名改为相应的域名地址) 输入“3”,配置“DSC通讯端口”,端口号自己定义,但必须与读取时端口号设置一致;

输入“4”,配置“DNSIP地址”, ,一般设为主站的DNSIP地址;输入“r”,保存设置输入Y或者N。 5.输入“4”进入“用户串口设置”菜单(图h) 图h图i 输入“1”,配置波特率(图i),一般采用9600bps,故输入“4”,再输入“r” 返回菜单; 输入“2”,配置数据位,一般设为8; 输入“3”,配置校验位,一般设为无校验位,故输入“1”,再输入“r”返回菜单; 输入“4”,配置停止位,一般设为1; 输入“r”,返回主菜单。 6.输入“5”,进入“特殊选项设置”菜单(图j) 图j 输入“6”,配置“通讯协议选择(透明0/DDP协议1)” ,一般选择透明,故输入“0”; 输入“7”,配置“网络连接方式(UDP0/TCP1)” ,一般采用TCP连接方式,故输入“1”; 输入“r”,再输入“r”返回主菜单。

GPRS DTU模块 说明书

目录 第一章产品简介 (4) 1.1概述 (4) 1.2产品特点 (4) 1.3技术参数 (4) 1.4产品外型 (5) 1.5接口定义 (6) 第二章安装调试 (7) 2.1概述 (7) 2.2 开箱 (7) 2.3 安装方法 (7) 2.3.1安装说明 (7) 2.3.2安装SIM卡和天线 (8) 2.4指示灯状态说明 (9) 第三章参数设置 (10) 3.1 连接设置 (10) 3.2 设参软件安装及模块的参数设置 (10) 3.2.1设参软件的安装 (10) 3.2.2 模块的参数设置 (11) 3.2.3多个DATA-6123模块的参数设置 (14) 3.2.3.1多个模块连续设置 (14) 3.2.3.2多个模块在不同时间进行设置 (14) 3.2.4其它参数解释 (15) 第四章测试 (17) 第五章远程维护 (19) 5.1 远程升级 (19) 5.1.1概述 (19) 5.1.2 通过“程序下载软件”远程升级 (19) 5.2 远程读、设参 (22) 5.2.1概述 (22) 5.2.2软件设置 (22) 5.2.3远程读参 (22) 5.2.4远程设参 (24) 第六章故障分析与排除 (25)

版权声明: 本使用说明书包含的所有内容均受版权法的保护,未经唐山平升电子技术开发有限公司的书面授权,任何组织和个人不得以任何形式或手段对整个说明书和部分内容进行复制和转载,不得以任何形式传播。 商标声明: 为唐山平升电子技术开发有限公司的注册商标。本文档提及的其他所有商标或注册商标,由拥有该商标的机构所有。 注意: 由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文档中的所有陈述、信息和建议不构成任何明示或暗示的担保。

DTU基础知识

1、什么是DTU? 答:DTU是数据终端设备(Data Terminal unit)的简写。广义地讲,在进行通信时,传输数据的链路两端负责发送数据信息的模块单元都称之为DTU,在它的作用下对所传信息进行格式转换和数据整理校验。狭义地讲,DTU一般特指无线通讯中的下位GPRS/CDMA发射终端设备。前者是一种模块,而后者则是设备。后面的介绍如果不加特别说明,都是指后者(下位发射终端设备)。 2、与DTU有关的名词解释? 1)什么是上位机和下位机? 答:上位机和下位机是一个相对的概念,在通信中,有主从关系的一对设备,负责提交信息的终端设备是下位机,负责处理提交信息的设备是上位机。DTU设备大多数情况下就属于下位机,而负责处理DTU回传信息的数据中心就是上位机,典型的应用方式是多台DTU对应一个数据中心。但是上位机和下位机不一定都是一一对应,他们可以是一个下位机对应一个或多个上位机,也可以是一个上位机对应一个或多个下位机,具体的对应方式要视应用而定。 2)什么是数据中心? 答:数据中心是指对下位机回传的信息进行采集、汇总和处理,并对下位机进行一定控制和管理的上位机系统,他包括完整的计算机硬件设备和特定的完整软件功能。 3)什么是全透明传输? 答:全透明传输就是对IP包不作任何操作和改变,只是简单的发送过程。通俗的讲就是,全透明传输时,数据在发送前和发送后的格式、内容都不发生变化,远端数据中心接收的数据与现场采集的数据是一样的,数据在传输过程中不发生变化,如果IP包有任何的操作和改变,就不是完全意义上的全透明了。 3、DTU与无线Mmodem有什么区别? 答:首先要明确的一点是:DTU与无线Modem是不一样的。 在软件设计上,DTU封装了协议栈内容并且具有嵌入式操作系统,硬件上可看作是嵌入式PC加无线接入部分的接合。GPRS/CDMA Modem是接入GPRS/CDMA分组网络的一个物理通道,它本身不具有操作系统,必须依附于计算机(在功能上类似于有线Modem),在计算机操作系统之上才能进行PPP拨号连接,通常是与PC结合使用。从某种角度来说,DTU是嵌入式PC与GPRS/CDMA Modem的结合,但它不能单独当作Modem 使用,它完成数据协议转换和透明传输这样一个功能。在使用上,前端采集设备或智能数据设备,通常提供标准的数据接口,如RS232、RS485/422等,这些前端用户设备适合采用DTU,借助于GPRS/CDMA网络平台,实现与监控中心端的数据通信。GPRS/CDMA Modem需要接入计算机,实现组网连接,比如说中心站的PC主机可以通过GPRS/CDMA Modem接入GPRS/CDMA网络,从而构成某中心站服务器,实现网络监控,数据通信等。而DTU很难作为中心服务站来使用。 4、DTU测试前需要做什么准备工作? 答:在对DTU进行测试前,需要有以下条件:

GPRS模块参数设置说明

GPRS模块参数设置说明 1. 超级终端通讯端口设置 新建一个超级终端,Windows系统会要求选择有关串行口的设置,选择连接的串行端口号(如COM2),参照下图所示配置串行端口参数: 超级终端通信参数设置如下: 速率: 57600baud 数据位: 8bit 奇偶校验:无 停止位: 1bit 数据流控制:无 2. 进入参数设置模式 启动PC的超级终端软件,按住PC键盘的空格键(SPACE),打开配置终端盒电源。必须在设备加电之前按住PC键盘的空格键(SPACE)不放,然后加电,直至PC机的超 级终端屏幕上显示下图所示界面

在主菜单(Main Menu)状态下键入C进入参数配置,系统可能会要求输入密码,请输入正确密码: 密码:1234 输入正确密码后键回车,进入如下所示界面。 在此状态下键入相应数字,即可进入对应参数配置项。 一般情况需要配置的参数项有: 1 移动业务中心参数配置 3 数据业务中心参数配置 4 串口通讯参数配置 其他参数项建议采用默认值! 3. 各参数项设置 3.1 移动业务中心参数配置(MSC) 在DTU参数配置(Configurations)菜单状态下1,进入移动业务中心参数配置 (MSC):

在此状态下键入相应数字,即可进行参数设置。 例: 按提示信息输入名称,按回车键确认。 然后按“R”键返回上层菜单, 按“Y”键确认保存。 如不需更改此项参数,按“Esc”键退出此项。 其它参数设置方法同此。 如采用公网,此参数项可采用默认。 如采用专网,根据需要设置的参数是: 2 用户名称 3 用户密码 4 设置接入点名称(默认为“CMNET”) 3.2 数据业务中心参数配置(DSC) 在DTU参数配置(Configurations)菜单状态下 3,进入移动业务中心参数

宏电DTU参数配置

宏电DTU的参数配置和与DEMO的连接测试 一、DTU的参数配置与下载 1、RS232接口的DTU接线原则:232母头连接线的RXD连接DTU的RS(B-);TXD连 接DTU的TX(A+)。GND接地一定要跟电源的GND相连接。否则通讯不上。 2、RS485接口的DTU接线原则:485+接A+;485-接B-。 3、配置DTU参数的时候一定要把IP设定为公网IP,另外端口映射一定要正确。 4、具体的DTU参数配置如下图所示: 图1.1 在图1中的DSC连接类型中选择UDP连接方式。IP地址设定为公网IP。

在图2中的本地IP也不需要进行设置。 图1.3

在图8中的本地端口和DNS地址不需要配置选择系统默认的就行。 图1.5

图1.6 图1.7

图1.8 配置注意问题: 1、配置过程中一定要注意IP地址是设定公网IP,并且端口号得映射也一定要与本机电脑 在路由器上的映射端口号相一致,否则就会出现连接不上的现象。 2、在配置好参数向DTU下载的过程中一定要先把DTU断电,点击“连接”之后再给DTU 上电,才能连接成功。连接成功之后,点击“全选”然后再点击“设置”就可以把配置好的参数下载到DTU中去。 二、DTU与DSC_DEMO的连接设置 DTU演示系统与DTU的连接过程中,也要对其进行参数设置,否则无法连接成功。具体的 需要设置的参数为:“设置”,如下图所示

图2.1 图2.2 在图2.2中“指定IP”前面一定不能选,服务类型选择UDP,启动类型:自动启动。 图2.3 按照上面的步骤配置完成后,先点击“启动服务”然后再开启DTU电源,连接成功后显示如下的界面。

DTU使用说明书

DTU使用说明书 此说明书适用于下列型号产品: 型号产品类别 F2116GPRS IP MODEM F2216CDMA IP MODEM F2416WCDMA IP MODEM F2616EVDO IP MODEM F2716TDD-LTE IP MODEM F2816FDD-LTE IP MODEM F2A16LTE IP MODEM 文档修订记录

目录 第一章产品简介 (3) 1.1产品概述 (3) 1.2产品特点 (3) 1.3工作原理框图 (4) 1.4产品规格 (4) 第二章安装 (8) 2.1概述 (8) 2.2开箱 (8) 2.3安装与电缆连接 (8) 2.4电源说明 (11) 2.5指示灯说明 (11) 第三章参数配置 (12) 3.1配置连接 (12) 3.2参数配置方式介绍 (12) 3.3参数配置详细说明 (12) 3.3.1配置工具运行界面 (13) 3.3.2设备上电 (14) 3.3.4中心服务 (20) 3.3.5串口 (21) 3.3.6无线拔号 (22) 3.3.7全局参数 (23) 3.3.8设备管理 (25) 3.3.9其它功能项 (26) 第四章数据传输试验环境测试 (26) 4.1试验环境网络结构 (26) 4.2测试步骤 (27)

第一章产品简介 1.1产品概述 F2X16系列IP MODEM是一种物联网无线数据终端,利用公用蜂窝网络为用户提供无线长距离数据传输功能。 该产品采用高性能的工业级32位通信处理器和工业级无线模块,以嵌入式实时操作系统为软件支撑平台,同时提供RS232和RS485(或RS422)接口,可直接连接串口设备,实现数据透明传输功能;低功耗设计,最低功耗小于5mA@12VDC;提供1路ADC,2路I/O,可实现数字量输入输出、脉冲输出、模拟量输入、脉冲计数等功能。 该产品已广泛应用于物联网产业链中的M2M行业,如智能电网、智能交通、智能家居、金融、移动POS终端、供应链自动化、工业自动化、智能建筑、消防、公共安全、环境保护、气象、数字化医疗、遥感勘测、军事、空间探索、农业、林业、水务、煤矿、石化等领域。IP MODEM典型应用如图1-1所示: 图1-1IP MODEM应用拓扑图 1.2产品特点 工业级应用设计 ◆ 采用高性能工业级无线模块 ◆ 采用高性能工业级32位通信处理器 ◆ 低功耗设计,支持多级休眠和唤醒模式,最大限度降低功耗 ◆ 采用金属外壳,保护等级IP30。金属外壳和系统安全隔离,特别适合于工控现场的应 用 ◆ 宽电源输入(DC5~36V) 稳定可靠 ◆ WDT看门狗设计,保证系统稳定 ◆ 采用完备的防掉线机制,保证数据终端永远在线 ◆ RS232/RS485/RS422接口内置15KV ESD保护 ◆ SIM/UIM卡接口内置15KV ESD保护 ◆ 电源接口内置反相保护和过压保护 ◆天线接口防雷保护(可选) 标准易用

DTU介绍

DTU数据传输单元介绍 数据传输单元DTU (Data Transfer unit),是专门用于将串口数据转换为IP数据或将IP数据转换为串口数据通过无线通信网络进行传送的无线终端设备[1-2]。 DTU DTU产品系列(3张) DTU硬件组成 DTU 硬件组成部分主要包括CPU控制模块、无线通讯模块以及电源模块 DTU 优点: 组网迅速灵活,建设周期短、成本低; 网络覆盖范围广; 安全保密性能好; 链路支持永远在线、按流量计费、用户使用成本低; CPU:工业级高性能ARM9嵌入式处理器,带内存管理MMU,200MPS, 16KB Dcache,16KB Icache FLASH:8MB,可扩充到32MB SDRAM:64MB,可扩充到256MB

接口: UART: CM 3160P: 1个RS232串口 串口速率:110bps ~ 230400bps 数据位支持:8位或7位 奇偶校验位:无或奇数校验或偶数校验 停止位:1位或2位 流控:无或RTS/CTS CM 3160EP: 1个RS485接口(根据需要,可硬件跳线支持RS232/422/TTL) 串口速率:110bps ~ 230400bps 数据位支持:8位或7位 奇偶校验位:无或奇数校验或偶数校验 停止位:1位或2位 流控:无或RTS/CTS 控制口: RS-232, 115200 bps, 8 data bits,1 stop bit, no parity (8N1) 指示灯:具有电源、通信及在线指示灯 天线接口:标准SMA阴头天线接口,特性阻抗50欧 UIM卡接口:3V/1.8V标准的推杆式用户卡接口 电源接口:标准的3芯火车头电源插座 语音接口:标准的耳机麦克风接口 3.5 供电: 外接电源:DC 9V 500mA 宽电压供电:DC 5-32V 通信电流:350mA 待机电流:35mA 3.6 尺寸: 产品外形尺寸:92x62x22 mm(不包括天线及固定件) 产品包装尺寸:298x226x60mm 3.7 重量: 0.41KG 3.8 其他参数: 工作环境温度:-25~+65ºC 储存温度:-40~+85ºC 相对湿度:95%(无凝结) DTU软件组成 4.1 TCP/UDP透明数据传输;支持多种工作模式。心跳包技术 4.2 智能防掉线,支持在线检测,在线维持,掉线自动重拨,确保设备永远在线 4.3 支持RSA,RC4加密算法

【整理】无线通讯模块DTU电科院各项认证实验报告

无线模块电科院各项认证实验报告 实验一:外观认证 产品名字,厂家,合格证书等认证。 实验二:通讯认证 通信终端向服务器每秒发送一定字节的数据,服务器能否全部收到,有没有乱码等。 实验三:功耗测试 电源12V输入,待机模式下1.2W,收发数据模式下1.6W。 实验四:电源浪涌实验 实验依据:GB/T 17626.5中规定的严酷等级为4级的浪涌骚扰。 实验方法: 1.差模±2000V,每60S一次,打5次, 2.共模±4000V,每60S一次,打5次。 1.整改前,电源12V进来接通过电流3A保险丝,并联一个300W功率,40V耐压的TVS管,再接一个过3A电流的防反接二极管,最后输入到DC-DC电源芯片。如下图所示。 2.整改方案1,电源12V输入端先并联一个耐压为36V的压敏电阻470KD20JX,再串联一个电流3A的保险丝,再并联一个功率1500W,耐压36V的TVS管,再接过3A电流的防反接二极管,最后输入到DC-DC 电源芯片。如下图所示。 3.整改方案2,电源12V输入端直接并联一个5000W,26耐压的TVS 管,然后串上过3A电流的防反接二极管,最后输入到DC-DC电源芯

片。如下图所示。 浪涌实验结果如下: 整改前:共模±4000V没问题,差模±2000V导致TVS管烧坏击穿,lmr14030芯片击穿,模块不能正常工作。 方案1:共模±4000V没问题,差模±2000V时,压敏电阻,TVS 管,lmr1430都没有问题,但是BL1117-3.3V的LDO芯片击穿,导致单片机烧坏,模块不能正常工作。 方案2:共模±4000V和差模±2000V都实验两台设备,全程实验没有出现烧坏元器件的现象,模块通讯也正常,没有出现程序死机复位等现象。 实验五:电快速瞬变脉冲群实验 实验依据:GB/T 17626.4规定的严酷等级为4级的电快速瞬变干扰。 实验标准:差模±4000V,频率5KHz,持续时间90S 实验结果:导致实验设备掉线,无法正常通讯。 整改方案:电源12V输入端直接并联330KD20JX耐压为26V的压敏电阻,和一个5000W,26耐压的TVS管SMDJ26CA,电源正负极分别与大地之间接一个101 8KV的高压瓷片电容,然后串上过3A电流的防反接二极管,最后输入到DC-DC电源芯片。如下图所示。 整改后实验结果:整改后没有出现死机,掉线等现象,实验合格。实验六:高频干扰实验 实验依据:GB/T 17626.10规定的严酷等级为4级的高频干扰。

DTU、GPRS DTU模块与力控组态软件通信设置说明

DTU(GPRS DTU模块)与力控组态软件 通信设置说明 V1.1

修订文档历史记录 日期版本说明作者2015-8-19 1.1 力控驱动7.0文档整理发布

目录 一、简介 (4) 二、设置GPRS模块(DTU)相关参数: (4) 1、安装设参软件 (4) 2、GPRS模块参数设置 (4) 3、同时设置多个模块 (6) 三、力控组态软件的配置方法 (7) 1、安装驱动 (7) 2、新建I/O设备 (7) 3、数据库组态 (11)

一、简介 设备类型:GPRS DTU 支持网络类型:GPRS 主要功能:通过GPRS实现远端设备与组态软件服务器的通信。GPRS网络覆盖率高、部署成本低,可与各式串口终端设备连接 ,具有内建Watchdog功能,系统永不当机,使用者不需编写程式即可设定通讯格式、传送方式及传送内容。 支持协议:TCP/IP。 二、设置GPRS模块(DTU)相关参数: 使用DATA-6123 GPRS 模块(DTU)作为无线通信设备,实现远端串口设备与服务器端的力控组态软件之间的无线通信,首先必须对模块进行设置,设置方法如下: 1、安装设参软件 请点击随机光盘内的设参软件安装包,将设参软件安装到PC主机。 双击图标进行安装 2、GPRS模块参数设置 将GPRS模块通过串口与电脑主机相连,接通模块电源后打开设参软件,点击“GPRS参数”,在弹出窗口中,“指定方式”选择串口,点击确定,如下所示:

进入参数设置页面,点击“读取”按钮,即可读取当前连接的GPRS模块参数设置信息,如下图所示: 读取设备参数后,即可进行参数设置,首先请设置“基本参数”: 本机号码:即SIM卡号; 传输型号:B型; 系统识别码:为一个任意6位数字,需保持默认设置,不可更改; 监听端口:必须与组态软件配置服务器的端口号一致;

DTU的30种问题的解决办法

DTU的30种问题的解决办法 一、DTU不能进入配置状态: 方法如下: 1、检查DTU的波特率和参数配置软件的波特率是否一致(才茂DTU出厂波特率为57600,最大115200); 2、检查串口线是否连接正常; 二、DTU可以进入配置状态,但AT指令不能写入? 方法如下: 1、检查模块与电路板是否接处良好; 2、模块波特率是否被改成太大了; 三、如何更改波特率? 方法如下: 在对波特率进行修改的时候,(透明模式下)按“s”键进入设置模式,输入AT+IPR?先查询其波特率, 含协议下为38400 , 但后台串口波特率仍为57600 。这时输入你想要更改的波特率,AT+IPR=1200,返回,在超级终端下断开连接,将后台波特率更改为1200,在进入超级终端,直接敲回车,输入AT 指令,这时就可以通过1200 波特率进行通信了。(非透明模式下)直接输入AT+IPR=1200,返回,相同的在超级终端下断开连接,将后台波特率更改为1200,就可以正常使用了。

四、DTU的默认设置是什么? 方法如下: 1、8位数据位/无奇偶校验/1位停止位、波特率57600bps 2、数据传输速率:57600bps 五、如何检查DTU有没有登陆GPRS/CDMA网络? 方法如下: 检测方法为:在AT 命令态下,输入AT+CGATT=1,返回OK,再输入AT+CGATT? 如返回的是1则表示进入GPRS 网络,如返回的是0 则表示还未登入GPRS 网络。CDMA暂无指令进行判断! 六、DTU不能连上中心? 方法如下: 1、先确定才茂通信中心DEMO的设置是否正常(可用模拟DTU来连中心),然后,在查看DTU的配置是否正确,即中心地址,端口等是否设置正确; 2、DTU信号是否正常(AT指令查看),SIM卡是否欠费; 七、DTU和中心DEMO的设置都正常的情况下,DTU还是连不上中心? 方法如下: 首先,我们先确定运行中心DEMO的PC机是否进行端口映射(如运行在DMZ服务器上则不需要端口映射); 再次,确定所映射的端口没有被占用;有没有被防火墙挡住。 八、中心DEMO与DTU通讯正常,但和下位的PLC通讯不上? 方法如下: 1、DTU的参数是否与下位的PLC对应,如波特率,奇偶校验,数据位,停止位。 2、PLC的通讯协议是还正确(可以先与PC机进行通讯)。 3、DTU与下位PLC 串口485电阻不匹配(匹配电阻一般在10几欧到200欧之间。 4、DTU与PLC通讯接口是否连接正确 九、中心DEMO与DTU正常通讯,但经常掉线? 方法如下: 1、DTU的心跳包时间是否设置正确,心跳包时间设置长度与当地的网络有关,一般设置在当地网络允许时间内无数据传输不会掉线之内; 2、DTU的ID号,SIM卡号是不是设置成唯一的,如果重复则会出现不断的掉线重连; 十、每次发送数据产生冗余数据量大小是多少? 方法如下: DTU只有在和中心端建立连接的时候会产生冗余数据,就是把自身的信息发给中心,以后只要在这链路未断的情况下,发送的数据是不会产生; 冗余数据。冗余数据为45个字节,具体格式如下:8位HEXID(4位)+11位电话号码+ 0 + 登入IP地址=41个;

DTU功能简介

DTU功能简介 DTU概述 DTU是数据终端设备(Data Terminal unit)的简写。广义地讲,在进行通信时,传输数据的链路两端负责发送数据信息的模块单元都称之为DTU,在它的作用下对所传信息进行格式转换和数据整理校验。狭义地讲,DTU一般特指无线通讯中的下位GPRS/CDMA发射终端设备。前者是一种模块,而后者则是设备。后面的介绍如果不加特别说明,都是指后者(下位发射终端设备) DTU的核心功能 1)内部集成TCP/IP协议栈 DTU内部封装了PPP拨号协议以及TCP/IP协议栈并且具有嵌入式操作系统,从硬件上,它可看作是嵌入式PC与无线的结合;它具备无线拨号上网以及TCP/IP数据通信的功能。 2)提供串口数据双向转换功能 DTU提供了串行通信接口,包括CM510-21X,CM510-23X,CM510-22X等都属于常用的串行通信方式,而DTU在设计上大都将串口数据设计成“透明转换”的方式,也就是说DTU可以将串口上的原始数据转换成TCP/IP数据包进行传送,而不需要改变原有的数据通信内容。因此,DTU可以和各种使用串口通信的用户设备进行连接,而且不需要对用户设备作改动。 3)支持自动心跳,保持永久在线

无线通信网络的优点之一就是支持无线终端设备永久在线,因此典型的无线DTU在设计上都支持永久在线功能,这就要求DTU包含了上电自动拨号、采用心跳包保持永久在线(当长时间没有数据通信时,移动网关将断开DTU 与中心的连接,心跳包就是DTU与数据中心在连接被断开之前发送一个小数据包,以保持连接不被断开)、支持断线自动重连、自动重拨号等特点。 4)支持参数配置,永久保存 DTU作为一种通信设备,其应用场合十分广泛。在不同的应用中,数据中心的IP地址及端口号,串口的波特率等都是不同的。因此,DTU都应支持参数配置,并且将配置好的参数保存内部的永久存储器件内(一般为FLASH 或EEPROM等)。一旦上电,就自动按照设置好的参数进行工作。 5)支持用户串口参数设置 不同用户设备的串口参数有所不同,DTU连接用户设备的串口时,要根据用户设备串口的实际参数对DTU端进行相应设置,保证用户设备的正常通信和可靠数据传输。 6)DTU (Data Transfer unit)全称数据传输单元,是专门用于将串口数据转换为IP数据或将IP数据转换为串口数据通过无线通信网络进行传送的无线终端设备。 DTU硬件组成 DTU 硬件组成部分主要包括CPU控制模块、无线通讯模块以及电源模块 DTU 优点 组网迅速灵活,建设周期短、成本低; 网络覆盖范围广; 安全保密性能好; 链路支持永远在线、按流量计费、用户使用成本低; DTU工作过程描述 DTU上电后,首先读出内部FLASH中保存的工作参数(包括无线拨号参数,串口波特率,数据中心IP地址等等,事先已经配置好)。 DTU登陆GSM网络,然后进行PPP拨号。拨号成功后,DTU将获得一个由移动随机分配的内部IP地址(一般是10.X.X.X)。也就是说,DTU处于移动内网中,而且其内网IP地址通常是不固定的,随着每次拨号而变化。我们可以理解为无线DTU这时是一个移动内部局域网内的设备,通过移动网关来实现与外部Internet公网的通信。这与局域网内的电脑通过网关访问外部网络的方式相似。 DTU主动发起与数据中心的通信连接,并保持通信连接一直存在。由于DTU处于移动内网,而且IP地址不固定。因此,只能由DTU主动连接数据中心,而不能由数据中心主动连接DTU。这就要求数据中心具备固定的公网IP 地址或固定的域名。数据中心的公网IP地址或固定的域名作为参数存储在DTU内,以便DTU一旦上电拨号成功,就可以主动连接到数据中心。 具体地讲,DTU通过数据中心的IP地址(如果是采用中心域名的话,先通过中心域名解析出中心IP地址)以及端口号等参数,向数据中心发起TCP

浅析宏电新版本DTU配置方法

浅析宏电新版本DTU配置方法 黄锐,蓝天飞,任玮颖 (湖北省十堰市气象局,湖北十堰 442000) 摘要:我省区域自动气象站的数据传输采用的是移动网络GPRS方式,数据传输的核心部件DTU的参数配置正确与否直接影响其通信状态。针对DTU生产厂家对DTU升级后采用了新的配置方法,本文介绍了DTU升级后新的配置方法与原有配置方法的区别,详细介绍了配置软件的的操作步骤,对配置参数时需要注意的选项进行了介绍,并和原有的配置方法进行了对比。 关键词:DTU;配置;方法 引言 深圳市宏电技术股份有限公司生产 DTU(Data Transfer Unit)是一款基于 GPRS/GSM网络的无线 DDN(Digital Data Network)的数据通信产品[1]。其广泛应用在我省的高山自动气象站、区域自动气象站、应急车载便携式自动气象站等设备上,DTU的配置参数使用超级终端工具进行配置。然而,从2015年开始,深圳市宏电技术股份有限公司对DTU进行了升级,新型号为H7118C-V59、WUSH8118,模块参数的配置方法有了改变,不能使用原有的超级终端进行配置,需要用专用的配置软件对通信模块进行参数设置。因此,本文对使用配置软件对新版本通信模块进行参数配置时,配置方法与原有使用超级终端配置DTU的方法进行了区分,对配置参数时的异同之处进行了介绍,对需要着重注意的地方进行了说明,解决因厂家DTU升级后气象技术保障人员对新版本DTU配置方法不熟练、参数配置不正确而导致DTU不上线的问题。 1 宏电DTU版本的查询与配置工具的准备 深圳市宏电技术股份有限公司生产的宏电DTU的版本信息可在DTU背部查询(见图1)。D54、V56等原版本DTU均为2008年、2012年生产,生产日期显示在条形码最下端。新版本DTU V59、WUSH8118均为为2015年后生产,它的配置方法与原版本DTU使用超级终端工具的配置方法不同,新版本的DTU采用专用的DTU配置软件“DTU工具盒”来对模块的参数进行配置。 图1 原版本模块参数(a)、新版本模块参数(b)

相关主题
文本预览
相关文档 最新文档