(接上篇)
eventbus 的具体逻辑剖析
从eventbus的启动函数切入分析具体逻辑,具体如下所示。
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| KubeEdge/edge/pkg/eventbus/event_bus.go |
| func (eb *eventbus) Start(c *context.Context) { // no need to call TopicInit now, we have fixed topic eb.context = c nodeID := config.CONFIG.GetConfigurationByKey("edgehub.controller.node-id") ... mqttBus.NodeID = nodeID.(string) mqttBus.ModuleContext = c if eb.mqttMode >= bothMqttMode { // launch an external mqtt server externalMqttURL := config.CONFIG.GetConfigurationByKey("mqtt.server") ... hub := &mqttBus.Client{ MQTTUrl: externalMqttURL.(string), } mqttBus.MQTTHub = hub hub.InitSubClient() hub.InitPubClient() } if eb.mqttMode <= bothMqttMode { internalMqttURL := config.CONFIG.GetConfigurationByKey("mqtt.internal-server") ... qos := config.CONFIG.GetConfigurationByKey("mqtt.qos") ... retain := config.CONFIG.GetConfigurationByKey("mqtt.retain") ... sessionQueueSize := config.CONFIG.GetConfigurationByKey("mqtt.session-queue-size") ... if qos.(int) < int(packet.QOSAtMostOnce) || qos.(int) > int(packet.QOSExactlyOnce) || sessionQueueSize.(int) <= 0 { klog.Errorf("mqtt.qos must be one of [0,1,2] or mqtt.session-queue-size must > 0") os.Exit(1) } // launch an internal mqtt server only mqttServer = mqttBus.NewMqttServer(sessionQueueSize.(int), internalMqttURL.(string), retain.(bool), qos.(int)) mqttServer.InitInternalTopics() err := mqttServer.Run() ... } eb.pubCloudMsgToEdge() } |
eventbus的启动函数做了如下3件事。
1) 处理eventbus模块的公共配置,具体如下所示。
|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| eb.context = c nodeID := config.CONFIG.GetConfigurationByKey("edgehub.controller.node-id") ... mqttBus.NodeID = nodeID.(string) mqttBus.ModuleContext = c |
接收并存储与EdgeCore其他模块通信的管道,从配置文件中获取所在节点的唯一标识。
2) 根据不同mqttMode启动与mqtt交互的不同实例,具体如下所示。
|---------------------------------------------------------------------------------|
| if eb.mqttMode >= bothMqttMode { ... } if eb.mqttMode <= bothMqttMode { ... } |
当 eb.mqttMode >= bothMqttMode将mqtt代理启动在eventbus之外,eventbus作为独立启动的mqtt代理的客户端与其交互;当eb.mqttMode <= bothMqttMode时,在eventbus内启动一个mqtt代理,负责与终端设备交互。
3)将云部分的指令和事件下发到与eventbus相连的设备,具体如下所示。
|------------------------|
| eb.pubCloudMsgToEdge() |
「 未完待续...... 」