Files
MoGoAiCloudSdk/libraries/mogo-telematic/src/main/java/com/mogo/telematic/NSDNettyManager.java

283 lines
9.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.mogo.telematic;
import android.content.Context;
import android.net.nsd.NsdServiceInfo;
import com.elegant.log.simplelog.Logger;
import com.mogo.telematic.client.NettyTcpClient;
import com.mogo.telematic.client.NsdClient;
import com.mogo.telematic.client.listener.MessageStateListener;
import com.mogo.telematic.client.listener.NettyClientListener;
import com.mogo.telematic.server.NSDServer;
import com.mogo.telematic.server.netty.NettyServerListener;
import com.mogo.telematic.server.netty.NettyTcpServer;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFutureListener;
public class NSDNettyManager {
private static final String TAG = "NSDNettyManager";
private volatile static NSDNettyManager sInstance;
// client端用来过滤的
public static final String SERVER_NAME = "NSD_SERVER";
private NSDServer mNsdServer;
private NettyTcpClient mNettyTcpClient;
private NsdClient mNsdClient;
private Context mContext;
private NettyServerListener mListener;
private NSDNettyManager() {
}
public static NSDNettyManager getInstance() {
if (sInstance == null) {
synchronized (NSDNettyManager.class) {
if (sInstance == null) {
sInstance = new NSDNettyManager();
}
}
}
return sInstance;
}
private final NettyServerListener mDefaultServerListener = new NettyServerListener() {
@Override
public void onMessageResponseServer(Object msg, Channel channel) {
if (msg instanceof MogoProtocolMsg && mListener != null) {
mListener.onMessageResponseServer(msg, channel);
}
}
@Override
public void onStartServer() {
registerNsdServer();
if (mListener != null) {
mListener.onStartServer();
}
}
@Override
public void onStopServer() {
if (mNsdServer != null) {
mNsdServer.stopNSDServer();
}
if (mListener != null) {
mListener.onStopServer();
}
}
@Override
public void onChannelConnect(Channel channel) {
if (mListener != null) {
mListener.onChannelConnect(channel);
}
}
@Override
public void onChannelDisConnect(Channel channel) {
if (mListener != null) {
mListener.onChannelDisConnect(channel);
}
}
};
/**
* 启动Netty和NSD服务的Server端
*
* @param context
* @param listener
*/
public void startNSDNettyServer(Context context, NettyServerListener listener) {
if (context == null) {
throw new RuntimeException("Context must not be null!");
} else {
mContext = context;
}
mListener = listener;
NettyTcpServer nettyTcpServer = NettyTcpServer.getInstance();
if (!nettyTcpServer.isServerStart()) {
nettyTcpServer.setListener(mDefaultServerListener);
nettyTcpServer.start();
} else {
Logger.i(TAG, "服务端已开启,断开连接!");
NettyTcpServer.getInstance().disconnect();
}
}
public void startNSDNettyServerWithSN(Context context, NettyServerListener listener, String sn) {
NettyTcpServer.sSERVER_SN = sn;
startNSDNettyServer(context, listener);
}
public boolean isServerStart() {
return NettyTcpServer.getInstance().isServerStart();
}
public void sendMogoProtocolMsgToClient(MogoProtocolMsg mogoProtocolMsg, ChannelFutureListener listener) {
NettyTcpServer.getInstance().sendMsgToClient(mogoProtocolMsg, listener);
}
public void sendMsgToAllClients(MogoProtocolMsg mogoProtocolMsg) {
NettyTcpServer.getInstance().sendMsgToAllClients(mogoProtocolMsg);
}
public void sendMsgToSpecifiedClient(MogoProtocolMsg mogoProtocolMsg, Channel channel, ChannelFutureListener listener) {
NettyTcpServer.getInstance().sendMsgToSpecifiedClient(mogoProtocolMsg, channel, listener);
}
/**
* 服务器端注册一个可供NSD探测到的网络 Ip 地址便于给展示叫号机连接此socket
*/
private final Runnable mNsdServerRunnable = new Runnable() {
@Override
public void run() {
if (mNsdServer == null) {
mNsdServer = new NSDServer();
}
mNsdServer.startNSDServer(mContext, NettyTcpServer.SERVER_NAME, NettyTcpServer.SERVER_PORT);
mNsdServer.setRegisterState(new NSDServer.IRegisterState() {
@Override
public void onServiceRegistered(NsdServiceInfo serviceInfo) {
Logger.i(TAG, "已注册服务onServiceRegistered: " + serviceInfo.toString());
//已经注册可停止该服务
// nsdServer.stopNSDServer();
}
@Override
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
}
@Override
public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
}
@Override
public void onUnRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
}
});
}
};
private void registerNsdServer() {
new Thread(mNsdServerRunnable).start();
}
/**
* 选择连接的Client端的channel
*
* @param channel
*/
public void selectChannel(Channel channel) {
NettyTcpServer.getInstance().selectorChannel(channel);
}
/**
* 搜索并连接Netty服务端
*
* @param context
*/
public void searchAndConnectServer(Context context, String uuid, NettyClientListener listener) {
if (mNsdClient == null) {
mNsdClient = new NsdClient(context, SERVER_NAME, new NsdClient.IServerFound() {
@Override
public void onServerFound(NsdServiceInfo info, int port) {
if (info != null) {
String hostAddress = info.getHost().getHostAddress();
Logger.d(TAG, "NSD查询到指定服务器信息ip为" + hostAddress + ",port为" + port);
//获取到指定的地址进行Netty的连接
connectNettyServer(hostAddress, port, uuid, listener);
if (info.getServiceName().equals(SERVER_NAME)) {
//扫描到以后停止
mNsdClient.stopServiceDiscovery();
}
}
}
@Override
public void onServerFail() {
}
});
}
mNsdClient.startNSDClient();
}
private void connectNettyServer(String serverAddress, int port, String sign, NettyClientListener listener) {
Logger.d(TAG, "connectNettyServer");
if (serverAddress == null || serverAddress.length() == 0) {
Logger.e(TAG, "Netty Server的ip不能为空");
return;
}
if (mNettyTcpClient == null) {
mNettyTcpClient = new NettyTcpClient.Builder()
.setHost(serverAddress) //设置服务端地址
.setTcpPort(port) //设置服务端端口号
.setMaxReconnectTimes(5) //设置最大重连次数
.setReconnectIntervalTime(5) //设置重连间隔时间。单位:秒
.setSendHeartBeat(true) //设置是否发送心跳
.setHeartBeatInterval(120) //设置心跳间隔时间。单位:秒
.setHeartBeatData(new MogoProtocolMsg(MogoProtocolMsg.HEART_DATA, 2, new byte[]{0x00, 0x00})) //设置心跳数据可以是String类型也可以是byte[],以后设置的为准
.setSign(sign) //设置客户端标识.(因为可能存在多个tcp连接)
.build();
if (listener != null) {
mNettyTcpClient.setListener(listener); //设置TCP监听
}
}
if (!mNettyTcpClient.getConnectStatus()) {
mNettyTcpClient.connect();//连接服务器
} else {
mNettyTcpClient.disconnect();
}
}
public boolean getConnectStatus() {
return mNettyTcpClient != null && mNettyTcpClient.getConnectStatus();
}
public String getConnServerIp() {
if (mNettyTcpClient == null) {
return "";
} else {
return mNettyTcpClient.getHost();
}
}
public String getServerSn() {
String sn = NettyTcpClient.sSERVER_SN;
return sn;
}
public void sendMogoProtocolMsgToServer(MogoProtocolMsg mogoProtocolMsg, final MessageStateListener listener) {
if (mNettyTcpClient != null) {
mNettyTcpClient.sendMsgToServer(mogoProtocolMsg, listener);
}
}
public static String bytesToHexFun(byte[] bytes, int length) {
StringBuilder buf = new StringBuilder(length * 2);
for (int i = 0; i < length; i++) {// 使用String的format方法进行转换
buf.append(String.format("%02x", new Integer(bytes[i] & 0xFF)));
}
return buf.toString();
}
/**
* 断开Netty连接
*/
public void disconnect() {
if (mNettyTcpClient != null) {
mNettyTcpClient.disconnect();
}
}
}