Powershell script som agerar webbserver (med sms stöd)

Trädvy Permalänk
Medlem
Registrerad
Maj 2002

Powershell script som agerar webbserver (med sms stöd)

Har nu färdigställt ett lite längre PowerShell script för att skicka sms via ett 3G modem. "Scriptet/webbservern" tar emot kommandon via olika url:er och utför sedan detta. Hela scriptet har jag lagt upp på Github så det är bara att spinna vidare på det om du vill, ge gärna lite cred i så fall och behåll länken till bloggen

Om någon här är bra på AT/DT kommandon till modem så har jag en sak jag inte lyckats med och skulle behöva tips på. Det är Svenska tecken via SMS som inte fungerar.. Någon som har nått tips på hur jag kan få det att fungera???
Scriptet på Github
Länk till en guide på hur scriptet konfigureras och hur allt fungerar

Nedan är lite exempel på hur scriptet fungerar:

Genom att skriva följande rad skickas ett sms: http://IPTillDatorn:54320/?SMS/0701234567/Skickar ett sms

Jag har även gjort en funktion i scriptet som tillåter loggning ner till disk, detta sker till olika filer genom följande kommando:
http://IPTillDatorn:54320/?LOGGA/ValfriText/Sensor2/27,5

För att slippa gå till datorn för att se vad som loggats har jag gjort en funktion som läser upp data i tabellform.
”http://IPTillDatorn:54320/?readlog/Demo/DATA/tabel”

Länk till en guide på hur scriptet konfigureras och hur allt fungera

// Ispep

Trädvy Permalänk
Medlem
Plats
Karlstad
Registrerad
Nov 2010

Grymt gjort någon gång senare ska jag kolla på denna. Det jag och andra gör idag är att anlitar en dyr företagswebbtjänst som skickar ut sms åt en. Tjänsten fungerar typ som din, men de tar betalt.
Men genom en sådan här lösning skulle man kunna göra mycket, tänk om man bara hade mer fritid.

Ett stort plus till dig för att du delar med dig av ditt arbete!

i7 7700 & Ryzen 1800X. Båda har 64GB ram, 500 GB 960 Evo m.2. Grafikkort är något jag hittade i en container..

Trädvy Permalänk
Medlem
Registrerad
Maj 2002

Tackar!
Tycker det är bra att dela med sig. Koden blir bara bättre om fler kollar på den och tycker till.

Dom där dyra företagswebbtjänsterna klarar iofs ÅÄÖ Men de ska nog de här scriptet snart göra med! Funderar på att lägga till stöd att skicka mail med!
Fritid får man genom att avvara sömn

Skrivet av Johan86c:

Grymt gjort någon gång senare ska jag kolla på denna. Det jag och andra gör idag är att anlitar en dyr företagswebbtjänst som skickar ut sms åt en. Tjänsten fungerar typ som din, men de tar betalt.
Men genom en sådan här lösning skulle man kunna göra mycket, tänk om man bara hade mer fritid.

Ett stort plus till dig för att du delar med dig av dit arbete

Trädvy Permalänk
Inaktiv
Registrerad
Sep 2013

Lite OT. Men vilket kontantkort erbjuder fria sms under 1 år? Är ute efter en liknande grej som jag kan koppla min Ericsson k700 till. Det ska finnas ett script/program som man kan mejla till mobilen genom script eller direkt till telefonen som sedan skickar ut det som SMS.

Trädvy Permalänk
Medlem
Registrerad
Maj 2002

Har laddat mitt kort med nått Telia årskort SMS, det gav 5000 SMS / månaden under ett år för 500:- Telia sidan
Tror inte jag kommer att behöva mer än det

Går det inte att koppla in mobilen till en dator och få den att agera "Modem"?
Skrev tidigare ett program som du kan anropa direkt i så fall: SMS program till PC

Skrivet av MickeMM:

Lite OT. Men vilket kontantkort erbjuder fria sms under 1 år? Är ute efter en liknande grej som jag kan koppla min Ericsson k700 till. Det ska finnas ett script/program som man kan mejla till mobilen genom script eller direkt till telefonen som sedan skickar ut det som SMS.

Trädvy Permalänk
Medlem
Plats
0:0:0:0:0:0:7f00:1
Registrerad
Aug 2005

