The SUSI.AI android app has the feature to connect to the smart speaker through the WiFi access point of the smart speaker. This connection takes place without internet and is completely offline and takes place locally between the device and the app.
When the APIs are hit, the parameters are sent to the server and are extracted by the speaker and then stored to perform further actions, but like any other API there is some response sent by the server once the parameters are fetched and only when this response is correctly parsed we show the confirmation that the data was required to be sent to the speaker is successfully done.
The SUSI.AI android app was unable to parse this response and so , every time there was a request made to the speaker the error message was displayed on the screen, just like this :
This is a cropped screenshot of the error message shown.
To handle the response from the local server there was a need to add the response parsing classes in the app, also since the app is written in kotlin the specialised classes for this purpose are already present in kotlin which are specifically for the purpose of handling responses. The data classes are added for the three APIs for the local server that are made, the response class added for the WiFi credentials response is :
|data class SpeakerWifiResponse(
val wifi: String,
val wifi_ssid: String,
val wifi_password: String
Here the first string by the name of ‘wifi’ is used to display a success message and other two variables are for the ssid and password of the wifi network respectively.
The API that is used to set the configuration of the speaker has the response class as follows :
|data class SpeakerConfigResponse(
val configuration: String,
val hotword: String,
val stt: String,
val tts: String,
val wake: String
The third API which is used to send the auth credentials to the speaker has the following response class :
|data class SpeakerAuthResponse(
val auth: String,
val authentication: String,
val email: String,
val password: String? = null
Now these response classes have the variable name similar to the key values in the JSON response generated by the local server. Due to the similar names to the keys an extra step and extra lines of code are eliminated which had to be added otherwise denoting the “Serializable” values to match the JSON response values.
After these data classes were added the Call<> functions of the retrofit service DeviceApi.java were made of the type of the types of the above data classes , which then were able to successfully parse the response from the local server of the speaker.
So, after this the app to speaker connection was successful and a success message was shown as :
- Data classes in kotlin : https://kotlinlang.org/docs/reference/data-classes.html
- Serializable values android : https://developer.android.com/reference/java/io/Serializable
- Retrofit services in kotlin : https://firstname.lastname@example.org/kotlin-and-retrofit-2-tutorial-with-working-codes-333a4422a890