Avainsana-arkisto: SIM908

Lähetetäänkö tekstiviesti? ja vähän luetaankin.

Tekstiviestin lähetys teknisellä tasolla ei ole ihan niin yksinkertainen homma kuin voisi kuvitella. Johtuu ehkä siitä, että alunperin sitä ei oltu suunniteltu ollenkaan kuluttaja käyttöön, vaan lähinnä operaattorilta asiakkaalle meneville viesteille (lue mainoksille?), mutta ihmiset ottivat 160 merkin viestit paljon paremmin vastaan kuin oletettiin. Osittain suosio ehkä johtui niinkin yksinkertaisesta asiasta, että alunperin tekstiviesti meni perille huomattavasti paremmin kuin puhelut huonossa kentässä ja eihän aluksi kenttää koko maassa kovin paljoa ollut.

SIM908 modulissa (ja yleisestikin) käytössä on kaksi moodia tekstiviesteille, PDU ja TEXT. Lähetettäessä PDU-muodossa viestit tulee normaalisti kännykkään, mutta TEXT-moodissa viesti tulee suoraan kännykän näytölle ja se pitää siitä erikseen tallettaa, ainakin niillä muutamalla samsugin puhelin mallilla, joilla olen asiaa testannut. Samoin PDU-moodissa SIM908-moduliin lähetetyt viestit käsitellään ”normaalisti” eli siis ne tallennetaan yms. TEXT-moodin viestit käsitellään eri tavalla. Niitä ei tallenneta vaan ne vain lähetetään serial lineen suoraan ja siis jos ne halutaan lukea ne täytyy huomata silloin, kun ne tulevat.

TEXT-moodissa viestin lähetys on yksinkertaisempaa kuin PDU-moodissa. TEXT-moodissa viestinä lähetystä olen käsitellyt jo aikaisemmin.  PDU vaatii enemmän koodia viestin lähetystä varten kuin TEXT-moodi.

Sony-ericson on julkaissut paperin PDU:sta. Puran paperista pääasiat tähän Suomeksi, mutta suosittelen lukemaan alkuperäisen artikkelin tarkempia tietoja varten. Luultavasti myös GSM-standardi on hyvää luettavaa tähän.
Ja tältä se PDU-moodin viesti näyttää lähetys vaiheessa: 07916407058099F911000A8170607896200000A71554747A0E4ACF416110945805B5CBF379F85C06
Selvää pässin lihaa eikö? 😀
Käydääs vähän tarkemmin tuota sitten lävitse. PDU on lyhenne sanoista Protocol Data Unit (tai myös Packet Data Unit) ja se koostuu kahdesta osasta, jotka ovat SCA (Service Central Adress) ja TPDU (Transport Protocol Data Unit).  Boldattu osa on SCA ja loppu on TDPU:ta.
Se siis koostuu heksadesimaali numero pareista, jotka esittävät aina tavun verran dataa.  Näitä pareja kutsutaan okteteiksi (octet). Oktetti ja tavu tarkoittavat samaa (8 bittiä dataa). Mahdollisesti historiallisista syistä niitä kuitenkin nimitetään erilailla. Ainoa ero on, että oktetti lähetetään ja tavu tallennetaan.
SCA on vain tekstiviestikeskuksen numero. SCA:n sijaan voidaan käyttää SIM-kortille tallennettua viestikeskusta, jos SCA korvataan ”00” .
0011000A8170607896200000A71554747A0E4ACF416110945805B5CBF379F85C06
Oktettien lähetysjärjestys löytyy esimerkistä. Esimerkiksi, jos halutaan lähettää seuraavat heksat 03FFFFE0.  Muutetaan oktetit ensiksi binaarimuotoon ja aloitetaan lähetys alusta.
  • 03                    0000 0011
  • FF                    1111 1111
  • FF                    1111 1111
  • E0                    1110 0000

ja lähetetään, oikean puoleisin bitti on ensimmäinen lähetetty.

1110 0000 1111 1111 1111 1111 0000 0011

Puretaan seuraavaksi toi SCA okteteiksi ja niiden merkityksiin.

07916407058099F911000A8170607896200000A71554747A0E4ACF416110945805B5CBF379F85C06
  • 07       osoitekentän pituus oktetteina (tätä oktettia ei lasketa mukaan)
  • 91       numeron tyyppi, tässä tapauksessa kansainvälinen ISDN/puhelin numero
  • 64       numerot 46
  • 07       numerot 70
  • 05       numerot 50
  • 08       numerot 80
  • 99       numerot 99
  • F9       numero 9 ja täytemerkki ”F”, jotta saadaan parillinen määrä numeroita.

