不确定为什么我的有效载荷为空。我想使用有效负载来确定我的设备是否已注册。如果注册,我将订阅主题。如果没有,我会做别的事情。但是我的有效负载为空。
第1部分:
client.subscribe(registerTopic, MqttQos.atMostOnce);
onSub().then((payload) {
//if(payload == '1')
print('Payload: $payload');
client.subscribe(subTopic, MqttQos.atMostOnce);
});
然后是第2部分:
Future<String> onSub() async {
client.updates.listen((List<MqttReceivedMessage<MqttMessage>> c) {
final MqttPublishMessage recMess = c[0].payload;
receivedMessage =
MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
print(
'::Change notification:: topic -> <${c[0].topic}>, payload -> <$receivedMessage> ');
payload = receivedMessage;
});
return payload;
}
我的输出:
Performing hot restart...
Syncing files to device AOSP on IA Emulator...
Restarted application in 2,501ms.
I/flutter (12404): ::Data connection is available.
I/flutter (12404): ::Mosquitto client connecting....
I/flutter (12404): ::Mosquitto client connected
I/flutter (12404): Payload: null
I/flutter (12404): ::Subscription confirmed -> topic -> registerTopic/registered
I/flutter (12404): ::Subscription confirmed -> topic -> subTopic/control_instruction
I/flutter (12404): ::Change notification:: topic -> <reisterTopic/registered>, payload -> <1>
I/flutter (12404): ::Change notification:: topic -> <subTopic/control_instruction>, payload -> <00010000011000000000>
答案 0 :(得分:0)
您将得到null,因为在收到来自then
的第一条消息之前已调用client.updates
,因此您不应使用Future。如果要在出现第一条消息后进行连接,则应使用Stream<String>
而不是Future<String>
。
第1部分:
client.subscribe(registerTopic, MqttQos.atMostOnce);
client.updates
.map<String>(_mapToString)
.listen((String payload) {
if (payload == '1') {
client.subscribe(subTopic, MqttQos.atMostOnce);
}
});
第2部分:
String _mapToString(List<MqttReceivedMessage<MqttMessage>> c) {
final MqttPublishMessage recMess = c[0].payload;
receivedMessage = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
print(
'::Change notification:: topic -> <${c[0].topic}>, payload -> <$receivedMessage> ');
return receivedMessage;
}