how to decode web socket response in flutter / dart
-
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:web_socket_channel/web_socket_channel.dart';class ScreenAngelWebSocket extends StatefulWidget {
const ScreenAngelWebSocket({Key? key}) : super(key: key);@override
State<ScreenAngelWebSocket> createState() => _ScreenAngelWebSocketState();
}class _ScreenAngelWebSocketState extends State<ScreenAngelWebSocket> {
WebSocketChannel? channel;@override
void initState() {
super.initState();
channel = WebSocketChannel.connect(Uri.parse(ApiPath.WSS_ANGEL));
channel!.sink.add(
jsonEncode({
"task": "cn",
"channel": "",
"token": "your_token",
"user": "clientId",
"acctid": "clientId"
}),
);
// channel!.sink.add(
// jsonEncode({
// "task": "mw",
// "channel": "bse_cm|532921",
// "token": "your_token",
// "user": "clientId",
// "acctid": "clientId"
// }),
// );
channel!.stream.listen(
(data) {
String response = data.toString();
debugPrint('wss Response before Decode: ' + response);
// String resToDecode = response.split('.')[0];
// List<int> res = base64.decode(base64.normalize(resToDecode));
// debugPrint('wss Response after Decode: ' + utf8.decode(res));
// String decodedText = utf8.decode(base64.decode(response));
// debugPrint('wss Response after Decode: ' + decodedText);
},
onDone: () {
debugPrint('wss Socket Connected');
},
onError: (error) => debugPrint('wss Error: ' + error.toString()),
);
}@override
void dispose() {
super.dispose();
channel!.sink.close();
}@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text('Web Socket Demo'),
],
);
}
}I'm using web_socket_channel: ^2.1.0 library for WebSocket and I'm also able to get the response from WebSocket. But I'm not able to decode response in flutter
I have referred available SDKs provided by angelbroking and I can see we need to follow some steps to get that response in JSON format.
byte[] decoded = Base64.getDecoder().decode(message); // By decoding using base64 will gives byte array
byte[] result = decompress(decoded); // By decompressing again will gives byte array
String str = new String(result, StandardCharsets.UTF_8); // By converting UTF_8 will gives JSON response in StringAngel Broking SDKs
https://github.com/angelbroking-github/smartapi-dotnet/blob/5cd0ce09b1bd9c558e96941aa8b1edd691778cc6/AngelBroking/AngelBroking/WebSocket.cs#L68
https://github.com/angelbroking-github/smartapi-dotnet/blob/5cd0ce09b1bd9c558e96941aa8b1edd691778cc6/AngelBroking/AngelBroking/Helpers.cs#L14 -
Replace initState block in above example. This is working
@override
void initState() {
super.initState();
channel = WebSocketChannel.connect(Uri.parse(ApiPath.WSS_ANGEL));
channel!.sink.add(
jsonEncode({
"task": "cn",
"channel": "",
"token": "feed_token",
"user": "client_id",
"acctid": "client_id"
}),
);channel!.sink.add(
jsonEncode({
"task": "mw",
// "channel": "nse_cm|3045",
"channel": "nse_cm|3045&nse_cm|2885",
"token": "feed_token",
"user": "client_id",
"acctid": "client_id"
}),
);channel!.stream.listen(
(data) {
String response = data.toString();
debugPrint('wss Response before Decode: ' + response);
var step1 = base64.decode(response);
debugPrint('wss Response Decode Step 1: ' + step1.toString());var inflated = zlib.decode(step1); var step2 = utf8.decode(inflated); debugPrint('wss Response Decode Step 2: ' + step2.toString()); var step3 = json.decode(step2); debugPrint('wss Response Decode Step 3: ' + step3.toString()); if (step3.toString().contains('task') && step3[0]['task'].toString() == 'cn' && step3[0]['msg'].toString() == 'cn') { debugPrint('wss Socket Connected'); } }, onDone: () { debugPrint('wss Socket Connected'); }, onError: (error) => debugPrint('wss Error: ' + error.toString()),
);
}Decoded Data in Log
wss Response Decode Step 3: [{e: nse_cm, name: sf, ltp: 2597.25, ltq: 20, tk: 2885, ltt: NA}, {e: nse_cm, name: sf, ltp: 518.90, ltq: 8, tk: 3045, ltt: NA}]