本示例使用的設備:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.1d292c1bk8Qc9r&ft=t&id=17021194999?
?一、服務端綁定IP開啟UDP端口接收消費機提交的請求
import sys
import os
import socket
import time
import datetimeIpList=[]
if sys.platform == 'linux' or sys.platform=='mac': # linux、mac系統獲取電腦所有網卡IPips = [ip.split('/')[0] for ip in os.popen("ip addr | grep 'inet '|awk '{print $2}'").readlines()]for i in ips:IpList.append(i)print('%d '%(len(IpList)) + i)
else:addrs = socket.getaddrinfo(socket.gethostname(),None) #windows獲取電腦所有網卡IPfor item in addrs:if ':' not in item[4][0]:IpList.append(item[4][0])print('%d '%(len(IpList)) + item[4][0])BUFSIZE = 1024
Bindip=IpList[0] #如果電腦有多個網卡IP,可以選擇綁定不同的IP
Bindprot=39192s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((Bindip, Bindprot))
print('\n系統綁定IP:'+Bindip+':%d'% (Bindprot)+'\n')while True:data, addr = s.recvfrom(BUFSIZE)message = 'Received from %s:%s \n' % (addr, data)print(message)GetInf = str(data, encoding="gbk")FieldsList = GetInf.split(',') #分割接收到的數據后解析、處理、返回指令 */
?二、接收到消費機上傳的刷卡數據
if(FieldsList[0]=='102'): #接收到消費機的刷卡信息DevRecFramesStr = FieldsList[1] #包序列號DevBufferIpAddrStr = FieldsList[2] #終端IPDevBufferRemoteAddrStr = FieldsList[3] #遠程電腦指機IPDevBufferMachinStr = FieldsList[4] #機號DevBufferCardidStr = FieldsList[5] #卡號if(len(FieldsList)>6): #2018年以后的設備有唯一硬件序號DevBufferSerialNumStr=FieldsList[6]SendInfStr="001,"+DevRecFramesStr #確定接收到信息,否則設備會連續發送三次SendInfToIp(SendInfStr,addr) #可以在這里加上業務對數據庫的查、增、刪操作,要分析是否重復接收的信息#用009指令 將業務處理結果發送到設備#設備如接收到了本次發送的信息,會以109指令回復,在正式項目中要根據此特性做重發機制SendInfStr="009,"+ DevBufferMachinStr + ",卡號:" + DevBufferCardidStr + "\\nn姓名:張三豐\\n余額:888.88\\n狀態:卡可正常使用\\n,20,1,0" SendInfToIp(SendInfStr,addr)
三、接收到消費機上傳的現金支付請求
if(FieldsList[0]=='103'): #接收到 輸入消費金額后刷卡、消費機定額消費、消費機計次消費 的上傳信息DevRecFramesStr = FieldsList[1] #包序列號DevBufferIpAddrStr = FieldsList[2] #終端IPDevBufferRemoteAddrStr = FieldsList[3] #遠程電腦指機IPDevBufferMachinStr = FieldsList[4] #機號DevBufferCardidStr = FieldsList[5] #卡號DevBufferUseMoneryStr= FieldsList[6] #消費金額DevBufferUseTimeStr= FieldsList[7] #消費時間if(len(FieldsList)>8): #2018年以后的設備有唯一硬件序號DevBufferSerialNumStr=FieldsList[8]SendInfStr="001,"+DevRecFramesStr #確定接收到信息,否則設備會連續發送三次SendInfToIp(SendInfStr,addr) #可以在這里加上業務對數據庫的查、增、刪操作,要分析是否重復接收的信息#用006指令返回本次消費失敗#用008指令返回本次消費成功#設備如接收到了本次發送的信息,會以109指令回復,在正式項目中要根據此特性做重發機制#SendInfStr="006," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + "姓名:張三豐 \\n余額:168.88 \\n狀態:此卡已掛失 \\n ,20,0,6" SendInfStr="008," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + DevBufferUseMoneryStr + "," + "姓名:張三豐 {123.45}\\n,20,0,1"SendInfToIp(SendInfStr,addr)
?四、接收到消費機上傳的計次消費請求
if(FieldsList[0]=='104'): #接收到 計次消費模式下,終端刷卡后設備向電腦發送此信息DevRecFramesStr = FieldsList[1] #包序列號DevBufferIpAddrStr = FieldsList[2] #終端IPDevBufferRemoteAddrStr = FieldsList[3] #遠程電腦指機IPDevBufferMachinStr = FieldsList[4] #機號DevBufferCardidStr = FieldsList[5] #卡號DevBufferUseTimeStr= FieldsList[6] #消費時間if(len(FieldsList)>7): #2018年以后的設備有唯一硬件序號DevBufferSerialNumStr=FieldsList[7]SendInfStr="001,"+DevRecFramesStr #確定接收到信息,否則設備會連續發送三次SendInfToIp(SendInfStr,addr) #可以在這里加上業務對數據庫的查、增、刪操作,要分析是否重復接收的信息#用006指令返回本次消費失敗#用008指令返回本次消費成功#設備如接收到了本次發送的信息,會以109指令回復,在正式項目中要根據此特性做重發機制SendInfStr="006," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + "姓名:張三豐 \\n余額:168.88 \\n狀態:此卡已掛失\\n ,20,0,6" #SendInfStr="008," + DevBufferMachinStr + "," + DevBufferCardidStr + ",0.00," + "姓名:張三豐 {123.45}\\n,20,0,1"SendInfToIp(SendInfStr,addr)
?五、接收到消費機上傳的記賬消費記錄
if(FieldsList[0]=='105'): #接收到脫網時 白名單卡 記賬消費記錄DevRecFramesStr = FieldsList[1] #包序列號DevBufferIpAddrStr = FieldsList[2] #終端IPDevBufferRemoteAddrStr = FieldsList[3] #遠程電腦指機IPDevBufferMachinStr = FieldsList[4] #機號DevBufferCardidStr = FieldsList[5] #卡號DevBufferUseMoneryStr= FieldsList[6] #消費金額DevBufferUseTimeStr= FieldsList[7] #消費時間DevBufferStaryStr= FieldsList[8] #消費方式 0扣費 1計次DevBufferRecordAddStr= FieldsList[9] #記錄地址標識DevBufferAllNoStr= FieldsList[10] #總計錄數if(len(FieldsList)>11): #2018年以后的設備有唯一硬件序號DevBufferSerialNumStr=FieldsList[11]SendInfStr="001,"+DevRecFramesStr #確定接收到信息,否則設備會連續發送三次SendInfToIp(SendInfStr,addr)if(isVaildDate(DevBufferUseTimeStr)==0): #判斷消費時間是否正確DevBufferUseTimeStr="9999-99-99 99:99:99" #如果消費時間不正確,需更為 9999-99-99 99:99:99 才能將此條非法記錄刪除#時間正確說明是條有效記錄,可以在這里加上業務對數據庫的查、增、刪操作,要分析是否重復接收的信息 #清除設備內當前這條已上傳的記錄,驅動設備繼續上傳剩下的記錄SendInfStr="011," + DevBufferMachinStr + "," + DevBufferCardidStr + "," + DevBufferUseMoneryStr + "," + DevBufferUseTimeStr + "," + DevBufferRecordAddStr SendInfToIp(SendInfStr,addr)
??六、接收到消費機上傳的按鍵信息
if(FieldsList[0]=='106'): #接收到設備的按鍵信息DevRecFramesStr = FieldsList[1] #包序列號DevBufferIpAddrStr = FieldsList[2] #終端IPDevBufferRemoteAddrStr = FieldsList[3] #遠程電腦指機IPDevBufferMachinStr = FieldsList[4] #機號DevBufferUseTimeStr= FieldsList[5] #按鍵信息if(len(FieldsList)>6): #2018年以后的設備有唯一硬件序號DevBufferSerialNumStr=FieldsList[6]SendInfStr="001,"+DevRecFramesStr #確定接收到信息,否則設備會連續發送三次SendInfToIp(SendInfStr,addr) #可以在這里加上業務對數據庫的查、增、刪操作,要分析是否重復接收的信息
?七、接收到消費機上傳的掃碼支付請求?
if(FieldsList[0]=='128'): #接收到消費金額、掃碼信息DevRecFramesStr = FieldsList[1] #包序列號DevBufferIpAddrStr = FieldsList[2] #終端IPDevBufferRemoteAddrStr = FieldsList[3] #遠程電腦指機IPDevBufferMachinStr = FieldsList[4] #機號DevBufferCommandStr = FieldsList[5] #指令號DevBufferUseMoneryStr= FieldsList[6] #消費金額DevBufferUseTimeStr= FieldsList[7] #消費時間DevBufferQrcodeInfStr=""if(len(FieldsList)>9): #防止二維碼信息中有分隔符,for num in range(9,len(FieldsList)-1):DevBufferQrcodeInfStr=DevBufferQrcodeInfStr+FieldsList[num]DevBufferSerialNumStr=FieldsList[len(FieldsList)-1] #2018年以后的設備有唯一硬件序號SendInfStr="001,"+DevRecFramesStr #確定接收到信息,否則設備會連續發送三次SendInfToIp(SendInfStr,addr) #可以在這里加上業務對數據庫的查、增、刪操作,要分析是否重復接收的信息#用006指令返回本次消費失敗#用008指令返回本次消費成功#設備如接收到了本次發送的信息,會以109指令回復,在正式項目中要根據此特性做重發機制#SendInfStr="006," + DevBufferMachinStr + "," + DevBufferCommandStr + "," + "姓名:張三豐 \\n余額:168.88 \\n狀態:此卡已掛失 \\n ,20,0,6" SendInfStr="008," + DevBufferMachinStr + "," + DevBufferCommandStr + "," + DevBufferUseMoneryStr + ",正在進行掃碼支付..{請不要按動鍵盤! \\n},5,0,1"SendInfToIp(SendInfStr,addr)
?八、接收到消費機開機信號
if(FieldsList[0]=='101'): #接收到設備的開機信號DevRecFramesStr = FieldsList[1] #包序列號DevBufferIpAddrStr = FieldsList[2] #終端IPDevBufferRemoteAddrStr = FieldsList[3] #遠程電腦指機IPDevBufferMachinStr = FieldsList[4] #機號DevBufferDatetimeStr = FieldsList[5] #設備日期時間if(len(FieldsList)>6): #2018年以后的設備有唯一硬件序號DevBufferSerialNumStr=FieldsList[6]SendInfStr="001,"+DevRecFramesStr #確定接收到信息,否則設備會連續發送三次SendInfToIp(SendInfStr,addr) GetDT=DevBufferDatetimeStr[0:16]SysDT= get_time()if (GetDT!=SysDT): #設備時鐘與系統不符,更新設備時間SendInfStr="003," + DevBufferMachinStr +"," + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) SendInfToIp(SendInfStr,addr)
門禁控制板介紹:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.52de2c1bIqEgQP&ft=t&id=599136536796?
九、接收到門禁控制板提交的刷卡開門請求?
if(FieldsList[0]=='150'): #接收到實時考勤門禁機的刷卡信息DevRecFramesStr = FieldsList[1] #包序列號DevBufferIpAddrStr = FieldsList[2] #終端IPDevBufferRemoteAddrStr = FieldsList[3] #遠程電腦指機IPDevBufferMachinStr = FieldsList[4] #機號DevBufferCardidStr = FieldsList[5] #卡號DevBufferReaderStr= FieldsList[6] #讀頭號DevBufferDoorNoStr= FieldsList[7] #門或繼電器號DevBufferDelayStr= FieldsList[8] #門磁未關秒數,0表示已關DevBufferPasswPropStr= FieldsList[9] #密碼屬性(0密碼無效,1刷卡后按密碼,2補簽密碼,3開門密碼,4防迫脅密碼)DevBufferPassWStr= FieldsList[10] #密碼(最多8位數字)DevBufferUseTimeStr= FieldsList[11] #刷卡時間if(len(FieldsList)>12): #2018年以后的設備有唯一硬件序號DevBufferSerialNumStr=FieldsList[12]SendInfStr="001,"+DevRecFramesStr #確定接收到信息,否則設備會連續發送三次SendInfToIp(SendInfStr,addr) #可以在這里加上業務對數據庫的查、增、刪操作,要分析是否重復接收的信息#用050指令返回開門成功#用051指令返回開門失敗,正式系統開發時要有重發機制#SendInfStr="051," + DevBufferMachinStr + "," + DevBufferCardidStr + ",卡號:" + DevBufferCardidStr + "\\n姓名:張三豐 \\n狀態:無效卡\\n,20,1,3" SendInfStr="050," + DevBufferMachinStr + "," + DevBufferCardidStr + ",卡號:" + DevBufferCardidStr + "\\n姓名:張三豐 \\n狀態:歡迎關臨\\n,20,1,0," + DevBufferReaderStr + "," + DevBufferDoorNoStr + ",5,20" SendInfToIp(SendInfStr,addr)
?十、服務端回應消費機的指令?
def SendInfToIp(SendInfStr,addr):sdata=bytes(SendInfStr, encoding='gbk') #將要發送的信息轉為bytess.sendto(sdata,addr) message = 'SendData To %s:%s' % (addr, sdata)print(message+"\n")