您的位置:首页 > 其它

采用list传输格式的webservice实现控制远程设备

2014-11-09 14:09 1111 查看
前些天在弄一个远程指令控制传感设备的程序,大体思路是这样的:用webservice作为中间服务程序,各平台作为客户端。客户端点击开启按钮调用webservice,webservice向传感设备发送开启指令,webservice和设备之间为TCP连接,分别为socketcliet和socketserver。二者会保持10秒的连接时间,传感设备数据会保存在webservice数据库中,10秒之后把数据封装成list传给平台客户端。如下图所示:



相关技术:

webService:axis2框架,该框架相关部署不在赘述了

数据库:mysql数据库

采用线程池和NIO保证数据非阻塞

当平台发送一条指令时会开启一个线程,该线程作为socket客户端与传感设备的路由(socketserver端)进行通信。线程都通过线程池进行管理,当与设备通信超时后(这里为10秒)会关闭该线程 重新放回池中。

为防止socketclient端阻塞,socket采用NIO流进行传输,以防止阻塞的发生。

webservice向平台返回数据采用list方式,将查询结果封装成model对象 再将model放到list,采用这种方式更利于表结构数据传输而且提高传输效率。下面是平台调用webservice的代码:

Java代码


public class test {

public static void main(String[] args) throws Exception{

List<HashMap<String, Object>> returns = new ArrayList<HashMap<String, Object>>();

RPCServiceClient serviceClient = new RPCServiceClient();

Options options = serviceClient.getOptions();

EndpointReference targetEPR = new EndpointReference("http://192.168.1.100:8080/XML/services/HelloWorld");

options.setTo(targetEPR);

QName opAddEntry = new QName("http://jdbc.mysql.com", "getList2");

Object[] so = serviceClient.invokeBlocking(opAddEntry, new Object[] {"美女"},

new Class[] {Object[].class });

if (so.length > 0) {

if (so[0] instanceof Object[]) {

Object[] elements = (Object[]) so[0];

for (Object o : elements) {

HashMap<String, Object> maps = new HashMap<String, Object>();

OMElementImpl ome = (OMElementImpl) o;

maps.put(ome.getLocalName(), ome.getText());

while (ome.getNextOMSibling() != null) {

ome = (OMElementImpl) ome.getNextOMSibling();

maps.put(ome.getLocalName(), ome.getText());

}

returns.add(maps);

}

} else {

Object ob = so[0];

if (ob instanceof OMElementImpl == false) {

HashMap<String, Object> maps = new HashMap<String, Object>();

maps.put("simple", ob);

returns.add(maps);

} else {

OMElementImpl ome = (OMElementImpl) so[0];

HashMap<String, Object> maps = new HashMap<String, Object>();

maps.put(ome.getLocalName(), ome.getText());

returns.add(maps);

}

}

println(returns);

} else {

println(returns);;

}

}

public static void println(List<HashMap<String, Object>> list) {

for (HashMap<String, Object> maps : list) {

System.out.println("------------------");

Set<String> set = maps.keySet();

Iterator<String> it = set.iterator();

while (it.hasNext()) {

String key = it.next();

Object value = maps.get(key);

System.out.print(key + ":" + value + "\t");

}

System.out.println();

}

}

}

客户端所用jar包见下方。

webservice服务端方法如下:

Java代码


public List<Model> getList2(String mac) throws Exception{

List<Model> list = new ArrayList<Model>();

if(connect(1,mac)){

String sql="相应的sql";

Connection con = getConn();

Statement sta = con.createStatement();

ResultSet rs = sta.executeQuery(sql);

while(rs.next()){

Model m = new Model();

m.setTfShuL(rs.getInt("tfShuL"));

m.setTfMingC(rs.getString("tfMingC"));

m.setTfGuiG(rs.getString("tfGuiG"));

m.setTfPinM(rs.getString("tfPinM"));

m.setTfDaL(rs.getString("tfDaL"));

m.setTfZhuDW(rs.getString("tfZhuDW"));

list.add(m);

}

}

return list;

}

开启线程的connect方法如下:

Java代码


public boolean connect(int machid,String mac) throws Exception{

try{

oz oz = new oz();

oz.initClient("192.168.1.110", 8899,machid,mac);

Thread td = new Thread(oz);

pool.submit(td); //线程池

Thread.sleep(8000);

}catch(Exception e){

System.out.println(e.getLocalizedMessage());

return false;

}

return true;

}

oz是一个自己实现的线程对象,里面也实现了一个NIO的socket客户端,可与传感设备组成的网络进行通信。文件放在附件中。

以上就是一个简单地通过webservice实现平台和硬件设备的通信实例,使用webservice可以适应多种平台 便于更新扩展同时便于数据的集中处理,其他好处想必大家日后会慢慢发现。。NIO可防止阻塞提高传输效率。

还有很多问题有待解决,比如数据的排队问题、线程和socket的优化等等。欢迎大家多多指正

本文由上海java培训机构推荐阅读,更多精彩请浏览上海it培训官网。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: