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.

 

 

 

 

.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *