钛极OS之MQTT MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务,详细请参考:https://en.wikipedia.org/wiki/MQTT 或 mqtt.org 了解更多信息。 目前主流的物联云厂商均支持MQTT, 如Amazon, 百度云,阿里云等等, TiJOS 提供符合MQTT 3.1.1标准协议的MQTT Client, 可与所有支持MQTT 协议的服务器直接连接, 如百度物联云及阿里物联云。 Java包 tijos.framework.networkcenter.mqtt TiJOS MQTT Client 包括如下类:
类名 | 说明 | MqttClient | Mqtt客户端 | MqttConnectOptions | Mqtt连接项设置 | MqttClientListener | Mqtt消息监听接口 | MqttException | Mqtt异常 |
TiJOS MQTT Client 支持TCP和SSL两种通讯方式, 符合MQTT3.1.1标准规范,支持QOS0,1,2, 支持高性能异步API, 在处理MQTT协议过程中通过事件回调返回操作结果, 可支持突发模式"burst-mode"客户端请求, 实现快速发布无等待, 避免客户端资源等待。 MQTT 连接配置 MQTT 连接配置通过MqttConnectOptions 类进行,可进行如下配置:
配置项 | MqttConnectOptions | 说明 | CleanSession | setCleanSession(boolean) | 设置 Client断开连接后Server是否应该保存Client的订阅信息 | UserName | setUserName(String) | 用户名 | Password | setPassword(String) | 密码 | LWT | setWill(String, byte[], int, boolean) | "Last Will and Testament" (LWT), 具体请参考MQTT协议 | KeepAliveInterval | setKeepAliveInterval(int) | 设置客户端与服务器之间最大空闲时间,以秒为单位,默认60秒 | ConnectionTimeout | setConnectionTimeout(int) | 客户连接服务器超时设置,秒为单位,默认10秒 | AutomaticReconnect | setAutomaticReconnect(boolean) | 设置是否自动重新连接 |
MQTT服务器地址及客户端ClientID通过MqttClient初始化时进行设置。 MQTT 连接建立步骤
-
通过MqttConnectOptions设置相应的连接参数:
- <font size="3">MqttConnectOptions connOpts = new MqttConnectOptions();
- connOpts.setUserName(username);
- connOpts.setPassword(password);
- connOpts.setAutomaticReconnect(true);</font>
复制代码 -
设置MQTT服务器地址及ClientID, 以百度物联云服务器为例:
- <font size="3">final String broker = "tcp://tijos.mqtt.iot.gz.baidubce.com:1883";
- final String clientId = "mqtt_test_java_client1";
-
- MqttClient mqttClient = new MqttClient(broker, clientId);</font>
复制代码 -
设置事件监听并连接服务器
- <font size="3">mqttClient.SetMqttClientListener(new MqttEventLister());
- mqttClient.connect(connOpts, mqttClient);</font>
复制代码 -
连接成功或失败时会通过MqttClientListener中onMqttConnectSuccess或onMqttConnectFailure返回, 用户也可以不使用突发模式直接进行topic的发布和订阅以提高性能。 MQTT 客户端通过异步事件的方式处理MQTT连接和断开响应, 消息调用过程如下:
MQTT 事件监听 MQTT的通过IMqttClientListener事件回调来处理事件,事件类型包括:
事件 | 说明 | connectComplete(Object, boolean) | 当网络连接成功或重新连接成功时调用 | connectionLost(Object) | 当网络断开或连接失败时调用 | onMqttConnectSuccess(Object ) | 当MQTT CONNECT消息返回成功时调用,意味着MQTT SERVER接受该连接 | onMqttConnectFailure(Object, int ) | 当MQTT CONNECT消息返回失败时调用,意味着MQTT SERVER不接受该连接, 具体原因可通过第二个参数获得 | messageArrived(Object, String, byte[]) | 当服务器端发送topic更新时调用 | publishCompleted(Object, int, String, int) | 当客户端PUBLISH成功后调用 | subscribeCompleted(Object, int, String, int) | 当客户端SUBSCRIBE成功后调用 | unsubscribeCompleted(Object, int, String, int) | 当客户端UNSUBSCRIBE成功时 |
MQTT Topic 发布和订阅 MQTT协议主要来进行topic的发布和订阅,即将数据发布到服务器和从服务器获得最数据更新,这主要通过MqttClient的publish和subscribe函数来完成:
- <font size="3">String topic = "topic2";
- String content = "Message from MQTT IoT demo";
- int Qos = 1;
- boolean retain = false;
-
- int msgId = mqttClient.subscribe(topic, Qos);
- msgId = mqttClient.publish(topic, content.getBytes(), Qos, retain);</font>
复制代码 publish和subscribe 返回msgId 用于标识本次操作,当操作完成后的事件回调中可通过msgId或topic名称来获得当前事件的执行结果。 注意:
更多详细介绍请见钛云物联官网:www.tijos.net |