本篇文章给大家谈谈mqtt与flutter,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
今天给各位分享mqtt与flutter的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
Flutter通过Mqtt消费ActivieMQ
Flutter通过mqtt消费activemq,在android端主要使用插件的方式进行
处理流程
Android端连接MQTT
插件端业务处理
step1:配置插件依赖包
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.multidex:multidex-instrumentation:2.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha08'
step2 实现连接
方法 class MqttClientPlugin : MethodCallHandler {
override fun onMethodCall(call: MethodCall, result: Result) {
when (call.method) {
"connectMq" - {
try {
connectToService()
result.success(true)
} catch (e: Exception) {
e.printStackTrace()
result.success(false)
}
}
}
}
private fun connectToService() {
val intent = Intent(context, MqttClientService::class.java)
this.context?.startService(intent)
}
}
step3 实现mqttclient服务
class MqTTClientService : Service {
private val TAG = "ActiveMQ"
val clientId = "any_client_name"
val serverURI = "tcp://192.168.0.201:1883" //replace with your ip
val publishTopic = "outbox"
val subscribeTopic = "TJ Test"
var client: MqttAndroidClient? = null
constructor() : super()
val MY_ACTION = "MY_ACTION"
var _currentV: Int = 0
override fun onBind(intent: Intent?): IBinder? {
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val myThread = MyThrad()
myThread.start()
return super.onStartCommand(intent, flags, startId)
}
private fun subscribe() {
try {
client?.subscribe(subscribeTopic, 0, IMqttMessageListener { topic, message -
Log.i("接收到监听的消息:", "${message.payload}")
})
} catch (e: MqttException) {
e.printStackTrace()
}
}
inner class MyThrad : Thread() {
override fun run() {
val connectOptions = MqttConnectOptions()
connectOptions.isAutomaticReconnect = true
client = MqttAndroidClient(this@MqTTClientService.applicationContext, serverURI, clientId)
try {
client?.connect(connectOptions, object : IMqttActionListener {
override fun onSuccess(asyncActionToken: IMqttToken) {
subscribe()
}
override fun onFailure(asyncActionToken: IMqttToken, e: Throwable) {
Log.i("连接错误:", "${e.message}")
}
})
} catch (e: MqttException) {
e.printStackTrace()
}
}
private fun subscribe() {
try {
client?.subscribe(subscribeTopic, 0) { topic, message -
//通过广播发送监听到的消息
val intent = Intent()
intent.action = MY_ACTION
intent.putExtra("DATAPASSED", message.toString())
sendBroadcast(intent)
}
} catch (e: MqttException) {
e.printStackTrace()
}
}
}
}
step4监听广播
class DevicemanagerPlugin : MethodCallHandler {
constructor(context: Context?, channel: MethodChannel) {
this.context = context
this.channel = channel
initMqtt()
register()
}
private fun register() {
myReceiver = MyReceiver()
val intentFilter = IntentFilter()
intentFilter.addAction("MY_ACTION")
this.context?.registerReceiver(myReceiver, intentFilter)
}
inner class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
try {
val value = intent?.getStringExtra("DATAPASSED")
//将监听到的消息,通过methchannel传给flutter
channel?.invokeMethod("receiveMsg", value)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}
Flutter端业务处理
实现receiveMsg方法
const channel = const MethodChannel("mqttclient");
class _MyHomePageState extends State<MyHomePage {
@override
void initState() {
registerMethod()
connectActiveMq()
}
void connectActiveMq() async{
if (Platform.isAndroid) {
var result = await Devicemanager.connectMq(API.MQ_URI);
if (result) {
print("mq链接成功");
} else {
print("mq链接失败");
}
}
}
void registerMethod() {
channel.setMethodCallHandler((handler) {
var completer = new Completer<String();
try {
switch (handler.method) {
case "receiveMsg":
//接收到的消息
var v = handler.arguments;
break;
default:
break;
}
} catch (e) {
print(e);
}
return completer.future;
});
}
}
flutter desktop event_bus 简单使用
最近使用flutter desktop,开发一个mqtt的桌面工具。
mqtt的发送没有问题,但是订阅的实现有点麻烦。
订阅需要listen监听到消息后,返回给页面,页面刷新收到的消息
数据,在页面展示出来。
网上查找,最好实现的方式是event_bus,用起来还真不错。
完成了前端页面的刷新。
MQTT简单介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上。好比你给好友发送一封电子邮件,发送完成后你可以去做别的事情,收件人也不必立刻响应,可以在自己有空的时候查看邮件,是一个典型的异步发布/订阅场景。而另一种典型的同步请求/回答场景,可以用接打电话的场景来类比。
MQTT的设计遵循以下的原则:
为了满足不同的场景,MQTT支持三种不同级别的服务质量(Quality of Service,QoS)为不同场景提供消息可靠性:
MQTT拥有14种不同的消息类型:
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于
字节流的双向传输。
当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连。
一个使用MQTT协议的应用
程序或者设备,它总是建立到服务器的网络连接。客户端可以:
MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:
订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
消息订阅者所具体接收的内容。
MQTT协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:
MQTT和Websocket的区别是什么
两者的应用场景不一样:
MQTT是为了物联网场景设计的基于TCP的Pub/Sub协议,有许多为物联网
优化的特性,比如适应不同网络的QoS、层级主题、遗言等等。
WebSocket是为了HTML5应用方便与服务器双向通讯而设计的协议,HTTP握手然后转TCP协议,用于取代之前的Server Push、Comet、长轮询等老旧实现。
两者之所有有交集,是因为一个应用场景:如何通过HTML5应用来作为MQTT的客户端,以便接受设备消息或者向设备发送信息,那么MQTT over WebSocket自然成了最合理的途径了。
关于mqtt与flutter和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
mqtt与flutter的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、mqtt与flutter的信息别忘了在本站进行查找喔。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~