Nu är jag egentligen för slö för att kika igenom hela scriptet men något åt detta håll borde få svenska tecken att genereras

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)

Du måste ju givetvis ändra variabler men det tror jag du hajjar

Trädvy Permalänk
Inaktiv
Registrerad
Sep 2013
Skrivet av Ispep:

Har laddat mitt kort med nått Telia årskort SMS, det gav 5000 SMS / månaden under ett år för 500:- Telia sidan
Tror inte jag kommer att behöva mer än det

Går det inte att koppla in mobilen till en dator och få den att agera "Modem"?
Skrev tidigare ett program som du kan anropa direkt i så fall: SMS program till PC

Det känner jag till med telia
Ska testa dit program, ser helt klart intressant ut. Jag använde för ngt år sedan ett program som agerade gateway och passade som handsken för Ericsson:en. Jag kan dock inte komma på namnet på det...

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011

åäöÅÄÖ ska tydligen kodas med följande värde för att fungera i SMS

Tecken

Värde

å

229

ä

228

ö

246

Å

197

Ä

196

Ö

214

Har läst att SMS numera har stöd för UTF-8, men det verkar inte fungera med den setup jag har där sändaren är RPi3 med USB-dongel och mottagare är iPhone6.

För den som vill skicka SMS med sin RPi, här är ett enkelt sätt om man har ett USB-modem (för mig är modemet tillgängligt via /dev/ttyUSB0)

$ chat "" AT+CMGF=1 OK AT+CMGS=\"<mottagarens telefonnummer>\",129 ">" "<meddelandet du vill skicka>^Z" "+GMGS:" "" < /dev/ttyUSB0 > /dev/ttyUSB0

Edit: en bild på RPi3 med bl.a. 3G USB-modem

Dold text

Edit2: uppdaterade tabellen, den kodning jag tidigare läst att man skulle använda är inte vad iPhone använder, där används ISO 8859-1 (ISO Latin 1).

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Trädvy Permalänk
Medlem
Plats
I en mörk gränd
Registrerad
Okt 2001

Koolt. Kan man ta emot sms också? Hur gör man det isf?

"Say unto thine own heart, I am mine own redeemer"
Don't touch me when I'm crazy off that airplane glue

Trädvy Permalänk
Medlem
Registrerad
Maj 2002

Tack för alla tips!!
----

Kollade lite på det där men de fungerar inte eftersom den där klassen jag kör inte verkar klara UTF8

Skrivet av Kalasis:

Nu är jag egentligen för slö för att kika igenom hela scriptet men något åt detta håll borde få svenska tecken att genereras

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)

Du måste ju givetvis ändra variabler men det tror jag du hajjar

fick inte det att fungera heller, men maxvärdet på teckentabellen borde väll vara 127 om jag inte är helt ute och cyklar? dvs 7bits teckenuppsättning? Har inte hunnit testa allt för mycket ännu, så det kan vara jag som gjorde fel med eller så är det nått med modemtypen Huawei e220 som är annorlunda.

Skrivet av Yoshman:

åäöÅÄÖ ska tydligen kodas med följande värde för att fungera i SMS

Tecken

Värde

å

134

ä

132

ö

148

Å

143

Ä

142

Ö

153

Har läst att SMS numera har stöd för UTF-8, men det verkar inte fungera med den setup jag har där sändaren är RPi3 med USB-dongel och mottagare är iPhone6.

För den som vill skicka SMS med sin RPi, här är ett enkelt sätt om man har ett USB-modem (för mig är modemet tillgängligt via /dev/ttyUSB0)

$ chat "" AT+CMGF=1 OK AT+CMGS=\"<mottagarens telefonnummer>\",129 ">" "<meddelandet du vill skicka>^Z" "+GMGS:" "" < /dev/ttyUSB0 > /dev/ttyUSB0

Edit: en bild på RPi3 med bl.a. 3G USB-modem

Just nu går det inte att läsa sms med det, men jag har lyckats läsa ut sms tidigare. Får jag till ÅÄÖ så lägger jag nog mer krut på att få till läsa sms med.

Skrivet av DarkBob:

Koolt. Kan man ta emot sms också? Hur gör man det isf?

Trädvy Permalänk
Medlem
Plats
Karlstad
Registrerad
Nov 2010
Skrivet av Yoshman:

