# Termux Sms Gateway
SMS and notification gateway using Android smartphone

#### Goal:

Make any laptop with an Internet connection a SMS gateway
Send SMS from his desktop using a web interface or other.
Receive SMS on his desk in order to use the content.

#### Method used

#### Send SMS or Notification

- SMS are created on one machine (1 or more) on the network.
    - They are then published to a public or private MQTT server
    - The messages are received on an MQTT client installed on the laptop (1 or more).
    - The messages are then sent to the recipients.

#### SMS reception

- The SMS are received on the smartphone and published to the MQTT server
- The messages are received on a MQTT client installed on the subscribed machine (1 or more)

#### Non-exhaustive use

- Email message usage
- Receive and process alert messages (IOT or other)
- etc ...

#### Conditions for receiving or sending
- Take a public or private MQTT server to relay messages
- Subscribe MQTT customers to the same topics

> You can install your own mosquitto server
>> https://mosquitto.org/download/
>
> More information on MQTT: https://fr.wikipedia.org/wiki/MQTT

- Security of data transmitted
> We may need to encrypt the content for security reasons.
>> Use encryption with public key / private key on clients

### Smartphone installation

https://github.com/termux/termux-app

#### Installation of termux
- Termux application obtained by F-Droid:
    - https://www.f-droid.org/fr/

- Or by google store:
    - https://play.google.com/

> IMPORTANT: You must choose either one or the other repository

- Install
    - Termux
    - Termux: API
    - Termux: Widget

#### MQTT client installation

The following python packages will be installed:

- termux-sms-gateway
- paho-mqtt
- supervisor
	- supervisor is a process control system
	- because Android do not support hard links, it will be necessary to patch  http.py from library
- rsa >> https://stuvel.eu/python-rsa-doc/

### Installation procedure

After installing termux on the smartphone, launch Termux

- Copy and paste the following command in the Termux terminal

        export PACKAGE="TermuxSmsGateway"&&
		export VERSION="1.0"&&
		mkdir -p $HOME/.termux/tasks&&
		mkdir -p $HOME/.termux/boot&&
		mkdir -p $PREFIX/etc/supervisor.d/&&
        apt install python git termux-api -y&&
		rm -rf TermuxSmsGateway&&
        git clone https://github.com/deunix-educ/TermuxSmsGateway.git&&
        cp -f $PACKAGE/smsquitto-install/smsquitto-st* $HOME/.termux/tasks/&&
		cp -f $PACKAGE/smsquitto/smsquitto-conf.yaml $HOME/.termux/&&
		cp -f $PACKAGE/smsquitto-install/supervisor/supervisord $HOME/.termux/boot/&&
		cp -f $PACKAGE/smsquitto-install/supervisor/supervisord.conf $PREFIX/etc/&&
		cp -f $PACKAGE/smsquitto-install/supervisor/smsquitto.conf $PREFIX/etc/supervisor.d/&&
        pip install $PACKAGE/dist/smsquitto-$VERSION.tar.gz&&
		cd $PREFIX/lib/python3.9/site-packages/supervisor&&
		patch < $HOME/$PACKAGE/smsquitto-install/supervisor/patch/http.py.patch&&
		cd ~

- Enter to start the installation

### Server configuration

- smsquitto config server are in ~/.termux/smsquitto-conf.yaml
    - host: ip or domain of the MQTT server
    - port: 1883 or 8883
    - keepalive: 60
    - username: login
    - password: password
    - useSSL: False or True
    - ca_cert: path/to/file/ca.cert
    - apikey: *string*

        - ** IMPORTANT **: This key is used to synchronize the topics with the subscriptions
            - ex: SQTT010203040506079

- Copy and paste the following command in the terminal

        nano $HOME/.termux/smsquitto-conf.yaml

- Install services (start, stop, status)
     - Install Tremux widget:Widget on the phone's by keeping your finger on the screen
     - Choose shortcut
     - Change the icon and the name if you want
     - Start, Stop, or Status service by clicking the icon

- supervisor to start and stop smsquitto process

	- you can use http://127.0.0.1:9001 too

		- login: root
		- password: toor


### Uses

- A MQTT client is required to operate the phone.
    - The smsquittod.py module gives an example of a client written in python.
        - Library is the Eclipse foundation paho-mqtt
        - Simply implemente ClientMQTTBase class

    - The sms-client.html file is another example but in websocket mode.
        - Directly modify the sms-client.html file
        - Launch it directly in a browser
            - by drag and drop
            - by an address of this type
                - file: ///path/to/file/sms-client.html

- demonstration

     - sms-client.html is fully functional
     - You just have to update the apikey in this file and in the configuration file on the smartphone
     - Set up some mobile numbers to do the tests

### Domotiz notification

- https://www.domoticz.com/wiki/Getting_started

##### Below is the integration process

- Send notification from custom HTTP/Action

    - Notification
        - script://notify.sh #FIELD1 #FIELD2 #FIELD3 #FIELD4 #TO #MESSAGE --tls or nothing
		- command
			- /usr/bin/python3 /home/pi/domoticz/scripts/notify.py --method=notify --host=$1 --port=$2 --user=$3 --password=$4 --apikey=$5 --text="$6" $7

    - SMS
        - script://notify.sh #FIELD1 #FIELD2 #FIELD3 #FIELD4 #TO #MESSAGE "00330645953706,0033791246318" --tls or nothing
			- command
            	- /usr/bin/python3 /home/pi/domoticz/scripts/smsquitto.py --method=sms --host=$1 --port=$2 --user=$3 --password=$4 --apikey=$5 --text="$6" --phone="$7" $8

    - SSL certification
        - argument --tls, in $7 or $8.
        - certification key in domoticz/scripts/smsquitto.py.

    - You must install python3 paho-mqtt library: pip3 install paho-mqtt

### API methods

Message sent and received format:

- (topic, payload)
    - topic: string that starts with apikey see above
        - apikey/pub/sms
        - apikey/emit/inbox
    - payload: is a Json string
        - {mobile: [mobile1, mobile2, etc ...], subject: "the subject", msg: "the message"}
        - {time: time, payload: payload}
- topics
    - apikey/pub/sms --> send SMS
    - apikey/pub/notify --> send notification
    - apikey/pub/location --> request for Geographic positioning
    - apikey/pub/inbox --> or all or sent or draft or outbox Read SMS message
    - apikey/pub/kill-service --> stop the service