Rakennellaanpa tässä samalla omaa esimerkkiä eikä vaan oteta samaa esimerkki kuin lähteessä. Elisan(Saunalahden) prepaidin viestikeskuksen numero on +358508771010 ja vastaava SCA 07 91 53 58 80 77 01 01. Tämä numero on parillinen, joten täytemerkkiä ”F” ei tarvita. SCA on siis muodostettu laittamalla numerot pareiksi ja vaihtamalla parien numerot päittäin.

07916407058099F911000A8170607896200000A71554747A0E4ACF416110945805B5CBF379F85C06

Viestikeskuksen osoitteen jälkeiset 3 oktettia kertovat esimerkiksi mihin suuntaan viesti on menossa ja kuinka kauan sitä yritetään lähettää vastaanottajalle.

seuraava oktetti, arvoltaan 11, tarkoittaa lyhyesti sanottuna, että olemme lähettämässä tekstiviestiä ja kertoo viestikeskukselle miten käsitellä myöhemmin lähetettävää viestin voimassa olo oktettia. (oktetin binääri kentät: TP-MTI viestin tyyppi, TP-RD duplikaattien esto, TP-VPF viestin voimassa olo viestin muoto, TP-SSR status reportti, TP-UHD user dataheader ja  TP-RP vastaus reitti.)

Seuraava oktetti TP-MR, arvoltaan 00, voidaan periaatteessa laittaa miksi tahansa välillä 0-255(muutettuna heksadesimaaliksi), mutta molemmissa esimerkeissä jätetään tämä arvoon 00.

Seuraavaksi päästään käsittelemään vastaanottajan numeroa

07916407058099F911000A8170607896200000A71554747A0E4ACF416110945805B5CBF379F85C06

 

0A 81 70 60 78 96 20 Tämä kenttä on muuten samanlainen kuin SCA, mutta sen sijaan, että numeron pituus laskettaisiin oktetteina, se lasketaan ihan suoraan numeroina.

  • 0A tarkoittaa siis, että numerossa on 10 numeroa.
  • 81 tarkoittaa numeron muotoa (tässä kansallinen muoto)
  • loput ovat puhelin numero, tässä 07 06 87 69 02 (070-6876902)

Koska numeroita on parillinen määrä niin täytemerkkiä ei tarvita.

ja tehdään taas omaa

numero mihin halutaan lähettää on +35840 537 3212, pareina 35 84 05 37 32 12 ja käännettynä 53 48 50 73 23 21 ja koko vastaaanottajan kenttä 0C91534850732321. Tähän menessä siis ollaan rakennettu seuraava pätkä.

079153588077010111000C91534850732321

Seuraava oktetti (TP-PID, protocol identifier) mahdollistaisi esimerkiksi tekstiviestin toimittamisen sähköpostiin, mutta tässä pitäydytään arvossa 00 ja mobiililaitteiden välisessä viestinnässä.  (Tarkempaa tietotoa GSM 03.40 spesifikaatiosta.)

Seuraava oktetti (TP-DCS) kertoo monen näköistä. Sillä voidaan esimerkiksi kertoa, että lähetetään 8-bittistä dataa GSM-standardin normaalin 7-bittisen sijaan. Tarkempia tietoja kannattaa etsiä GSM spesifikaatiosta 03.38 ja alkuperäisestä artikkelista. Molemmissa esimerkeissä päädytään arvoon 00.

Seuraava oktetti (TP-VP) kertoo kuinka kauan viestiä yritetään lähettää. Tähän vaikuttaa myöskin aikaisempi TP-VPF. Molemmissa esimerkeissä käytettään arvoa A7 (eli viestiä yritetään lähettää 12h+12h=24h)

Seuraava oktetti TP-UDL kertoo kuin pitkästi viestiä on tulossa. Jos käytössä on normaali GSM-merkistö tämä kertoo merkkien määrän, jos käytössä on 8-bittinen tai muuten oktetteina esitetty data tämä kertoo oktettien määrän. Aikaisemmin määriteltiin jo TP-DCS kohdassa, että käytetään SMS luokkaa. jossa on normaali GSM aakkosto. Ja tosiaan 15hex= 21dec ja meillä on 21 merkkiä viestissä.

Ja omassa esimerkissä on taasen vastaavasti 0Bhex =11dec

Katsotaan sitten oman esimerkin avulla miten viesti koodataan lähetystä varten.  Otetaan esimerkiksi vaikka huudahdus ”Hoo ka hei!”

Ensimmäiseksi kaivetaan esille mitä mikäkin kirjain on GSM spesifikaation mukaan. Perus gsm merkistö on 7-bittinen, mutta ne kuitenkin lähetetään 8-bitin muodossa.

  • H    1001000
  • o     1101111
  • o     1101111
  •         0100000
  • k     1101011
  • a     1100001
  •         0100000
  • h     1101000
  • e     1100101
  • !      0100001

Tämän jälkeen vain kasataan bitit yhteen pötköön ja muutetaan  ne 8-bit pätkissä heksadesimaali muotoon. Taulukko ehkä selventää.  Taulukkoon on vasemmalle alas lisätty nollia täyttömerkeiksi. Käytännössä siis lähetetään tässä tapauksessa ensimmäiseksi merkki ”H” ja sen jälkeen ”o” jne.

7 6 5 4 3 2 1 0 heksa
1 1 0 0 1 0 0 0 C8 H o o k a h e i !
1 1 1 1 0 1 1 1 F7
0 0 0 1 1 0 1 1 1B
1 0 1 1 0 1 0 0 B4
0 0 0 0 1 1 1 0 0E
1 0 0 0 0 0 1 1 83
1 1 0 1 0 0 0 0 D0
1 1 1 0 0 1 0 1 E5
0 1 1 1 0 1 0 0 74
0 0 0 0 1 0 0 0 08

 

Ja lopullinen oma esimerkki PDU:sta on seuraava 079153588077010111000C915348507323210000A70BC8F71BB40E83D0E57408

Joka siis lähettää viestin ”Hoo ka hei!” käyttäen PDU-moodia ja Saunalahden prepaid viestikeskusta minulle. Vastaava lähetys käyttäen SIM-kortin viestikeskusta olisi.

0011000C915348507323210000A70BC8F71BB40E83D0E57408

Mitä se Sony Ericsonin esimerkki sitten lähettää?

07916407058099F911000A8170607896200000A71554747A0E4ACF416110945805B5CBF379F85C06

No vähän pitemmän viestin ”This is a PDU message”

Vaikka omaan projektiin löytyisikin kirjastoja, joilla viestin saisi koodattua PDU muotoon lennossakin taidan tyytyä koodaamaan viestit valmiiksi ja lähettää pelkkiä vakio viestejä. Katsotaan miten tämä tästä sitten eteen päin kehittyy.

Lupailin otsikossa, että tässä kirjoituksessa käsitellään viestin vastaanottamistakin. No periaatteessa sekin on käsitelty jo aikaisemmassa sepustuksessa. Laitetaan kuitenkin esille video aiheesta, ettei ihan valehdella otsikossa.

 

 

 

Netistä löytyy PDU laskimia kumpaankin suuntaa useitakin. Minä olen käyttänyt dekoodaukseen diafaan.comin laskuria ja enkoodaukseen useampaakin nettisivua.

Sony Ericksonin paperi on vuodelta 2003, mutta mitä ilmeisemminkin se on edelleen ihan kuranttia kamaa, uusimpia muutoksia siinä ei tietenkään ole, mutta näkyyhän toi toimivan edelleen.

 

 

 

 

.

SIM908 modulin liittäminen muuhun maailmaan

Ostin kilkkeen, jossa on samassa GSM ja GPS palikat. Moduli perustuu simcomin sim908 palikkaan.  LIevähkö yllätys tuli siinä vaiheessa, kun minulle selvisi, että modulia ohjataan AT käskyillä. Olen tässä vuosien varrella muutamia kertoja törmännyt sivulauseessa kyseisiin komentoihin, mutta edellisen kerran minä niitä varsinaisesti olen käyttänyt viimeksi suunnilleen 90-luvulla, kun leikin modeemilla.  Ensimmäiset muistikuvat AT-käskyistä on jo 80-luvulta. Äidillä oli työ käytössä silloin ”tyhmä pääte” ja sen yhteys maatalouden laskentakeskuksen koneeseen avattiin ja lopetettiin AT-käskyillä.  Yritin netistä löytää kuvaa kapistuksesta, mutten kunnollista löytänyt. Ainut kuva missä pääte edes oli, oli historiikki kuva ja siitä ei juuri päätteestä selvää saa.