åäöÅÄÖ ska tydligen kodas med följande värde för att fungera i SMS

Tecken

Värde

å

134

ä

132

ö

148

Å

143

Ä

142

Ö

153

Har läst att SMS numera har stöd för UTF-8, men det verkar inte fungera med den setup jag har där sändaren är RPi3 med USB-dongel och mottagare är iPhone6.

För den som vill skicka SMS med sin RPi, här är ett enkelt sätt om man har ett USB-modem (för mig är modemet tillgängligt via /dev/ttyUSB0)

$ chat "" AT+CMGF=1 OK AT+CMGS=\"<mottagarens telefonnummer>\",129 ">" "<meddelandet du vill skicka>^Z" "+GMGS:" "" < /dev/ttyUSB0 > /dev/ttyUSB0

Edit: en bild på RPi3 med bl.a. 3G USB-modem

Tusan vad en vill bli arbetslös och bara pyssla med detta, jag tänker mig en egenkonstruerad övervakningskamera m.m. Vissa saker är förvånansvärt enkelt som du visade, ej många rader kod.

Nå om man ska fundera vidare så börjar väl mail ersätta sms? och det är också superenkelt..
https://www.raspberrypi.org/forums/viewtopic.php?f=36&t=32077

Angående läsa sms så kan man då göra styrning av det mesta, detta blir mycket intressant..

i7 7700 & Ryzen 1800X. Båda har 64GB ram, 500 GB 960 Evo m.2. Grafikkort är något jag hittade i en container..

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011

@Ispep: fungerar inte de koderna för dig? Är i alla fall de värden jag får om jag skickas SMS med åäö från iPhone till RPi, att det är >127 pekar ju på att man använder något tillägg ovanpå standard ASCII. Läste i.o.f.s. något om att åäö ofta inte fungerar med utländska mobiloperatörer, men utgår från att alla svenska operatörer har stöd för åäö i SMS.

@Johan86c: har också rätt stora problem att hitta tid för detta, håller på med ett automationsprojekt till min sommarstuga så dead-line är till hösten när kylan kommer igen.

Blev ju rätt enkelt att skicka SMS, chat är ett väldigt gammalt verktyg som designades för att automatisera uppkoppling av PPP-interface över modem, så en rätt bra match även för detta.

Man kan läsa ut alla SMS och konvertera det hela till en JSON-array så här

if chat -V -f show_sms.chat < /dev/ttyUSB0 > /dev/ttyUSB0 2> >(gawk -F, -f sms_to_json.awk > sms.json); then cat sms.json ; fi

där innehållet i show_sms.chat är

ABORT ERROR "" AT+CMGF=1 OK AT+CMGL="ALL" OK ""

och innehållet i sms_to_json.awk är

BEGIN { lines_to_msg =- 1 in_msg = 0 print "[" } END { print "]" } { if (--lines_to_msg == 0) { in_msg = 1 } } /\w/ { if (in_msg != 0) { if (in_msg == 1) { printf ", \"msg\": \"" in_word = 2 } else { printf "\\n" } printf $0 } } /^$/ { if (in_msg == 2) { in_msg = 0 print "\" }," } } /^\+CMGL/ { lines_to_msg = 2 sub(/\+08/, "", $5) sub(/ /, "\", \"time\": \"", $5) printf " { \"nr\": " $3 ", \"date\": " $5 }

Man kan få något något likt detta

[ { "nr": "<mitt mobil nr>", "date": "2016/04/04", "time": "22:19:48", "msg": "Skickar tillbaka" }, { "nr": "<mitt mobil nr>", "date": "2016/04/04", "time": "22:24:03", "msg": "Testar" }, { "nr": "<mitt mobil nr>", "date": "2016/04/08", "time": "22:30:25", "msg": "SMS with multiple lines\nSecond line" }, ]

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Trädvy Permalänk
Medlem
Registrerad
Maj 2002

Mer tid hade varit önskvärt för att hinna allt man vill... Tidigare när jag körde telldus gjorde jag en funktion i Powershell som hämtade bilder från en övervaknings kamera och la dessa som en bilaga i ett mail som skickades via Gmail Använde den tillsammans med en 433Mhz ringklocka för att se vilka som plingade på dörren

Skrivet av Johan86c:

