MQTT源码解析

 

一、MQTT的创建和connect流程

1.Android端实现mqtt,首先会new一个MqttAndroidClient,并传入需要的参数。

首先,MqttAndroidClient是如何创建的呢?

public MqttAndroidClient(Context context, String serverURI,
			String clientId, MqttClientPersistence persistence, Ack ackType) {
		myContext = context;
		this.serverURI = serverURI;
		this.clientId = clientId;
		this.persistence = persistence;
		messageAck = ackType;
	}

MqttAndroidClient本身是继承Broadcast的子类,他的构造器需要传入上面的参数,必须传入的为

public MqttAndroidClient(Context context, String serverURI,
			String clientId) {
		this(context, serverURI, clientId, null, Ack.AUTO_ACK);
	}

2.connect的核心方法:

@Override
	public IMqttToken connect(MqttConnectOptions options, Object userContext,
			IMqttActionListener callback) throws MqttException {

		IMqttToken token = new MqttTokenAndroid(this, userContext,
				callback);

		connectOptions = options;
		connectToken = token;

		/*
		 * The actual connection depends on the service, which we start and bind
		 * to here, but which we can't actually use until the serviceConnection
		 * onServiceConnected() method has run (asynchronously), so the
		 * connection itself takes place in the onServiceConnected() method
		 */
		if (mqttService == null) { // First time - must bind to the service
			Intent serviceStartIntent = new Intent();
			serviceStartIntent.setClassName(myContext, SERVICE_NAME);
			Object service = myContext.startService(serviceStartIntent);
			if (service == null) {
				IMqttActionListener listener = token.getActionCallback();
				if (listener != null) {
					listener.onFailure(token, new RuntimeException(
							"cannot start service " + SERVICE_NAME));
				}
			}

			// We bind with BIND_SERVICE_FLAG (0), leaving us the manage the lifecycle
			// until the last time it is stopped by a call to stopService()
			myContext.bindService(serviceStartIntent, serviceConnection,
					Context.BIND_AUTO_CREATE);

			if (!receiverRegistered) registerReceiver(this);
		}
		else {
			pool.execute(new Runnable() {

				@Override
				public void run() {
					doConnect();
					
					//Register receiver to show shoulder tap.
					if (!receiverRegistered) registerReceiver(MqttAndroidClient.this);
				}

			});
		}

		return token;
	}

返回一个IMqttToken对象,这里首先new一个MqttTokenAndroid对象,然后去判断是否存在MqttService实例。

没有的话会创建一个,如果创建失败直接调用IMqttActionListener的onFailure回调。

成功的话绑定一个bindService,传入ServiceConnection参数对象。

而ServiceConnection的成功回调中有个doConnect()方法,里面会调用MqttService的connect方法从而建立Mqtt的连接。

而在MqttService的connect方法里面,会创建一个MqttConnection对象,调用他的connect方法。

而MqttConnection的connect方法里面会判断是否有MqttAsyncClient实例,如果没有会创建他的实例并调用他的connect方法

// if myClient is null, then create a new connection
			else {
				alarmPingSender = new AlarmPingSender(service);
				myClient = new MqttAsyncClien
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Thingsboard是一个开源的物联网平台,它提供了一个完整的解决方案来连接物理设备和云端系统,以便于数据的传输和管理。Thingsboard的源码是开源的,允许开发者自由地定制和修改它的功能和特性,从而满足各种不同的物联网应用场景的需求。 Thingsboard的源码解析主要包括以下几个方面: 1. 系统架构和组件:Thingsboard采用了分布式架构设计,包括多个组件,在设备端包括嵌入式平台、传感器等,云端包括数据存储、消息队列、规则引擎等。源码解析可以了解到每个组件的功能和相互协作关系。 2. 数据传输和管理:Thingsboard采用了多种协议和技术来实现数据的传输和管理,包括MQTT、HTTP、CoAP等,同时还采用了数据缓存和异步处理等技术来保证数据的高可靠性和处理效率。源码解析可以深入了解这些技术和实现方式。 3. 规则引擎和数据分析:Thingsboard的规则引擎和数据分析功能可以自定义和配置各种数据处理和转换规则,并提供可视化的工具来实现数据分析和可视化展示。源码解析可以了解到规则引擎和数据分析的具体实现方式和应用场景。 4. 用户界面和可定制性:Thingsboard提供了丰富的用户界面和可定制性特性,包括可拖拽的页面设计、自定义样式和主题、Dashboard等。源码解析可以了解到这些特性的实现方式和技术实现。 总之,Thingsboard的源码是一个非常受欢迎的开源物联网平台的源码,通过对其源码解析可以深入了解其技术实现和应用场景,为开发者提供了很多有价值的经验和教训。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值