前言

一个超市里常用的条码秤对接经历

屏幕截图.png

tcp/ip

该条码秤使用 tcp/ip 协议进行通信,在 java 中,tcp/ip 通信被封装成了 Socket 类,所以使用起来还算简单。

以下是一个简单的 socket 示例

try {

socket = new Socket();

InetSocketAddress socketAddress = new InetSocketAddress("192.168.3.150", 4001);

socket.connect(socketAddress, 10 * 1000);

socket.setSoTimeout(5 * 1000);

if (socket.isConnected()) {

// 向 socket 服务器写入数据

byte[] bytes = {0x21, 0x30, 0x49, 0x41, 0x0d, 0x0a, 0x03};

socket.getOutputStream().write(bytes);

// 接收 socket 服务器返回的数据

InputStreamReader ipr = new InputStreamReader(socket.getInputStream());

bufferedReader = new BufferedReader(ipr);

String str = bufferedReader.readLine();

}

} catch (IOException error) {

error.printStackTrace();

}

复制代码

建议先实例化 socket 再进行连接,因为这样可以通过 setSoTimeout 函数设置超时时间,避免线程阻塞,同时 socket 的连接不能在主线程中进行,否则会报错。

发送数据到条码秤

大华条码秤 socket 服务器的端口为 4001,需要给大华秤盘设置一个固定的 ip 地址。

设置方式如下:

按下功能键 -> 输入9002 -> 按下确认 -> 开始输入 ip 地址,输入 . 需要按下去皮键 -> 在输入主机地址后按下去皮键完成设置

在大华的文档中标明,每个指令都得以 0x0d, 0x0a, 0x03 为结束符,所以可以封装一个函数,如下:

private String sendCommand(byte[] bytes) {

byte[] suffix = {0x0d, 0x0a, 0x03};

try {

if (socket != null && socket.isConnected() && socket.getOutputStream() != null) {

byte[] command = byteMerger(bytes, suffix);

socket.getOutputStream().write(command);

return "SEND_SUCCESS";

} else {

return "NOT_CONNECT";

}

} catch (IOException e) {

e.printStackTrace();

return "SEND_FAIL";

}

}

private static byte[] byteMerger(byte[] bt1, byte[] bt2){

byte[] bt3 = new byte[bt1.length + bt2.length];

System.arraycopy(bt1, 0, bt3, 0, bt1.length);

System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);

return bt3;

}

复制代码

首先发送清除 plu 和报表指令到条码秤来初始化条码秤。

屏幕截图.png

public boolean clearData() {

if (socket != null && socket.isConnected()) {

try {

byte[] bytes = {0x21, 0x30, 0x49, 0x41};

sendCommand(bytes)

byte[] bytes2 = {0x21, 0x30, 0x48, 0x41};

sendCommand(bytes2)

return true;

} catch (IOException e) {

e.printStackTrace();

return false;

}

} else {

return false;

}

}

复制代码

这里有一点需要注意,因为初始化报表会耗费一定的时间,所以不能在清除报表后立马同步商品数据,否则会导致同步失败。

关于商品数据传入文档描述如下:

屏幕截图.png

屏幕截图.png

这里针对几个关键信息作出说明:

plu 条码秤中货品的助记码,可在条码秤使用快捷键或录入 plu 码进行搜索

code 商品代码,长度7位,用于条码秤打印条码标签后在系统数据库中进行匹配,第一位固定为店名号最后一位,意味着再怎样进行设置打印后都为店名号

price 商品价格,单位为分,长度6位,不足需补位0

goodsName 商品名,中文字符,需要转换成区位码转换函数如下

private static String bytes2HexString(byte b) {

return bytes2HexString(new byte[] { b });

}

