Python UDP Socket 實時在線刷卡掃碼POS消費機門禁控制服務端示例源碼

本示例使用的設備: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")        

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/911678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911678.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對于高考邊界的理解以及未來就業層級的學習與思考

目錄 一、2024年高考全國多少考生,文化課,文科理科,分別總分多少分?清北得多少分能上?二、1342萬人里面,有多少人能上清北,多少能上985,多少能上211,多少能上二本&#x…

JVM調優實戰 Day 4:JVM類加載機制

【JVM調優實戰 Day 4】JVM類加載機制 文章內容 在Java虛擬機(JVM)的運行過程中,類加載機制是整個程序啟動和運行的基礎。它決定了Java類是如何被動態加載到JVM中,并為后續的字節碼執行做好準備。理解JVM類加載機制不僅有助于我們…

R 語言中的判斷語句

R 語言中的判斷語句 在R語言編程中,判斷語句是執行條件邏輯的基礎。它們允許程序根據特定的條件執行不同的代碼塊。本文將深入探討R語言中的幾種常見判斷語句,包括if語句、if-else語句和switch語句,并探討它們的用法和場景。 1. if語句 if…

從設備自動化到智能管控:MES如何賦能牛奶飲料行業高效生產?

萬界星空科技全新推出的:新一代智能化MES系統,深度融合AI大數據技術,實現生產全流程可視化、智能排產、實時質量追溯與設備互聯,助力企業降本增效30%。 現開放免費試用名額,體驗智能化生產管理的高效與便捷&#xff01…

TDengine 技術參數配置大全

1. 背景 TDengine 的 taos.cfg 中配置項及使用 SQL 命令 alter 修改的系統變量之間的關系如何,哪些是持久存儲項,哪些設置是臨時項,這章將詳細說明。 本文是技術參考資料,請收藏。 2.定義 1. 全局配置參數 全局配置參數&#…

無人機神經網絡模塊運行與技術難點

一、神經網絡模塊的運行方式 1. 分層處理架構 感知層 多模態數據融合:通過八元數卷積網絡(OCNN)統一處理LiDAR、攝像頭、IMU等異構傳感器數據,將點云坐標(x/y/z)、圖像RGB與光流信息編碼至8維虛部&#…

前端react框架實現打包時間動態加入配置展示在指定頁面

注意: 當前方法特定為 create-react-app 構建框架,其他的構建流程不同,不能直接照搬 react-scripts 的方式。 ? 目標: 在 React 打包(build)時,自動將當前時間寫入代碼中某個變量或 console…

原子操作(CAS)

原子操作 原子操作原理什么是原子操作?原子性原子變量相關接口內存序 shared_ptr的實現 原子操作原理 什么是原子操作? 原子操作其實就是指在多線程的環境下,確保對共享變量的操作不會被干擾,從而避免了競態條件。 我們都知道&…

馬克思主義基本原理期末復習下

二十、資本的原始積累 所謂資本原始積累,就是以暴力手段使生產者與生產資料分離資本快速集中于少數人手中,資本主義得以快速發展的歷史過程。具體過程其一,用暴力手段奪取農民的土地,如英國圈地運動在國外建立殖民地,…

體育數據api接口,足球api籃球api電競api,比賽賽事數據api

在體育行業,數據驅動一切,從內容分發到競猜預測,從用戶互動到商業變現,背后少不了一個關鍵詞:數據接口(API)。無論是實時比分、比賽事件、歷史統計,還是球員詳情、戰績排名&#xff…

Harmony 狀態監聽 @Monitor和@Computed

Monitor與Computed裝飾器在ArkUI狀態管理中的協同應用 一、裝飾器概述 1. Monitor裝飾器 Monitor是ArkUI狀態管理V2中的核心裝飾器,用于深度監聽狀態變量的修改: 支持監聽嵌套類屬性、多維數組項和對象數組中的指定項變化能夠獲取變化前后的值進行比…

同濟大學多模態感知具身導航全面綜述

作者: I-Tak Ieong, Hao Tang 單位:同濟大學計算機學院,北京大學計算機學院 論文標題: Multimodal Perception for Goal-oriented Navigation: A Survey 論文鏈接:https://arxiv.org/pdf/2504.15643 主要貢獻 基于…

2025年CCF先進音頻技術競賽

由中國計算機學會主辦、CCF語音對話與聽覺專委會承辦、語音之家協辦、華為終端有限公司贊助的CCF先進音頻技術大賽正式啟動。大賽旨在推動國內高等院校及科研院所在音頻技術領域的專業人才培養,支持學生科技創新,選拔優秀人才。 賽事官網:ht…

手撕線程池

線程池的目的: 1.復用線程,減少頻繁創建和銷毀的開銷 創建和銷毀線程是昂貴的系統操作,涉及內核調度、內存分配; 使用線程池預先創建一批線程,在多個任務間循環復用,避免資源浪費,提高性能。 …

3DTiles三維模型

1. 3DTiles 介紹? 2016 年,Cesium 團隊借鑒傳統 2DGIS 的地圖規范:WMTS,借鑒圖形學中的層次細節模型,打造出大規模的三維數據標準:3d-Tiles,中文譯名:三維瓦片。 它在模型上利用了 gltf 渲染…

Golang Kratos 系列:業務分層的若干思考(一)

在使用 Kratos 框架開發云服務的過程中,漸漸理解和感受到“領域層”這個概念和抽象的強大之處,它可以將業務和存儲細節解耦、將業務和開發初期頻繁變更的API結構,讓Mock單元測試變得更加容易、對細節的變化更魯棒。讓業務代碼擺脫技術細節依賴…

深度優化OSS上傳性能:多線程分片上傳 vs 斷點續傳實戰對比

1 卸載開頭 對象存儲服務(OSS)已成為現代應用架構的核心組件,但隨著業務規模擴大,文件上傳性能問題日益凸顯。本文將深入探討兩種核心優化技術:多線程分片上傳和斷點續傳,通過理論分析、代碼實現和性能測試…

doris_工作使用整理

文章目錄 前言一、doris整體情況二、doris的存儲過程情況1.分類2. 同步物化視圖3. 異步物化視圖三,分區相關1.分區建的過多前言 提示:doris使用版本3.x 提示:以下是本篇文章正文內容,下面案例可供參考 一、doris整體情況 細節放大 二、doris的存儲過程情況 1.分類 按…

左神算法之單輔助棧排序算法

目錄 1. 題目2. 解釋3. 思路4. 代碼5. 總結 1. 題目 請編寫一個程序,對一個棧里的整型數據,按升序進行排序(即排序前棧里的數據是無序的,排序后最大元素位于棧頂)。要求最多只能使用一個額外的棧存放臨時數據&#xf…

使用Trae編輯器與MCP協議構建高德地圖定制化服務

目錄 一、使用Trae編輯器配置高德MCP Server 1.1 Trae介紹 1.2 從mcp.so中獲取配置高德地圖mcp server配置信息 1.3 高德地圖開發者配置 1.4 添加Filesystem 到Trae 1.5 使用結果展示 1.6 MCP常見命令行工具和包管理說明 1.7 Function Call工具和MCP技術對比 二、本地…