,
(南京理工大學(xué) 機(jī)械工程學(xué)院,南京 210094)
目前醫(yī)院使用的大多是IC卡水表(熱水),需要用水必須要有IC卡。顯然這種用水方式并不適宜流動(dòng)性極大的病人及其家屬們,而且辦卡手續(xù)繁瑣,充值麻煩。近年來微信支付逐漸成為流行的支付手段,無現(xiàn)金支付極大便利了人們的生活,也使IC卡水表被替代成為可能。本文基于此種情況設(shè)計(jì)了一種可以使用微信支付的水表,用戶只需關(guān)注公眾號(hào)并注冊(cè)充值,使用手機(jī)微信掃描水表上的二維碼,即可用水。
微信水表系統(tǒng)的整體結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)總體框圖
該系統(tǒng)分為兩個(gè)部分:水表控制終端以及搭建在微信平臺(tái)和騰訊云服務(wù)器上的服務(wù)系統(tǒng)。水表控制終端主要功能是通過以太網(wǎng)絡(luò)與云服務(wù)器連接并進(jìn)行數(shù)據(jù)傳輸,根據(jù)云端傳來的信息完成相應(yīng)的操作,并在用水結(jié)束后將用戶的使用信息及時(shí)反饋給云端。云服務(wù)器接收終端數(shù)據(jù)并存儲(chǔ),借助微信公眾平臺(tái)與手機(jī)端微信實(shí)現(xiàn)信息交互。用戶利用手機(jī)微信掃描水表終端的二維碼,云服務(wù)器解析掃碼信息后通知對(duì)應(yīng)設(shè)備開閥放水。
水表終端由主控芯片、閥門控制電路、LCD顯示電路、水溫測(cè)量電路、網(wǎng)絡(luò)通信電路5部分構(gòu)成。
考慮到功耗以及性能問題,水表終端選用TI公司研發(fā)的芯片MSP430F149。該芯片是一種采用低功耗技術(shù)的混合信號(hào)處理器,其內(nèi)配置有大量的外圍模塊且支持JTAG,調(diào)試方便,易于開發(fā)。它具有5種低功耗模式,工作狀態(tài)下電流也僅為250 μA/MIPS[1],且具有快速喚醒的功能,僅需6 μs就可以將它從待機(jī)狀態(tài)轉(zhuǎn)換為工作狀態(tài)[1]。利用該特性,水表終端在非使用狀態(tài)時(shí),將芯片切換到低功耗模式能夠降低整個(gè)系統(tǒng)的耗能。
圖2 閥門控制電路
圖2是閥門控制電路圖。該電路由復(fù)合晶體管陣列ULN2003、繼電器和電磁閥構(gòu)成。因?yàn)镸SP430F149引腳的輸出電流最大為6 mA,而要使繼電器能夠工作,電流至少要達(dá)到50 mA,所以在其中加上了ULN2003芯片,ULN2003是一個(gè)七通道非門電路,其驅(qū)動(dòng)電流最大可達(dá)500 mA,能夠滿足驅(qū)動(dòng)要求。當(dāng)P5.5引腳輸出為低電平時(shí),ULN2003輸出高電平驅(qū)動(dòng)繼電器開始工作,繼電器線圈通電吸引開關(guān)閉合,電磁閥打開,水管出水。用戶接完水按下關(guān)閉按鈕,引腳P5.5變?yōu)楦唠娖?,繼電器斷電,電磁閥線圈也斷電,電磁閥閥門關(guān)閉,水就會(huì)停止流出。
要完成與云服務(wù)器的通信,必須要使水表能夠接入網(wǎng)絡(luò),因此本設(shè)備選用了W5500以太網(wǎng)模塊。W5500芯片整合了物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層和傳輸層,并在內(nèi)部利用硬件實(shí)現(xiàn)了TCP/IP協(xié)議棧,是一款全硬件TCP/IP嵌入式以太網(wǎng)控制器。它只需要對(duì)Socket進(jìn)行編程就能夠?qū)崿F(xiàn)網(wǎng)絡(luò)數(shù)據(jù)傳輸,而不需要像傳統(tǒng)的以太網(wǎng)芯片一樣還需要在微控制器內(nèi)嵌入TCP/IP 協(xié)議,這可以大幅降低系統(tǒng)開發(fā)時(shí)間。W5500與主芯片通過SPI接口連接,連接情況如圖3所示。
圖3 網(wǎng)絡(luò)模塊電路
W5500支持TCP、UDP、ARP等協(xié)議,基于穩(wěn)定性考慮,本設(shè)計(jì)采用TCP方式通信。水表終端處于客戶端模式,在初始化過程中,除了要配置自身的網(wǎng)關(guān)、子網(wǎng)掩碼,物理地址和IP地址,還需要設(shè)置服務(wù)器的IP地址。
圖4 溫度測(cè)量電路
水溫測(cè)量模塊本文選用的是高溫型DS18B20防水型數(shù)字溫度傳感器水溫探頭,其感溫范圍為-55~125 ℃,單總線接口,3~5 V電壓供電,精度高,抗干擾能力強(qiáng)。連接電路如圖4所示。在水表進(jìn)入工作模式后,CPU每分鐘都會(huì)讀一次溫度數(shù)據(jù)并顯示。水表的顯示模塊選用的是LCD12864,在此不再贅述。
水表終端的控制流程如圖5所示,當(dāng)系統(tǒng)上電并初始化完成后,系統(tǒng)進(jìn)入低功耗狀態(tài),直到按鍵中斷將其喚醒。
圖5 終端軟件流程圖
進(jìn)入工作模式后,終端向云服務(wù)器發(fā)送連接請(qǐng)求,與云服務(wù)器經(jīng)過三次握手后建立穩(wěn)定連接[2]。用戶利用手機(jī)微信掃描終端的二維碼,服務(wù)器解析二維碼中蘊(yùn)含的設(shè)備號(hào)后,通知對(duì)應(yīng)設(shè)備開啟。云服務(wù)器能夠同時(shí)接入的終端數(shù)目有限,因此在用戶用水完成后,水表會(huì)主動(dòng)斷開與服務(wù)器的連接,從而減輕服務(wù)器的負(fù)擔(dān),同時(shí)水表也進(jìn)入休眠模式,降低功耗。
考慮到要與微信平臺(tái)對(duì)接,本系統(tǒng)選用的是騰訊云服務(wù)器。服務(wù)器上主要實(shí)現(xiàn)兩個(gè)功能,一是與水表終端連接,從而實(shí)現(xiàn)對(duì)終端的控制以及數(shù)據(jù)傳輸功能,二是與微信平臺(tái)對(duì)接,從而使用戶可以利用手機(jī)微信打開設(shè)備、查閱信息以及繳費(fèi)等。
云服務(wù)器與終端利用TCP方式通信,兩者之間的連接由終端主動(dòng)發(fā)起,因此服務(wù)器創(chuàng)建serversocket之后需要先調(diào)用accept函數(shù)監(jiān)聽指定端口。因?yàn)榉?wù)器要與不止一個(gè)終端相連,而服務(wù)端對(duì)客戶端連接請(qǐng)求的處理是同步進(jìn)行的,也就是說如果服務(wù)器端已與某個(gè)客戶端建立連接,即使監(jiān)聽到來自新的客戶端的連接請(qǐng)求也不能立即回應(yīng),必須要先跟當(dāng)前的客戶端通信完之后才能處理新的連接請(qǐng)求。因此服務(wù)器程序設(shè)置為在主線程循環(huán)監(jiān)聽客戶端的連接,每接收到一個(gè)Socket請(qǐng)求就新建一個(gè)工作線程來處理它,如此便能流暢地與多個(gè)客戶端連接[3]。工作線程流程如圖6所示,其中deviceID是全局變量,默認(rèn)值為0。用戶掃碼之后,二維碼中的設(shè)備號(hào)被解析后發(fā)給云服務(wù)器,將此值賦給deviceID。
圖6 工作線程流程圖
云服務(wù)器能夠與微信平臺(tái)進(jìn)行數(shù)據(jù)交互,除了需要微信公眾號(hào)處于開發(fā)模式外,還必須要保證云服務(wù)器上的應(yīng)用程序與微信平臺(tái)的接口相連,確保云服務(wù)器收到的請(qǐng)求來自微信平臺(tái),因此服務(wù)器上需要添加請(qǐng)求校驗(yàn)程序,其校驗(yàn)流程如下:
① 接收到校驗(yàn)請(qǐng)求后,提取signature、nonce、timestamp以及echostr四個(gè)參數(shù)。
② 將token、nonce、timestamp三個(gè)參數(shù)按字典序排序并拼接成字符串。
③ 對(duì)字符串進(jìn)行sha1加密,與signature比對(duì),如果兩者相等,則表明所用的服務(wù)器與微信服務(wù)器成功對(duì)接,此時(shí)返回參數(shù)echostr;如果不相等,則表明對(duì)接失敗,檢查配置程序并修改后重新嘗試對(duì)接。
云平臺(tái)和微信平臺(tái)成功連接后,用戶就可以在手機(jī)微信端完成充值、查詢用水記錄等操作。
手機(jī)端與云服務(wù)器之間的信息交互實(shí)際上是以微信平臺(tái)作為中轉(zhuǎn)站的。三者之間的通信流程描述如下:
① 用戶利用微信客戶端做出某種操作(比如掃碼),該操作的信息首先會(huì)被微信平臺(tái)接收到[4]。
② 微信平臺(tái)收到消息后,將此消息通過HTTP POST方式傳到騰訊云服務(wù)器(本系統(tǒng)使用的云服務(wù)器)[4]。
③ 云服務(wù)器收到消息后進(jìn)行處理,然后將結(jié)果返回給微信平臺(tái)。
④ 微信平臺(tái)將處理結(jié)果發(fā)送給手機(jī)微信客戶端。
每臺(tái)水表終端都有唯一的設(shè)備號(hào),基于此服務(wù)器才能準(zhǔn)確找到對(duì)應(yīng)的設(shè)備。因此如何將這個(gè)設(shè)備號(hào)傳遞給云服務(wù)器,讓云端知道該通知哪臺(tái)水表開閥放水是個(gè)重要問題。本系統(tǒng)采用二維碼來區(qū)分不同設(shè)備。
二維碼通過黑白相間的圖案來記錄信息,近年來,其作為一種優(yōu)秀的信息存儲(chǔ)手段,已經(jīng)被廣泛使用。因?yàn)楸鞠到y(tǒng)使用的是微信服務(wù),而且其公眾號(hào)開發(fā)模式可以提供生成帶參數(shù)二維碼的接口,所以本系統(tǒng)選用的是微信二維碼。
用戶使用手機(jī)微信掃描水表上的二維碼,解析出設(shè)備號(hào)之后發(fā)送到云端,從而完成對(duì)應(yīng)設(shè)備的開啟。
在實(shí)際測(cè)試中,掃描水表二維碼后,水表閥門順利打開,手機(jī)微信端的返回信息正確,如圖7所示。點(diǎn)擊微信公眾號(hào)上的“消費(fèi)記錄“可看到自己的賬戶余額和花費(fèi),如圖8所示。微信水表系統(tǒng)預(yù)期的功能基本實(shí)現(xiàn),通信正常。
圖7 測(cè)試結(jié)果一
圖8 測(cè)試結(jié)果二