Python通过Socket操作RFID设备-盘点功能

news2024/12/23 13:46:33

项目介绍:根据这么多年的IT经验,需求通过与用户沟通发现的,机会也是这样出来的。仓库的小伙子跟我倒苦水,动不动实物盘点,几千颗物料,都忙疯了,而且,新的物料一入库,作为公司的标准流程,现有的旧物料都需要盘点一遍。

公司的流程定义没有问题,但是真正的落实确实难度比较大,总不能一直不断的加人来解决这个问题吧?那肯定不行,而且现在经济形势不好,也不是说加就加的。

分析:作为供应链部门考量的一个重点,账面与实物匹配至关重要,一方面可以准确的支持生产,另一方面也是涉及物品安全。那么,怎么才能够既又呢? 既保障数据正确,又减去一线员工的工作强度。这是一个问题。

于是,我考虑到了RFID,这个技术应该将比条码要上了一个台阶。传统的条码扫描需要人员手工一个个对准条码扫描。RFID技术只要在附件就可以感应,实现快速扫描。

对于RFID的介绍,这里我不再介绍,网上搜索一下,相关的资料很多。

说干就干,在了解了相关的技术后,找供应商借了RFID设备,这里我们选用了UHF高频设备,型号为深圳成为Chainway UR4,

UHF一般有三个工作模式,主动式,被动式,触发式,功能强大,根据我们的需求,我涉及的定时扫描仓库物品,采用的是被动式,也就是下图所说的命令工作模式。这个模式就是定时的扫描固定区域,采集这个区域的所有标签。

拿到设备后,供应商提供了一些SDK和Demo,这里的Demo主要有C#和Java的,当然也有安卓studio的。移动端现在基本上安卓偏多。供应商也封装了C# dll, 自行开发的话用C#还是比较方便的。

这款UHF支持串口和有线网口,在设备管理领域,Python是最擅长的,笔者决定通过Python来与UHF设备互动。翻遍了供应商提供的开发包,没找到现成的Python实例,只能自己干了。

目前看来,有两个思路,1. 通过python 调用C# dll。2. Python 直接通过Socket发送通讯协议然后等待获取返回值。把这几个思路跟业内几个资深大拿稽工,朱工交流了一遍,他们都是在开发领域浸淫多年,骨灰级开发者,一致认为没有必要绕弯子,直接Python开干。这样做还有一个好处,Python调用Socket是通用方法,对于其他类似设备(不限于UHF)都是通用的,一般通过网络调试助手调试的设备,也是可以通过Python Socket来实现的。

采用第二种方式,直接一点说就是不断的收发操作,要发送指令,肯定要有通讯协议,幸运的是,供应商非常配合的提供了ISO18000-6C的通讯协议,有了这个,直接发送就是了。当然,如有没有通讯协议,那可能就需要通过抓包工具实现了,方法总是有的,可能就是实现方式上面复杂一点。

整个盘点流程设计

今天我们这边重点记录如何实现采集指定区域内的标签,步骤如下:

1. 硬件准备UHF,需要安装到指定区域,这款设备最多支持4根天线,这里我只用了1根天线,最大的感应区域大约为20米,因尚未大规模测试,我预计10米左右无遮挡肯定没问题。另外,RFID因功率较大,不建议走POE方式,建议单独供电。

2. 设备安装完成后,配置IP,注意,需要重启后生效,通过Ping命令看看是否成功。修改IP也需要通过供应商提供的Demo工具连上操作,这些都可以在供应商提供的操作手册中找到。

3. Python + Socket 代码实现:

import socket

import binascii

import time

s=socket.socket()  #创建socket对象

host='10.202.*.*' #UHF设备IP

port=8888 #指定端口号

send_data_start=b"\xC8\x8C\x00\x0A\x82\x27\x10\xBF\x0D\x0A" #采集启动代码

send_data_stop=b"\xC8\x8C\x00\x08\x8C\x84\x0D\x0A" #停止采集

data=b''

timestamp1=time.time() #获取当前时间戳

time_limit=10

#处理获取的数据

def convert_to_list(source):

    EPC=[]

    result=source.split("c88c")

   

    for line in result:

        line=line[10:34]

        EPC.append(line)

    print("去重前EPC标签编号:"+str(len(EPC)))

    result2=list(set(EPC))

    del(result2[0])

    print("去重后EPC标签编号:",result2)

    return result2

