Flutter MQTT通信插件kinnow_mqtt的使用
Flutter MQTT通信插件kinnow_mqtt的使用
1. 生命周期管理
Kinnow Mqtt客户端会自动重试连接如果连接失败。如果连接断开后重新连接成功,它也会自动进行重连。生命周期将在后续部分详细解释。
2. 详细的洞察
Kinnow Mqtt客户端函数将返回任何相应的确认数据包。例如,调用subscribe将返回由代理发送的SubAck数据包。对于publishQos1调用,将返回PubAck。对于没有调用触发的事件(如ping请求和响应),提供了一个事件流。
3. 适用于不可靠网络
该库旨在处理不可靠网络。客户端确保操作完成,无论连接状态如何。这意味着用户在开始任何操作之前不需要监控连接状态。
客户端生命周期
名称来源
Kinnow(发音为kee-noo)是一种在巴基斯坦和印度种植的水果。它与橙子非常相似,但口感稍微不那么酸,果肉更多。
贡献
项目仍处于初期阶段,需要您的帮助!如果您遇到任何问题,请务必报告。如果您有任何功能请求,请在问题中提及。
路线图
- 添加对Websockets的支持。
- Mqtt消息存储(正在开发中)。
- 实现认证数据包。
- 处理服务器发起的断开连接。
使用示例
import 'package:kinnow_mqtt/kinnow_mqtt.dart';
void main() async {
// 创建一个MQTT客户端实例
final client = KinnowMqttClient(
TcpMqttNetworkConnection("your.brokers.address.here.com", 1883)
);
// 设置连接参数
final connPkt = ConnectPacket(
cleanStart: true,
lastWill: null,
keepAliveSeconds: 60,
username: null,
password: null,
);
// 开始连接并监听事件流
final eventStream = client.begin(connPkt);
eventStream.listen((event) => print(event.runtimeType));
// 发布QoS 0的消息
await client.publishQos0(TxPublishPacket(
false,
"kinnowTestTopic",
StringOrBytes.fromString("A QoS 0 message"),
));
// 发布QoS 1的消息
final puback = await client.publishQos1(TxPublishPacket(
false,
"kinnowTestTopic",
StringOrBytes.fromString("A QoS1 message"),
));
if (puback != null) {
print("puback received");
}
// 发布QoS 2的消息
final qos2res = await client.publishQos2(TxPublishPacket(
false,
"kinnowTestTopic",
StringOrBytes.fromString("A QoS2 message"),
));
if (qos2res != null) {
print("pubrec and pubcomp received");
}
// 订阅主题
final suback = await client.subscribe(SubscribePacket([
TopicSubscription("KinnowSubTopic1", MqttQos.atMostOnce),
TopicSubscription("KinnowSubTopic2", MqttQos.atLeastOnce),
TopicSubscription("KinnowSubTopic3", MqttQos.exactlyOnce),
]));
if (suback != null) {
print("suback received");
int idx = 0;
for (final reason in suback.reasonCodes) {
print("topic $idx success ${reason.name}");
idx++;
}
}
// 监听接收到的消息
client.receivedMessagesStream.listen(
(event) => print("Packet Received \n \t topic: ${event.topic},\n \t qos: ${event.qos},\n \t payload: ${event.payload.asString}"),
);
// 等待15秒后断开连接
await Future.delayed(const Duration(seconds: 15));
client.disconnect();
}
更多关于Flutter MQTT通信插件kinnow_mqtt的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter MQTT通信插件kinnow_mqtt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用kinnow_mqtt
插件来实现MQTT通信的代码示例。这个示例将展示如何连接到MQTT代理、订阅主题和发布消息。
首先,确保你已经在pubspec.yaml
文件中添加了kinnow_mqtt
依赖:
dependencies:
flutter:
sdk: flutter
kinnow_mqtt: ^latest_version # 替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来是示例代码:
import 'package:flutter/material.dart';
import 'package:kinnow_mqtt/kinnow_mqtt.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late MqttClient _client;
String _clientId = 'flutterClient';
String _broker = 'mqtt.eclipse.org'; // 公共MQTT代理地址
int _port = 1883; // MQTT默认端口
String _topic = 'test/topic';
String _message = 'Hello MQTT';
@override
void initState() {
super.initState();
connect();
}
Future<void> connect() async {
_client = MqttClient(_broker, _port, _clientId);
_client.keepAliveInterval = 60;
_client.logging(on: true);
final MqttConnectOptions connOpts = MqttConnectOptions.builder()
.clientIdentifier(_clientId)
.cleanSession(true)
.keepAliveInterval(60)
.automaticReconnect(true)
.withWillTopic(_topic)
.withWillMessage('Client has disconnected unexpectedly')
.withWillQos(MqttQos.atLeastOnce);
try {
await _client.connect(connOpts).then((_) {
print('Connected');
_client.updates!.listen((List<MqttReceivedMessage<MqttMessage>> c) {
final MqttPublishMessage receivedMessage =
c[0].payload as MqttPublishMessage;
final MqttMessage receivedPayload = receivedMessage.payload;
final String pt =
MqttPublishPayload.bytesToStringAsString(receivedPayload.message,
encoding: MqttPayloadFormat.UTF8);
print('Message received: topic is <${c[0].topic}>, payload is <-- $pt -->');
});
subscribe();
}).catchError((e) {
print('Exception has been thrown: $e');
_client.disconnect();
});
} catch (e) {
print('Exception has been thrown: $e');
_client.disconnect();
}
}
Future<void> subscribe() async {
try {
await _client.subscribe(_topic, MqttQos.atLeastOnce);
print('Subscribed to topic: $_topic');
} catch (e) {
print('Exception has been thrown: $e');
}
}
Future<void> publish() async {
MqttMessageBuilder builder = MqttMessageBuilder();
builder.addString(_message);
MqttMessage message = builder.toMessage();
MqttPublishMessage pubMsg = MqttPublishMessage.builder()
.topic(_topic)
.qos(MqttQos.atLeastOnce)
.payload(message);
_client.publishMessage(pubMsg);
print('Message published');
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter MQTT Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () {
publish();
},
child: Text('Publish Message'),
),
],
),
),
),
);
}
@override
void dispose() {
// 清理MQTT客户端连接
if (_client.isConnected()) {
_client.disconnect();
}
super.dispose();
}
}
这个示例代码做了以下几件事情:
- 连接到MQTT代理:使用
MqttClient
类连接到MQTT代理(在这个例子中是mqtt.eclipse.org
)。 - 订阅主题:在成功连接到MQTT代理后,订阅一个主题(
test/topic
)。 - 发布消息:通过点击按钮发布消息到订阅的主题。
- 监听消息:监听并打印从MQTT代理接收到的消息。
请注意,kinnow_mqtt
插件的具体API可能会有所变化,因此建议查阅最新的kinnow_mqtt文档(如果可用)以获取最新的使用信息和API参考。
此外,由于公共MQTT代理可能有连接限制,如果你在生产环境中使用MQTT,建议搭建自己的MQTT代理服务器。