
本示例适配的设备:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.47b32c1bmEakv9&ft=t&id=22173428704
javascript
.版本 2
.程序集 窗口程序集_启动窗口
.子程序 _TCP服务器_数据到达
.局部变量 接收到的字节集, 字节集
.局部变量 数据报文, 文本型
.局部变量 客户IP端口, 文本型
.局部变量 系统时间, 日期时间型
.局部变量 回应指令数据, 字节型, , "200"
.局部变量 发送的字节集, 字节集
.如果 (服务线程 = 真)
接收到的字节集 = TCP服务器.取回数据 ()
客户IP端口 = TCP服务器.取回客户 ()
更新客户框列表 (客户IP端口)
数据报文 = 字节集转十六进制文本 (接收到的字节集)
.如果 (列表框_报文.取项目数 () > 30)
列表框_报文.清空 ()
.否则
.如果结束
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (客户IP端口 + " ", 22) + "接收数据:" + 数据报文, )
解析处理接收数据 (客户IP端口, 接收到的字节集)
.否则
.如果结束
.子程序 十六进制转十进制, 整数型
.参数 十六进制, 文本型
.局部变量 i, 整数型
.局部变量 十进制, 整数型
.计次循环首 (取文本长度 (十六进制), i)
十进制 = 十进制 × 16 + 寻找文本 ("0123456789ABCDEF", 取文本中间 (到大写 (十六进制), i, 1), , 假) - 1
.计次循环尾 ()
返回 (十进制)
.子程序 字节集转十六进制文本, 文本型
.参数 字节集, 字节集
.局部变量 i, 整数型
.局部变量 结果, 文本型
.局部变量 计次, 整数型
结果 = ""
计次 = 取字节集长度 (字节集)
.计次循环首 (计次, i)
.如果 (字节集 [i] < 16)
结果 = 结果 + "0" + 取十六进制文本 (字节集 [i]) + " "
.否则
结果 = 结果 + 取十六进制文本 (字节集 [i]) + " "
.如果结束
.计次循环尾 ()
返回 (结果)
.子程序 取系统时间, 文本型
.局部变量 当前时间, 日期时间型
.局部变量 结果, 文本型
当前时间 = 取现行时间 ()
结果 = 取文本右边 ("0" + 到文本 (取小时 (当前时间)), 2) + ":" + 取文本右边 ("0" + 到文本 (取分钟 (当前时间)), 2) + ":" + 取文本右边 ("0" + 到文本 (取秒 (当前时间)), 2)
返回 (结果)
.子程序 _按钮_启动TCP服务器_被单击
.局部变量 通讯端口, 整数型
.如果 (按钮_启动TCP服务器.标题 = "启动TCP服务器")
通讯端口 = 到整数 (编辑框_通讯端口.内容)
TCP服务器.端口 = 通讯端口
TCP服务器.激活 ()
按钮_启动TCP服务器.标题 = "停止"
服务线程 = 真
.否则
按钮_启动TCP服务器.标题 = "启动TCP服务器"
服务线程 = 假
列表框_客户端.清空 ()
.如果结束
.子程序 __启动窗口_创建完毕
.子程序 更新客户框列表
.参数 客户端IP, 文本型
.局部变量 已存在, 逻辑型
.局部变量 i, 整数型
.局部变量 项目数, 整数型
已存在 = 假
项目数 = 列表框_客户端.取项目数 ()
.如果 (项目数 > 0)
.计次循环首 (项目数, i)
.如果 (列表框_客户端.取项目文本 (i - 1) = 客户端IP)
已存在 = 真
.否则
.如果结束
.计次循环尾 ()
.否则
.如果结束
.如果 (已存在 = 假)
列表框_客户端.加入项目 (客户端IP, )
.否则
.如果结束
.子程序 解析处理接收数据
.参数 客户IP端口, 文本型
.参数 接收到的字节集, 字节集
.局部变量 数据长度, 整数型
.局部变量 设备IP, 文本型
.局部变量 机号, 整数型
.局部变量 数据包序号, 整数型
.局部变量 卡号长度, 整数型
.局部变量 物理卡号, 文本型
.局部变量 唯一设备序号, 文本型
.局部变量 解析结果, 文本型
.局部变量 i, 整数型
.局部变量 随机动态码, 文本型
数据长度 = 取字节集长度 (接收到的字节集)
.如果 (数据长度 > 10 且 (接收到的字节集 [1] = 十六进制 ("C1") 或 接收到的字节集 [1] = 十六进制 ("CF"))) ' 接收到IC读卡器数据
.如果 (接收到的字节集 [1] = 十六进制 ("C1"))
解析结果 = "接收数据解析:IC读卡器刷卡数据,设备IP["
.否则
解析结果 = "接收数据解析:IC卡离开读卡器,设备IP["
.如果结束
设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
机号 = 接收到的字节集 [6] + 接收到的字节集 [7] × 256
数据包序号 = 接收到的字节集 [8] + 接收到的字节集 [9] × 256
卡号长度 = 接收到的字节集 [10]
.计次循环首 (卡号长度, i)
物理卡号 = 物理卡号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [10 + i]), 2)
.计次循环尾 ()
i = 10 + i
.判断循环首 (i < 数据长度)
唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
i = i + 1
.判断循环尾 ()
唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
解析结果 = 解析结果 + 设备IP + "],机号[" + 到文本 (机号) + "],数据包序号[" + 到文本 (数据包序号) + "],卡号长度[" + 到文本 (卡号长度) + "],物理卡号HEX[" + 物理卡号 + "],唯一设备序号[" + 唯一设备序号 + "]"
列表框_报文.加入项目 (解析结果, )
列表框_报文.加入项目 ("", )
接收到刷卡数据回应 (客户IP端口, 机号)
.否则
.如果 (数据长度 > 10 且 (接收到的字节集 [1] = 十六进制 ("D1") 或 接收到的字节集 [1] = 十六进制 ("DF"))) ' 接收到ID读卡器数据
.如果 (接收到的字节集 [1] = 十六进制 ("D1"))
解析结果 = "接收数据解析:ID读卡器刷卡数据,设备IP["
解析结果 = "接收数据解析:ID卡离开读卡器,设备IP["
.否则
.如果结束
设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
机号 = 接收到的字节集 [6] + 接收到的字节集 [7] × 256
数据包序号 = 接收到的字节集 [8] + 接收到的字节集 [9] × 256
.计次循环首 (5, i)
物理卡号 = 物理卡号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [10 + i]), 2)
.计次循环尾 ()
i = 15
.判断循环首 (i < 数据长度)
唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
i = i + 1
.判断循环尾 ()
唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
解析结果 = 解析结果 + 设备IP + "],机号[" + 到文本 (机号) + "],数据包序号[" + 到文本 (数据包序号) + "],物理卡号HEX[" + 物理卡号 + "],唯一设备序号[" + 唯一设备序号 + "]"
列表框_报文.加入项目 (解析结果, )
列表框_报文.加入项目 ("", )
接收到刷卡数据回应 (客户IP端口, 机号)
.否则
.如果 (数据长度 > 10 且 接收到的字节集 [1] = 十六进制 ("F3")) ' 接收到
设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
机号 = 接收到的字节集 [6] + 接收到的字节集 [7] × 256
数据包序号 = 接收到的字节集 [8] + 接收到的字节集 [9] × 256
解析结果 = "接收数据解析:设备心跳数据包," + 设备IP + "],机号[" + 到文本 (机号) + "],数据包序号[" + 到文本 (数据包序号) + "],心跳包类型[" + 到文本 (接收到的字节集 [10]) + "]"
解析结果 = 解析结果 + ",长度[" + 到文本 (接收到的字节集 [11]) + "]"
解析结果 = 解析结果 + ",继电器状态[" + 到文本 (接收到的字节集 [12]) + "]"
解析结果 = 解析结果 + ",外部输入状态[" + 到文本 (接收到的字节集 [13]) + "]"
.计次循环首 (4, i)
随机动态码 = 随机动态码 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [13 + i]), 2)
.计次循环尾 ()
解析结果 = 解析结果 + ",随机动态码[" + 随机动态码 + "]"
i = 18
.判断循环首 (i ≤ 数据长度)
唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
i = i + 1
.判断循环尾 ()
解析结果 = 解析结果 + ",唯一设备序号[" + 唯一设备序号 + "]"
列表框_报文.加入项目 (解析结果, )
列表框_报文.加入项目 ("", )
.否则
.如果结束
.如果结束
.如果结束
.子程序 接收到刷卡数据回应
.参数 客户IP端口, 文本型
.参数 机号, 整数型
.如果 (选择框_回应.选中)
.如果 (单选框_蜂鸣.选中)
驱动设备蜂鸣响声 (客户IP端口, 机号)
.否则
.如果 (单选框_继电器.选中)
驱动设备开继电器 (客户IP端口, 机号)
.否则
.如果 (单选框_显示和蜂鸣.选中)
驱动设备显示和蜂鸣 (客户IP端口, 机号)
.否则
.如果 (单选框_显示蜂鸣语音.选中)
驱动设备显示文字播报语音 (客户IP端口, 机号)
.否则
.如果结束
.如果结束
.如果结束
.如果结束
.否则
.如果结束
.子程序 _按钮_驱动蜂鸣响声_被单击
.局部变量 客户IP端口, 文本型
客户IP端口 = 列表框_客户端.取项目文本 (列表框_客户端.现行选中项)
.如果 (客户IP端口 = "")
信息框 ("请在客户端列表中选择要发送指令的客户IP!", 0, "提示", )
.否则
驱动设备蜂鸣响声 (客户IP端口, 0) ' 0表示任意机号
.如果结束
.子程序 驱动设备蜂鸣响声
.参数 客户IP端口, 文本型
.参数 机号, 整数型
.局部变量 指令缓冲, 字节型, , "4"
指令缓冲 [1] = 十六进制 ("96") ' 驱动读卡器蜂鸣响声的指令码
指令缓冲 [2] = 机号 % 256 ' 读卡器机号低位
指令缓冲 [3] = 机号 \ 256 ' 读卡器机号高位
指令缓冲 [4] = 组合框_蜂鸣声.现行选中项 ' 蜂鸣器响声代码
TCP服务器.发送数据 (客户IP端口, 到字节集 (指令缓冲), )
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (客户IP端口 + " ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲)), )
列表框_报文.加入项目 ("发送数据说明:驱动设备蜂鸣响声。", )
列表框_报文.加入项目 ("", )
.子程序 驱动设备开继电器
.参数 客户IP端口, 文本型
.参数 机号, 整数型
.局部变量 指令缓冲, 字节型, , "6"
.局部变量 继电器延时, 整数型
指令缓冲 [1] = 十六进制 ("78") ' 驱动读卡器开启继电器的指令码
指令缓冲 [2] = 机号 % 256 ' 读卡器机号低位
指令缓冲 [3] = 机号 \ 256 ' 读卡器机号高位
.如果 (组合框_继电器.现行选中项 = 1)
指令缓冲 [4] = 十六进制 ("F1")
.否则
.如果 (组合框_继电器.现行选中项 = 2)
指令缓冲 [4] = 十六进制 ("F2")
.否则
.如果 (组合框_继电器.现行选中项 = 3)
指令缓冲 [4] = 十六进制 ("F3")
.否则
.如果 (组合框_继电器.现行选中项 = 4)
指令缓冲 [4] = 十六进制 ("F4")
.否则
.如果 (组合框_继电器.现行选中项 = 5)
指令缓冲 [4] = 十六进制 ("F5")
.否则
.如果 (组合框_继电器.现行选中项 = 6)
指令缓冲 [4] = 十六进制 ("F6")
.否则
.如果 (组合框_继电器.现行选中项 = 7)
指令缓冲 [4] = 十六进制 ("F7")
.否则
.如果 (组合框_继电器.现行选中项 = 8)
指令缓冲 [4] = 十六进制 ("F8")
.否则
.如果结束
指令缓冲 [4] = 十六进制 ("F0")
.如果结束
.如果结束
.如果结束
.如果结束
.如果结束
.如果结束
.如果结束
继电器延时 = 到整数 (编辑框_继电器.内容)
指令缓冲 [5] = 继电器延时 % 256
指令缓冲 [6] = 继电器延时 \ 256
TCP服务器.发送数据 (客户IP端口, 到字节集 (指令缓冲), )
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (客户IP端口 + " ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲)), )
列表框_报文.加入项目 ("发送数据说明:驱动设备开启继电器。", )
列表框_报文.加入项目 ("", )
.子程序 _按钮_开继电器_被单击
.局部变量 客户IP端口, 文本型
客户IP端口 = 列表框_客户端.取项目文本 (列表框_客户端.现行选中项)
.如果 (客户IP端口 = "")
信息框 ("请在客户端列表中选择要发送指令的客户IP!", 0, "提示", )
.否则
驱动设备开继电器 (客户IP端口, 0) ' 0表示任意机号
.如果结束
.子程序 驱动设备关继电器
.参数 客户IP端口, 文本型
.参数 机号, 整数型
.局部变量 指令缓冲, 字节型, , "6"
.局部变量 继电器延时, 整数型
指令缓冲 [1] = 十六进制 ("78") ' 驱动读卡器开启继电器的指令码
指令缓冲 [2] = 机号 % 256 ' 读卡器机号低位
指令缓冲 [3] = 机号 \ 256 ' 读卡器机号高位
.如果 (组合框_继电器.现行选中项 = 1)
指令缓冲 [4] = 十六进制 ("E1")
.否则
.如果 (组合框_继电器.现行选中项 = 2)
指令缓冲 [4] = 十六进制 ("E2")
.否则
.如果 (组合框_继电器.现行选中项 = 3)
指令缓冲 [4] = 十六进制 ("E3")
.否则
.如果 (组合框_继电器.现行选中项 = 4)
指令缓冲 [4] = 十六进制 ("E4")
.否则
.如果 (组合框_继电器.现行选中项 = 5)
指令缓冲 [4] = 十六进制 ("E5")
.否则
.如果 (组合框_继电器.现行选中项 = 6)
指令缓冲 [4] = 十六进制 ("E6")
.否则
.如果 (组合框_继电器.现行选中项 = 7)
指令缓冲 [4] = 十六进制 ("E7")
.否则
.如果 (组合框_继电器.现行选中项 = 8)
指令缓冲 [4] = 十六进制 ("E8")
.否则
.如果结束
指令缓冲 [4] = 十六进制 ("E0")
.如果结束
.如果结束
.如果结束
.如果结束
.如果结束
.如果结束
.如果结束
继电器延时 = 到整数 (编辑框_继电器.内容)
指令缓冲 [5] = 继电器延时 % 256
指令缓冲 [6] = 继电器延时 \ 256
TCP服务器.发送数据 (客户IP端口, 到字节集 (指令缓冲), )
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (客户IP端口 + " ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲)), )
列表框_报文.加入项目 ("发送数据说明:驱动设备关闭继电器。", )
列表框_报文.加入项目 ("", )
.子程序 驱动设备显示和蜂鸣
.参数 客户IP端口, 文本型
.参数 机号, 整数型
.局部变量 指令缓冲, 字节型, , "5"
.局部变量 显示字节集, 字节集
指令缓冲 [1] = 十六进制 ("5A") ' 驱动读卡器显示文字和蜂鸣响声指令码
指令缓冲 [2] = 机号 % 256 ' 读卡器机号低位
指令缓冲 [3] = 机号 \ 256 ' 读卡器机号高位
.如果 (选择框_响声.选中)
指令缓冲 [4] = 组合框_蜂鸣声.现行选中项 ' 蜂鸣器响声代码
.如果 (单选框_背光不变.选中)
指令缓冲 [4] = 位或 (指令缓冲 [4], 128)
.否则
.如果结束
.否则
指令缓冲 [4] = 十六进制 ("FF") ' 不蜂鸣响声
.如果 (单选框_背光不变.选中)
指令缓冲 [4] = 位或 (指令缓冲 [4], 127)
.否则
.如果结束
.如果结束
指令缓冲 [5] = 到字节 (编辑框_显示延时.内容) ' 显示延时,255表示永久显示
显示字节集 = 取字节集左边 (到字节集 (编辑框_显示文字.内容 + " "), 34) ' 后面加上空格并取34长度,表示本次满屏显示
TCP服务器.发送数据 (客户IP端口, 到字节集 (指令缓冲) + 显示字节集, )
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (客户IP端口 + " ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲) + 显示字节集), )
列表框_报文.加入项目 ("发送数据说明:驱动设备显示文字+蜂鸣响声。", )
列表框_报文.加入项目 ("", )
.子程序 _按钮_显示和蜂鸣_被单击
.局部变量 客户IP端口, 文本型
客户IP端口 = 列表框_客户端.取项目文本 (列表框_客户端.现行选中项)
.如果 (客户IP端口 = "")
信息框 ("请在客户端列表中选择要发送指令的客户IP!", 0, "提示", )
.否则
驱动设备显示和蜂鸣 (客户IP端口, 0) ' 0表示任意机号
.如果结束
.子程序 _按钮_关继电器_被单击
.局部变量 客户IP端口, 文本型
客户IP端口 = 列表框_客户端.取项目文本 (列表框_客户端.现行选中项)
.如果 (客户IP端口 = "")
信息框 ("请在客户端列表中选择要发送指令的客户IP!", 0, "提示", )
.否则
驱动设备关继电器 (客户IP端口, 0) ' 0表示任意机号
.如果结束
.子程序 _按钮_显示蜂鸣语音_被单击
.局部变量 客户IP端口, 文本型
客户IP端口 = 列表框_客户端.取项目文本 (列表框_客户端.现行选中项)
.如果 (客户IP端口 = "")
信息框 ("请在客户端列表中选择要发送指令的客户IP!", 0, "提示", )
.否则
驱动设备显示文字播报语音 (客户IP端口, 0) ' 0表示任意机号
.如果结束
.子程序 驱动设备显示文字播报语音
.参数 客户IP端口, 文本型
.参数 机号, 整数型
.局部变量 指令缓冲, 字节型, , "11"
.局部变量 显示字节集, 字节集
.局部变量 语音字节集, 字节集
.局部变量 后缀缓冲, 字节型, , "4"
.局部变量 继电器延时, 整数型
显示字节集 = 取字节集左边 (到字节集 (编辑框_显示文字.内容 + " "), 34) ' 后面加上空格并取34长度,表示本次满屏显示
语音字节集 = 到字节集 ("[v" + 删首尾空 (编辑框_音量.内容) + "]" + 删首尾空 (编辑框_TTS语音.内容))
指令缓冲 [1] = 十六进制 ("5C") ' 驱动读卡器显示文字播报TTS语音和蜂鸣响声指令码
指令缓冲 [2] = 机号 % 256 ' 读卡器机号低位
指令缓冲 [3] = 机号 \ 256 ' 读卡器机号高位
.如果 (选择框_响声.选中)
指令缓冲 [4] = 组合框_蜂鸣声.现行选中项 ' 蜂鸣器响声代码
.如果 (单选框_背光不变.选中)
指令缓冲 [4] = 位或 (指令缓冲 [4], 128)
.否则
.如果结束
.否则
指令缓冲 [4] = 十六进制 ("FF") ' 不蜂鸣响声
.如果 (单选框_背光不变.选中)
指令缓冲 [4] = 位或 (指令缓冲 [4], 127)
.否则
.如果结束
.如果结束
.如果 (组合框_继电器.现行选中项 = 1)
指令缓冲 [5] = 十六进制 ("F1")
.否则
.如果 (组合框_继电器.现行选中项 = 2)
指令缓冲 [5] = 十六进制 ("F2")
.否则
.如果 (组合框_继电器.现行选中项 = 3)
指令缓冲 [5] = 十六进制 ("F3")
.否则
.如果 (组合框_继电器.现行选中项 = 4)
指令缓冲 [5] = 十六进制 ("F4")
.否则
.如果 (组合框_继电器.现行选中项 = 5)
指令缓冲 [5] = 十六进制 ("F5")
.否则
.如果 (组合框_继电器.现行选中项 = 6)
指令缓冲 [5] = 十六进制 ("F6")
.否则
.如果 (组合框_继电器.现行选中项 = 7)
指令缓冲 [5] = 十六进制 ("F7")
.否则
.如果 (组合框_继电器.现行选中项 = 8)
指令缓冲 [5] = 十六进制 ("F8")
.否则
.如果结束
指令缓冲 [5] = 十六进制 ("F0")
.如果结束
.如果结束
.如果结束
.如果结束
.如果结束
.如果结束
.如果结束
继电器延时 = 到整数 (编辑框_继电器.内容)
指令缓冲 [6] = 继电器延时 % 256
指令缓冲 [7] = 继电器延时 \ 256
指令缓冲 [8] = 到字节 (编辑框_显示延时.内容) ' 显示保留时间,单位为秒,为255时表示永久显示
指令缓冲 [9] = 0 ' 在显示屏中的哪个位置开始显示
指令缓冲 [10] = 34 ' 显示字符串长度 0-34为全屏
指令缓冲 [11] = 取字节集长度 (语音字节集) ' 语音长度,最长可以126
后缀缓冲 [1] = 十六进制 ("55") ' 4字节固定的后缀
后缀缓冲 [2] = 十六进制 ("AA")
后缀缓冲 [3] = 十六进制 ("66")
后缀缓冲 [4] = 十六进制 ("99")
TCP服务器.发送数据 (客户IP端口, 到字节集 (指令缓冲) + 显示字节集 + 语音字节集 + 到字节集 (后缀缓冲), )
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (客户IP端口 + " ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲) + 显示字节集 + 语音字节集 + 到字节集 (后缀缓冲)), )
列表框_报文.加入项目 ("发送数据说明:驱动设备显示文字、播报语音、开启继电器、蜂鸣响声。", )
列表框_报文.加入项目 ("", )