#!/bin/bash
###############################################################################################################
# Titel: sdsfrpoc
# Autor: Michael Kaden
# Datum: 14.09.2014
#
# Funktion:
# Dieses Skript ist ein Teilprogramm von fdtsds. 
# Enthält eine SDS-TL (Type 4) eine Empfangsquittungsanforderung im Message Header, so kann eine 
# "Delivery Report"-SDS an den Absender versandt werden. Empfangene Status-SDS können quittiert werden, in dem der empfangene
# Status an den Absender als Status-SDS zurückgesandt wird, wenn die SDS in die DB geschrieben werden konnte.
#
# Zweck:
# Das Script soll als Hintergrundprozess auf einem Statusmonitor-PC laufen, der mittels RS232-Schnittstellen (auch 
# USB/Seriell-Konverter oder Ethernet-Serial-Device-Server) mit einem PEI-Interface eines TETRA Funkgerätes verbunden ist. 
# Die in der MySQL-Datenbank gesammelten SDS können so in anderen Anwendungen, z.B. Einsatzführungssoftware, ausgewertet 
# werden, um z.B. Status-, Positions- oder Text-Informationen zu verarbeiten.
#
# Copyright (C) 2014 Michael Kaden
#
# Dieses Programm ist freie Software. Sie können es unter Beachtung der Nutzungsbedingungen benutzen, 
# weitergeben und modifizieren.
# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen von Nutzen sein wird, 
# aber OHNE IRGENDEINE GARANTIE, sogar ohne die Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN 
# BESTIMMTEN ZWECK. 
###############################################################################################################

# Config-File einlesen
source /usr/local/smi/sub/etc/sdsfrsms.conf

# Konstanen und Variablen definieren
myname=$(echo $0 | $awk -F/ '{ print $NF }')

# alle MQTT-Messages des Read-Spoolers in einer Endlosschleife einlesen
while read -r line; do

	# hole aktuellen Timestamp
	now=$(date +%s)

	# erzeuge ein assoziatives Array um die Output-Elemente zu speichern
	#declare -A SDSArray

	# erzeuge ein assoziatives Array um die JSON-Message zu speichern
	declare -A json

	# notify processing a new JSON-Objekt
	log "$myname" "processing new SMS JSON object"
	
	# erstelle Liste der Keys im JSON-Objekt
	keys=$(echo "$line" | $jq -r 'keys[]')
	
	# übernehme JSON-Objekt in Array
	for i in $keys; do json[${i}]=$(echo "$line" | $jq -r .${i}); done
	
	# write the json array content into the logfile
	for i in $keys; do log "$myname" "  $i: ${json[${i}]}"; done
	log "$myname" "done"
	
	log "$myname" "transforming SMS message to SDS-PDU"

	# Assoziatives Array erzeugen um die decodierten PDU-Protocol-Tags zu speichern
	declare -A PDUelements
	
	# Zeilenweise den Output des PHP-dekodier-Skripts einlesen, der das Array der PDU-Protocol-Tags füllt
	while read line; do
		if [ -n "$(echo "$line" | tr -d '\r\n')" ]; then
			# für alle nicht leeren Zeilen die Array-Elemente befüllen
			eval $line
		fi
	done <<< "$("$php" "$SMSdecoder" ${json[ud]})"
	
	text="${PDUelements[number]} ${PDUelements[message]}"


	# creating SDS PDU
	TXT_PDU=$("$php" "$SDSencoder" --ProtoIdent 130 --MsgType 0 --DelivRepReq 0 --ShrtFmRep 0 --StorFwd 0 --MsgRef 255 --TimStmpUsd 0 --TxtCodSch 1 --Text "$text")
	TXT_PDU=$(echo $TXT_PDU | tr -d '\r\n" "')

	# creating SDS JSON object
	message="{ \"host\": \"$host\", \"pub\": \"smi/sub/sdsfrsms\", \"sys\": \"sds\", \"ts\": \"$now\", \"type\": \"message\", \"dev\": \"${json[dev]}\", \"dir\": \"rx\", \"st\": \"12\", \"from\": \"$virtual_ISSI\", \"ft\": \"0\", \"to\": \"$virtual_ISSI\", \"tt\": \"0\", \"ln\": \"$(echo "${#TXT_PDU}*4" | bc)\", \"ud\": \"${TXT_PDU}\" }"

	# publishing SDS JSON object on MQTT
	$mosquitto_pub -t "$(eval echo $MqttMsgOut)" -m "$message"
		
	# clear json array
	unset json
	declare -A json
	
	# erstelle Liste der Keys im JSON-Objekt
	keys=$(echo "$message" | $jq -r 'keys[]')

	# übernehme JSON-Objekt in Array
	for i in $keys; do json[${i}]=$(echo "$message" | $jq -r .${i}); done

	# write the json array content into the logfile
	for i in $keys; do log "$myname" "  $i: ${json[${i}]}"; done

	log "$myname" "done"
	unset json
	unset PDUelements
done < <($mosquitto_sub -t "$(eval echo $MqttMsgIn)")
exit 0

