[Update]Adas多屏代码更改、Netty框架自定义协议并解决粘包/拆包问题

This commit is contained in:
chenfufeng
2022-02-14 16:02:59 +08:00
parent d9b8bbb593
commit 0f7a2453d8
14 changed files with 127 additions and 25 deletions

View File

@@ -18,10 +18,21 @@ import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.telematic.MogoProtocolMsg
import com.mogo.telematic.MogoProtocolMsg.NORMAL_DATA
import com.mogo.telematic.NSDNettyManager
import com.mogo.telematic.client.listener.NettyClientListener
import com.mogo.telematic.client.status.ConnectState
import com.mogo.telematic.server.netty.NettyServerListener
import com.zhidao.support.adas.high.AdasManager
import com.zhidao.support.adas.high.bean.IPCUpgradeInfo
import com.zhidao.support.adas.high.common.CupidLogUtils
import io.netty.channel.Channel
import java.util.concurrent.TimeUnit
import com.zhidao.support.adas.high.AdasOptions
import io.netty.channel.ChannelFuture
import java.util.*
/**
* @author xiaoyuzhou
@@ -47,17 +58,104 @@ class MoGoAutopilotProvider :
// TODO 临时方案根据不同的身份标识连接不同的工控机IP
when (FunctionBuildConfig.appIdentityMode) {
0 -> // 司机
AdasManager.getInstance().create(context, "192.168.1.102")
{
// "192.168.1.102"
val options = AdasOptions.Builder().setClient(false).build()
AdasManager.getInstance().create(context, options)
NSDNettyManager.getInstance().startNSDNettyServer(context, object : NettyServerListener<MogoProtocolMsg> {
override fun onMessageResponseServer(
msg: MogoProtocolMsg?,
ChannelId: String?
) {
Logger.d(TAG, "Receive client data is:${msg?.toString()}")
}
override fun onStartServer() {
Logger.d(TAG, "onStartServer")
}
override fun onStopServer() {
Logger.d(TAG, "onStopServer")
}
override fun onChannelConnect(channel: Channel?) {
// TODO:("暂时保存一个Client的channel后面管理多个Client的channel")
NSDNettyManager.getInstance().selectChannel(channel)
val socketAddress = channel?.remoteAddress().toString()
Logger.d(TAG, "Client ip is:${socketAddress}")
}
override fun onChannelDisConnect(channel: Channel?) {
Logger.d(TAG, "onChannelDisConnect")
}
})
}
1 -> // 乘客
AdasManager.getInstance().create(context, "192.168.1.103")
{
// "192.168.1.102"
val options = AdasOptions.Builder().build()
AdasManager.getInstance().create(context, options)
NSDNettyManager.getInstance().searchAndConnectServer(context, object : NettyClientListener<MogoProtocolMsg> {
override fun onMessageResponseClient(msg: MogoProtocolMsg?, index: Int) {
Logger.d(TAG, "收到司机端的数据!")
// 乘客端收到adas数据直接解析后续分发解析后的数据流程同司机端
msg?.let {
AdasManager.getInstance().parseIPCData(it.body)
Logger.d(TAG, "解析司机端数据完毕!")
}
}
override fun onClientStatusConnectChanged(statusCode: Int, index: Int) {
when (statusCode) {
ConnectState.STATUS_CONNECT_SUCCESS -> Logger.d(TAG, "乘客端连接司机端服务成功! index is:${index}")
else -> Logger.d(TAG, "client statusCode is:${statusCode}")
}
}
})
}
//
else -> // 默认采用UDP寻址方式
AdasManager.getInstance().create(context)
{
val options = AdasOptions.Builder().setClient(false).build()
AdasManager.getInstance().create(context, options)
}
}
//////////////////////////////////注意先后顺序AdasManager.getInstance().create后才可以设置监听/////////////////////////////////////////////
// 监听 adas 连接状态
AdasManager.getInstance().setOnAdasConnectStatusListener(MoGoAdasMsgConnectStatusListenerImpl())
// 监听ADAS-SDK获取到的工控机数据
// 监听ADAS-SDK获取到的工控机数据(乘客也需注册)
AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl())
// 司机端监听
if (FunctionBuildConfig.appIdentityMode == 0) {
AdasManager.getInstance().setOnMultiDeviceListener { bytes ->
Logger.d(
TAG,
"司机端接收到工控机吐出来的数据为:${Arrays.toString(bytes)}"
)
// 发送数据给乘客端
if (NSDNettyManager.getInstance().isServerStart) {
Logger.d(
TAG,
"司机端透传数据给乘客端!"
)
NSDNettyManager.getInstance().sendMogoProtocolMsgToClient(MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes)) { channelFuture: ChannelFuture ->
if (channelFuture.isSuccess) {
Logger.d(
TAG,
"Send data to client is success."
)
} else {
Logger.d(
TAG,
"Send data to client is failure."
)
}
}
} else {
Logger.d(TAG, "司机端Server未启动")
}
}
}
// 同步数据给工控机的服务
AsyncDataToAutopilotServer.INSTANCE.initServer()
}