« TeraTerm Pro - 取代超級終端機 有誤的新聞報導:陳冠希事件 »

一月21

TwSMS 發簡訊 (Linux C 版)

tags , , , | 1,700 views


台灣簡訊(TwSMS)是國內一家線上傳簡訊的服務商,提供文字簡訊、語音簡訊等服務,價格也很合理,最重要的是有提供 API 介面,方便用戶在自己的程式中加入發送簡訊功能,官網已經有提供不少範例(PHP/ASP/JSP/Java/Perl/VB/BCB/Delphi),這邊也有 Ruby 的版本,不過就是沒看到 C 的,所以大略寫了一個 Linux C 版本,打算加入自己的嵌入式專題使用。

TwSMS 提供的 API 很簡單,只要由 HTTP 對 API server 發送 Request 即可,接著 server 就會回傳結果。程式先建立一個 socket 連線,然後發送簡訊,最後再擷取回傳碼檢查是否成功。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
 
int main()
{
    
/* TWSMS 相關設定 */
    
char *username = "username";   // 帳號
    
char *password = "password"; // 密碼
    
char *type = "now";         // 發送型態
    
char *mobile = "0912xxxxxx"; // 電話
    
char *message = "簡訊測試"; // 簡訊內容
    
char *encoding = "big5";    // 簡訊內容編碼
    
char *popup = "";          // 使用 POPUP 顯示
    
char *mo = "";             // 使用雙向簡訊
    
char *vldtime = "86400";    // 簡訊有效期限(秒)
    
char *dlvtime = "";         // 預約時間
    
    
int sockfd;
    
int len = 0;
    
char *host = "api.twsms.com";
    
char msg[512], MSGData[512], buf[512];
    
char *res, *checkRes;
    
struct sockaddr_in address;
    
struct hostent *hostinfo;
    
    
bzero(&address, sizeof(address));
    
hostinfo = gethostbyname(host);
    
if (!hostinfo) {
        
fprintf(stderr, "no host: %s\n", host);
        
exit(1);
    
}
    
address.sin_family = AF_INET;
    
address.sin_port = htons(80);
    
address.sin_addr = *(struct in_addr *)*hostinfo->h_addr_list;
    
    
/* Create socket */
    
sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
    
/* Connect to server */
    
if (connect(sockfd, (struct sockaddr *)&address, sizeof(address)) == -1) {
        
perror("connect faild!\n");
        
exit(1);
    
}
    
    
/* Request string */
    
len = snprintf(msg, 512,
                  
"username=%s&password=%s&type=%s&encoding=%s&popup=%s&mo=%s&mobile=%s"
                  
"&message=%s&vldtime=%s&dlvtime=%s", username, password, type, encoding,
                  
popup, mo, mobile, message, vldtime, dlvtime);
                  
    
/* HTTP request content */
    
snprintf(MSGData, 512,
            
"POST /send_sms.php HTTP/1.1\r\n"
            
"Host: %s\r\n"
            
"Content-Length: %d\r\n"
            
"Content-Type: application/x-www-form-urlencoded\r\n"
            
"Connection: Close\r\n\r\n"
            
"%s\r\n", host, len, msg);
    
    
/* Send message */
    
send(sockfd, MSGData, strlen(MSGData), 0);
    
    
/* Response message */
    
recv(sockfd, buf, 512, 0);
    
    
for (res = strtok(buf, "\n"); strncmp(res, "resp", 4) != 0; res = strtok(NULL, "\n"));
    
checkRes = strtok(res, "=");
    
checkRes = strtok(NULL, "=");
    
    
if (atoi(checkRes) <= 0) {
        
printf("傳送失敗\n");
    
} else {
        
printf("傳送完成\n");
    
}
    
    
close(sockfd);
    
return 0;
}
Trackback:

4 Comments on “TwSMS 發簡訊 (Linux C 版)”

  1. charlie Says:

    您這套發簡訊能夠在FreeBSD執行嗎
    我是過好像不行,有很多的TCP API不清楚是否
    FreeBSD能提供,或者還要配合您指定的一些LIBRARY
    Charlie

  2. http://blog.linym.net/
    lym520 Says:

    charlie:
    今天特地裝了 FreeBSD 6.3 來測試,只安裝基本套件並設定好網路而已,結果是完全 OK 的
    此程式都是標準 Unix socket 函式,請您再試試看囉!

  3. shanhan.yu Says:

    你好
    最近要開始著手製作專題
    其中有個功能就是要發送簡訊到手機上面
    因為之前就有稍微看過說可以架設linux然後發送
    但是不太了解這個
    所以有幾點事情想要請問你一下

    透過主機發送簡訊到手機這較啥名稱/技術呢?
    需要收取任何費用嗎!?還是說主機架設好就可以了

  4. http://blog.linym.net/
    lym520 Says:

    shanhan.yu:
    您好,大致上來說發簡訊的方式有兩種。
    一種就是透過簡訊服務商,如 Hinet 及本篇介紹的 TwSMS,這些服務商會提供一套 API 讓您在自己的程式裡使用,所以只要撰寫 socket 程式和 API 溝通即可,費用依服務商規定收取。

    另一種方式就是自行架一台 SMS Server,這台 server 必須要有 GSM Modem,並且需要插上您的 SIM 卡,再寫程式去向 Modem 發送 AT 指令集,來達到傳簡訊的功能,費用就和一般手機傳簡訊費率相同。

Leave a Reply