Home General Computer Multimedia Business Lounge

Post Reply 
Mengirim comand CUSD ke modem GSM dengan C (GNU/Linux)
06-05-2011, 04:28 PM
Post: #1
Heart Mengirim comand CUSD ke modem GSM dengan C (GNU/Linux)
Hi all, met kenal semua...
Mo pamer kode... boleh khan ? piss

Apa sich command CUSD itu ?
Silahkan search di google, I believe you can do that easly.
Biasanya command ini digunakan untuk meng "query" operator telp GSM untuk melihat informasi yang disediakan oleh operator tersebut, seperti misalnya: penggunaan pulsa. Saya sering pake kode ini buat ngecheck pulsa saya pada modem GSM saya.
OK langsung saja,

File ser_dev.h
Code:
/* File ser_dev.h */

#ifndef SER_DEV_H
#define SER_DEV_H

#define S_BUF_SZ 8192

#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif

typedef struct ser_dev_t
{
  int fd;
  int is_open;
  char buff[S_BUF_SZ];
  char port[128];
  speed_t baud;
  struct termios *old_opt;
  struct termios *new_opt;
} ser_dev_t;

extern void
ser_dev_init(ser_dev_t *ser_dev, const char *port_name, speed_t baudrate);

extern void
ser_dev_clear_buff(ser_dev_t *ser_dev);

extern int
ser_dev_open(ser_dev_t *ser_dev);

extern int
ser_dev_write(ser_dev_t *ser_dev, const char *cmd);

extern int
ser_dev_read(ser_dev_t *ser_dev);

extern void
ser_dev_close(ser_dev_t *ser_dev);

#endif // End of ser_dev.h

File ser_dev.c
Code:
/* File ser_dev.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "ser_dev.h"

void ser_dev_init(ser_dev_t *ser_dev, const char *port, speed_t baudrate)
{
  ser_dev->fd = 0;
  ser_dev->is_open = FALSE;
  memset((void *)ser_dev->buff, '\0', S_BUF_SZ);
  memset((void *)ser_dev->port, '\0', sizeof(ser_dev->port));
  strncpy((char *)ser_dev->port, port, sizeof(ser_dev->port));
  ser_dev->baud = baudrate;
  ser_dev->old_opt = (struct termios *)malloc(sizeof(ser_dev_t));
  memset((void *)ser_dev->old_opt, 0, sizeof(struct termios));
  ser_dev->new_opt = (struct termios *)malloc(sizeof(ser_dev_t));
  memset((void *)ser_dev->new_opt, 0, sizeof(struct termios));
}

void ser_dev_clear_buff(ser_dev_t *ser_dev)
{
  memset((void *)ser_dev->buff, 0, S_BUF_SZ);
}

int ser_dev_open(ser_dev_t *ser_dev)
{
  int result = FALSE;

  errno = 0;
  ser_dev->fd = open(ser_dev->port, O_RDWR | O_NOCTTY | O_NDELAY);
  if (ser_dev->fd < 0) {
    printf("Error opening serial port: %s\n", strerror(errno));
  } else {

    fcntl(ser_dev->fd, F_SETFL, 0);
    tcgetattr(ser_dev->fd, ser_dev->old_opt);

    /* Initialize port */
    ser_dev->new_opt->c_cflag |= (CLOCAL | CREAD | CMSPAR);
    ser_dev->new_opt->c_cflag &= ~(PARENB | CSTOPB);
    ser_dev->new_opt->c_cflag &= ~CSIZE;
    ser_dev->new_opt->c_cflag |= CS8;
    ser_dev->new_opt->c_cflag &= ~CRTSCTS;

    cfsetispeed(ser_dev->new_opt, ser_dev->baud);
    cfsetospeed(ser_dev->new_opt, ser_dev->baud);

    ser_dev->new_opt->c_iflag |= (IGNPAR | IGNCR | IGNBRK);
    ser_dev->new_opt->c_iflag &= ~(IXON | IXOFF | IXANY);

    ser_dev->new_opt->c_oflag &= ~OPOST;

    ser_dev->new_opt->c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    ser_dev->new_opt->c_lflag |= NOFLSH;

    ser_dev->new_opt->c_cc[VMIN] = 0;
    ser_dev->new_opt->c_cc[VTIME] = 5;

    tcsetattr(ser_dev->fd, TCSANOW, ser_dev->new_opt);
    /* End of initialize port */

    ser_dev->is_open = TRUE;
    result = TRUE;
  }
  return result;
}

int ser_dev_write(ser_dev_t *ser_dev, const char *cmd)
{
  int result = FALSE;

  int res = 0;
  if (ser_dev->is_open) {
    errno = 0;
    res = write(ser_dev->fd, cmd, strlen(cmd));
    if (res <= 0) {
      printf("Error writing serial port: %s\n", strerror(errno));
    } else {
      result = TRUE;
    }
  } else {
    printf("Error writing serial port: %s\n", strerror(errno));
  }
  return result;
}

int ser_dev_read(ser_dev_t *ser_dev)
{
  int result = FALSE;
  char rd_buf[255];

  int res = 0;
  if (ser_dev->is_open) {
    memset((void *)rd_buf, 0, sizeof(rd_buf));
    while ((res = read(ser_dev->fd, (void *)rd_buf, sizeof(rd_buf))) > 0) {
      if ((strlen(ser_dev->buff) + res) < S_BUF_SZ) {
    strncat((char *)ser_dev->buff, rd_buf, res);
    memset((void *)rd_buf, 0, sizeof(rd_buf));
    result = TRUE;
      } else {
        printf("Error reading serial port: %s\n", strerror(errno));
      }
    }
  } else {
    printf("Error reading serial port: %s\n", strerror(errno));
  }
  return result;
}

void ser_dev_close(ser_dev_t *ser_dev)
{
  if (ser_dev->is_open) {
    tcsetattr(ser_dev->fd, TCSANOW, ser_dev->old_opt);
    close(ser_dev->fd);
    free((void *)ser_dev->new_opt);
    free((void *)ser_dev->old_opt);
    memset((void *)ser_dev->buff, 0, S_BUF_SZ);
    ser_dev->is_open = FALSE;
  }
}