Tusan vad en vill bli arbetslös och bara pyssla med detta, jag tänker mig en egenkonstruerad övervakningskamera m.m. Vissa saker är förvånansvärt enkelt som du visade, ej många rader kod.

Nå om man ska fundera vidare så börjar väl mail ersätta sms? och det är också superenkelt..
https://www.raspberrypi.org/forums/viewtopic.php?f=36&t=32077

Angående läsa sms så kan man då göra styrning av det mesta, detta blir mycket intressant..

Tackar för tipsen.

Har tyvärr inte fått det att fungera med E220 huawei modemet

kör jag:
AT+CSCS?

så får jag svaret:
+CSCS: "IRA"

har testat att köra
AT+CSCS="UCS2"
AT+CSMP=17,167,0,8

Samt försökt att köra data konverterat till big endian..

kör jag
AT+CMGF=1
AT+CMGL="ALL"

testar då att övesätta datat i SMS:et ( 00200020002000310020003200200033 ) (Å Ä Ö 1 2 3) och får (" 1 2 3"), dvs å ä ö försvinner.
kör jag programmet och skickar ett sms på igen till modemet så fungerar Å Ä Ö 1 2 3 i appen.

Vad för du för resultat när du kör på din telefon:
AT+CSCS?

Skrivet av Yoshman:

@Ispep: fungerar inte de koderna för dig? Är i alla fall de värden jag får om jag skickas SMS med åäö från iPhone till RPi, att det är >127 pekar ju på att man använder något tillägg ovanpå standard ASCII. Läste i.o.f.s. något om att åäö ofta inte fungerar med utländska mobiloperatörer, men utgår från att alla svenska operatörer har stöd för åäö i SMS.

@Johan86c: har också rätt stora problem att hitta tid för detta, håller på med ett automationsprojekt till min sommarstuga så dead-line är till hösten när kylan kommer igen.

Blev ju rätt enkelt att skicka SMS, chat är ett väldigt gammalt verktyg som designades för att automatisera uppkoppling av PPP-interface över modem, så en rätt bra match även för detta.

Man kan läsa ut alla SMS och konvertera det hela till en JSON-array så här

if chat -V -f show_sms.chat < /dev/ttyUSB0 > /dev/ttyUSB0 2> >(gawk -F, -f sms_to_json.awk > sms.json); then cat sms.json ; fi

där innehållet i show_sms.chat är

ABORT ERROR "" AT+CMGF=1 OK AT+CMGL="ALL" OK ""

och innehållet i sms_to_json.awk är

BEGIN { lines_to_msg =- 1 in_msg = 0 print "[" } END { print "]" } { if (--lines_to_msg == 0) { in_msg = 1 } } /\w/ { if (in_msg != 0) { if (in_msg == 1) { printf ", \"msg\": \"" in_word = 2 } else { printf "\\n" } printf $0 } } /^$/ { if (in_msg == 2) { in_msg = 0 print "\" }," } } /^\+CMGL/ { lines_to_msg = 2 sub(/\+08/, "", $5) sub(/ /, "\", \"time\": \"", $5) printf " { \"nr\": " $3 ", \"date\": " $5 }

Man kan få något något likt detta

[ { "nr": "<mitt mobil nr>", "date": "2016/04/04", "time": "22:19:48", "msg": "Skickar tillbaka" }, { "nr": "<mitt mobil nr>", "date": "2016/04/04", "time": "22:24:03", "msg": "Testar" }, { "nr": "<mitt mobil nr>", "date": "2016/04/08", "time": "22:30:25", "msg": "SMS with multiple lines\nSecond line" }, ]

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011

Skickade meddelandet

Skickar 'åäöÅÄÖ'

från telefonen till RPi. Läser jag ut detta i normalt text-läge (normalläget är "IRA") så klipper "chat" bort översta biten så det blir

Skickar 'edvEDV'

Byter jag textkodningsläge till UCS-2

AT+CSCS="UCS2"

får man detta resultat

0053006B00690063006B006100720020002700E500E400F600C500C400D60027

vilket man snabbt noterar att övre byte är noll och vad som står i låg byte är ISO Latin 1 kodat, inklusive åäöÅÄÖ.

Så från denna hexsträng går det att återskapa meddelandet i det format din dator använder.

Edit: Konstaterade också att min USB-dongel inte stödjer UTF-8, detta misslyckas

AT+CSCS="UTF-8"

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer