Commit c89d948f authored by laishanqi's avatar laishanqi

mqtt

parent 3780e441
buildscript { buildscript {
ext.kotlin_version = '1.3.50' ext.kotlin_version = '1.3.50'
repositories { repositories {
google() //google()
jcenter() //jcenter()
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven { url "http://download.flutter.io" }
} }
dependencies { dependencies {
...@@ -13,8 +18,12 @@ buildscript { ...@@ -13,8 +18,12 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
google() // google()
jcenter() // jcenter()
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven { url "http://download.flutter.io" }
} }
} }
......
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:netrain_flutter_app/laishanqi/netrain/Images.dart';
class Login extends StatelessWidget {
@override
Widget build(BuildContext context) {
var controller = TextEditingController();
return MaterialApp(
home: Scaffold(
body: Container(
margin: EdgeInsets.only(top: 108),
alignment: Alignment.center,
child: Column(
children: [
Image.asset(Images.logo_01),
Container(
margin: EdgeInsets.only(top: 91),
child: Row(
crossAxisAlignment: CrossAxisAlignment.baseline,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Column(
children: [
Text(
"验证码登录",
style: TextStyle(
color: Color(0xff2893FF),
fontWeight: FontWeight.bold,
fontSize: 17),
),
Container(
height: 6,
),
Image.asset(Images.ic_login_mode)
],
),
Text("密码登录",
style: TextStyle(
color: Color(0xff949494),
fontWeight: FontWeight.bold,
fontSize: 17)),
],
),
),
Container(
margin: EdgeInsets.only(top: 26),
child: Stack(
children: [
Container(
child: TextField(
controller: controller,
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 19),
hintText: "请输入手机号",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
borderSide: BorderSide(
color: Color(0xffF1F1F1), width: 1)),
),
),
margin: EdgeInsets.only(left: 32, right: 32),
height: 47,
),
Positioned(
top: 12,
right: 50,
child: Text(
"获取验证码",
style: TextStyle(color: Color(0xff727272)),
))
],
),
),
Container(
child: TextField(
controller: controller,
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 19),
hintText: "请输入密码",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
borderSide: BorderSide(
color: Color(0xffF1F1F1), width: 1)),
),
),
margin: EdgeInsets.only(left: 32, right: 32,top: 11),
height: 47,
),
],
),
),
),
);
}
}
import 'package:fluttertoast/fluttertoast.dart';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:mqtt_client/mqtt_server_client.dart';
class MqttClient {
Future<MqttServerClient> connect() async {
MqttServerClient client =
// MqttServerClient.withPort('emqtt.hdmedicine.naiterui.com', '180.76.145.155', 61630);
MqttServerClient.withPort('broker.emqx.io', 'flutter_client', 1883);
client.logging(on: true);
client.onConnected = onConnected;
client.onDisconnected = onDisconnected;
client.onUnsubscribed = onUnsubscribed;
client.onSubscribed = onSubscribed;
client.onSubscribeFail = onSubscribeFail;
client.pongCallback = pong;
final connMessage = MqttConnectMessage()
.authenticateAs('androiduser', 'Cf3Jf3tM06200G+Up0')
.keepAliveFor(60)
.withWillTopic('clientWillDead')
.withWillMessage('{"i":"dr_133","c":0,"t":3}')
.startClean()
.withWillQos(MqttQos.atLeastOnce);
client.connectionMessage = connMessage;
try {
await client.connect();
} catch (e) {
print('Exception: $e');
client.disconnect();
}
client.updates.listen((List<MqttReceivedMessage<MqttMessage>> c) {
final MqttPublishMessage message = c[0].payload;
final payload =
MqttPublishPayload.bytesToStringAsString(message.payload.message);
print('收到消息 Received message:$payload from topic: ${c[0].topic}>');
Fluttertoast.showToast(msg: "flutter 收到MQtt消息 $payload");
});
client.subscribe("topic/test", MqttQos.atLeastOnce);
return client;
}
// 连接成功
void onConnected() {
print('连接 --- Connected');
}
// 连接断开
void onDisconnected() {
print('连接 --- Disconnected');
}
// 订阅主题成功
void onSubscribed(String topic) {
print('连接 --- Subscribed topic: $topic');
}
// 订阅主题失败
void onSubscribeFail(String topic) {
print('连接 --- Failed to subscribe $topic');
}
// 成功取消订阅
void onUnsubscribed(String topic) {
print('连接 --- Unsubscribed topic: $topic');
}
// 收到 PING 响应
void pong() {
print('连接 --- Ping response client callback invoked');
}
MqttClient();
}
import 'dart:collection';
import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
class HttpUtil {
static HttpClient httpClient = HttpClient();
static HashMap<String,String> headers;
static String scheme = "http";
static String host = "api-docker.naiterui.com";
static String global_config = "ad/doctorInfo/globalConfig";
static Future<http.Response> get(String path,{Map<String, dynamic> queryParameters}) async {
var response = await http.get("http://$host/$path");
// _get(path, host: HttpUtil.host, queryParameters: queryParameters);
return response;
}
static _get(
String path, {
String host,
Map<String, dynamic> queryParameters,
}) async {
Uri uri = Uri(
scheme: scheme,
host: host,
path: path,
queryParameters: queryParameters);
HttpClientRequest request = await httpClient.getUrl(uri);
addHeaders(request);
print('http url---> $uri \n headers---> \n ${request.headers} queryParameters ---> ${uri.queryParameters}');
HttpClientResponse response = await request.close();
String responseBody = await response.transform(Utf8Decoder()).join();
print('http responseBody ---> \n $responseBody');
}
static void addHeaders(HttpClientRequest request) {
request.headers.add("_p", "0");
request.headers.add("_o", "1");
request.headers.add("_n", "1");
request.headers.add("_v", "1.0.0");
request.headers.add("_nv", "1.0.0");
}
post() {}
postBody() {}
}
...@@ -17,4 +17,5 @@ class Images{ ...@@ -17,4 +17,5 @@ class Images{
static const ic_prescription = "${imagesPath}ic_prescription.png"; static const ic_prescription = "${imagesPath}ic_prescription.png";
static const ic_privacy = "${imagesPath}ic_privacy.png"; static const ic_privacy = "${imagesPath}ic_privacy.png";
static const ic_sign = "${imagesPath}ic_sign.png"; static const ic_sign = "${imagesPath}ic_sign.png";
static const ic_back_black = "${imagesPath}ic_back_black.png";
} }
\ No newline at end of file
import 'package:flutter/material.dart';
/**
* 注册页
*/
class RegisterPage extends StatefulWidget{
@override
State createState() => _RegisterState();
}
class _RegisterState extends State{
@override
Widget build(BuildContext context) {
return registerWidget();
}
Widget registerWidget() {
return MaterialApp(
theme: ThemeData(
primaryColor: Colors.white,
),
home: Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: (){
Navigator.of(context).pushNamed("/");
},
),
centerTitle: true,
title: Text("注册"),
elevation: 0,
),
body: ListView(
children: [
],
),
),
);
}
}
\ No newline at end of file
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart';
import 'package:netrain_flutter_app/laishanqi/mqtt/MqttClient.dart';
import 'package:netrain_flutter_app/laishanqi/netrain/Http/HttpUtil.dart';
import 'package:netrain_flutter_app/laishanqi/netrain/user/RegisterPage.dart';
import 'HomePage.dart'; import '../HomePage.dart';
import 'Images.dart'; import '../Images.dart';
/// 登录页 /// 登录页
class LoginPage extends StatefulWidget { class LoginPage extends StatefulWidget {
...@@ -18,6 +22,14 @@ class _LoginState extends State<LoginPage> { ...@@ -18,6 +22,14 @@ class _LoginState extends State<LoginPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var mqtt = MqttClient();
mqtt.connect();
HttpUtil.get(HttpUtil.global_config).then((Response value) {
Fluttertoast.showToast(msg: "global_config 请求成功 ");
});
return MaterialApp( return MaterialApp(
title: '登陆页', title: '登陆页',
theme: ThemeData( theme: ThemeData(
...@@ -74,7 +86,8 @@ class _LoginState extends State<LoginPage> { ...@@ -74,7 +86,8 @@ class _LoginState extends State<LoginPage> {
return; return;
} }
// 跳转 // 跳转
Navigator.push(context, MaterialPageRoute(builder: (context)=>HomePage())); Navigator.push(context,
MaterialPageRoute(builder: (context) => HomePage()));
Fluttertoast.showToast( Fluttertoast.showToast(
msg: msg:
"登录 手机号:${phoneController.text} 验证码或密码:${codeController.text}"); "登录 手机号:${phoneController.text} 验证码或密码:${codeController.text}");
...@@ -92,10 +105,16 @@ class _LoginState extends State<LoginPage> { ...@@ -92,10 +105,16 @@ class _LoginState extends State<LoginPage> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text( MaterialButton(
onPressed: () {
Navigator.pushNamed(context, "register");
// Navigator.push(context,MaterialPageRoute(builder: (context) => RegisterPage()));
},
child: Text(
"快速注册", "快速注册",
style: TextStyle(color: Colors.blue), style: TextStyle(color: Colors.blue),
), ),
),
Text(" | ", style: TextStyle(color: Colors.blue)), Text(" | ", style: TextStyle(color: Colors.blue)),
Text("忘记密码", style: TextStyle(color: Colors.blue)) Text("忘记密码", style: TextStyle(color: Colors.blue))
], ],
...@@ -114,16 +133,15 @@ class _LoginState extends State<LoginPage> { ...@@ -114,16 +133,15 @@ class _LoginState extends State<LoginPage> {
height: 46, height: 46,
margin: EdgeInsets.only(left: 32, right: 32, top: 10), margin: EdgeInsets.only(left: 32, right: 32, top: 10),
child: TextField( child: TextField(
obscureText: select == 2 , obscureText: select == 2,
controller: codeController, controller: codeController,
style: TextStyle(color: Colors.blue, fontSize: 16), style: TextStyle(color: Colors.blue, fontSize: 16),
decoration: InputDecoration( decoration: InputDecoration(
contentPadding: EdgeInsets.only( contentPadding:
left: 10, right: 10, top: 10, bottom: 10), EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10),
hintText: checkText, hintText: checkText,
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderSide: borderSide: BorderSide(color: Color(0xFFf1f1f1), width: 1),
BorderSide(color: Color(0xFFf1f1f1), width: 1),
borderRadius: BorderRadius.circular(23), borderRadius: BorderRadius.circular(23),
), ),
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:netrain_flutter_app/TestPage.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:netrain_flutter_app/laishanqi/Login.dart';
import 'laishanqi/Stateful_page.dart'; import 'laishanqi/Stateful_page.dart';
import 'laishanqi/Stateless_page.dart'; import 'laishanqi/Stateless_page.dart';
import 'laishanqi/layout_page.dart'; import 'laishanqi/layout_page.dart';
import 'laishanqi/netrain/loginPage.dart'; import 'laishanqi/netrain/user/loginPage.dart';
import 'laishanqi/netrain/user/RegisterPage.dart';
import 'laishanqi/photo.dart'; import 'laishanqi/photo.dart';
void main() { void main() {
// runApp(MyApp()); runApp(MyApp());
runApp(Login()); // runApp(Login());
// runApp(TestPage());
print("启动");
} }
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
// This widget is the root of your application. // This widget is the root of your application.
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return WillPopScope(child: MaterialApp(
title: 'Flutter Demo', title: 'Flutter Demo',
initialRoute: "/",
theme: ThemeData( theme: ThemeData(
primarySwatch: Colors.blue, primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity, visualDensity: VisualDensity.adaptivePlatformDensity,
...@@ -27,13 +31,20 @@ class MyApp extends StatelessWidget { ...@@ -27,13 +31,20 @@ class MyApp extends StatelessWidget {
title: Text("路由"), title: Text("路由"),
), ),
body: RouterNavigator(title: 'Flutter Demo Home Page'), body: RouterNavigator(title: 'Flutter Demo Home Page'),
), ),
routes: <String, WidgetBuilder>{ routes: <String, WidgetBuilder>{
"less": (BuildContext context) => LessGroupPage(), "less": (context) => LessGroupPage(),
"ful": (BuildContext context) => FulGroupPage(), "ful": (context) => FulGroupPage(),
"layout": (BuildContext context) => LayoutPage(), "layout": (context) => LayoutPage(),
"photo": (BuildContext context) => PhotoApp(), "photo": (context) => PhotoApp(),
"register": (context) => RegisterPage(),
},
), onWillPop: ()async{
Fluttertoast.showToast(msg: "退出");
return true;
}); });
} }
} }
......
...@@ -20,6 +20,7 @@ version: 1.0.0+1 ...@@ -20,6 +20,7 @@ version: 1.0.0+1
environment: environment:
sdk: ">=2.7.0 <3.0.0" sdk: ">=2.7.0 <3.0.0"
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
...@@ -30,6 +31,9 @@ dependencies: ...@@ -30,6 +31,9 @@ dependencies:
cupertino_icons: ^0.1.3 cupertino_icons: ^0.1.3
image_picker: ^0.6.7+11 image_picker: ^0.6.7+11
fluttertoast: ^3.1.3 fluttertoast: ^3.1.3
http: 0.12.2
mqtt_client: ^9.3.2
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment