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