怎么用java连接第三方设备,比如水表,电表
发布时间:2025-05-20 20:44:51 发布人:远客网络
一、怎么用java连接第三方设备,比如水表,电表
1、对接过一些门锁,说下,连接硬件的经验吧,不一定对,首先,你连接那种智能的硬件,这种硬件一般会有网卡,有了网卡,才能和别的设备连接起来,有可能是网线,或者无线WiFI,现在应该都是wifi,至少不需要网线那样的接口,一个硬件上如果带有网线那样的接口,会丑的要死。有了网线,你需要去配置相关的东西,比如wifi,你至少需要把账号密码给它,它才能连上网。这里面一般制造那个硬件的公司会开发一个APP,通过APP,就可以去设置账号密码,一般情况下,APP是通过蓝牙直接跟硬件交互。你能配置好wifi的账号密码之后,那个智能的水电表,就能连上那个公司对应的管理平台,然后你就能调用那个公司对应管理平台的接口,获取对应的数据了,也可以是操作,我对接的是门锁,所以一般是开门,或者关门,水电表的化,应该是获取读数了。这是一种方式,还有另一种,会有专门的软件,你需要把软件安装到自己的服务器,同时把对应的智能硬件连接到对应的软件上,这个就相当于服务器,硬件都有你们自己管理了。
2、这里面,其实重要的是理解计算机网络,两个东西怎么依赖网络连接起来。然后是这种硬件的开发商,一般会有对应的文档,描述怎么对接的。多看看,然后从网络连接的角度理解下,就好了。
二、qq 第三方登录 java sdk怎么用
在正式接入之前你需要了解以下名词的含义:
1. appid:应用的唯一标识。在OAuth2.0认证过程中,appid的值即为oauth_consumer_key的值。
2. appkey:appid对应的密钥,访问用户资源时用来验证应用的合法性。在OAuth2.0认证过程中,appkey的值即为oauth_consumer_secret的值。
3. redirecturl:成功授权后的回调地址,必须是注册appid时填写的主域名下的地址,建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。
4. access token:用来判断用户在本网站上的登录状态,具有3个月有效期,用户再次登录时自动刷新。
5. openid:是此网站上唯一对应用户身份的标识,网站可将此ID进行存储便于用户下次登录时辨识其身份,或将其与用户在网站上的原有帐号进行绑定。
要接入QQ登录,必不可少的是appid和appkey,通过申请接入QQ登录,按照相应步骤操作即可轻松获得,在此不做赘述。
在需要放置QQ登录按钮的页面加入下面SCRIPT代码:
<scripttype="text/javascript"src=""data-appid="APPID"data-redirecturi="REDIRECTURI"charset="utf-8"></script>
PS:APPID和REDIRECTURI换成第一步申请所得到的对应内容,REDIRECTURI就是登录之后返回的回调地址,在申请页面自己填写,一般写网站主域名即可。注意:回调地址必须以http或https开头。
在页面放置一个元素节点用来展现登录按钮,并且指定其ID,如:
<div id="qq"></div>
<scripttype="text/javascript">
这时就可以在页面看到如下效果:
如对这个展示效果不满意,也可以自定义登录按钮。
在 REDIRECTURI即回调地址页面加入如下SCRIPT:
<scripttype="text/javascript"
src=""charset="utf-8"data-callback="true"></script>
另外:官方说法如果回调地址页与加入QQ登录按钮是同一个页面,则只需要引用一次脚本文件。如果理解不了这种官方说法,可以在第一步的脚本中加入data-callback="true"属性,而忽略第四步,前提是回调地址页与加入QQ登录按钮的页面是同一个页面。
因为JS SDK封装了获取Access Token以及OpenID的方法,因此开发者不需要用开发代码进行获取,直接调用QQ登录OpenAPI即可。
调用OpenAPI时,请统一遵循下述调用方式:
提供一种代码接入思路,仅供参考:
QC.api("get_user_info",{})//get_user_info是API参数
//指定接口访问成功的接收函数,s为成功返回Response对象
//成功回调,通过s.data获取OpenAPI的返回数据
nick= s.data.nickname;//获得昵称
headurl= s.data.figureurl_qq_1;//获得头像
if(QC.Login.check()){//判断是否登录
QC.Login.getMe(function(openId, accessToken){//这里可以得到openId和accessToken
//指定接口访问失败的接收函数,f为失败返回Response对象
////指定接口完成请求后的接收函数,c为完成请求返回Response对象
// alert("获取用户信息完成!");
三、怎么调用hessian接口 spring
1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持。
Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实现方案,Hessian也是基于HTTP协议的,其工作原理如下:
客户端程序—>发送远程调用请求—>Hessian客户端拦截器—>封装远程调用请求—>Hessian代理—>通过HTTP协议发送远程请求代理到服务端。
远程调用结果—>HTTP响应—>客户端。
远程调用HTTP请求—>HessianServiceExporter接收请求—>HessianExporter将远程调用对象封装为HessianSkeleton框架—> HessianSkeleton处理远程调用请求。
HessianSkeleton封装远程调用处理结果—>HTTP响应—>客户端。
本文章通过分析Spring对Hessian支持的相关源码,了解Spring对Hessian支持的具体实现。
Hessian的客户端需要做类似如下的配置:
<bean id=”hessianProxy” class=”org.springframework.remoting.caucho.HessianProxyFactoryBean”>
<property name=”serviceUrl”>
<value>;
<property name=”serviceInterface”>
<value>远程调用服务接口</value>
和HTTP调用器的配置类似,都需要配置远程调用请求的url,这个url要和服务端的url一致,Spring通过DispatcherServlet找到服务端对于的请求url。
HessianProxyFactoryBean是Spring中管理Hessian客户端的IoC容器,主要负责产生服务端远程调用代理和对客户端远程调用的拦截器设置。
HessianProxyFactoryBean生成远程调用代理和客户端远程调用拦截器设置,其源码如下:
public class HessianProxyFactoryBean extends HessianClientInterceptor implements FactoryBean<Object>{
//Spring IoC容器依赖注入完成后的回调方法
public void afterPropertiesSet(){
//首先调用父类HessianClientInterceptor的回调方法
//创建远程调用代理对象并设置拦截器,注意这个this参数,因为//HessianProxyFactoryBean继承HessianClientInterceptor,因此其本身也
this.serviceProxy= new ProxyFactory(getServiceInterface(), this).getProxy(getBeanClassLoader());
//Spring IoC容器的接口FactoryBean产生对象的方法,客户端通过该方法获取被管
public Class<?> getObjectType(){
return getServiceInterface();
//对象是否是单态类型,Spring默认管理的对象都是单态模式
public boolean isSingleton(){
HessianProxyFactoryBean最核心的功能就是在IoC容器回调方法中产生远程调用代理对象,在产生远程调用代理对象时,将代理对象的拦截器设置为其父类HessianClientInterceptor。
4.HessianClientInterceptor拦截客户端的远程调用请求:
HessianClientInterceptor对客户端的远程调用进行拦截,为客户端的远程调用创建Hessian代理,通过Hessian代理调用服务端远程调用对象,其源码如下:
public class HessianClientInterceptor extends UrlBasedRemoteAccessor implements MethodInterceptor{
private HessianProxyFactory proxyFactory= new HessianProxyFactory();
public void setProxyFactory(HessianProxyFactory proxyFactory){
this.proxyFactory=(proxyFactory!= null? proxyFactory: new HessianProxyFactory());
public void setSerializerFactory(SerializerFactory serializerFactory){
this.proxyFactory.setSerializerFactory(serializerFactory);
//设置Hessian是否发送java集合类型对象
public void setSendCollectionType(boolean sendCollectionType){
this.proxyFactory.getSerializerFactory().setSendCollectionType(sendCollectionType);
public void setOverloadEnabled(boolean overloadEnabled){
this.proxyFactory.setOverloadEnabled(overloadEnabled);
public void setUsername(String username){
this.proxyFactory.setUser(username);
public void setPassword(String password){
this.proxyFactory.setPassword(password);
//设置是否使用Hessian的Debug调试模式
public void setDebug(boolean debug){
this.proxyFactory.setDebug(debug);
//设置是否使用chunked端口发送Hessian请求
public void setChunkedPost(boolean chunkedPost){
this.proxyFactory.setChunkedPost(chunkedPost);
//设置Hessian等待响应的超时时长
public void setReadTimeout(long timeout){
this.proxyFactory.setReadTimeout(timeout);
//设置是否使用Hessain版本2协议解析请求和响应
public void setHessian2(boolean hessian2){
this.proxyFactory.setHessian2Request(hessian2);
this.proxyFactory.setHessian2Reply(hessian2);
//设置是否使用Hessian版本2协议解析请求
public void setHessian2Request(boolean hessian2){
this.proxyFactory.setHessian2Request(hessian2);
//设置是否使用Hessian版本2协议解析响应
public void setHessian2Reply(boolean hessian2){
this.proxyFactory.setHessian2Reply(hessian2);
//子类HessianProxyFactoryBean的回调方法调用此回调方法
public void afterPropertiesSet(){
//调用其父类UrlBasedRemoteAccessor的回调方法获取客户端配置的请求url
public void prepare() throws RemoteLookupFailureException{
this.hessianProxy= createHessianProxy(this.proxyFactory);
catch(MalformedURLException ex){
throw new RemoteLookupFailureException("Service URL ["+ getServiceUrl()+"] is invalid", ex);
protected Object createHessianProxy(HessianProxyFactory proxyFactory) throws MalformedURLException{
Assert.notNull(getServiceInterface(),"'serviceInterface' is required");
//使用Hessian代理工厂创建Hessian代理
return proxyFactory.create(getServiceInterface(), getServiceUrl());
public Object invoke(MethodInvocation invocation) throws Throwable{
if(this.hessianProxy== null){
throw new IllegalStateException("HessianClientInterceptor is not properly initialized-"+
"invoke'prepare' before attempting any operations");
ClassLoader originalClassLoader= overrideThreadContextClassLoader();
//调用Hessian代理的方法,是Hessian远程调用的入口方法,使用JDK反射机制
return invocation.getMethod().invoke(this.hessianProxy, invocation.getArguments());
catch(InvocationTargetException ex){
Throwable targetEx= ex.getTargetException();
if(targetEx instanceof InvocationTargetException){
targetEx=((InvocationTargetException) targetEx).getTargetException();
if(targetEx instanceof HessianConnectionException){
throw convertHessianAccessException(targetEx);
else if(targetEx instanceof HessianException|| targetEx instanceof HessianRuntimeException){
Throwable cause= targetEx.getCause();
throw convertHessianAccessException(cause!= null? cause: targetEx);
else if(targetEx instanceof UndeclaredThrowableException){
UndeclaredThrowableException utex=(UndeclaredThrowableException) targetEx;
throw convertHessianAccessException(utex.getUndeclaredThrowable());
throw new RemoteProxyFailureException(
"Failed to invoke Hessian proxy for remote service ["+ getServiceUrl()+"]", ex);
resetThreadContextClassLoader(originalClassLoader);
//将Hessian异常转换为Spring远程调用异常
protected RemoteAccessException convertHessianAccessException(Throwable ex){
if(ex instanceof HessianConnectionException|| ex instanceof ConnectException){
return new RemoteConnectFailureException(
"Cannot connect to Hessian remote service at ["+ getServiceUrl()+"]", ex);
return new RemoteAccessException(
"Cannot access Hessian remote service at ["+ getServiceUrl()+"]", ex);
通过上面对HessianClientInterceptor的源码分析,我们可以看到Hessian客户端拦截器提供的最重要的方法是对远程调用拦截的方法invoke,在该方法中使用JDK的反射机制调用Hessian代理对象的指定方法。而Hessian代理是由Hessain代理器工厂HessianProxyFactory产生的,这个Hessian代理器工厂是有Hessian提供的。