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

        前些天在弄一个远程指令控制传感设备的程序,大体思路是这样的:用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的代码:

 

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服务端方法如下:

 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方法如下:

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的优化等等。欢迎大家多多指正

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值