Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

254 rader
8.7 KiB

  1. import 'package:flutter/material.dart';
  2. import 'package:http/http.dart' as http;
  3. import 'dart:convert';
  4. import 'dart:io';
  5. import 'package:http/io_client.dart';
  6. class CameraPage extends StatelessWidget {
  7. final String loginUrl = 'https://192.168.60.230:5050/auth/login';
  8. final String moveCameraUrl = 'https://192.168.60.230:5050/move-camera';
  9. Future<http.Client> createHttpClient() async {
  10. final ioc = HttpClient()
  11. ..badCertificateCallback =
  12. (X509Certificate cert, String host, int port) => true;
  13. return IOClient(ioc);
  14. }
  15. Future<String> loginAndGetToken(http.Client client) async {
  16. var url = Uri.parse(loginUrl);
  17. var data = {'username': 'admin', 'password': 'Pwdadmin1!'};
  18. var body = data.keys
  19. .map((key) =>
  20. "${Uri.encodeComponent(key)}=${Uri.encodeComponent(data[key] ?? '')}")
  21. .join("&");
  22. var response = await client.post(
  23. url,
  24. headers: {
  25. "Content-Type": "application/x-www-form-urlencoded",
  26. },
  27. body: body,
  28. );
  29. var responseBody = response.body;
  30. var parsedJson = jsonDecode(responseBody);
  31. if (parsedJson['access_token'] != null) {
  32. return parsedJson['access_token'];
  33. } else {
  34. throw Exception('Token not found in response');
  35. }
  36. }
  37. Future<void> sendPostRequestMoveCamera(
  38. BuildContext context, String token, Map<String, dynamic> data) async {
  39. var url = Uri.parse(moveCameraUrl);
  40. var jsonData = jsonEncode(data);
  41. HttpClient httpClient = HttpClient()
  42. ..badCertificateCallback =
  43. ((X509Certificate cert, String host, int port) => true);
  44. var request = await httpClient.postUrl(url)
  45. ..headers.contentType = ContentType.json
  46. ..headers.add('Authorization', 'Bearer $token')
  47. ..write(jsonData);
  48. var response = await request.close();
  49. var responseBody = await utf8.decodeStream(response);
  50. var responseJson = jsonDecode(responseBody);
  51. var message = responseJson['message'] ?? 'Unknown response';
  52. bool isError = message.startsWith('Error:') || message.startsWith('Errore:');
  53. ScaffoldMessenger.of(context).showSnackBar(
  54. SnackBar(
  55. content: Text(message),
  56. backgroundColor: isError ? Colors.red : Colors.green,
  57. ),
  58. );
  59. }
  60. @override
  61. Widget build(BuildContext context) {
  62. double screenWidth = MediaQuery.of(context).size.width;
  63. return Scaffold(
  64. body: OrientationBuilder(
  65. builder: (context, orientation) => Stack(
  66. children: [
  67. Column(
  68. children: [
  69. Expanded(
  70. child: Builder(
  71. builder: (context) => GestureDetector(
  72. onTap: () async {
  73. final client = await createHttpClient();
  74. String token = await loginAndGetToken(client);
  75. await sendPostRequestMoveCamera(context, token, {
  76. "baseUrl": "HTTP://10.1.1.66:2000",
  77. "username": "admin",
  78. "password": "Adminadmin1",
  79. "preset": 1
  80. });
  81. },
  82. child: Stack(
  83. children: [
  84. Container(
  85. color: Colors.transparent,
  86. child: Transform.rotate(
  87. angle: 3.14 / 2,
  88. child: Image.asset(
  89. 'assets/images/img1.png',
  90. fit: BoxFit.cover,
  91. ),
  92. ),
  93. ),
  94. ],
  95. ),
  96. ),
  97. ),
  98. ),
  99. Expanded(
  100. child: Builder(
  101. builder: (context) => GestureDetector(
  102. onTap: () async {
  103. final client = await createHttpClient();
  104. String token = await loginAndGetToken(client);
  105. await sendPostRequestMoveCamera(context, token, {
  106. "baseUrl": "HTTP://10.1.1.66:2000",
  107. "username": "admin",
  108. "password": "Adminadmin1",
  109. "preset": 3
  110. });
  111. },
  112. child: Stack(
  113. children: [
  114. Container(
  115. color: Colors.transparent,
  116. child: Transform.rotate(
  117. angle: 3.14 / 2,
  118. child: Image.asset(
  119. 'assets/images/img2.png',
  120. fit: BoxFit.cover,
  121. ),
  122. ),
  123. ),
  124. ],
  125. ),
  126. ),
  127. ),
  128. ),
  129. Expanded(
  130. child: Builder(
  131. builder: (context) => GestureDetector(
  132. onTap: () async {
  133. final client = await createHttpClient();
  134. String token = await loginAndGetToken(client);
  135. await sendPostRequestMoveCamera(context, token, {
  136. "baseUrl": "HTTP://10.1.1.66:2000",
  137. "username": "admin",
  138. "password": "Adminadmin1",
  139. "preset": 2
  140. });
  141. },
  142. child: Stack(
  143. children: [
  144. Container(
  145. color: Colors.transparent,
  146. child: Transform.rotate(
  147. angle: 3.14 / 2,
  148. child: Image.asset(
  149. 'assets/images/img3.png',
  150. fit: BoxFit.cover,
  151. ),
  152. ),
  153. ),
  154. ],
  155. ),
  156. ),
  157. ),
  158. ),
  159. ],
  160. ),
  161. Positioned(
  162. top: 110.0,
  163. right: 350.0,
  164. child: GestureDetector(
  165. onTap: () async {
  166. final client = await createHttpClient();
  167. String token = await loginAndGetToken(client);
  168. await sendPostRequestMoveCamera(context, token, {
  169. "baseUrl": "HTTP://10.1.1.66:2000",
  170. "username": "admin",
  171. "password": "Adminadmin1",
  172. "preset": 5
  173. });
  174. },
  175. child: Transform.rotate(
  176. angle: 3.14 / 2, // Rotating 90 degrees (PI / 2 radians)
  177. child: FaceSymbol(),
  178. ),
  179. ),
  180. ),
  181. Positioned(
  182. top: 350.0,
  183. right: 350.0,
  184. child: GestureDetector(
  185. onTap: () async {
  186. final client = await createHttpClient();
  187. String token = await loginAndGetToken(client);
  188. await sendPostRequestMoveCamera(context, token, {
  189. "baseUrl": "HTTP://10.1.1.66:2000",
  190. "username": "admin",
  191. "password": "Adminadmin1",
  192. "preset": 4
  193. });
  194. },
  195. child: Transform.rotate(
  196. angle: 3.14 / 2, // Rotating 90 degrees (PI / 2 radians)
  197. child: FaceSymbol(),
  198. ),
  199. ),
  200. ),
  201. Positioned(
  202. top: 700.0,
  203. right: 350.0,
  204. child: GestureDetector(
  205. onTap: () async {
  206. final client = await createHttpClient();
  207. String token = await loginAndGetToken(client);
  208. await sendPostRequestMoveCamera(context, token, {
  209. "baseUrl": "HTTP://10.1.1.66:2000",
  210. "username": "admin",
  211. "password": "Adminadmin1",
  212. "preset": 6
  213. });
  214. },
  215. child: Transform.rotate(
  216. angle: 3.14 / 2, // Rotating 90 degrees (PI / 2 radians)
  217. child: FaceSymbol(),
  218. ),
  219. ),
  220. ),
  221. ],
  222. ),
  223. ),
  224. );
  225. }
  226. }
  227. class FaceSymbol extends StatelessWidget {
  228. @override
  229. Widget build(BuildContext context) {
  230. return Icon(
  231. Icons.face, // Using a built-in face icon
  232. size: 50.0,
  233. color: Colors.blue,
  234. );
  235. }
  236. }