資料名稱 | IF3報(bào)鐘器C版公共接口程序(TXT文本方式)備驅(qū)動(dòng)-有數(shù)量有匙牌 | ||||||||||||
更新時(shí)間 | 2013-9-14 16:02:27 | ||||||||||||
下載地址 |
|
||||||||||||
資料說(shuō)明 | 刷卡報(bào)鐘系統(tǒng)用到了2個(gè)接口程序,一個(gè)是我公司開發(fā)的底層接口程序:fst _sn_card_data.exe,他負(fù)責(zé)完成和室內(nèi)刷卡器的底層接口,(下稱公共接口程序,窗口標(biāo)題是“桑拿刷卡器公共接口”),一個(gè)是合作軟件公司依據(jù)自己軟件開發(fā)的上層接口程序,(下稱私有接口程序,窗口標(biāo)題是“桑拿數(shù)據(jù)處理程序”)。
公共接口程序完成了對(duì)刷卡器發(fā)來(lái)數(shù)據(jù)的解包,并以文本文件“接口.TXT”保存信息內(nèi)容,然后向私有接口程序,也就是窗口標(biāo)題是“桑拿數(shù)據(jù)處理程序”的程序發(fā)送一條標(biāo)號(hào)是1088的通知消息,然后一直等待。私有接口程序收到這個(gè)通知消息后,打開“接口.TXT”文件,依據(jù)其中內(nèi)容,完成對(duì)應(yīng)的操作,比如技師起鐘等,然后將操作結(jié)果,寫會(huì)“接口.TXT”文件,并向公共接口程序發(fā)送一條標(biāo)號(hào)是1088,lParam是2的通知消息。公共接口程序收到該通知消息后,從“接口.txt”里提取返回信息,然后返回給室內(nèi)刷卡器,并刪除“接口.TXT”文件。
工作流程圖如下:
1、編寫私有接口程序需要做的是:
a) 不停檢測(cè)是否收到1088號(hào)消息,如果收到,就打開“接口.TXT”文件。
b) 從“接口.TXT”文件讀取數(shù)據(jù),然后按照要求執(zhí)行對(duì)應(yīng)的操作,然后將返回結(jié)果,增加到這個(gè)文件的尾部。
c) 保存“接口.TXT”文件,退出對(duì)這個(gè)文件的占用。
d) 向“桑拿刷卡器公共接口”程序,也就是fst _sn_card_data.exe發(fā)送編號(hào)是1088的系統(tǒng)消息,并且消息的lParam參數(shù)是2,就可以了。
2、“接口.TXT”文件文件結(jié)構(gòu)
例子格式如下:
串口號(hào):1
設(shè)備號(hào):1
命令內(nèi)容:安排技師-撤鐘;客人卡號(hào):0000106496;部長(zhǎng)卡號(hào):0000106496
其中第一行是:串口號(hào):1
第二行是:設(shè)備號(hào):1
在實(shí)際施工中,通過(guò)串口擴(kuò)展卡,一個(gè)PCI插槽可以擴(kuò)展8個(gè)串口,每個(gè)串口最多可以連接32個(gè)房間。
客戶應(yīng)該在自己的系統(tǒng)中建立房間與串口號(hào)和設(shè)備號(hào)的對(duì)應(yīng)關(guān)系。
這樣通過(guò)串口號(hào),和設(shè)備號(hào),軟件就可以得到是哪個(gè)房間發(fā)送的信息了。
第三行是:命令內(nèi)容:
不同的命令,內(nèi)容格式不一樣。
3、命令內(nèi)容的詳細(xì)格式:
1、 起鐘:
命令內(nèi)容:起鐘;技師卡號(hào):0008712735
2、 加鐘:
命令內(nèi)容:加鐘;技師卡號(hào):0008712735
3、 出鐘:
命令內(nèi)容:出鐘;技師卡號(hào):0008712735
4、 應(yīng)鐘:
命令內(nèi)容:應(yīng)鐘;技師卡號(hào):0008712735
等等
例如:催鐘的實(shí)現(xiàn)方法:
刷卡器操作命令是由刷卡器操作,向電腦發(fā)送操作命令,公共接口程序接收生成“接口.TXT”文件,私有接口程序處理數(shù)據(jù),然后返回操作結(jié)果給公共接口程序,公共接口程序發(fā)送給刷卡器。
文件內(nèi)容如下:
格式一、
串口號(hào):1
設(shè)備號(hào):1
催鐘:004,005
這樣,報(bào)鐘器就會(huì)發(fā)出“技師004 005已經(jīng)到鐘”的聲音
格式二、
串口號(hào):1
設(shè)備號(hào):1
催鐘[5]:004,005
這樣,報(bào)鐘器就會(huì)發(fā)出“技師004 005 5分鐘以后到鐘”的聲音
5、私有接口程序可以向“接口.TXT”寫入的信息:
1、 起鐘:
語(yǔ)音提示,請(qǐng)刷技師卡,
操作回復(fù):
A、 起鐘成功
B、 房間錯(cuò)誤
C、 鐘房沒有安排
D、 已經(jīng)起鐘
E、 技師卡錯(cuò)誤
完成技師開始計(jì)鐘的功能,具體的操作流程按程序設(shè)計(jì)的不同而不同,詳見設(shè)備實(shí)際操作菜單。
2、 加鐘:
語(yǔ)音提示,請(qǐng)刷技師卡
操作回復(fù):
A、 加鐘成功
B、 房間錯(cuò)誤
C、 沒有起鐘
D、 技師卡錯(cuò)誤
完成客人對(duì)技師的續(xù)鐘要求。
3、 出鐘:
語(yǔ)音提示,請(qǐng)刷技師卡,
操作回復(fù):
A、 出鐘成功
B、 房間錯(cuò)誤
C、 沒有起鐘
D、 技師卡錯(cuò)誤
結(jié)束技師的上鐘,并生成客人消費(fèi)記錄和技師的提成記錄。
4、 應(yīng)鐘:
語(yǔ)音提示,請(qǐng)刷技師卡,
操作回復(fù);
A、 應(yīng)鐘成功
B、 鐘房沒有安排
C、 技師卡錯(cuò)誤
對(duì)技師安排以后,技師進(jìn)行響應(yīng)。
5、 服務(wù):
語(yǔ)音提示,服務(wù)代碼--請(qǐng)刷技師卡,
操作恢復(fù):
A、 服務(wù)成功
B、 房間錯(cuò)誤
C、 沒有起鐘
D、 技師卡錯(cuò)誤
向服務(wù)臺(tái)發(fā)送需要指定服務(wù)的求助信息。比如送免費(fèi)飲料等。
6、 小費(fèi),
語(yǔ)音提示:金額---請(qǐng)刷技師卡
操作回復(fù)
A、 小費(fèi)成功
B、 沒有上鐘
C、 技師卡錯(cuò)誤
技師自行錄入消費(fèi),可以防止小費(fèi)跑單。
7、 商品,
語(yǔ)音提示:商品編號(hào)---請(qǐng)刷技師卡
操作回復(fù):
A、 商品成功
B、 沒有上鐘
C、 技師卡錯(cuò)誤
D、 商品編號(hào)錯(cuò)誤
在上鐘過(guò)程中,客人的消費(fèi)錄入,可以打印單據(jù)到吧臺(tái)等地方,并記錄技師的提成信息。
服務(wù)員[部長(zhǎng)]功能界面操作:包括輪鐘、點(diǎn)鐘、括鐘、選鐘和撤消對(duì)技師安排,并把信息通過(guò)打印機(jī)、語(yǔ)音、顯示屏幕、電腦顯示屏來(lái)通知給技師房。
8、 輪鐘
語(yǔ)音提示:模式編號(hào)---技師編號(hào)—請(qǐng)刷客人卡
操作回復(fù)
A、 101號(hào)技師安排成功
B、 該技師不是排鐘狀態(tài)
C、 部長(zhǎng)卡錯(cuò)誤
D、 模式錯(cuò)誤
E、 客人卡錯(cuò)誤
9、 點(diǎn)鐘
語(yǔ)音提示:模式編號(hào)---技師編號(hào)—請(qǐng)刷客人卡
操作回復(fù):
A、 101號(hào)技師安排成功
B、 該技師不是排鐘狀態(tài)
C、 部長(zhǎng)卡錯(cuò)誤
D、 模式編號(hào)錯(cuò)誤
E、 客人卡錯(cuò)誤
10、括鐘
語(yǔ)音提示:模式編號(hào)---技師編號(hào)—請(qǐng)刷客人卡
操作回復(fù):
A、 101號(hào)技師安排成功
B、 該技師不是排鐘狀態(tài)
C、 部長(zhǎng)卡錯(cuò)誤
D、 模式編號(hào)錯(cuò)誤
E、 客人卡錯(cuò)誤
11、選種
語(yǔ)音提示:模式編號(hào)---技師編號(hào)—請(qǐng)刷客人卡
操作回復(fù):
A、 101號(hào)技師安排成功
B、 該技師不是排鐘狀態(tài)
C、 部長(zhǎng)卡錯(cuò)誤
D、 模式編號(hào)錯(cuò)誤
E、 客人卡錯(cuò)誤
12、撤鐘
語(yǔ)音提示:請(qǐng)刷客人卡
操作回復(fù):
A、 撤鐘成功
B、 沒有安排
C、 客人卡錯(cuò)誤
D、 部長(zhǎng)卡錯(cuò)誤
13、退技師
語(yǔ)音提示:請(qǐng)刷客人卡
操作回復(fù)
A、 退技師成功
B、 沒有安排
C、 客人卡錯(cuò)誤
D、 部長(zhǎng)卡錯(cuò)誤
14、換房間
語(yǔ)音提示:請(qǐng)刷客人卡
操作回復(fù):
A、 換房間成功
B、 客人卡錯(cuò)誤
C、 部長(zhǎng)卡錯(cuò)誤
15、換模式
語(yǔ)音提示:模式編號(hào),請(qǐng)刷客人卡
操作回復(fù)
A、 換模式成功,當(dāng)前模式101
B、 客人卡錯(cuò)誤
C、 部長(zhǎng)卡錯(cuò)誤
D、 模式號(hào)錯(cuò)誤
E、 沒有安排技師
16、商品
語(yǔ)音提示:商品編號(hào)---請(qǐng)刷客人卡
操作回復(fù):
A、 商品成功
B、 客人卡錯(cuò)誤
C、 部長(zhǎng)卡錯(cuò)誤
D、 商品編號(hào)錯(cuò)誤
給客人錄入商品消費(fèi),并自動(dòng)打印單據(jù)到吧臺(tái)等地方
*、贈(zèng)送
語(yǔ)音提示:商品編號(hào)---請(qǐng)刷客人卡
操作回復(fù):
E、 商品成功
F、 客人卡錯(cuò)誤
G、 部長(zhǎng)卡錯(cuò)誤
H、 商品編號(hào)錯(cuò)誤
贈(zèng)送客人的商品消費(fèi)錄入,并自動(dòng)打印單據(jù)到吧臺(tái)等地方。
0、 詢技師排鐘
語(yǔ)音提示:技師類別編號(hào)
操作恢復(fù):
i. 101 102
ii. 技師類別編號(hào)錯(cuò)誤
iii. 部長(zhǎng)卡錯(cuò)誤
11、 查詢技師
語(yǔ)音提示:技師編號(hào)---請(qǐng)刷客人卡
操作恢復(fù):
I、 101號(hào)技師,203房間,模式101,5分鐘后出鐘
J、 部長(zhǎng)卡錯(cuò)誤
K、 技師編號(hào)錯(cuò)誤
17、買單
語(yǔ)音提示:請(qǐng)刷客人卡
操作恢復(fù):
A、 當(dāng)前消費(fèi)金額50元
語(yǔ)音:是否結(jié)帳?---人民幣結(jié)還是貴賓卡結(jié)帳
B、 結(jié)帳成功
6、私有接口程序可以向“接口.TXT”本接口可以接受的返回消息是固定的,可以接收以下消息:
起鐘成功
加鐘成功
小費(fèi)成功
錯(cuò)誤技師卡
已經(jīng)起鐘
房間錯(cuò)誤
出鐘成功
應(yīng)鐘成功
服務(wù)成功
沒有起鐘
錯(cuò)誤部長(zhǎng)卡
錯(cuò)誤客人卡
錯(cuò)誤模式編號(hào)
錯(cuò)誤商品編號(hào)
錯(cuò)誤技師編號(hào)
排鐘成功
點(diǎn)鐘成功
選鐘成功
括鐘成功
撤鐘成功
退技師成功
更換房間成功
商品成功
贈(zèng)送成功
錯(cuò)誤技師類別
a) 從刷卡器到PC的數(shù)據(jù)傳輸協(xié)議:
[0x24頭字節(jié)][設(shè)備號(hào)][0x33命令字節(jié)][數(shù)據(jù)長(zhǎng)度][數(shù)據(jù),長(zhǎng)度=命令長(zhǎng)度字節(jié)][校驗(yàn)位,從第2位到數(shù)據(jù)加總][0x2A尾部][發(fā)送次數(shù)]
b) 從PC到刷卡器的數(shù)據(jù)傳輸協(xié)議:
[0x24][設(shè)備號(hào)][0x22 命令字節(jié)][數(shù)據(jù)長(zhǎng)度][數(shù)據(jù)][校驗(yàn)位][0x2A結(jié)尾]
設(shè)備“編號(hào)房號(hào)撥碼開關(guān)”在設(shè)備正上方“地址”字符位置。設(shè)備安裝前,根據(jù)每個(gè)房間的編號(hào),設(shè)置對(duì)應(yīng)的設(shè)備地址碼。設(shè)備的地址碼開關(guān)排列如下圖:
撥碼開關(guān)的地址碼定義如上表(地址碼撥到OFF有效)
撥碼開關(guān)方式:采用地址碼累加方式定義,全部撥到“ON”為“0”號(hào)地址,全部撥到“OFF”狀態(tài)為“31”號(hào)設(shè)備。例如:如要設(shè)置設(shè)備為18號(hào),設(shè)置方式:把撥碼開關(guān)第2位和第5位撥到OFF狀態(tài),第1、3、4位撥到ON狀態(tài)即可。設(shè)備重新設(shè)置地址碼后,必須重新上電或復(fù)位后才生效。
四、接口程序中“配置文件.ini”的設(shè)置
1、打開接口程序文件夾中的“配置文件.ini”,找到
波特率=
正確修改波特率。比如電腦直接接第三代、第四代報(bào)鐘器,應(yīng)該設(shè)置成:
波特率=2400
保存該文件。
2、 打開接口程序文件夾中的“配置文件.ini”,找到
串口端口=
檢查連接設(shè)備的串口號(hào),如果使用COM1進(jìn)行和報(bào)鐘器通信,則設(shè)置成:
串口端口= 1
如果有多個(gè)串口同時(shí)工作,比如COM3,COM4,COM5,則設(shè)置成:
串口端口= 3,4,5
3、 檢查當(dāng)前電腦已經(jīng)使用了的端口:
在【開始】--【運(yùn)行】中錄入CMD命令,進(jìn)入命令操作窗口,執(zhí)行NETSTAT –AN
紅色部分是你的電腦已經(jīng)占用了的端口,然后從6000開始找可以使用的端口,比如當(dāng)前6003,6004是可以使用的。
4、 打開接口程序文件夾中的“配置文件.ini”,找到并設(shè)置成
接口程序端口=6003
工作程序端口=6004
5、 將我公司提供的例子程序,編譯,生成可執(zhí)行文件sn_lcdcard.exe,切記,文件名必須不能改變,而且不能直接運(yùn)行它。
6、 將該文件sn_lcdcard.exe拷貝到接口程序目錄中,然后運(yùn)行fst_sn_card_data.exe,你可以系統(tǒng)初始化了你設(shè)置的端口,然后看到剛才編譯后生成的sn_lcdcard.exe自動(dòng)運(yùn)行了起來(lái)。通過(guò)雙擊WINDOWS托盤區(qū)的【桑拿刷卡器公共接口】圖標(biāo),可以打開程序界面,如果看到有初次握手字樣,表示,您剛才的設(shè)置時(shí)正確的,而且例子接口程序已經(jīng)基本可以工作了。
7、 試著操作報(bào)鐘器的起鐘命令,看看可否工作。
【經(jīng)驗(yàn)之談】:
當(dāng)有多個(gè)串口同時(shí)工作,建議每個(gè)fst_sn_card_data.exe只負(fù)責(zé)一個(gè)串口的數(shù)據(jù)傳輸。比如有4個(gè)串口工作,分別是1、2、3、4,那么可以建立4個(gè)文件夾,每個(gè)文件夾通過(guò)修改配置文件的
串口端口=
接口程序端口=6000
工作程序端口=6001
工作程序名稱=sn_lcdcard.exe
要確保每個(gè)文件夾中的端口互相不同,工作程序名稱也不能相同。
可以把端口號(hào)按6000~6007排列。
(一) 、客戶寫一個(gè)軟件,名字是sn_lcdcard.exe。
(二) 、在主工作窗口放置winsock控件,命名OLE_1。
(三) 、在窗口打開的時(shí)候設(shè)置OLE_1的如下屬性:
protocol=1 采用UDP方式連接
remotehost='127.0.0.1' 本地電腦通信
localport=6001 本程序使用6001端口
remoteport=6000 接口程序使用6000端口
bind() 綁定網(wǎng)絡(luò)協(xié)議
senddata("初次握手") 向接口程序發(fā)送握手信息
1、 在WINSOCK控件的dataarrive事件中,通過(guò)getdata函數(shù)得到從接口程序中傳輸來(lái)的內(nèi)容,進(jìn)行處理。具體命令內(nèi)容可以在接口程序界面中看到,也可以從程序路徑的data文件夾下,找到,基本格式如下。 串口號(hào)-設(shè)備號(hào)-命令序號(hào)-命令內(nèi)容
比如:
1-31-0-命令內(nèi)容:起鐘;上鐘方式:;模式編號(hào):11;技師卡號(hào):0010144830;客人卡號(hào):0010144830
表示COM1上的設(shè)備31,第0次發(fā)送命令,要求起鐘。
上鐘方式?jīng)]有指定。模式編號(hào)是11,卡號(hào)是0010144830的技師,要給匙牌號(hào)是0010144830的客人服務(wù)。
以上內(nèi)容可以通過(guò)跟蹤獲得,也可以從接口程序的data文件夾下的跟蹤記錄中獲得。 經(jīng)過(guò)對(duì)上述命令進(jìn)行處理,然后將操作結(jié)果按以下格式通過(guò)WINSOCK控件的senddata函數(shù)返回:串口號(hào):N;設(shè)備號(hào):N;返回內(nèi)容
3、私有接口程序向“公共接口程序”發(fā)送數(shù)據(jù)的方法:
由于私有接口程序可能是由不同的語(yǔ)言編寫的,所以方法會(huì)有一定差異。
例如VB:
首先定義以下外部函數(shù):
Public Declare Function PostMessage& Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
然后使用使用FindWindowA函數(shù)先找到公共接口程序窗口的指針,然后調(diào)用PostMessage來(lái)發(fā)送信息。
DEPHI:
使用函數(shù)PostMessage()來(lái)發(fā)送信息
例如 PB:
先定義外部函數(shù):
FUNCTION ulong FindWindowA(ulong classname,string windowname) LIBRARY "user32.dll"
recheck:
wHandle = FindWindowA(0, "桑拿刷卡器公共接口")
if wHandle > 0 then//程序已經(jīng)運(yùn)行
send(wHandle,1088,0,2)//
else
goto recheck
end if 5、PB例子代碼
在窗口的OTHER事件中
string handerrorkf,iszd='N'//是否主動(dòng)發(fā)送
long sc,i,czjg
string stype,cznr,jg
long lastxh,whandle
if message.number <> 1088 then return
st_1.text=string(now())+"得到數(shù)據(jù)"+string(message.LongParm)
st_1.setredraw(true)
long filenum
string ss
long commno//串口號(hào)
long devno//設(shè)備號(hào)
long commxh//命令序號(hào)
string s_mlnr //命令內(nèi)容
string mlkey,mldata
filenum=fileopen("接口.txt",linemode!,read!)
//讀入串口號(hào):
fileread(filenum,ss)
commno=long(mid(ss,8))
//設(shè)備號(hào)
fileread(filenum,ss)
devno=long(mid(ss,8))
//命令內(nèi)容
fileread(filenum,ss)
fileclose(filenum)
s_mlnr=mid(ss,10)
mlkey=left(s_mlnr,pos(s_mlnr,';') - 1)
mldata=mid(s_mlnr,pos(s_mlnr,';') + 1)
string kfname
select kfname into :kfname from n_kf where sbno=:devno and comm=:commno;
string cardno
choose case mlkey
case '起鐘'
cardno=right(mldata,10)
wf_qz(cardno,kfname,commxh)
case '加鐘'
cardno=right(mldata,10)
wf_jz_js(cardno,kfname,commxh)
case '出鐘'
cardno=right(mldata,10)
wf_czok(cardno,kfname,commxh)
case '應(yīng)鐘'
cardno=right(mldata,10)
wf_outroom(cardno,kfname,commxh)
case '服務(wù)'
wf_server(kfname,commxh,mldata)
case '小費(fèi)'
wf_xf_enter(kfname,commxh,mldata)
case '安排技師-排鐘'
wf_needjs(kfname,commxh,mldata,'排鐘')
case '安排技師-點(diǎn)鐘'
wf_needjs(kfname,commxh,mldata,'點(diǎn)鐘')
case '安排技師-選鐘'
wf_needjs(kfname,commxh,mldata,'選鐘')
case '安排技師-括鐘'
wf_needjs(kfname,commxh,mldata,'括鐘')
case '安排技師-撤鐘'
wf_needjs_cancel(kfname,commxh,mldata)
case '退技師'
wf_change_js(kfname,commxh,mldata)
case '更換房間'
wf_change_room(kfname,commxh,mldata)
case '更換模式'
wf_change_ms(kfname,commxh,mldata)
case '技師商品'
wf_shop(kfname,commxh,mldata,'=')
case '部長(zhǎng)商品'
wf_shop(kfname,commxh,mldata,'N')
case '贈(zèng)送商品'
wf_shop(kfname,commxh,mldata,'Y')
case '結(jié)帳查詢'
wf_select_money(kfname,commxh,mldata)
case '查詢技師排鐘'
wf_select_jspz(kfname,commxh,mldata)
case '查詢技師狀態(tài)'
wf_select_jsstate(kfname,commxh,mldata)
end choose
//over:
|