Archive

Posts Tagged ‘Linux’

TwSMS 發簡訊 (Linux C 版)

一月 21st, 2008

台灣簡訊(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;
}

C/C++, 程式筆記 , , ,

開源中文語音合成:eSpeak

十二月 1st, 2007

語音合成系統通常拿來做 TTS(Text to Speach) 應用,英文 TTS 已經滿多且成熟了,但是中文的目前大多是廠商或實驗室驗自行開發,所以可能沒辦法免費拿來研究。

最近發現的 eSpeak 這個 Open Source 已經在最新的開發版本中加入中文語音支援囉!網頁在這裡,應該不久就會變成正式版本釋出。根據了解,好用的 StarDict 翻譯軟體也是使用 eSpeak 來作為朗讀發音系統哦!

在嘗試移植到嵌入式 ARM Linux 時失敗,因為實在太多 Shared Libraries 了,如果有成功的高手希望能分享一下心得。

Linux, 軟體筆記 , , ,

編譯 ZD1211 無線網卡驅動

十一月 19th, 2007

關於如何編譯 ZD1211/ZD1211B 晶片的 USB 無線網卡 driver,經常在各大討論區及 BBS 看到有人提出相同的問題,因此來寫個教學。

前往 ZD1211 專案網站可以知道目前有三種版本的驅動,其中建議使用 zd1211rw 這個版本,因為它持續在更新且已納入 Linux 2.6.18 以後的 kernel 裡。zd1211rw 支援這三種晶片:

  • ZyDAS ZD1211
  • ZyDAS ZD1211B
  • Atheros AR5007UG

不過既然都已經納入 kernel 了為什麼還要編譯驅動?因為還是有很多產品的 USB ID 不能被 zd1211rw 所辨識(我的 PCI GW-US54GXS 就是),當然就沒辦法驅動囉!這篇要做的就是從 kernel 裡的 zd1211rw source code 加入對應的 USB ID,主機環境是 ubuntu 7.10,其他版本應該也差不多。

首先要安裝編譯相關套件 & 下載 linux source
$ sudo apt-get install build-essential kernel-package linux-source

切換至 src 目錄並解開 linux source
$ cd /usr/src
$ sudo tar -xjvf linux-source-2.6.22.tar.bz2

拷貝 kernel 設定檔(.config) 至 linux source
$ sudo cp linux-headers-2.6.22-14-generic/.config linux-source-2.6.22

編輯 zd_usb.c 加入新 USB ID,可利用 lsusb 指令可以找出網卡的 ID,如:2019:5303
$ cd linux-source-2.6.22
$ sudo vim drivers/net/wireless/zd1211rw/zd_usb.c
在檔案開頭不遠處可以看到一堆 USB ID 號碼,就是要加進這裡面,GW-US54GXS 是 ZD1211B 晶片,所以在 ZD1211B 下方增加一行:
/* ZD1211B */
{ USB_DEVICE(0x2019, 0x5303), .driver_info = DEVICE_ZD1211B },
確認後就存檔離開

開始編譯驅動
$ sudo mkdir .tmp_versions
$ sudo make drivers/net/wireless/zd1211rw/zd1211rw.ko

沒錯誤就會產生 zd1211rw.ko,將它覆蓋原本系統中的
$ sudo cp drivers/net/wireless/zd1211rw/zd1211rw.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless/zd1211rw
$ sudo depmod -a

重開機應該就可以正確驅動了:D

參考資料:
Adding new device IDs to zd1211rw

Linux, Other, 硬體筆記 , , ,

Ubuntu 7.10 安裝心得

十月 21st, 2007

最新版的 Ubuntu 7.10 Gutsy Gibbon,終於在 2007 年 10 月 18 日下午正式發佈囉!這次沒聽說塞爆伺服器的情形發生了,大多順利下載完成,我也馬上拿出 NB 來全新安裝,裝完進到桌面的感想是:比以前更順了,安裝和使用大致上也沒什麼問題,不過筆電是 ATI X1450 的顯示晶片,要啟動 Compiz Fusion 特效還是麻煩了些。

一、啟動 Compiz Fusion 桌面特效
在新版中,如果顯卡驅動沒問題並且有支援,預設就會啟動特效,如果要手動更改可到 偏好設定 -> 外觀設定 -> Visual Effects 設定。

二、安裝 Compiz Fusion 管理工具
新版中設定 Compiz Fusion 特效要安裝 compizconfig-settings-manager,不要使用 gnome-compiz-manager (會不穩定)。

三、ATI 顯卡開啟特效
我是用 ATI Mobility Radeon X1450 的晶片,預設沒辦法開啟 Compiz Fusion,但安裝內建的驅動加上 xserver-xgl 套件即可。
driver

但是裝了 xserver-xgl 之後,特效雖然開了,SCIM 輸入法卻也掛點了,完全沒辦法打中文,幸好 Ubuntu 正體中文站 有人找到了解決方法。
選擇功能表 系統 -> 偏好設定 -> 作業階段 -> 初始啟動程式 -> 新增 -> 名稱(SCIM)→ 指令(scim) ,重新啟動即可。

ps. 據說官方即將釋出 8.42 驅動,預設就可以支援特效,敬請期待!
8.42.3 版的 Linux 驅動已釋出,但許多人試用的感想都不太理想,因此如果要開啟 compiz 特效,建議還是使用上面的方法。

Linux, 系統筆記 , , ,

Ubuntu 懶人包 - Lazybuntu 正式版發佈

十月 21st, 2007

由 PCMan 所發起的 Ubuntu 懶人包 - Lazybuntu 終於正式發佈囉!剛好趕上 Ubuntu 7.10 的發行 ,正式版號為 0.1,強調 3個步驟,搞定你的 Ubuntu,Ubuntu 安裝完後,再使用 Lazybuntu,就能讓你的 Ubuntu 更好用,省去了麻煩的調校設定工作,值得 Ubuntu 新手或愛用者試試!
Lazybuntu

Linux, 系統筆記, 軟體筆記 , , ,