try:

    s.connect((host,port)) #设备连接

    print("设备连接成功")

    s.send(send_data_start) #发送代码

    while True:

        recvData=s.recv(1024) #接收返回的数据

        m=int(time.time()-timestamp1) #获取当前时间戳

        print("计时:"+str(m))

        if m>time_limit: #到达指定计时后停止接收,跳出循环

            break

       

        data+=recvData

            

    s.send(send_data_stop) #发送停止指令

    recvStop=s.recv(1024)

    response_stop=binascii.hexlify(recvStop).decode("utf-8") #转换为16进制

    print("停止位发送状态:"+response_stop)

    s.close()

    response_hex=binascii.hexlify(recvData).decode("utf-8")

    print(response_hex)

    print(type(response_hex))

    print(type(recvData))

    print(len(response_hex))

    response_hex2=binascii.hexlify(data).decode("utf-8")

    result=convert_to_list(response_hex2)

    print("数据接收总EPC数量:"+str(len(result)))

except Exception as e:

    print("错误:",str(e))

s.close()

代码说明:设计的步骤是连上UHF设备,发送采集命令,等待10秒后,停止采集。

与官方Demo测试对比结果如下图:

对比起来,获取的标签数量差别不大,基本上没有问题。

小结:

         万里长征第一步,RFID有很多功能还等待挖掘,先把第一步迈出来。无比期待把这个功能整合到MRO物料管理中。目前来看,RFID是智能仓储的基石,也是IT向智能化供应链管理迈出的重要一步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/974596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Matlab分析的电力系统可视化研究

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

什么是专线网络?互联网专线为什么贵

宽带主要分为专线和家庭宽带。一般来说,企业服务器和云服务提供商通常使用专线宽带,普通家庭接入家庭宽带。 什么是专线网络? 专线是指依托国内骨干网络和宽带城市网络资源,为企业集团客户提供专线接入方式互联网城市互联网&…

WebDAV之π-Disk派盘 + 无忧日记

无忧日记,生活无忧无虑。 给用户专业的手机记录工具,用户可以很轻松地通过软件进行每天发生事情的记录,可以为用户提供优质的工具与帮助,用户还可以通过软件来将地理位置,天气都记录在日记上,用户也可以通过软件来进行图片的导入,创建长图日记, 心情报表:用户写日记…

企业架构LNMP学习笔记14

默认官方模块: Gzip压缩: 压缩文件,使文件变小了,传输更快了,目前大部分市场浏览器都支持Gzip。 传输的时候省流量。 目的是为了提高用户的加载速度。 #开启gzip压缩 gzip on; #http协议版本 gzip_http_version 1.0…

css之层叠上下文

之前调元素的显示优先级时,只会默默的调z-index以达到效果,但有时不生效,又不知道根因。刚好详细了解到层叠上下文,可以解释此类问题。 什么是层叠上下文? 在CSS2.1规范中,每个盒模型的位置是三维的&…

智能电网时代:数字孪生的崭露头角

随着科技的不断进步,数字孪生已经开始在电力行业崭露头角,为这个关键的行业带来了前所未有的机遇和潜力。本文就带大家了解一下数字孪生在哪些方面为电力行业做出改变,以及未来的创新应用。 首先,数字孪生可以提高电力系统运营效率…

Mysql事务及锁

一、MVCC原理 1.1 版本链 trx_id :每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的 事务id 赋值给 trx_id 隐藏列。 roll_pointer :每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到 undo日志 中&#xff0…

木棒切割问题

题目很简单&#xff0c;就是我们在写二分的时候&#xff0c;会遇到这样的情况&#xff1a; mid left (right-left)/2; if (nums k)return mid;if (nums>k)left mid;if (nums<k)right mid-1; 若我们debug会发现其可能会一致卡在left mid&#xff0c;例如&#xff08…

ceph Monitor原理和代码流程介绍

Monitor介绍 Monitor在Ceph集群中扮演管理者的角色&#xff0c;维护了整个集群的状态&#xff0c;集群的状态被抽象成几个Map对象&#xff0c;包括monmap、osdmap、mdsmap、authmap、logmap等&#xff0c;保证集群的相关组件在同一时刻能够达成一致&#xff0c;相当于领导层。…

语言深入理解指针(非常详细)(三)

目录 数组名的理解使用指针访问数组 一维数组传参的本质二级指针指针数组指针数组模拟二维数组 数组名的理解 在上⼀个章节我们在使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这里我们使用 &am…