File send_cusd.c
Code:
/* File send_cusd.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>

#include "ser_dev.h"

ser_dev_t s_dev;
speed_t s_baud = B115200;
char wr_buf[128];

int main(int argc, char *argv[])
{
  if (argc != 2){
    fprintf(stderr, "Usage: %s <string_command>\n", argv[0]);
    exit(EXIT_FAILURE);
  }
  puts("Test serial device");
  memset((void *)wr_buf, '\0', sizeof(wr_buf));
  strncpy(wr_buf, "AT+CUSD=1,\"", sizeof(wr_buf));
  strncat(wr_buf, argv[1], sizeof(wr_buf));
  wr_buf[strlen(wr_buf)] = '\0';
  strncat(wr_buf, "\",15\r", sizeof(wr_buf));
  printf("Command: %s\n", wr_buf);

  ser_dev_init(&s_dev, "/dev/ttyUSB2", s_baud);
  if (!ser_dev_open(&s_dev)){
    puts("Error opening device");
    exit(EXIT_FAILURE);
  }
  ser_dev_write(&s_dev, wr_buf);
  ser_dev_clear_buff(&s_dev);
  int i;
  for (i=0; i<60; i++){
    ser_dev_read(&s_dev);
    if (strstr(s_dev.buff, "+CUSD: 0") != NULL){
      printf("%s", s_dev.buff);
      break;
    } else if (strstr(s_dev.buff, "+CUSD: 1") != NULL){
      ser_dev_write(&s_dev, "AT+CUSD=2\r");
      ser_dev_read(&s_dev);
      printf("%s", s_dev.buff);
      break;
    }
    if (strstr(s_dev.buff, "ERROR") != NULL){
      ser_dev_write(&s_dev, "AT+CUSD=2\r");
      ser_dev_read(&s_dev);
      printf("%s", s_dev.buff);
      break;
    }
  }
  if (i==30) printf("Tired of waiting for %d times\n", i);
  ser_dev_close(&s_dev);
  return(0);
}

Dan yg terakhir Makefile
Code:
all        : send_cusd

send_cusd    : ser_dev.h ser_dev.c send_cusd.c
    gcc -Wall -o send_cusd ser_dev.c send_cusd.c

clean        :
    rm -rf *~ *.obj send_cusd

Program ini berasumsi bahwa modem ada pada /dev/ttyUSB2 (lihat pada file send_cusd.c)

Well that's it
Hope That Help
Find all posts by this user
Quote this message in a reply
06-05-2011, 04:36 PM
Post: #2
RE: Mengirim comand CUSD ke modem GSM dengan C (GNU/Linux)
bisa di jelaskan lebih detail mbak cara penggunaan nya ?

btw nice tutor.. keep share yeah piss
Visit this user's website Find all posts by this user
Quote this message in a reply
06-05-2011, 04:55 PM
Post: #3
RE: Mengirim comand CUSD ke modem GSM dengan C (GNU/Linux)
@eidelweiss

1. Copy paste code di atas sesuai dengan nama file nya.
2. Compile dengan perintah "make"
3. Perintah make akan akan membuat file executable send_cusd

Di sini saya pake Modem HWawei E169G, secara "magis" openSUSE saya mengenali nya sebagai /dev/ttyUSB0, /dev/ttyUSB1 dan /dev/ttyUSB2 (pake perintah dmesg)
Jika menggunakan operator GSM misal: Simpati, maka no untuk mengecheck pulsa adalah *888#, maka execute dengan:
Code:
#./send_cusd *888# <Enter>
tunggu beberapa saat, apabila pada buffer terdapat string, maka program ini akan menampilkannya secara "kasar", dan saya kira ini cukup untuk mengetahui informasi mengenai pulsa.
Jika ada pertanyaan lagi silahkan sampaikan lewat forum ini...
Find all posts by this user
Quote this message in a reply
06-05-2011, 04:59 PM
Post: #4
RE: Mengirim comand CUSD ke modem GSM dengan C (GNU/Linux)
duch.. si chaer sensian sama ane.. jadi ane gak bisa ngasich reputasi..
maaf ya mbak..

btw nice info .. keep share yach piss
Visit this user's website Find all posts by this user
Quote this message in a reply
06-05-2011, 05:05 PM
Post: #5
RE: Mengirim comand CUSD ke modem GSM dengan C (GNU/Linux)
(06-05-2011 04:59 PM)eidelweiss Wrote:  duch.. si chaer sensian sama ane.. jadi ane gak bisa ngasich reputasi..
maaf ya mbak..

btw nice info .. keep share yach piss

I am not looking for reputation, I just want to share what I know and hope it could be useful... piss
Find all posts by this user
Quote this message in a reply
Post Reply 


Topic Tools
Topic Link :
BBCode :
HTML Code :
View a Printable Version Send Thread to a Friend Subscribe to this thread
Submit Google Submit Face book Submit to Digg Submit to Reddit Submit to Furl Submit to Del.icio.us Submit to Jeqq

Possibly Related Threads...
Thread: Author Replies: Views: Last Post
  C# Mencari Zodiak dengan SubString k4d03l 3 129 03-30-2012 04:26 PM
Last Post: k4d03l
  Buat Ombak Segitiga dengan While dan For RieqyNS13 7 316 03-22-2012 05:56 PM
Last Post: avia
  [Tutor] Perulangan dengan while chiboga 5 266 02-25-2012 12:58 PM
Last Post: chiboga
Tongue [Tutor] Iseng dengan C++ nyiurmelambai 24 1,069 02-15-2012 07:22 PM
Last Post: hael
  Sekilas VFS pada linux kernel 2.4 ev1lut10n 1 229 01-21-2012 09:16 PM
Last Post: ketek
  IOCTL Programming Under Linux Kernel 2.6 ev1lut10n 3 341 11-25-2011 01:01 PM
Last Post: ketek
  Pemrograman IP Versi 6 dengan C mywisdom 4 969 09-17-2011 08:33 PM
Last Post: semutdanlaba2
  enkripsi dan deskripsi dengan teknik caesar jinjun 5 1,303 06-13-2011 07:19 PM
Last Post: apiep
  Bermain main dengan heap dan stack di FreeBSD 32 bit mywisdom 2 601 06-10-2011 11:44 AM
Last Post: whitelite
  [Tutor] membalikan kata dengan strrev bogenk 0 665 05-10-2011 08:50 AM
Last Post: bogenk

Users Browsing
1 Guest(s)


Stop SOPA/PIPA | Discuss !