车联网架构设计(一)_消息平台的搭建

本文详细描述了车联网平台的架构设计,涉及MQTT通信、车辆消息处理、V2X应用、数据存储与分析,以及使用EMQX、Kafka和HAProxy实现的高可用性和安全性措施。

车联网是物联网的一个主要应用方向,车辆通过连接车联网平台,实时进行消息的交互,平台可以提供车辆远程控制,故障检测,车路协同等各方面的功能。

我在车联网行业从事了很长时间的技术工作,参与了整个车联网平台的构建以及很多不同车联网应用的开发工作,这里打算以构建一个车联网平台作为例子,总结一下涉及到的架构设计方面的东西。

系统功能

一个车联网平台需要实现以下的一些功能:

1. 与车辆的消息交互

在物联网中,主要应用的通信协议是MQTT,这是一个基于发布/订阅模式的物联网通信协议,具备了支持QoS,简单易实现,报文紧凑等特点。在车联网中,大部分的车企也是采用MQTT协议来进行通讯。因此在车联网的架构中,我们需要考虑设置一个MQTT Broker集群来与大量的车辆进行连接通信。目前有很多的开源的Broker,例如ActiveMQ, EMQ, RocketMQ等等,其中EMQ和RocketMQ都是国内的产品,有详尽的中文资料介绍。这里我选择EMQ作为MQTT Broker。

2. 车辆消息的消费与存储

MQTT Broker接收到车辆的消息后,需要把消息给到上层应用来进行处理。我们可以把这些消息保存到数据库或者转发到一个消息队列来缓存。这里我选择Kafka。上层应用通过订阅Kafka主题,来获得其需要的相关车辆信息,进行处理。上层应用也可以把要下发给车辆的消息发送到Kafka的主题,然后让MQTT Broker再转发给车辆,也可以直接通过MQTT主题发布消息的方式来直接发送给车辆。

3. V2X应用

包括了V2V, V2I, V2P等应用场景,车辆需要能和不同的数据源进行消息交互,从而为驾驶提供决策信息。我将基于这个平台展示一些V2X应用的开发设计,实现3GPP规范里面制定的一些V2X场景。

4. 车辆数据分析与报表

车联网平台每天都收集和生成了大量的数据,通过对这些数据进行发掘分析,可以更好的了解业务运行的情况,同时也可以更好的为商业决策提供参考。我们可以基于目前流行的大数据处理平台,例如Spark/Beam/Flink等,对数据进行即时的处理,保存到数据仓库,随后再进行各种数据分析和报表呈现。

在这篇文章中,我先对以上提到的第一点功能进行介绍,搭建一个MQTT消息平台。

MQTT消息平台

我选择EMQX来搭建这个平台,EMQX是国内的一个优秀的MQTT broker软件,有企业版和开源版,这里我选择开源版。在官网上有介绍安装方式,在Kubernetes上是采用Operator的方式来安装的,但是我这里采用kustomization的方式来安装,因为这样方便我进行一些设置上的改动。在我本地用minikube启动了一个kubernetes cluster。

安装EMQX集群

定义一个新的namespace

apiVersion: v1
kind: Namespace
metadata:
  name: emqx

为这个namespace创建一个service account并赋予相关权限

apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: emqx
  name: emqx
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: emqx
  name: emqx
rules:
- apiGroups:
  - ""
  resources:
  - endpoints 
  verbs: 
  - get
  - watch
  - list
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: emqx
  name: emqx
subjects:
  - kind: ServiceAccount
    name: emqx
    namespace: emqx
roleRef:
  kind: Role
  name: emqx
  apiGroup: rbac.authorization.k8s.io

定义一个configmap,因为我们要创建一个statefulset的emqx多个节点,要实现auto cluster的功能,自动把这多个节点组成一个cluster,因此需要定义相关的配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: emqx-config
  namespace: emqx
data:
  EMQX_NAME: "emqx"
  EMQX_CLUSTER__DISCOVERY_STRATEGY: "k8s"
  EMQX_CLUSTER__K8S__SERVICE_NAME: "emqx-headless"
  EMQX_CLUSTER__K8S__NAMESPACE: "emqx"
  EMQX_CLUSTER__K8S__ADDRESS_TYPE: "hostname"
  EMQX_CLUSTER__K8S__APISERVER: "https://kubernetes.default.svc:443"
  EMQX_CLUSTER__K8S__SUFFIX: "svc.cluster.local"

定义一个headless的service,用于statefulset的服务暴露和通信。

apiVersion: v1
kind: Service
metadata:
  name: emqx-headless
  namespace: emqx
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: emqx
  ports:
  - name: mqtt
    port: 1883
    protocol: TCP
    targetPort: 1883
  - name: mqttssl
    port: 8883
    protocol: TCP
    targetPort: 8883
  - name: mgmt
    port: 8081
    protocol: TCP
    targetPort: 8081
  - name: websocket
    port: 8083
    protocol: TCP
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gzroy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值