一月21

TwSMS 發簡訊 (Linux C 版)

tags , , , | Comments(4) | 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;
}


一月11

TeraTerm Pro - 取代超級終端機

Windows 內建的超級終端機(HyperTerminal),有使用過的應該都知道問題很多,經常跑出亂碼、甚至程式當掉,可以說是年久失修的工具阿,連 Vista 都將它拿掉了,不過有許多 router、硬體設備仍是要透過 Serial Port 去做 debug、設定等等,所以有沒有可以取代超級終端機的軟體呢?

有的,試用過 TeraTerm Pro 之後就愛上他了,擁有比超級終端機簡潔的畫面,原有的功能都沒少,還增加了 UTF8/SSH/telnet/Macro…,在 Vista 上跑也沒問題,所以,換掉超級終端機吧!

TeraTerm Pro 專案網頁
下載頁面


一月10

Wordpress 2.3.2 無法中文化問題

tags , , | Comments(5) | 1,251 views

Wordpress 最近已經更新到 2.3.2 版了,趁著最近專題發表結束的空閒來更新一下,到官方抓了新版以及 Kirin Lin 的中文語系,由於 2.3.2 只是些 bug 及安全性修正,所以就直接採用覆蓋大法更新了。完工之後,咦?怎麼變英文介面了,wp-config.php 設定沒錯阿,於是求助 google 大神,馬上就找到了這篇,原來在 PHP 5.2.x 以及 64bit 系統下會有這個問題,登入 BlueHost 主機的後台看一下,果然沒錯,開始修正囉!

其實只要修正一行即可:
wp-includes/gettext.php LINE:117

if ($magic == ($MAGIC1 & 0xFFFFFFFF) || $magic == ($MAGIC3 & 0xFFFFFFFF)) { // to make sure it works for 64-bit platforms

更改成:

if ($magic == $MAGIC1 || $magic == $MAGIC3) { // <- 64 BIT FIX: CHANGE THIS LINE!

ok!

一月10

Google Map 地圖定位

tags , , , | Comments(3) | 1,716 views

Google Map 提供的 API 實在是強大又好用,結合 GPS 很快就可以做出地圖定位的網站,將之前的 Urmap 範例修改了一下,成為 Google Map 地圖定位系統,為了能夠展示所以將座標先寫好讓它自己動態更新,其中按下停止按鈕會畫出所有紀錄點的連線,可做路徑追蹤。

Google Map API 網路上的資源已經相當豐富了,在此就不多敘述,比較特別的是畫折線(polyline)的部份,如果用原始的 GPolyline 方法來畫,大概幾十個點就需要運算很久,甚至導致瀏覽器 crash,所以 API 後來又加入了編碼折線(encodedPolyline)的功能,先將所有的點用特定演算法轉換成一串文字符號,再丟給 GPolyline.fromEncoded 顯示,幾乎是馬上就顯示出來了,差很多喔,而這個編碼演算法也已經有人寫好囉!請看:Encoding polylines for Google Maps

十二月22

CodeIgniter 設定 MySQL 編碼

tags , , , | Comments(2) | 1,297 views

※ CodeIgniter 1.6 已釋出,不需再做這篇的修正了哦!

先前有提到CodeIgniter 這個 PHP Framework,也用它做了幾個 case,當然開發速度不能說快上多少,但確實讓程式碼變得整齊優雅許多。

使用 CI 目前遇到第一個問題是存取 MySQL 資料的問題,在 MySQL 4.1 以後採用了多層式編碼設定,簡單說就是不管是資料庫、資料表、欄位或是 Client 連線階段,都可以分別設定編碼,所以即使 server 都改成了 utf8,PHP 到 MySQL Server 的這個 connection 卻還是預設的(latin1),許多亂碼就是這樣造成的,應該已經有不少人知道解決方法,就是先送出一個改變編碼的查詢:SET NAMES 'charset'。
然而目前 CodeIgniter 並沒有這樣的設計,所以只好自行改 code 囉!

Step1:修改 system/application/config/database.php
增加一項:$db['default']['charset'] = "utf8";

Step2:修改 system/database/DB_driver.php
在 32 行之後的宣告增加:var $charset = '';
接著 96 行的陣列增加:'charset' => '',

Step3:修改 system/database/drivers/mysql/mysql_driver.php
74 行 return 前加入:

if (!empty($this->charset))
{
    @
mysql_query("SET NAMES $this->charset");
}

這樣就 ok 了,如果使用 mysqli 請如法炮製。另外如果主機環境符合,可使用 PHP 內建函式來設定:
// PHP >= 5.2.3,MySQL >= 5.0.7 for mysql
@mysql_set_charset($this->charset, $this->conn_id);
// PHP >= 5.0.5,MySQL >= 5.0.6 for mysqli
@mysqli_set_charset($this->conn_id, $this->charset);