医者无疆 | AI赋能大医精诚,医疗制药的进阶与突破

在历史的长河中&#xff0c;医学一直是人类文明的重要组成部分。从古希腊的希波克拉底到现代医学研究&#xff0c;医学始终与时俱进&#xff0c;为人类的健康和福祉做出了巨大的贡献。在互联网、大数据、5G等信息技术的迭代下&#xff0c;人工智能&#xff08;AI&#xff09;的…

cpp20规范 vs2019 STL库 unordered_map源码分析(整理后上传)

&#xff08;1&#xff09; unordered_map 模板有如下的模板调用和包含关系。 绿箭头1 处的模板类&#xff0c;继承了绿箭头2 &#xff0c; 绿箭头2 又继承了红框模板。但红框模板有一个泛化版本和一个特化版本&#xff0c;选择哪一个呢&#xff1f; 经过源代码查找&#xff0…

腾讯张乐:“反内卷”潮流已至,研发效能是软件企业必由之路

目录 Why&#xff5c;“狂飙”踩下刹车&#xff0c;“湖水岩石效应”加速显现 What&#xff5c;效能 ≠ 效率&#xff0c;效能 效率 有效性 How&#xff5c;研发效能“黄金三角” e.g.&#xff5c;软件研发效能实践中的“坑”与“解” 1. 忽视重视工程师的声音 2. “迷…

【Spring】SpringBoot的10个参数验证技巧

这里写目录标题 前言1.使用验证注解2 使用自定义验证注解3 在服务器端验证4 提供有意义的错误信息5 将 i18n 用于错误消息messages.properties6 使用分组验证7 对复杂逻辑使用跨域验证8 对验证错误使用异常处理9 测试你的验证逻辑10 考虑客户端验证总结 前言 参数验证很重要&am…

跨空间域数据管理分布式共识算法:现状、挑战和展望

跨空间域数据管理分布式共识算法&#xff1a;现状、挑战和展望 李伟明1&#xff0c;李彤1,2, 张大方1&#xff0c;戴隆超1,2, 柴云鹏1,2 1 中国人民大学信息学院&#xff0c;北京 100872 2 数据工程与知识工程教育部重点实验室&#xff0c;北京 100872 摘要&#xff1a;随着数字…

生信学院|09月08日《SOLIDWORKS扣合特征应用》

课程主题&#xff1a;SOLIDWORKS扣合特征应用课程时间&#xff1a;2023年09月08日 14:00-14:30主讲人&#xff1a;陈冬冬 生信科技 售后服务工程师1、什么是扣合特征2、唇缘与凹槽3、装配体凸4、台通风孔5、弹簧扣与弹簧扣卡槽请安装腾讯会议客户端或APP&#xff0c;微信扫描海…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理——排列组合——分堆分配

⛲️ 一、考点讲解 1.方法介绍 在排列组合中&#xff0c;经常遇到元素分堆或分组问题&#xff0c;尤其难点是出现等数量的分堆&#xff0c;很多考生容易犯错误。 2.方法应用 平均分成的组&#xff0c;不管他们的顺序如何&#xff0c;都是一种情况&#xff0c;所以分组后一定要…

HTML5-3-表格

文章目录 属性边框属性标题跨行和跨列单元格边距 HTML 表格由 <table> 标签来定义。 tr&#xff1a;tr 是 table row 的缩写&#xff0c;表示表格的一行。td&#xff1a;td 是 table data 的缩写&#xff0c;表示表格的数据单元格。th&#xff1a;th 是 table header的缩…

Python中if __name__ == ‘__main__‘:的作用和原理

if name ‘main’:的作用 一个python文件通常有两种使用方法&#xff0c; 第一是作为脚本直接执行&#xff0c;第二是 import 到其他的 python 脚本中被调用&#xff08;模块重用&#xff09;执行。 举例说明如下&#xff1a; 在本文件中&#xff0c;name 是main 在被impor…

Vue3---uni-app--高德地图引用BUG

先给报错信息&#xff1a;module libs/map//libs/map_min.js is not defined, require args is /libs/map_min.js 查看我引用方法&#xff1a; 本人查阅资料发现 是 require 使用的是 commonJS方式引用说这个适配Vue2可我项目是Vue3应该使用ES6语法糖 然后我有跑了项目发现BU…