Tarkoituksena siis tieto kulkemaan molempiin suuntaan moduulista sekä tekstiviestillä, että netin yli.  Alunperin suunnittelin, että moduli itsessään toimisi webbi serverinä, mutta erinäisistä syistä johtuen päädyin käyttämään apuna erillistä webbiserveriä. Suurin syy on se, että pääsen ehkä helpommalla koodauksen kanssa näin. Muita syitä on mm. se että mobiilissa palikan IP numero vaihtelee. Tämä ainakin on siis tällä hetkellä suunnitelma.

Simcom kertoo kyllä kiltisti kaikki AT-käskyt ja vastaukset niihin, mutta kaikistellen ei mitenkään selitä mitä tarvitaan mihinkin. Yllättäviä vaikeuksi aihuetti myöskin se etten heti tajunnut, että AT käskyissä on useampaa versiota ja modulissa on varsinaisia AT-käskyjä että simcomin omia AT-käskyjä. Varsinkin nettipuolen  yhteys oli aluksi sen takia täysin mahdoton idea. Varsinkin nettipuolen toiminnnan kannalta nettisivut olivat todella hyvää luettavaa. Kuten myöskin cooking hackingin sivut auttoivat valtavasti, mutta myös aiheuttivat harmaita hiuksia virheellisen GPS-koordinaattien muunnoksen takia. Heidän koodin mukaisella sijannilla asun Suomenlinnassa.

Katsotaan sitten miten moduli tottelee AT käskyjä. Aloitetaan ihan yleisillä jutuilla ja mennään sitten aluksi tarkemmin tekstiviesteihin ja sen jälkeen netti datasiirtoon.

AT käskyjen yleinen muoto on AT+KÄSKY. Moduli yleisin vastaus OK tai error, lisäksi tulee riipuen käskystä muutakin. Moduli on kytkettävissä suoraan arduinon TX ja RX pinneihin. Kokeilu vaiheessa käytin myöskin USB to TTL muunninta, joka toimi itse asiassa paremmin kuin arduino. Arduinon software serial kirjasto ei minun kokeiluissa toiminut luotettavasti ja muutenkin lienee parempi tehdä homma suoraan hardware TX/RX linjoihin, koska lopullisessa käyttökohteessa moduli tulee nimenomaan hardware serial linjaan kiinni.

Modulin kytkennän ja toiminnan voi varmistaa käskyllä AT, vastauksen pitäis olla OK.

AT+CPIN? Kertoo SIM-kortin PIN koodin tilanteen.  ”+CPIN: READY” kertoo, että PIN koodi on ok ja ”+CPIN: SIM PIN” taasen, että PIN koodia ei ole annettu. AT+CPIN=1234 lähettään PIN-koodin.

AT+CREG? kertoo, kun moduli on kiinni verkossa.  ”+CREG: 0,1” kertoo, että ollaan kiinni kotiverkossa. Jälkimmäinen numero kertoo verkossa kiinni olemisen tilanteen.

0 Not registered, MT is not currently searching a new operator to register to

1 Registered, home network

2 Not registered, but MT is currently searching a new

operator to register to

3 Registration denied

4 Unknown

5 Registered, roaming

AT+CMGF=1 Asettaa modulin teksti moodiin, AT+CMGF=0 asettaa PDU moodin (binääri).  Minä olen käyttänyt teksti moodia.

AT+CMGS=”0401234567″ Lähettää puhelinnumeron modulille ja moduli vastaa ”>” merkillä. Sen jälkeen lähetetään itse tekstiviesti ja perään CTRL-Z (eli lopetus koodi) 0x1A heksakoodina.

Ja siinä se! tekstiviesti lähti maailmalle. Modulista löytyy monta IMG_20151021_185729käskyä joilla voidaan tekstiviestejä käsitellä mm. tallentaa odottamaan lähetystä.  Ilmeisesti viesti ei ihan normaali muodossa lähde oletus arvoilla, koska se tulee vähän hassusti puhelimeen. Viesti pitää erikseen tallentaa puhelimessa.

Viestin lukemiseen modulista tarvitaan muutama komento lisää. Moduli laitetaan tekstimoodiin, jos se ei jo siinä ole (AT+CMGF=1)

AT+CPMS=”SM,”SM”,”SM” käskyllä asetetaan muisti. Tarkkaan en ole tutustunut käskyyn, mutta SM tarkoittaa SIM korttia ja käskyssä ensimmäinen SM on muisti joka käsittelee viestien lukemista ja poistamista, toinen SM on kirjoitus ja lähetys ja viimeinen on viestien vastaanotto. Tämä tarvitsee kyllä viellä tutkimista, että mikä on mikäkin.

AT+CMGR=1 Lukee ensimmäisessä muisti paikassa olevan viestin. Toisessa muisti paikassa olevan viestin voin lukea vaihtamalla numeron 1 numeroksi 2

AT+CMGL=”ALL” Käskyllä saadaan listattua kaikki viestit muistista kerralla.

”REC UNREAD” Received unread messages
”REC READ” Received read messages
”STO UNSENT” Stored unsent messages
”STO SENT” Stored sent messages
”ALL” All message
Niin kuin jo aikaisemmin sanoin tekstiviestien käsittelyyn löytyy paljon enemmänkin käskyjä, mutta tässä on nyt aikalailla minini mitä tarvitaan.

Netin kautta yhdistämiseen löytyy useampikin vaihtoehtoinen tapa. Valitettavasti mistään ei selvästi tätä suoraan kerrottu, joten jouduin aika hyvän hetken taistelemaan, että sain yhteyden toimimaan.

Kokeillaans sitten miten saadaan netistä tietoa moduliin päin. Kun AT+CREG? kertoo, että ollaan kiinni verkossa yhteys voidaan aloittaa.

AT+SAPBR=3,1,”Contype”,”GPRS” Asettaa yhteystyypin GPRS moodiin.

AT+SAPBR=3,1,”APN”,”internet” Asettaa APN, tässä tapauksessa saunalahden käyttämä ”internet”.  LIsäksi tarvittaessa voidaan asettaa käyttäjätunnus ja salasana. Saunalahden yhteydessä niitä ei tarvita (eikä ilmeisesti muissakaan suurilla Suomalaisilla operaattoreilla)

AT+SAPBR =1,1 Käynnistää yhteyden.

AT+SAPBR=2,1 Kertoo yhteyden tilan mm. modulin IP numeron. Jos yhteydellä on IP numero voimme jatkaa, muuten kokeillaan uudestaan.

AT+HTTPINIT Aloittaa HTTP yhteyden muodostamisen.

AT+HTTPPARA=”CID”,1 Asettaa yhteyden profiilin numeron (bearer profile identifier). CID on yksi niitä juttuja joista ei älyttömästi kerrota mikä se on.

AT+HTTPPARA=”URL”,”https://rahikkala.net/robots.txt”  Asettaa kohde URL:n.

AT+HTTPACTION=0 Aloittaa HTTP GET yhteyden. vastaus ”+HTTPACTION:0,200,87 ” kertoo onnistuneen yhteyden.  0 kertoo että käytetään GET metodia, 200 kertoo onnistuneesta yhteydestä, ja 87 kertoo kuinka monta tavua on noudettu.

AT+HTTPREAD hakee serverin vastauksen.

 

Modulista maailmalle päin voidaan dataa saada useammallakin tavalla liikenteeseen. Itse taidan käyttää GET metodia, joka on helpompi. Periaatteessa eroa netistä tiedon hakuun on vain se, että serverillä on sopiva vaikkapa PHP-koodi joka otta vastaan tiedon. GET metodissa tieto on URL:ssä. URL-osoitteessa on ”?” merkki jonka jälkeen data tulee.  Cooking hacksin sivuilla on hyvä esimerkki tästä ja sieltä myös löytyy esimerkki sopivasta PHP-koodista.

Tämä on vain pinta raapaisu miten SIM908 voidaan liittää muuhun maailmaan, jätän ihan tarkoituksella monia asioita selittämättä, suurimmaksi osaksi ihan siksi, etten itsekään vielä tiedä. Valmiista laitteesta tulee vielä tarkemmin juttua, mutta se voi hyvinkin mennä tulevalle vuodelle.  SIM908 dokumentaation periaatteessa hyvä, mutta käytännössä se vaatii melkeinpä kokeilemalla kokeilemaan miten mikäkin toimii. Onneksi internetistä löytyy tietoa aika paljonkin. Erillaisia kirjastoja olisi ollut vaikka kuinka paljon valmiiksikin kirjoitettuna, mutta en halunnut käyttää niitä tässä.

 

Ps. Vaikka useimpien lauseiden aikamuodosta voisi päätellä muuta, en ole vielä oikeastaan edes aloittanut koodin kirjoittamista, mutta kaikki mainitut käskyt on kuitenkin testattu ja toimivaksi todettu.