The beauty of SUSI Smart Speaker lies in it being customizable according to the user’s needs. And we allow the user to customize it by providing an interface through the mobile clients. To do so, we create a local server on the Raspberry Pi itself. The Raspberry Pi is started in an Access Point mode and the mobile clients hit the endpoints in a specific order and then the configuration is sent to the server and stored according to the user.
The following API’s are required to be executed by the mobile clients
1> /speaker_config
2> /wifi_credentials
3> /auth
4> /config
The following is the order of API execution
1. /speaker_config
This endpoint only takes the room name as a parameter. And then send send to the server to store the location of the device under the user’s account
def speaker_config(): room_name = request.args.get(‘room_name’) config = json_config.connect(config_json_folder) config[‘room_name’] = rogom_name |
2. /wifi_credentials
This endpoint takes the wifi ssid and wifi password as the parameters and then stores it in the raspberry Pi wifi config file.
def wifi_config(): wifi_ssid = request.args.get(‘wifissid’) wifi_password = request.args.get(‘wifipassd’) subprocess.call([‘sudo’, ‘bash’, wifi_search_folder + ‘/wifi_search.sh’, wifi_ssid, wifi_password]) display_message = {“wifi”:“configured”, “wifi_ssid”:wifi_ssid, “wifi_password”: wifi_password} resp = jsonify(display_message) resp.status_code = 200 return resp |
Now the script wifi_search is called which stores the wifi credentials in the wifi_config file using the following command
cat >> /etc/wpa_supplicant/wpa_supplicant.conf <<EOF network={ ssid=“$SSID” psk=“$PSK” } EOF |
3. /auth
This endpoint takes the SUSI’s login credentials as parameters, i.e. the registered email id and the corresponding password.
def login(): auth = request.args.get(‘auth’) email = request.args.get(’email’) password = request.args.get(‘password’) subprocess.call([‘sudo’, ‘bash’, access_point_folder + ‘/login.sh’, auth, email, password]) display_message = {“authentication”:“successful”, “auth”: auth, “email”: email, “password”: password} resp = jsonify(display_message) resp.status_code = 200 return resp |
4. /config
Finally, this endpoint takes the stt, tts, hotword detection engine and wake button as the parameters and configures the speaker accordingly.
def config(): stt = request.args.get(‘stt’) tts = request.args.get(‘tts’) hotword = request.args.get(‘hotword’) wake = request.args.get(‘wake’) subprocess.Popen([‘sudo’, ‘bash’, access_point_folder + ‘/config.sh ‘, stt, tts, hotword, wake]) display_message = {“configuration”:“successful”, “stt”: stt, “tts”: tts, “hotword”: hotword, “wake”:wake} resp = jsonify(display_message) resp.status_code = 200 return resp |
Now, this function runs a script called config.sh which in turn runs a script called rwap.sh to convert the Raspberry Pi to normal mode and then finally start SUSI on startup.
#!/bin/bash if [ “$EUID“ -ne 0 ] then echo “Must be root” exit fi cd /etc/hostapd/ sed -i ‘1,14d’ hostapd.conf cd /etc/ sed -i ‘57,60d’ dhcpcd.conf cd /etc/network/ sed -i ‘9,17d’ interfaces echo “Please reboot” sudo reboot |
After successfully hitting all the endpoint from the client, your Smart Speaker would restart and would see the following screen on your client.
References
- https://github.com/fossasia/susi_linux
- https://raspberrypi.stackexchange.com/questions/10251/prepare-sd-card-for-wifi-on-headless-pi
- http://flask.pocoo.org/docs/1.0/
Additional Resources
- To read more about bash scripting regarding Wifi on RasPi , read the following discussion: https://www.raspberrypi.org/forums/viewtopic.php?t=116023
- To learn more about shell scripting in general: https://www.shellscript.sh/
- To contribute more to our repo , proceed here
- https://github.com/fossasia/susi_linux
- https://github.com/fossasia/susi_ios (IOS Clients)
- https://github.com/fossasia/susi_android (Android Clients)
Tags
fossasia, susi, susi.ai, gsoc, gsoc’18, handshake