Daudzdaļu (multipar) latviešu valodas īsziņu (SMS) sūtīšana izmantojot ASTERISK + USB modēmu + chan_dongle

Ieviešam SMS izsūtīšanu ar RaspBerryPI + USB modēms + LMT pieslēgums + chan_dongle …

Brītiņu papriecājāmies, un tad sapratām, ka ar to ir par maz. Galvenais ierobežojums – latīņu burti un 160 simboli. Bet mūsdienās tak, nav nekādas problēmas izsūtīt “multipart” sms, vai tad ne? 🙂

Tāpēc dienu nācās pastrādāt un gribu padalīties ar rezultātu. Ja nu kādam noder – kopā mēs sasniegsim vairāk!

Neuzņemos nekādu atbildību par sintakses un loģikas kļūdām!

1) SMS jāsūta PDU formātā. Īsumā, tā ir hex datu rindiņa

dongle pdu dongle0 0041000B917311325476F80008240500030501010160007600650069006b0061002000700061007300610075006c00650021

2) Pati māksla ir uzģenerēt PDU datu virkni. Materiāls, kur mācīties: http://mobiletidings.com/2009/02/11/more-on-the-sms-pdu/
Kā arī online encoderi/decoderi:

http://www.diafaan.com/sms-tutorials/gsm-modem-tutorial/online-sms-pdu-decoder/
http://smspdu.benjaminerhart.com/ un vēl daži citi.

 

Tātad īss skaidrojums PDU virknei:

dongle pdu dongle0 0041000B917311325476F80008080500030501010061
                 ^   ^   ^ ^ ^         ^    ^ ^ ^   ^ ^ ^ ^^                
                 |   |   | | |         |    | | |   | | | ||- sākas SMS teksts. Kodēts UCS2. katrs simbols ir 4 octeti, jeb 4 oktetu pāri. 0061 == "a" burtu.
                 |   |   | | |         |    | | |   | | | |- tekošās īsziņas id (šajā piemērā - viena no vienas sanāk)
                 |   |   | | |         |    | | |   | | |- kopējais dalīto sms skaits.      
                 |   |   | | |         |    | | |   | |- "05" Reference numurs. Vienas īsziņas robežās jābūt vienādiem. Bet nav jāģenerē. Var būt statisks kods.
                 |   |   | | |         |    | | |   |- "03" norāda, ka nākamie būs 3 octetu datu pāri.
                 |   |   | | |         |    | | |- "05" - norāda data headera garumu. Tātad - vēl 5 octetu pāri	
                 |   |   | | |         |    | |- "08" - norāda tālākā ziņojuma PILNO garumu, sākot jau ar nākamo simbolu. Svarīgi - data headeris (kas ir 05...) arī jāskaita klāt (t.i. - mesage garums octetu pāri + 6)                                         
                 |   |   | | |         |    |-"08", norāda, ka tiks izmantots UCS-2 (unicode) teksta kodējums. t.i. - katrs burts 4 cipari (2 ciparu pāri)  
                 |   |   | | |         |- tā kā mums ir nepāra skaits ciparu, tad beigās ir jālīmē klāt F (pēc RFC, katrs bits attēlo 2 ciparus. Un ja mums ir jāatēlo tikai viens cipars, tad pēdējā "liekā" vietā ir jābūt bināri 1111, jeb 15 hexā, kas ir F)0 hexā)  	
		 |   |   | | |- sākas tel nr. Katri 2 cipari sākot ar pirmo tiek mainīti vietām un ierakstīti.                       
		 |   |   | |- "91" norāda, ka būs INTERNATIONAL telefons, tātad pilno tel.nr norādām ar 371. Mūsu gadījumā: "37112345678", kopā 11 simboli.
                 |   |   |- Telefona numura garums 37112345678 == 11, tātad hexā "0B"
		 |   |-PDU protokola numurs. "41" nozīmēs, ka mēs sūtīsim ne tikai tekstu, bet izmantosim arī message data header.
		 |-šis ir diongle ID. Ja ir vairāki Dongles, tad šeit norāda ID ciparu

Tā kā veltīju jau tā pārlieku daudz laika šī izpētei, tad plašāku info tagad nepostēšu. Ja kādam pēkšņi būs vēlēšanās vai interese, vai būs veiksmīgi šo izmantojis, rakstiet – pēc brīvā laikā iespējām varēšu palīdzēt!

1. ^RFC dokuments http://www.3gpp.org/ftp/Specs/archive/23_series/23.040/23040-c20.zip kas apraksta PDU oficiālo pilno formātu. Punktā 9.1.2.3 aprakstīts princips, kā rīkoties, ja jāattēlo nepāra skaits datu.

In the case where a semi‑octet represented field comprises an odd number of digits, the bits with bit numbers 4 to 7 within the last octet are fill bits and shall always be set to “1111”.

 

Arnis

 

2 thoughts on “Daudzdaļu (multipar) latviešu valodas īsziņu (SMS) sūtīšana izmantojot ASTERISK + USB modēmu + chan_dongle

  1. Jauks raksts, varbūt kādreiz noderēs, vari nedaudz paskaidrot “..tā kā mums ir nepāra skaits ciparu, tad beigās ir jālīmē klāt F (kas ir 0 hexā)..” Kāpēc “F” tiek tulkots kā “0”? vai ar to domāji, ka tajā datu formātā “f” tiek ignorēts šajā vietā vai kā? cik atceros f vienmēr ir bijis 15 (dec)

    1. Jā, kļūdījos. F == 15, protams, nevis nulle. Un atradu arī pamatojumu KĀPĒC tā jādara (skatīt atsauci uz RFC).

      Doma tāda – katrs “oktets” attēlo 2 ciparus.
      Katru ciparu attēlo 4 biti. Bitus skaita “no labās puses” (tāpēc hexā pierakstot, tie “jāmaina vietām”).

      Rezultātā – ja mums ir nepāra numurs, tad pēdējam ciparam mēs izmantojam tikai pirmos 4 bitus no okteta, bet atlikušos 4 bitus (pēc RFC) – mums jāaizpilda ar “liekiem” “1111″ kas ir “F” hexā.

      Paraugā minētā numura 37112345678 – pēdējais cipars ir 8 (1000 bināri). Aizpildām atlikušos bitus ar “1111″ – sanāk “11111000″ bināri. Kas hexā ir “F8″.

      Dodiet ziņu, ja vēl kaut ko nepareizi sarēķināju.

Atbildēt

Jūsu e-pasta adrese netiks publicēta.