Updated 2009-06-13 07:06:49 by arlie

Anton Kovalenko: GSM library for tcl

A library [1] to communicate with GSM mobile phone and to send/receive SMS.

Usage samples:
    set phone [open COM1 r+]
    foreach {manuf model revision} [gsm::phone::acquire $phone] {break}
    puts "Phone model: $manuf $model ($revision)"
    gsm::io::atcmd $phone Z
    # set default timeout
    gsm::io::timeout $phone 4000
    set gdconts [gsm::io::atcmd $phone +CGDCONT]
    ...
    gsm::phone::sendsms $phone +79163453402 \
                 "Hello Anton, I'm testing your library"
    gsm::phone::sendsms $phone +79163453402 "Unicode test: \u0412 "

    foreach sm [gsm::pdu::assemble [gsm::phone::readsms $tty ME 4]] {
      array set sm1 $sm
      puts "Storage id $sm1(id), assembled from $sm1(parts)"
      puts "From/to $sm1(peer): $sm1(text)"
    }

It is possible to use it with my infrared mini-extension. Just pass to gsm::phone::acquire a socket connected to IrDA:IrCOMM service.

This library is used in SMS Reception Center [2]

As an alternative to the character conversion implemented in the gsm library, the encoding command can be extended with a gsm0338 encoding: GSM 03.38 encoding

dzach 2006-8-1: I was trying the library, and sent a message in greek, even in lowcase! That's very nice! Is there any way to receive a message or a RING as it comes in like with the +CNMI=1,2,0,0,0 command? When I enter +CNMI=1,2,0,0,0 the library pops an error and stops responding to commands (NOKIA 6310):
 invalid command name "RING"
    while executing
 "RING"
    (in namespace eval "::" script line 1)
    invoked from within
 "namespace eval :: $state(handler,$fd) [list $str]"
    (procedure "_unsolicited" line 3)
    invoked from within
 "_unsolicited $fd $str"
    (procedure "::gsm::io::_reader" line 52)
    invoked from within
 "::gsm::io::_reader file4"

What could be the cause of this?

dzach (some hours later) Aha! you give it an event handler for any unknown event and everything works smoothly now:
 ::gsm::phone::acquire $phone ::handler

where ::handler can be as simple as:
 proc ::handler args {puts $args}

I tried it with a RING and with a +CMT event (with +CNMI=1,2,0,0,0, allowing for automatic reception of SMSs). It needed also a change to the -translation option in the fconfigure command to {auto cr} from {auto crlf} for the NOKIA 6310.

Anton, I like the capability to handle lower case greek characters very much. Nice work!

Arlie, did this:
    package require gsm

    set phone [open COM8 r+]

    ::gsm::phone::acquire $phone ::handler

    foreach {manuf model revision} [gsm::phone::acquire $phone] {break}
    puts "Phone model: $manuf $model ($revision)"

    gsm::io::atcmd $phone Z
    # set default timeout
    gsm::io::timeout $phone 4000

    set gdconts [gsm::io::atcmd $phone +CGDCONT]

    #gsm::phone::sendsms $phone +79163453402 "Hello Anton, I'm testing your library"
    #gsm::phone::sendsms $phone +79163453402 "Unicode test: \u0412 "

    foreach sm [gsm::pdu::assemble [gsm::phone::readsms $tty ME 4]] {
         array set sm1 $sm
         puts "Storage id $sm1(id), assembled from $sm1(parts)"
         puts "From/to $sm1(peer): $sm1(text)"
    }

    proc ::handler args {puts $args}

But got this:
    Phone model:  WAVECOM MODEM  MULTIBAND  900E  1800  (641c09gg.Q2406B 1349424 092 404 15:49)
    +CME ERROR: 3
        while executing
    "error $state(result,$fd)"
        (procedure "gsm::io::atcmd" line 26)
        invoked from within
    "gsm::io::atcmd $phone +CGDCONT"
        invoked from within
    "set gdconts [gsm::io::atcmd $phone +CGDCONT]"
        (file "gsm-modem.tcl" line 14)

Please help. I really need this to work.

[ Category Package | Category Internet | Category Channel | Category Device Control ]