Pages

2012-10-29

透過RJ-11埠開啟電子錢箱

POS主機通常會有一個RJ-11埠連接電子錢箱(DC 12V),要以GPIO讀寫來控制它,就得知道它的GPIO暫存器位址。通常主機廠商能提供規格文件,例如以下的畫面(這算是寫得很人性的文件,有些寫得十分不直覺):
CashDrawer Register Spec 
上圖是說只要寫IO位址0A22h,將該Byte的Bit4設為1即可開錢箱。我們可以透過RW工具開啟IO Space位址圖,並寫值測試是否可開?你可以使用LPT1的位址區段(0378h)作此工具實驗,這些區段通常允許你寫入值。
LPT1 IO Range

RJ-11埠固定連著錢箱,所以你不用特別讀出原值作OR Bit4運算,直接測一下ON,OFF值即可。各式電子錢箱開啟位址及流程不一致,有些下「關->開」指令即可,有些得「關->開->關」才能把錢箱推回去。因應各種錢箱,我寫了一個C#類別來處理它,讀入不等長的Hex指令字串依實機狀況來設定,雖短短幾行,裏頭卻包含著一些與硬體打交道的程式兼容寫作經驗。
Sample Code

2012-10-26

電子錢箱(CashDrawer)的選購策略

POS電子錢箱市場上各家廠牌一大堆,身為消費者(或系統整合商)該選擇怎麼的規格最適合呢?
Cash Drawer
外觀尺寸
以尺寸區分,電子錢箱通常寬度分為35,40,45公分,重量則約7,9, 11公斤左右。35公分寬的錢箱,通常是比較便宜的,但個人覺得小錢箱內的空間也小,拿錢都會卡卡的,不是很方便,建議還是40公分以上比較適當~當然那種最大的是更好,就像開RV休旅車,只要車庫放得下,誰不想要大車呢?但大車價格貴,還是買中間款的比較合適,何況店面收銀台空間通常不大的。

開箱考量
錢箱開啟時會震動,所以太輕的錢箱會讓上面的POS主機產生晃動,硬碟震久了易壞。有些錢箱開啟時會噹一聲,安靜時會覺得它很吵,但營業時其實還好,而且也能提醒店家錢箱被開了!不過這種噹聲通常不能以軟體指令取消,購買前也得考慮一下。

開箱介面
錢箱不需要電源,常見是透過RJ-11(6針4線)、RJ-12(6針6線)、RS-232介面開啟。RJ-11款比較常見,也比較便宜,不過一般PC並沒有RJ-11埠,而且得透過Driver讀寫控制其IO位址,然而一般錢箱並沒有經過微軟官方驗證的專屬Driver,而且硬體上連接的IO位址也不盡相同。因此獨立性上,RS-232介面(帶電)會比較通用。

開箱電壓
錢箱可以連接在出單機/發票機(24V),也可以連接至POS主機(12V),電壓彼此不相容,雖然也有12->24V變壓器可調整,但這又是另一個成本了。考慮到多用性,而且一般PC主機上沒有RJ-11介面(通常只有專屬pos機硬體才有),所以若有發票機或出單機,會建議買24V的錢箱機種。

結論
若無特殊狀況且已有出單機情況下,建議買24V,40公分寬以上的POS錢箱最適宜! 若是有專屬的POS主機,講求電源獨立性可以買12V的錢箱即可。

2012-10-18

SQLExpress的Login Failure

SQLExpress雖然是免費DB,但存在一些限制,其中最討厭就是同時執行程式存取及SQL Management Studio (SMS),一方打開了,另一方就喊程序被使用無法開啟,常常得重新啟動SQLExpress服務及解除MDF檔的Lock才行(Unlocker工具)。既然免費,這點極不方便的麻煩就忍了,我後來自己寫了一套SQL執行管理工具取代了SMS以應急。

若使用SQLExpress當作是Website的資料庫,極可能你會遇到「Login Failure for “NT Authority\System”」的錯誤,網上文章會教你要SMS的Login裏要新增這帳號,但明明它就已存在呀! 其實要通過DB權限登入檢查,有下次2個地方要注意:

1. DB Security:
下圖是SMS安全/登入裏的角色,預設「NT Authority\System」帳戶就會存在,但每個DB裏也有Login的帳戶,當你複製過來時即使有同名的帳號,其實該Login User已中斷了權限,必須刪除再重建才行。
DB Security
2. File Security:
畢竟SQLExpress會讀寫MDF檔,所以該帳號也要有對FileSystem的讀寫權限,不過通常「 System」帳號都有讀寫權了。
File Security

通常以上兩種試了此錯誤還是會存在,才會有此文章的產生。通常SQLExpress的連線字串是使用:
AttachDbFilename=|DataDirectory|\xxx.mdf;User Instance=True

由於IIS執行網頁已咬住該MDF檔,所以你在SMS無法attach打開它,往往會誤以為新增SQL服務Login就好,它就會連動至所有的SQLExpress DB,這是錯誤的觀念,因為它的「Login連動效果」只侷限SMS內有Attached上的所有DB而己。

所以請用Unlocker工具把MDF檔解除鎖定,再用SMS將它Attach上,並在其DB Login內確認具備該System帳號 (複製而來的通常不存在),再Detach卸載該DB(因為無法同時使用)並執行即可。