flutter服务(flutter服务器框架)

网友投稿 1414 2022-12-28

本篇文章给大家谈谈flutter服务,以及flutter服务器框架对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享flutter服务的知识,其中也会对flutter服务器框架进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Flutter开发——socket+udp通信

Android平台使用CoAP通信绑定设备 已在前文中介绍flutter服务,目前需要从Android平台迁移到Linux平台flutter服务,flutter提供的CoAP协议包只提供flutter服务了客户端而没有服务端,在进行设备绑定时,设备不仅要作为服务端,也要作为客户端接收底层的消息推送,尝试实现socket+udp通信模块。

Flutter中使用gRPC

gRPC是谷歌开发的一款远程过程调用系统flutter服务,可以让客户端像调用本地对象一样使用服务端应用的方法,使用protocol buffers接口定义语言来定义服务方法,protocol buffer定义参数和返回类型。

protobuf类似json,是一种数据结构协议,在android studio中安装Protobuf Support,方便查看编写的proto文件
dart使用proto插件将proto文件生成对应的dart文件,使用如下步骤
https://blog.csdn-/qq_30903139/article/details/88558414

1、安装flutter之后,再flutter的下面路径中有pub命令,需要将命令加入到path中。
可以vi ~/.zshrc,在文件中加入source ~/.bash_profile,然后在vi ~/.bash_profile文件中加入下面路径(:分割不同的路径)
export PATH=/Users/webull/app/flutter/bin:/Users/webull/app/flutter/bin/cache/dart-sdk/bin:/Users/webull/.pub-cache/bin:$PATH
其中fluter/bin是flutter的命令路径,dart-sdk/bin中包含flutter服务了pub和其flutter服务他dart命令,.pub-cache/bin是之后运行pub之后建立的路径,里面包含了proto-gen-dart命令,用来将proto文件转换为dart的命令

2、使用下面的命令安装proto插件
$ pub global activate protoc_plugin
安装完成后,上面的用户目录中的.pub-cache目录才会有proto-gen-dart文件。

1、其中/Users/webull是flutter服务我的用户目录 app/flutter是flutter的安装目录

参考:
1、gRPC介绍
2、gRPC配置

Flutter 之 文件操作(二十九)

Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart IO 库来操作文件的,不过和 Dart VM 相比,Flutter 有一个重要差异是文件系统路径不同,这是因为Dart VM 是运行在 PC 或服务器操作系统下,而 Flutter 是运行在移动操作系统中,他们的文件系统会有一些差异。

Android 和 iOS 的应用存储目录不同, PathProvider 插件提供了一种平台透明的方式来访问设备文件系统上的常用位置。该类当前支持访问两个文件系统位置:

File代表一个整体的文件,他有三个构造函数,分别是:

文件读取本身有两种形式,一种是文本,一种是二进制。

2.2.1 读取文本内容

如果是文本文件,File提供了readAsString、readAsLines、readAsStringSync、readAsLinesSync方法,读取文本内容

readAsString 一次性读取所有文本

readAsLines 一行行的读取文本

结果返回的是一个List,list中表示文件每行的内容

readAsStringSync、readAsLinesSync同步读取文本

2.2.2 读取二进制内容
如果文件是二进制,那么可以使用readAsBytes或者同步的方法readAsBytesSync:

dart中表示二进制有一个专门的类型叫做Uint8List,他实际上表示的是一个int的List。

上面提到的读取方式,都是一次性读取整个文件,缺点就是如果文件太大的话,可能造成内存空间的压力。
所以File为我们提供了另外一种读取文件的方法,流的形式来读取文件.

示例

dart提供了open和openSync两个方法来进行随机文件读写:

写入和文件读取一样,可以一次性写入或者获得一个写入句柄,然后再写入。
一次性写入的方法有四种,分别对应字符串和二进制

句柄形式可以调用openWrite方法,返回一个IOSink对象,然后通过这个对象进行写入:

默认情况下写入是会覆盖整个文件的,但是可以通过下面的方式来更改写入模式:

虽然dart中所有的异常都是运行时异常,但是和java一样,要想手动处理文件读写中的异常,则可以使用try,catch:

我们还是以计数器为例,实现在应用退出重启后可以恢复点击次数。 这里,我们使用文件来保存数据:

1.引入PathProvider插件;在pubspec.yaml文件中添加如下声明:
执行 flutter pub get

2.实现如下

参考: https://www.jianshu.com/p/92b09aaecf17
https://book.flutterchina.club/chapter11/file_operation.html

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 蓝牙ble(blue tooth),同时连接多台/多个设备

于是就有了写作本文的动力,--------解决同时连接多台蓝牙设备!!!

flutter_blue 适合于单台的蓝牙设备,使用起来简单
flutter_reactive_ble 适合于单台的蓝牙设备,多台蓝牙设备也可以用
flutter_ble_lib 适合于单台的蓝牙设备,多台蓝牙设备也可以用,可以在模拟器上进行调试蓝牙

感觉后2个第三方库都可以使用,本人先入为主使用了flutter_reactive_ble,所以本文以flutter_reactive_ble为基础进行介绍

先声明4个全局变量,后面会用到

开始扫描

如果扫描过程,不使用过滤条件,withServices这个参数可以给个空数组

停止扫描如下

连接设备

断开设备,
每连接成功一个设备后,就会产生一个_connectionStreamSubscription,对应设备的断开,就用对应的StreamSubscription去断开, 可以用一个HashMap,去记录 连接成功的设备 与 StreamSubscription 的对应关系

去扫描服务,并过滤服务,扫描结果服务里面是包含有特征的数组,如: serviceId:[fff0,fff1,fff2,fff3,...]

去监听上报来的数据,参数来自前面扫描到的结果serviceId--服务ID, characteristicId--特征ID,deviceId--设备ID

后面就是各位看官根据自己的需求去做逻辑处理啦。

对设备设置命令,发送请求(写操作),list为整形数据,要写的数据

读取设备的信息(读操作)

flutter 多台蓝牙设备同时连接的分享就到这里喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点个赞吧~~ 后续分享更多有关flutter的文章。如果有疑问的话,请在下方留言~

过一段时间后,我在项目把这个蓝牙库用起来了,基本能满足日常需求.效果如下: 关于flutter服务和flutter服务器框架的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 flutter服务的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于flutter服务器框架、flutter服务的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:flutter传值和调用(flutter文件操作)
下一篇:重庆小程序组件(重庆小程序公司)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~