No feed data
-
I am using flutter to get the data.
Authentication is successful, after auth i am connecting web socket to get the feed data, connection is success and ping pong is also working, but no feed data is coming.
here is the code.import 'dart:developer'; import 'dart:io'; import 'package:angelone/websocket.dart'; import 'package:flutter/material.dart'; import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:device_info_plus/device_info_plus.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { String token = ""; String feedToken = ""; Future<String> getLocalIpAddress() async { for (var interface in await NetworkInterface.list()) { for (var address in interface.addresses) { if (address.type == InternetAddressType.IPv4) { return address.address; } } } return '127.0.0.1'; } Future<String> getPublicIpAddress() async { try { final response = await http.get(Uri.parse('https://api.ipify.org')); if (response.statusCode == 200) { return response.body; } else { throw Exception('Failed to get public IP address'); } } catch (e) { return 'Failed to get public IP'; } } Future<String> getMacAddress() async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); var data = await deviceInfo.androidInfo; return data.hardware; } Future<void> loginUser(String totp) async { const String url = 'https://apiconnect.angelbroking.com/rest/auth/angelbroking/user/v1/loginByPassword'; String localIp = await getLocalIpAddress(); String publicIp = await getPublicIpAddress(); String macAddress = await getMacAddress(); log(localIp); log(publicIp); log(macAddress); Map<String, String> headers = { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-UserType': 'USER', 'X-SourceID': 'MOBILE', 'X-ClientLocalIP': localIp, 'X-ClientPublicIP': publicIp, 'X-MACAddress': macAddress, 'X-PrivateKey': 'KUAkW8dC', }; Map<String, String> body = { 'clientcode': 'clientcode', 'password': 'pin', 'totp': totp, }; try { final response = await http.post( Uri.parse(url), headers: headers, body: json.encode(body), ); if (response.statusCode == 200) { Map<String, dynamic> data = json.decode(response.body); log(data['data']['jwtToken'].toString()); log(data['data']['feedToken'].toString()); setToken(data['data']['jwtToken'], data['data']['feedToken']); } else { print('Failed to login. Status code: ${response.statusCode}'); } } catch (error) { print('Error: $error'); } } void setToken(String newToken, String newFeedToken) { token = newToken; feedToken = newFeedToken; setState(() {}); } // feed api key: KUAkW8dC from dashboard Future<void> getCandleData(String token, String feedToken) async { final ws = SmartWebSocketV2( authToken: token, apiKey: 'KUAkW8dC', clientCode: 'client code', feedToken: feedToken, ); ws.connect(); final tokenList = [ { "exchangeType": 1, "tokens": ["26009"] }, // { // "exchangeType": 5, // "tokens": ["234230", "234235", "234219"] // }, ]; log(tokenList.toString()); ws.subscribe('abc123', 1, tokenList); // WebSocket connection code } TextEditingController controller = TextEditingController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ const Text('Enter TOTP:'), TextFormField( controller: controller, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: () async { // if (token.isEmpty) { await loginUser(controller.text); // } else { await getCandleData(token, feedToken); // } }, tooltip: 'Connect', child: const Icon(Icons.add), ), ); } }
import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:web_socket_channel/io.dart'; class SmartWebSocketV2 { static const String ROOT_URI = "wss://smartapisocket.angelone.in/smart-stream"; static const String HEART_BEAT_MESSAGE = "ping"; static const int HEART_BEAT_INTERVAL = 10; final String authToken; final String apiKey; final String clientCode; final String feedToken; IOWebSocketChannel? _channel; Timer? _heartBeatTimer; SmartWebSocketV2({ required this.authToken, required this.apiKey, required this.clientCode, required this.feedToken, }); Future<void> connect() async { final uri = Uri.parse(ROOT_URI); final headers = { "Authorization": authToken, "x-api-key": apiKey, "x-client-code": clientCode, "x-feed-token": feedToken, }; try { final socket = await WebSocket.connect(uri.toString(), headers: headers); _channel = IOWebSocketChannel(socket); print('Connected to $uri'); _channel!.stream.listen( _onMessage, onDone: _onDone, onError: _onError, ); _startHeartBeat(); } catch (error) { print('Failed to connect: $error'); _reconnect(); } } void _startHeartBeat() { _heartBeatTimer?.cancel(); _heartBeatTimer = Timer.periodic(const Duration(seconds: 10), (timer) { _send(HEART_BEAT_MESSAGE); }); } void _send(String message) { print('Sending: $message'); _channel?.sink.add(message); } void _onMessage(dynamic message) { print('Received: $message'); if (message == "pong") { print('Received pong'); } else { try { final parsedMessage = jsonDecode(message); _handleMessage(parsedMessage); } catch (e) { print('Error decoding message: $e'); } } } void _handleMessage(Map<String, dynamic> message) { // Implement message handling logic print("data: $message"); } void _onDone() { print('Connection closed'); _reconnect(); } void _onError(error) { print('Error: $error'); _reconnect(); } void _reconnect() { _heartBeatTimer?.cancel(); Future.delayed(Duration(seconds: HEART_BEAT_INTERVAL), () { print('Reconnecting...'); connect(); }); } void subscribe(String correlationId, int mode, List<Map<String, dynamic>> tokenList) { final requestData = { "correlationID": correlationId, "action": 1, // Subscribe action "params": { "mode": mode, "tokenList": tokenList, }, }; _send(jsonEncode(requestData)); } void unsubscribe(String correlationId, int mode, List<Map<String, dynamic>> tokenList) { final requestData = { "correlationID": correlationId, "action": 0, // Unsubscribe action "params": { "mode": mode, "tokenList": tokenList, }, }; _send(jsonEncode(requestData)); } void closeConnection() { print('Closing connection'); _heartBeatTimer?.cancel(); _channel?.sink.close(); } }
response logs
[log] 10.0.2.15 [log] 103.92.42.31 [log] ranchu [log] eyJhbGciOiJIUzUxMiJ9.eyJ1c2VybmFtZSI6IkE1NDA5NDAiLCJyb2xlcyI6MCwidXNlcnR5cGUiOiJVU0VSIiwidG9rZW4iOiJleUpoYkdjaU9pSlNVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKMWMyVnlYM1I1Y0dVaU9pSmpiR2xsYm5RaUxDSjBiMnRsYmw5MGVYQmxJam9pZEhKaFpHVmZZV05qWlhOelgzUnZhMlZ1SWl3aVoyMWZhV1FpT2pFeExDSnpiM1Z5WTJVaU9pSXlJaXdpWkdWMmFXTmxYMmxrSWpvaU5qVXpOMlJrWVRBdFpXTTVOeTB6TkdJeExUZzBZall0WmprM1kySm1ZakV4TkdZNElpd2lhMmxrSWpvaWRISmhaR1ZmYTJWNVgzWXhJaXdpYjIxdVpXMWhibUZuWlhKcFpDSTZNVEVzSW5CeWIyUjFZM1J6SWpwN0ltUmxiV0YwSWpwN0luTjBZWFIxY3lJNkltRmpkR2wyWlNKOWZTd2lhWE56SWpvaWRISmhaR1ZmYkc5bmFXNWZjMlZ5ZG1salpTSXNJbk4xWWlJNklrRTFOREE1TkRBaUxDSmxlSEFpT2pFM01qSTVORE15T1Rnc0ltNWlaaUk2TVRjeU1qZzBORTUN3aWFXRjBJam94TnpJeU9EUTBPRGN3TENKcWRHa2lPaUk0WTJSak5XSm1aaTFqTkRRNUxUUmpaakF0WVRObU1pMDJOR1U0TWpsbE1HUmlZMllpZlEubmQxejZnT1JnQlAwNmU2dG5BVVpNd3VWNmJuNHFuRkwtVVVLTnNfSm9fQ3NlanFfRldTX1ZwOEg1NjNKeEJBdDB1Xzc1eFBqYzJucDlEd3V6MWNEemVCZXV1eVotd0ZJMHZpYi1xcS1QNF9SUUhCSGFnUmJwcHpUelp6bHpsYy1xQlctenltZHY5YzZEbUJWTU9GZXBUMGg3QUYweUloaDV5REJqdWU0b2FvIiwiQVBJLUtFWSI6IktVQWtXOGRDIiwiaWF0IjoxNzIyODQ0OTMwLCJleHAiOjE3MjI5NDMyOTh9.xzzsybeTQajqwk4Dh5lRGthWfIbPERbGBQkQX0dmDgO7k26QoPOPG6K_5NZcZ1_xgPYlASk0orKJdJoCQqjd3g [log] eyJhbGciOiJIUzUxMiJ9.eyJ1c2VybmFtZSI6IkE1NDA5NDAiLCJpYXQiOjE3MjI4NDQ5MzAsImV4cCI6MTcyMjkzMTMzMH0.CkFvYHb104oy4emRjQOAjqUh_5kacWF58tnCkjCK_Oj1mu4C2GwbuiFAYB5N-ozMncnRqAxNgPldHw0i7d4Jdg I/flutter (28759): Sending: {"correlationID":"abc123","action":1,"params":{"mode":1,"tokenList":[{"exchangeType":1,"tokens":["26009"]}]}} [log] [{exchangeType: 1, tokens: [26009]}] D/EGL_emulation(28759): app_time_stats: avg=905.93ms min=5.89ms max=30968.91ms count=35 I/flutter (28759): Connected to wss://smartapisocket.angelone.in/smart-stream I/flutter (28759): Sending: ping I/flutter (28759): Received: pong I/flutter (28759): Received pong I/flutter (28759): Sending: ping I/flutter (28759): Received: pong I/flutter (28759): Received pong I/flutter (28759): Sending: ping I/flutter (28759): Received: pong I/flutter (28759): Received pong I/flutter (28759): Sending: ping I/flutter (28759): Received: pong I/flutter (28759): Received pong I/flutter (28759): Sending: ping I/flutter (28759): Received: pong I/flutter (28759): Received pong