{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671518037859,"data":{"id":71713915,"title":"17.5 通道管理","slug":"xdgirl","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"

数据流示意图

说明:HMI的多屏TBT(引导、算路、定位)、视图会根据配置在BL层进行序列化,然后通过通道同步到各个视图生效。自定义数据需要HMI自行进行序列化。BL提供了两种通道模式,在通道服务初始化时设置

  1. BL内置的socket通道:HMI设置主副屏及端口号即可实现不同设备的多屏消息通信。
  2. BL提供的通道代理:上层有需要时可以自行实现不同设备间的通信通道,对接BL提供的通道代理能力即可传输消息到多屏模块。见 17.5.1 通道代理

时序图

服务初始化&反初始化



通道代理

核心接口

boolean com.autonavi.gbl.consis.ChannelService.addObserver(IChannelProxyObserver pObserver)

boolean com.autonavi.gbl.consis.ChannelService.addObserver(IChannelObserver pObserver)

boolean com.autonavi.gbl.consis.ChannelService.addObserver(IConsisObserver pObserver)

boolean com.autonavi.gbl.consis.ChannelService.addChannel(String channelName, IChannelMessageObserver pObserver)

com.autonavi.gbl.consis.ChannelService.sendMessage(CustomChannelMessageParam param)

com.autonavi.gbl.consis.obServer.IChannelMessageObserver.onNotifyMsg(ChannelMsgHead info, ChannelParcel data)

com.autonavi.gbl.consis.ChannelParcel.writeXXX()

com.autonavi.gbl.consis.ChannelParcel.readXXX()

static void com.autonavi.gbl.consis.ChannelSerializeControl.writeToParcel(ChannelParcel parcel, RouteOption data)

static void com.autonavi.gbl.consis.ChannelSerializeControl.readFromParcel(ChannelParcel parcel,IRouteOption data)

调用示例

通道初始化

/*< 获取通道服务实例 */\nChannelService mChannelService = (ChannelService)ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.ChannelServiceID);\nif (mChannelService == null) {\n    return false;\n}\n\n/*< 从配置文件等获取当前进程的主副屏属性 */\nboolean isMaster = getConfig("isMasterDisplay");\n\n/*< 通道初始化 */\nChannelInitParam initParam = new ChannelInitParam();\ninitParam.enableConsis = true;  //这里配置是否需要开启一致性\ninitParam.host = "127.0.0.1";\ninitParam.port = 1234;\n/*< 从配置文件等获取当前进程的主副屏属性 */\ninitParam.isMaster = getConfig("isMasterDisplay");\ninitParam.useInnerChannel = true;\n/*< 设置本SDK的名字,唯一标识,不可重复,主屏的SDKName内部固化,无须设置 */\ninitParam.localSdkName = "client-A";\nmChannelService.init(initParam);\n\n//1. 初始化通道服务后设置AddObserver,否则设置会失效\n//2. 释放pObserver时设置AddObserver为空防止空指针\n//3. 实现方式见下文“通道连接观察者实现”\nIChannelProxyObserver ob = new IChannelProxyObserver;\nmChannelService.addObserver(ob);\n//4. 实现方式见下文“通道创建观察者实现”\nIChannelObserver obCreate = new IChannelObserver;\nmChannelService.addObserver(obCreate);\n//5. 实现方式见下文“用户自定义数据接收”\nIChannelMessageObserver obCreate = new IChannelMessageObserver;\nmChannelService.addChannel(SdkName, IChannelMessageObserver);

通道连接观察者实现

class MultiChannelProxyObserver extends IChannelProxyObserver\n{\n    \n    @Override\n    public void onChannelProxyConnect(String sdkName)\n    {\n        //通道连接时连接上的SdkName\n        msdkName = sdkName;\n    }\n\n    @Override\n    public void onChannelProxyDisconnect(String sdkName)\n    {\n        //通道断开时将保存的对应通道名字置空\n        if (msdkName == sdkName)\n        {\n            msdkName = "";\n        }\n    }\n}

通道创建观察者实现

class MultiChannelObserver extends IChannelObserver\n{\n    \n    @Override\n    public void onChannelCreate(String sdkName, String channelName)\n    {\n        //通道对象创建时回调\n        msdkName = sdkName;\n        mchannelName = channelName;\n    }\n\n    @Override\n    public void onChannelDestroy(String sdkName, String channelName)\n    {\n        //通道断开连接回调时将保存的对应通道名字置空\n        if (msdkName == sdkName)\n        {\n              msdkName = "";\n              mchannelName = "";\n        }\n    }\n}

用户自定义数据发送

{\n    if (mChannelService != NULL)\n    {\n        //准备要发送的数据,以下只是举例,可以封装任意数据\n        //localSdkName为当前的sdkName,与InitChannelParam参照中的localSdkName一致\n        //receiverSdkName为需要发送自定义消息的对象,该name在OnChannelProxyConnect回调时会通知,主屏存在多个receiverSdkName需要自行管理\n        CustomChannelMessageParam messageParam = new CustomChannelMessageParam();\n        messageParam.senderChannelName = localSdkName;\n        messageParam.receiverChannelName = receiverSdkName;\n        channelParcel data = new channelParcel;\n        data.writeInt(12345678);\n        data.writeString("87654321");\n        writeToParcel(data, routeOption);\n        messageParam.customData = data;\n        mChannelService.SendMessage(messageParam);\n    }\n}

用户自定义数据接收

class MultiChannelMessageObserver extends IChannelMessageObserver\n{\n    \n    @Override\n    public void onNotifyMsg(ChannelMsgHead info, ChannelParcel data)\n    {\n       //如果onNotifyMsg回调的数据需要转线程处理,则将SDK回调的数据进行数据拷贝处理\n       ChannelMsgHead channelMsgHead = new ChannelMsgHead();\n       channelMsgHead.customCode = info.customCode;\n       channelMsgHead.senderName = info.senderName;\n       channelMsgHead.receiverName = info.receiverName;\n       byte[] buf = data.getBuf() == null ? new byte[]{} : data.getBuf();\n       byte[] bytes = Arrays.copyOf(buf, buf.length);\n       ChannelParcel channelParcel = new ChannelParcel(bytes);\n       //自定义消息通知时回调info中携带了发送者和接收者的sdkName信息\n       //以读取两个整数为例,顺序与写入顺序一致.\n       //数据发送方式见下文“用户自定义数据发送”\n       //注意:数据发送/接收顺序需匹配,否则会引起崩溃!\n       //更多用法见API手册channelParcel\n       String senderName = info.getSenderName();\n       String receiverName = info.getReceiverName();\n       int recvInt = data->readInt();\n       String recvString = data->readString();\n       RouteOption recvRouteOption = readFromParcel(data);\n    }\n\n    @Override\n    public void onChannelDestroy(String sdkName, String channelName)\n    {\n        //通道断开连接回调时将保存的对应通道名字置空\n        if (msdkName == sdkName)\n        {\n              msdkName = "";\n              mchannelName = "";\n        }\n    }\n}
","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-09-01 07:46:46","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":93,"collectCount":0,"estimateDate":12,"docStatus":0,"permissions":true,"overView":false}}