private static String bytes2HexString(byte[] b) {

String ret = "";

for (int i = 0; i < b.length; i++) {

String hex = Integer.toHexString(b[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

ret += hex.toUpperCase();

}

return ret;

}

private String StringToAreaByteCode(String str) {

String result = "";

for (int i = 0; i < str.length(); i++) {

result += charToAreaByteCode(str.charAt(i));

}

return result;

}

private String charToAreaByteCode(char str) {

byte[] bs = new byte[0];

try {

bs = String.valueOf(str).getBytes("GB2312");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

String s = "";

String t = "";

for (int i = 0; i < bs.length; i++) {

int a = Integer.parseInt(bytes2HexString(bs[i]), 16);

t = (a - 0x80 - 0x20) + "";

if(t.length() == 1){

t = 0 + t;

}

s += t;

}

return s;

}

复制代码

发送商品数据代码如下:

public boolean setGoods(BarCodeScaleGoods goods) {

String plu = goods.pluCode;

String code = goods.code;

String price = String.valueOf(new Double(goods.price * 100).intValue());

String goodsName = StringToAreaByteCode(goods.goodsName);

String unit = goods.unit;

while (plu.length() < 4) {

plu = '0' + plu;

}

while (price.length() < 6) {

price = '0' + price;

}

String goodsInfo = String.format("!0V%sA%s%s%s00000099901010000000000000000000000000000000000000000000000B%sCDE", plu, code, price, unit, goodsName);

byte[] bytes = goodsInfo.getBytes();

String result = sendCommand(bytes);

if (result.equals("SEND_SUCCESS")) {

try {

InputStreamReader ipr = new InputStreamReader(socket.getInputStream());

bufferedReader = new BufferedReader(ipr);

String str = bufferedReader.readLine();

if (str.length() > 0) {

return true;

} else {

return false;

}

} catch (IOException e) {

e.printStackTrace();

return false;

}

} else {

return false;

}

}

复制代码

因为发送商品数据的指令每个字段没有明确的标识位,大华在解析指令时是以下标来获取信息的,所以得保证每个字段的信息字节数是固定的,所以得对动态的信息进行补位,代码如下:

while (plu.length() < 4) {

plu = '0' + plu;

}

while (price.length() < 6) {

price = '0' + price;

}

复制代码

需在空字节上填充0。

在完成发送后,判断条码秤是否成功录入商品的条件是条码秤有没有返回信息,所以就有以下代码来判断是否录入成功。

if (result.equals("SEND_SUCCESS")) {

try {

InputStreamReader ipr = new InputStreamReader(socket.getInputStream());

bufferedReader = new BufferedReader(ipr);

String str = bufferedReader.readLine();

if (str.length() > 0) {

return true;

} else {

return false;

}

} catch (IOException e) {

e.printStackTrace();

return false;

}

} else {

return false;

}

复制代码

最后需要同步热键设置,用于快捷键录入商品,文档描述如下:

屏幕截图.png

代码如下:

public void setHotKey() {

String str = "!0L00A";

for (int i = 1; i <= 71; i++) {

if (String.valueOf(i).length() == 1) {

str += "000" + i;

} else if (String.valueOf(i).length() == 2) {

str += "00" + i;

}

}

str += "B";

byte[] bytes = str.getBytes();

sendCommand(bytes);

}

复制代码

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[大华条码秤对接经验总结]http://www.zyiz.net/tech/detail-141508.html

android 大华电子秤波特率_大华条码秤对接经验总结相关推荐

  1. 拼接大屏数据展示_大屏数据可视化设计注意事项

    大屏数据可视化是以大屏为主要展示载体的数据可视化设计.大屏的特点,使得在用户观感上留下独特的印象,同时,大屏所具备储存更大的信息量,对于大屏企业来说重点主要在于将信息全面的显示在屏幕上,关注于画质的清 ...

  2. 大数据 就业 缺口_大数据人才缺口大!乌兰察布从政策激励等方面吸引人才

    授牌仪式 9月25日,记者从第八届内蒙古"草原英才"高层次人才合作交流会暨呼包鄂乌人才创新创业周乌兰察布分会场同步启动的2020年大数据产业发展与人才培养大会上获悉,乌兰察布市大数 ...

  3. Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户

    深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:14:39 作者:陈飚 "昔我十年前,与君始相识." 一瞬间Hadoop也到了要 ...

  4. 大数据产业链结构_大数据产业链包含那几个应用环节?

    大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化的信息资产. 大数 ...

  5. python大数据就业方向_大数据方向:就业主要从事哪些工作?

    你好. 一.大数据就业前景 大数据行业人才稀缺,人才需求量达100万+,随着人工智能.物联网.云计算的快速发展,大数据人才需求也急剧增加,未来还将不断扩大.而且大数据人才的薪资也是普遍较高的,2018 ...

  6. python大数据好不好学_大数据好学吗?想转行大数据??

    作为一名IT从业者,同时也是一名教育工作者,我来回答一下这个问题. 首先,虽然大数据技术具有一定的难度,但是随着大数据技术体系的逐渐丰富和完善,大数据领域对于人才的需求类型也在不断趋于多元化,不同知识 ...

  7. python与大数据是什么_大数据和python有什么区别

    大数据(big data),IT行业术语,是指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才 能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化 ...

  8. python开发和大数据开发工程师_大数据开发工程师的岗位职责

    大数据开发工程师负责该领域的业务需求讨论,完成技术方案及数据开发.下面是学习啦小编整理的大数据开发工程师的岗位职责. 大数据开发工程师的岗位职责1 职责: 1.负责所分管团队的团队建设和日常管理工作; ...

  9. hadloop大数据平台论文_大数据平台建设探讨

    2019.03 1 概述 大数据平台通过统一的 大数据库实现全省业务信息 的集中 , 该库数据来源于全省各个业务系统和基础数据 库等应用数据 . 位置数据 . 搜索数据等结构化数据 . 半 结构化数据 ...

  10. 交通大数据应用细分_大数据之路之交通大数据应用总体架构设计

    上期简单介绍了大数据,了解了大数据应用的可行性与必然性,事实上也的确如此,大数据在公共管理(某省的最多跑一次),教育行业(某省交通厅大数据建设),税务行业(某省税务大数据平台应用建设),信息管理(某省 ...

最新文章

  1. OneFlow系统设计
  2. 新年新技术:MongoDB 3.0
  3. 机器学习特征筛选:方差选择法VarianceThreshold
  4. 04 | 内存快照:宕机后, Redis 如何实现快速恢复
  5. mysql dmz_MySQL 中LIMIT的使用详解
  6. 【kafka】kafka 查看 GroupCoordinator 以及 kafka Group dead 消费组死掉 以及 GroupCoordinatorRequest 使用
  7. 【Centos配置2】远程管理必备工具配置:ssh/vnc/webadmin
  8. Win10配置Tensorflow_Object_Detection_API
  9. sqlserver垮库查询_sql跨库查询(sqlserver跨库查询)
  10. SAP Cloud for Customer里Sales Order和Sales Quote的建模方式 1
  11. Q117:PBRT-V3反射模型(Reflection Models)笔记
  12. Ubuntu18.04之国内常用源
  13. 42.数据库 SQL 操作
  14. mysql物业管理系统设计_小区物业管理系统的设计与实现(IDEA,SSM,MySQL)
  15. Web漏洞扫描工具AWVS12使用详解
  16. win10安装iNode客户端软件就不能连接无线网络的问题解决
  17. 为什么要写技术博客?
  18. 上海旅行日志 2012年7月14日
  19. 1.44TFT彩屏字体翻转,扫描方式的改变
  20. 基于ESP32-S2制作本地气象台/温度计

热门文章

  1. H5点击复制到剪贴板
  2. php kindeditor远程图片上传,kindeditor 远程图片本地化,远程图片下载到本地自动更换图片路径...
  3. Dreamweaver中插入透明Flash
  4. CCBoot 2019(遥志无盘启动系统)官方中文版V2019.0601 | ccboot无盘软件下载 | 遥志无盘启动CCBoot
  5. Linux服务器开发学习方法
  6. 【已解决】QQ异地登录,设备型号lya,设备名称LYA-AL10
  7. c语言程序设计马秀丽课后题答案,c语言程序设计课后题答案马秀丽
  8. 【历史上的今天】7 月 22 日:Linux 开发的“二把手”出生;苹果发布 OS 8;MSN 发布
  9. 神仙软件商店:到这儿买软件会员最多打5折,各种绿色开源软件还应有尽有
  10. 从零开始用Kotlin结合Jetpack写一个五子棋