易语言数据报UDP通讯接收RFID网络读卡器获取卡号驱动设备播报TTS语音

本示例使用的设备:

https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.47b32c1bbjboAL&ft=t&id=22173284717

vbscript 复制代码
.版本 2
.支持库 iext

.程序集 窗口程序集_启动窗口

.子程序 _按钮_搜索在线设备_被单击
.局部变量 指令缓冲, 字节型, , "1"

超级列表框1.全部删除 ()
数据报.端口 = 到长整数 (编辑框_本地端口.内容)
指令缓冲 [1] = 十六进制 ("A6")
数据报.发送数据 (, 39169, 到字节集 (指令缓冲))  ' 广播式发送搜索在线设备的指令
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 ("255.255.255.255:39169                      ", 22) + "发送广播:A6", )


.子程序 _数据报_数据到达
.局部变量 接收到的字节集, 字节集
.局部变量 数据报文, 文本型
.局部变量 客户IP端口, 文本型

接收到的字节集 = 数据报.取回数据 ()
数据报文 = 字节集转十六进制文本 (接收到的字节集)
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (客户IP端口 + "                      ", 22) + "接收数据:" + 数据报文, )
列表框_报文.现行选中项 = 列表框_报文.取项目数 ()

解析处理接收数据 (接收到的字节集)



.子程序 解析处理接收数据
.参数 接收到的字节集, 字节集
.局部变量 数据长度, 整数型
.局部变量 设备IP, 文本型
.局部变量 机号, 文本型
.局部变量 唯一设备序号, 文本型
.局部变量 解析结果, 文本型
.局部变量 i, 整数型
.局部变量 掩码, 文本型
.局部变量 通讯端口, 文本型
.局部变量 网关, 文本型
.局部变量 网关MAC, 文本型
.局部变量 远程服务器IP, 文本型
.局部变量 服务器MAC, 文本型
.局部变量 网络标识, 文本型
.局部变量 参数标识, 文本型
.局部变量 设备MAC, 文本型
.局部变量 模块序号, 文本型
.局部变量 DN, 文本型
.局部变量 设备型号, 文本型
.局部变量 固件日期, 文本型
.局部变量 截取字节集, 字节集
.局部变量 数据包序号, 整数型
.局部变量 随机动态码, 文本型
.局部变量 卡号长度, 整数型
.局部变量 物理卡号, 文本型
.局部变量 十位卡号反码, 文本型
.局部变量 十位卡号正码, 文本型

数据长度 = 取字节集长度 (接收到的字节集)
.如果 (数据长度 > 10 且 接收到的字节集 [1] = 十六进制 ("F2"))  ' 接收到搜索在线设备的返回
    解析结果 = "接收数据解析:在线设备信息,设备IP["
    设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
    掩码 = 到文本 (接收到的字节集 [6]) + "." + 到文本 (接收到的字节集 [7]) + "." + 到文本 (接收到的字节集 [8]) + "." + 到文本 (接收到的字节集 [9])
    通讯端口 = 到文本 (接收到的字节集 [10] + 接收到的字节集 [11] × 256)
    机号 = 到文本 (接收到的字节集 [12] + 接收到的字节集 [13] × 256)
    网关 = 到文本 (接收到的字节集 [14]) + "." + 到文本 (接收到的字节集 [15]) + "." + 到文本 (接收到的字节集 [16]) + "." + 到文本 (接收到的字节集 [17])
    .计次循环首 (6, i)
        网关MAC = 网关MAC + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [17 + i]), 2)
        .如果 (i < 6)
            网关MAC = 网关MAC + "-"
        .否则

        .如果结束

    .计次循环尾 ()
    远程服务器IP = 到文本 (接收到的字节集 [24]) + "." + 到文本 (接收到的字节集 [25]) + "." + 到文本 (接收到的字节集 [26]) + "." + 到文本 (接收到的字节集 [27])
    .计次循环首 (6, i)
        服务器MAC = 服务器MAC + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [27 + i]), 2)
        .如果 (i < 6)
            服务器MAC = 服务器MAC + "-"
        .否则

        .如果结束

    .计次循环尾 ()
    网络标识 = 到文本 (接收到的字节集 [34])
    参数标识 = 到文本 (接收到的字节集 [35])
    ' 模块序号 = 到文本 (接收到的字节集 [36]) + "-" + 到文本 (接收到的字节集 [37]) + "-" + 到文本 (接收到的字节集 [38]) + "-" + 到文本 (接收到的字节集 [39])
    .计次循环首 (4, i)
        模块序号 = 模块序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [35 + i]), 2)
        .如果 (i < 4)
            模块序号 = 模块序号 + "-"
        .否则

        .如果结束

    .计次循环尾 ()
    .如果 (数据长度 > 39)
        .计次循环首 (6, i)
            设备MAC = 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [39 + i]), 2) + 设备MAC
            .如果 (i < 6)
                设备MAC = "-" + 设备MAC
            .否则

            .如果结束

        .计次循环尾 ()

        .计次循环首 (8, i)
            唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [39 + i]), 2)
            DN = 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [39 + i]), 2) + DN
        .计次循环尾 ()
    .否则

    .如果结束
    解析结果 = 解析结果 + 设备IP + "],掩码[" + 掩码 + "],通讯端口[" + 通讯端口 + "],机号[" + 机号 + "],网关[" + 网关 + "],网关MAC[" + 网关MAC + "],远程服务器IP[" + 远程服务器IP + "],服务器MAC["
    解析结果 = 解析结果 + 服务器MAC + "],网络标识[" + 网络标识 + "],参数标识C[" + 参数标识 + "],模块序号[" + 模块序号 + "],设备MAC[" + 设备MAC + "],唯一设备序号[" + 唯一设备序号 + "]"
    列表框_报文.加入项目 (解析结果, )
    列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
    列表框_报文.加入项目 ("", )
    更新超级列表框设备信息 (机号, 设备IP, 掩码, 通讯端口, 网关, 网关MAC, 远程服务器IP, 服务器MAC, 网络标识, 参数标识, 模块序号, 设备MAC, 唯一设备序号, DN)

.否则
    .如果 (数据长度 > 12 且 接收到的字节集 [1] = 十六进制 ("F6"))  ' 查询在线设备型号的返回
        解析结果 = "接收数据解析:在线设备型号版本,设备IP["
        设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
        机号 = 到文本 (接收到的字节集 [6] + 接收到的字节集 [7] × 256)
        截取字节集 = 取字节集中间 (接收到的字节集, 9, 接收到的字节集 [8])
        设备型号 = 到文本 (截取字节集)
        截取字节集 = 取字节集中间 (接收到的字节集, 9 + 接收到的字节集 [8] + 1, 接收到的字节集 [9 + 接收到的字节集 [8]])
        固件日期 = 到文本 (截取字节集)
        .计次循环首 (8, i)
            唯一设备序号 = 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [数据长度 - i + 1]), 2) + 唯一设备序号
        .计次循环尾 ()
        解析结果 = 解析结果 + 设备IP + "],机号[" + 机号 + "],设备型号[" + 设备型号 + "],固件日期C[" + 固件日期 + "],唯一设备序号[" + 唯一设备序号 + "]"
        列表框_报文.加入项目 (解析结果, )
        列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
        列表框_报文.加入项目 ("", )
        更新超级列表框设备型号版本 (设备IP, 唯一设备序号, 设备型号, 固件日期)

    .否则
        .如果 (数据长度 > 12 且 接收到的字节集 [1] = 十六进制 ("F3"))  ' 接收到心跳包
            设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
            机号 = 到文本 (接收到的字节集 [6] + 接收到的字节集 [7] × 256)
            数据包序号 = 接收到的字节集 [8] + 接收到的字节集 [9] × 256
            解析结果 = "接收数据解析:设备心跳数据包,设备IP[" + 设备IP + "],机号[" + 到文本 (机号) + "],数据包序号[" + 到文本 (数据包序号) + "],心跳包类型[" + 到文本 (接收到的字节集 [10]) + "]"
            解析结果 = 解析结果 + ",长度[" + 到文本 (接收到的字节集 [11]) + "]"
            解析结果 = 解析结果 + ",继电器状态[" + 到文本 (接收到的字节集 [12]) + "]"
            解析结果 = 解析结果 + ",外部输入状态[" + 到文本 (接收到的字节集 [13]) + "]"
            .计次循环首 (4, i)
                随机动态码 = 随机动态码 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [13 + i]), 2)
            .计次循环尾 ()
            解析结果 = 解析结果 + ",随机动态码[" + 随机动态码 + "]"
            i = 18
            .判断循环首 (i ≤ 数据长度)
                唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
                i = i + 1
            .判断循环尾 ()
            解析结果 = 解析结果 + ",唯一设备序号[" + 唯一设备序号 + "]"
            列表框_报文.加入项目 (解析结果, )
            列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
            列表框_报文.加入项目 ("", )
            接收到设备信息回应 (设备IP, 39169, 到整数 (机号))

        .否则
            .如果 (数据长度 > 10 且 接收到的字节集 [1] = 十六进制 ("C1"))  ' 接收到IC卡刷卡数据
                解析结果 = "接收数据解析:IC读卡器刷卡数据,设备IP["
                设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
                机号 = 到文本 (接收到的字节集 [6] + 接收到的字节集 [7] × 256)
                数据包序号 = 接收到的字节集 [8] + 接收到的字节集 [9] × 256
                .计次循环首 (4, i)
                    物理卡号 = 物理卡号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [10 + i]), 2)
                .计次循环尾 ()
                十位卡号反码 = 取文本右边 ("0000000000" + 到文本 (接收到的字节集 [11] + 接收到的字节集 [12] × 256 + 接收到的字节集 [13] × 求次方 (256, 2) + 接收到的字节集 [14] × 求次方 (256, 3)), 10)
                十位卡号正码 = 取文本右边 ("0000000000" + 到文本 (接收到的字节集 [11] × 求次方 (256, 3) + 接收到的字节集 [12] × 求次方 (256, 2) + 接收到的字节集 [13] × 256 + 接收到的字节集 [14]), 10)
                i = 10 + i
                .判断循环首 (i < 数据长度)
                    唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
                    i = i + 1
                .判断循环尾 ()
                唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)

                解析结果 = 解析结果 + 设备IP + "],机号[" + 到文本 (机号) + "],数据包序号[" + 到文本 (数据包序号) + "],物理卡号HEX[" + 物理卡号 + "],转10位正码[" + 十位卡号正码 + "],唯一设备序号[" + 唯一设备序号 + "]"
                列表框_报文.加入项目 (解析结果, )
                列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
                列表框_报文.加入项目 ("", )
                接收到设备信息回应 (设备IP, 39169, 到整数 (机号))

            .否则
                .如果 (数据长度 > 10 且 接收到的字节集 [1] = 十六进制 ("CF"))  ' 接收到IC卡离开的信息
                    解析结果 = "接收数据解析:IC卡离开感应区,设备IP["
                    设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
                    机号 = 到文本 (接收到的字节集 [6] + 接收到的字节集 [7] × 256)
                    数据包序号 = 接收到的字节集 [8] + 接收到的字节集 [9] × 256
                    .计次循环首 (4, i)
                        物理卡号 = 物理卡号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [11 + i]), 2)
                    .计次循环尾 ()
                    十位卡号反码 = 取文本右边 ("0000000000" + 到文本 (接收到的字节集 [12] + 接收到的字节集 [13] × 256 + 接收到的字节集 [14] × 求次方 (256, 2) + 接收到的字节集 [15] × 求次方 (256, 3)), 10)
                    十位卡号正码 = 取文本右边 ("0000000000" + 到文本 (接收到的字节集 [12] × 求次方 (256, 3) + 接收到的字节集 [13] × 求次方 (256, 2) + 接收到的字节集 [14] × 256 + 接收到的字节集 [15]), 10)
                    i = 11 + i
                    .判断循环首 (i < 数据长度)
                        唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
                        i = i + 1
                    .判断循环尾 ()
                    唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)

                    解析结果 = 解析结果 + 设备IP + "],机号[" + 到文本 (机号) + "],数据包序号[" + 到文本 (数据包序号) + "],物理卡号HEX[" + 物理卡号 + "],转10位正码[" + 十位卡号正码 + "],唯一设备序号[" + 唯一设备序号 + "]"
                    列表框_报文.加入项目 (解析结果, )
                    列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
                    列表框_报文.加入项目 ("", )
                    接收到设备信息回应 (设备IP, 39169, 到整数 (机号))

                .否则
                    .如果 (数据长度 > 10 且 接收到的字节集 [1] = 十六进制 ("D1"))  ' 接收到ID读卡器数据
                        解析结果 = "接收数据解析:ID读卡器刷卡数据,设备IP["
                        设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
                        机号 = 到文本 (接收到的字节集 [6] + 接收到的字节集 [7] × 256)
                        数据包序号 = 接收到的字节集 [8] + 接收到的字节集 [9] × 256
                        .计次循环首 (5, i)
                            物理卡号 = 物理卡号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [9 + i]), 2)
                        .计次循环尾 ()
                        十位卡号正码 = 取文本右边 ("0000000000" + 到文本 (接收到的字节集 [10] + 接收到的字节集 [11] × 256 + 接收到的字节集 [12] × 求次方 (256, 2) + 接收到的字节集 [13] × 求次方 (256, 3)), 10)
                        十位卡号反码 = 取文本右边 ("0000000000" + 到文本 (接收到的字节集 [10] × 求次方 (256, 3) + 接收到的字节集 [11] × 求次方 (256, 2) + 接收到的字节集 [12] × 256 + 接收到的字节集 [13]), 10)
                        i = 15
                        .判断循环首 (i < 数据长度)
                            唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
                            i = i + 1
                        .判断循环尾 ()
                        唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)

                        解析结果 = 解析结果 + 设备IP + "],机号[" + 到文本 (机号) + "],数据包序号[" + 到文本 (数据包序号) + "],物理卡号HEX[" + 物理卡号 + "],转10位正码[" + 十位卡号正码 + "],唯一设备序号[" + 唯一设备序号 + "]"
                        列表框_报文.加入项目 (解析结果, )
                        列表框_报文.加入项目 ("", )
                        接收到设备信息回应 (设备IP, 39169, 到整数 (机号))

                    .否则
                        .如果 (数据长度 > 10 且 接收到的字节集 [1] = 十六进制 ("DF"))  ' 接收到ID卡离开的数据
                            解析结果 = "接收数据解析:ID读卡器刷卡数据,设备IP["
                            设备IP = 到文本 (接收到的字节集 [2]) + "." + 到文本 (接收到的字节集 [3]) + "." + 到文本 (接收到的字节集 [4]) + "." + 到文本 (接收到的字节集 [5])
                            机号 = 到文本 (接收到的字节集 [6] + 接收到的字节集 [7] × 256)
                            数据包序号 = 接收到的字节集 [8] + 接收到的字节集 [9] × 256
                            .计次循环首 (5, i)
                                物理卡号 = 物理卡号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [11 + i]), 2)
                            .计次循环尾 ()
                            十位卡号正码 = 取文本右边 ("0000000000" + 到文本 (接收到的字节集 [12] + 接收到的字节集 [13] × 256 + 接收到的字节集 [14] × 求次方 (256, 2) + 接收到的字节集 [15] × 求次方 (256, 3)), 10)
                            十位卡号反码 = 取文本右边 ("0000000000" + 到文本 (接收到的字节集 [12] × 求次方 (256, 3) + 接收到的字节集 [13] × 求次方 (256, 2) + 接收到的字节集 [14] × 256 + 接收到的字节集 [15]), 10)
                            i = 17
                            .判断循环首 (i < 数据长度)
                                唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)
                                i = i + 1
                            .判断循环尾 ()
                            唯一设备序号 = 唯一设备序号 + 取文本右边 ("0" + 取十六进制文本 (接收到的字节集 [i]), 2)

                            解析结果 = 解析结果 + 设备IP + "],机号[" + 到文本 (机号) + "],数据包序号[" + 到文本 (数据包序号) + "],物理卡号HEX[" + 物理卡号 + "],转10位正码[" + 十位卡号正码 + "],唯一设备序号[" + 唯一设备序号 + "]"
                            列表框_报文.加入项目 (解析结果, )
                            列表框_报文.加入项目 ("", )
                            接收到设备信息回应 (设备IP, 39169, 到整数 (机号))

                        .否则

                        .如果结束

                    .如果结束

                .如果结束

            .如果结束

        .如果结束

    .如果结束

.如果结束



.子程序 十六进制转十进制, 整数型
.参数 十六进制, 文本型
.局部变量 i, 整数型
.局部变量 十进制, 整数型

.计次循环首 (取文本长度 (十六进制), i)
    十进制 = 十进制 × 16 + 寻找文本 ("0123456789ABCDEF", 取文本中间 (到大写 (十六进制), i, 1), , 假) - 1
.计次循环尾 ()
返回 (十进制)


.子程序 十进制转二进制, 文本型
.参数 十进制, 整数型
.局部变量 二进制, 文本型
.局部变量 余数, 整数型

.判断循环首 (十进制 > 1)
    余数 = 十进制 % 2
    十进制 = 十进制 \ 2
    二进制 = 到文本 (余数) + 二进制
.判断循环尾 ()

二进制 = 到文本 (十进制) + 二进制

.判断循环首 (取文本长度 (二进制) < 8)
    二进制 = "0" + 二进制
.判断循环尾 ()

返回 (二进制)


.子程序 更新超级列表框设备信息
.参数 机号, 文本型
.参数 设备IP, 文本型
.参数 掩码, 文本型
.参数 通讯端口, 文本型
.参数 网关, 文本型
.参数 网关MAC, 文本型
.参数 远程服务器IP, 文本型
.参数 服务器MAC, 文本型
.参数 网络标识, 文本型
.参数 参数标识, 文本型
.参数 模块序号, 文本型
.参数 设备MAC, 文本型
.参数 唯一设备序号, 文本型
.参数 DN, 文本型
.局部变量 index, 整数型
.局部变量 项目数, 整数型
.局部变量 i, 整数型
.局部变量 项目值, 文本型
.局部变量 是否存在, 逻辑型
.局部变量 指令缓冲, 字节型, , "1"

是否存在 = 假
项目数 = 超级列表框1.取表项数 ()
.如果 (项目数 > 0)
    .计次循环首 (项目数, i)
        .如果 (设备IP = 超级列表框1.取标题 (i - 1, 1) 且 唯一设备序号 = 超级列表框1.取标题 (i - 1, 12))
            是否存在 = 真
            超级列表框1.置标题 (i - 1, 0, 机号)
            超级列表框1.置标题 (i - 1, 2, 掩码)
            超级列表框1.置标题 (i - 1, 3, 通讯端口)
            超级列表框1.置标题 (i - 1, 4, 网关)
            超级列表框1.置标题 (i - 1, 5, 网关MAC)
            超级列表框1.置标题 (i - 1, 6, 远程服务器IP)
            超级列表框1.置标题 (i - 1, 7, 服务器MAC)
            超级列表框1.置标题 (i - 1, 8, 网络标识)
            超级列表框1.置标题 (i - 1, 9, 参数标识)
            超级列表框1.置标题 (i - 1, 10, 模块序号)
            超级列表框1.置标题 (i - 1, 11, 设备MAC)
            超级列表框1.置标题 (i - 1, 15, DN)
            返回 ()
        .否则

        .如果结束

    .计次循环尾 ()
.否则

.如果结束

.如果 (是否存在 = 假)
    index = 超级列表框1.插入表项 (, , , , , )
    超级列表框1.置标题 (index, 0, 机号)
    超级列表框1.置标题 (index, 1, 设备IP)
    超级列表框1.置标题 (index, 2, 掩码)
    超级列表框1.置标题 (index, 3, 通讯端口)
    超级列表框1.置标题 (index, 4, 网关)
    超级列表框1.置标题 (index, 5, 网关MAC)
    超级列表框1.置标题 (index, 6, 远程服务器IP)
    超级列表框1.置标题 (index, 7, 服务器MAC)
    超级列表框1.置标题 (index, 8, 网络标识)
    超级列表框1.置标题 (index, 9, 参数标识)
    超级列表框1.置标题 (index, 10, 模块序号)
    超级列表框1.置标题 (index, 11, 设备MAC)
    超级列表框1.置标题 (index, 12, 唯一设备序号)
    超级列表框1.置标题 (index, 15, DN)

    指令缓冲 [1] = 十六进制 ("A8")
    数据报.发送数据 (设备IP, 39169, 到字节集 (指令缓冲))  ' 广播式发送搜索在线设备的指令
    列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (设备IP + ":39169                      ", 22) + "发送指令:A8", )
.否则

.如果结束



.子程序 更新超级列表框设备型号版本
.参数 设备IP, 文本型
.参数 唯一设备序号, 文本型
.参数 设备型号, 文本型
.参数 固件日期, 文本型
.局部变量 i, 整数型


.计次循环首 (超级列表框1.取表项数 (), i)
    .如果 (设备IP = 超级列表框1.取标题 (i - 1, 1) 且 唯一设备序号 = 超级列表框1.取标题 (i - 1, 12))
        超级列表框1.置标题 (i - 1, 13, 设备型号)
        超级列表框1.置标题 (i - 1, 14, 固件日期)
        返回 ()
    .否则

    .如果结束

.计次循环尾 ()


.子程序 字节集转十六进制文本, 文本型
.参数 字节集, 字节集
.局部变量 i, 整数型
.局部变量 结果, 文本型
.局部变量 计次, 整数型

结果 = ""
计次 = 取字节集长度 (字节集)
.计次循环首 (计次, i)
    .如果 (字节集 [i] < 16)
        结果 = 结果 + "0" + 取十六进制文本 (字节集 [i]) + " "
    .否则
        结果 = 结果 + 取十六进制文本 (字节集 [i]) + " "
    .如果结束

.计次循环尾 ()
返回 (结果)


.子程序 取系统时间, 文本型
.局部变量 当前时间, 日期时间型
.局部变量 结果, 文本型

当前时间 = 取现行时间 ()
结果 = 取文本右边 ("0" + 到文本 (取小时 (当前时间)), 2) + ":" + 取文本右边 ("0" + 到文本 (取分钟 (当前时间)), 2) + ":" + 取文本右边 ("0" + 到文本 (取秒 (当前时间)), 2)
返回 (结果)


.子程序 __启动窗口_创建完毕



.子程序 _超级列表框1_被双击, 逻辑型
.参数 横向位置, 整数型
.参数 纵向位置, 整数型
.参数 功能键状态, 整数型
.局部变量 index, 整数型

index = 超级列表框1.现行选中项
.如果真 (index = -1)
    返回 ()
.如果真结束

编辑框_机号.内容 = 超级列表框1.取标题 (index, 0)
编辑框_IP.内容 = 超级列表框1.取标题 (index, 1)
编辑框_设备端口.内容 = 超级列表框1.取标题 (index, 3)
指定IP发送.选中 = 真
广播式发送.选中 = 假


.子程序 _按钮_驱动蜂鸣响声_被单击

.如果 (广播式发送.选中 = 真)
    驱动设备蜂鸣响声 ("", 39169, 0)
.否则
    驱动设备蜂鸣响声 (删全部空 (编辑框_IP.内容), 到整数 (编辑框_设备端口.内容), 到整数 (编辑框_机号.内容))
.如果结束


.子程序 驱动设备蜂鸣响声
.参数 远程IP, 文本型
.参数 远程端口, 整数型
.参数 机号, 整数型
.局部变量 指令缓冲, 字节型, , "4"

指令缓冲 [1] = 十六进制 ("96")  ' 驱动读卡器蜂鸣响声的指令码
指令缓冲 [2] = 机号 % 256  ' 读卡器机号低位
指令缓冲 [3] = 机号 \ 256  ' 读卡器机号高位
指令缓冲 [4] = 组合框_蜂鸣声.现行选中项  ' 蜂鸣器响声代码

数据报.发送数据 (远程IP, 远程端口, 到字节集 (指令缓冲))
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (远程IP + ":" + 到文本 (远程端口) + "              ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲)), )
列表框_报文.加入项目 ("发送数据说明:驱动设备蜂鸣响声。", )
列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
列表框_报文.加入项目 ("", )


.子程序 _按钮_开继电器_被单击

.如果 (广播式发送.选中 = 真)
    驱动设备开继电器 ("", 39169, 0)
.否则
    驱动设备开继电器 (删全部空 (编辑框_IP.内容), 到整数 (编辑框_设备端口.内容), 到整数 (编辑框_机号.内容))
.如果结束



.子程序 驱动设备开继电器
.参数 远程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

数据报.发送数据 (远程IP, 远程端口, 到字节集 (指令缓冲))
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (远程IP + ":" + 到文本 (远程端口) + "              ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲)), )
列表框_报文.加入项目 ("发送数据说明:驱动设备开启继电器。", )
列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
列表框_报文.加入项目 ("", )


.子程序 _按钮_关继电器_被单击

.如果 (广播式发送.选中 = 真)
    驱动设备关继电器 ("", 39169, 0)
.否则
    驱动设备关继电器 (删全部空 (编辑框_IP.内容), 到整数 (编辑框_设备端口.内容), 到整数 (编辑框_机号.内容))
.如果结束



.子程序 驱动设备关继电器
.参数 远程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

数据报.发送数据 (远程IP, 远程端口, 到字节集 (指令缓冲))
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (远程IP + ":" + 到文本 (远程端口) + "              ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲)), )
列表框_报文.加入项目 ("发送数据说明:驱动设备关闭继电器。", )
列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
列表框_报文.加入项目 ("", )



.子程序 _按钮_显示和蜂鸣_被单击

.如果 (广播式发送.选中 = 真)
    驱动设备显示和蜂鸣 ("", 39169, 0)
.否则
    驱动设备显示和蜂鸣 (删全部空 (编辑框_IP.内容), 到整数 (编辑框_设备端口.内容), 到整数 (编辑框_机号.内容))
.如果结束



.子程序 驱动设备显示和蜂鸣
.参数 远程IP, 文本型
.参数 远程端口, 整数型
.参数 机号, 整数型
.局部变量 指令缓冲, 字节型, , "5"
.局部变量 显示字节集, 字节集

指令缓冲 [1] = 十六进制 ("5A")  ' 驱动读卡器显示文字和蜂鸣响声指令码
指令缓冲 [2] = 机号 % 256  ' 读卡器机号低位
指令缓冲 [3] = 机号 \ 256  ' 读卡器机号高位

.如果 (选择框_响声.选中)
    指令缓冲 [4] = 组合框_蜂鸣声.现行选中项  ' 蜂鸣器响声代码
    .如果 (单选框_背光不变.选中)
        指令缓冲 [4] = 位或 (指令缓冲 [4], 128)
    .否则

    .如果结束

.否则
    指令缓冲 [4] = 十六进制 ("FF")  ' 不蜂鸣响声
    .如果 (单选框_背光不变.选中)
        指令缓冲 [4] = 位或 (指令缓冲 [4], 127)
    .否则

    .如果结束

.如果结束

指令缓冲 [5] = 到字节 (编辑框_显示延时.内容)  ' 显示延时,255表示永久显示

显示字节集 = 取字节集左边 (到字节集 (编辑框_显示文字.内容 + "                                  "), 34)  ' 后面加上空格并取34长度,表示本次满屏显示

数据报.发送数据 (远程IP, 远程端口, 到字节集 (指令缓冲) + 显示字节集)
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (远程IP + ":" + 到文本 (远程端口) + "              ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲) + 显示字节集), )
列表框_报文.加入项目 ("发送数据说明:驱动设备显示文字+蜂鸣响声。", )
列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
列表框_报文.加入项目 ("", )



.子程序 _按钮_显示蜂鸣语音_被单击

.如果 (广播式发送.选中 = 真)
    驱动设备显示文字播报语音 ("", 39169, 0)
.否则
    驱动设备显示文字播报语音 (删全部空 (编辑框_IP.内容), 到整数 (编辑框_设备端口.内容), 到整数 (编辑框_机号.内容))
.如果结束



.子程序 驱动设备显示文字播报语音
.参数 远程IP, 文本型
.参数 远程端口, 整数型
.参数 机号, 整数型
.局部变量 指令缓冲, 字节型, , "11"
.局部变量 显示字节集, 字节集
.局部变量 语音字节集, 字节集
.局部变量 后缀缓冲, 字节型, , "4"
.局部变量 继电器延时, 整数型

显示字节集 = 取字节集左边 (到字节集 (编辑框_显示文字.内容 + "                                  "), 34)  ' 后面加上空格并取34长度,表示本次满屏显示

语音字节集 = 到字节集 ("[v" + 删首尾空 (编辑框_音量.内容) + "]" + 删首尾空 (编辑框_TTS语音.内容))  ' [v10]表示的播报的语音量大小,最大取值16

指令缓冲 [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")
                        .如果结束

                    .如果结束

                .如果结束

            .如果结束

        .如果结束

    .如果结束

.如果结束

继电器延时 = 到整数 (编辑框_继电器.内容)  ' 继电器开启延时,取值65535 表示永久开启
指令缓冲 [6] = 继电器延时 % 256
指令缓冲 [7] = 继电器延时 \ 256

指令缓冲 [8] = 到字节 (编辑框_显示延时.内容)  ' 显示保留时间,单位为秒,为255时表示永久显示

指令缓冲 [9] = 0  ' 在显示屏中的哪个位置开始显示
指令缓冲 [10] = 34  ' 显示字符串长度 0-34为全屏
指令缓冲 [11] = 取字节集长度 (语音字节集)  ' 语音长度,最长可以126

后缀缓冲 [1] = 十六进制 ("55")  ' 4字节固定的后缀
后缀缓冲 [2] = 十六进制 ("AA")
后缀缓冲 [3] = 十六进制 ("66")
后缀缓冲 [4] = 十六进制 ("99")

数据报.发送数据 (远程IP, 远程端口, 到字节集 (指令缓冲) + 显示字节集 + 语音字节集 + 到字节集 (后缀缓冲))
列表框_报文.加入项目 (取系统时间 () + " " + 取文本左边 (远程IP + ":" + 到文本 (远程端口) + "              ", 22) + "发送数据:" + 字节集转十六进制文本 (到字节集 (指令缓冲) + 显示字节集 + 语音字节集 + 到字节集 (后缀缓冲)), )
列表框_报文.加入项目 ("发送数据说明:驱动设备显示文字、播报语音、开启继电器、蜂鸣响声。", )
列表框_报文.现行选中项 = 列表框_报文.取项目数 ()
列表框_报文.加入项目 ("", )


.子程序 _按钮1_被单击
.局部变量 index, 整数型

index = 超级列表框1.现行选中项
.如果 (index = -1)
    信息框 ("请在下栏在线设备列表中选择需要更改网络参数的设备!!", 0, "提示", )
.否则
    载入 (更改网络参数, , 真)

.如果结束



.子程序 接收到设备信息回应
.参数 远程IP, 文本型
.参数 远程端口, 整数型
.参数 机号, 整数型

.如果 (选择框_回应.选中)
    .如果 (单选框_蜂鸣.选中)
        驱动设备蜂鸣响声 (远程IP, 远程端口, 机号)
    .否则
        .如果 (单选框_继电器.选中)
            驱动设备开继电器 (远程IP, 远程端口, 机号)
        .否则
            .如果 (单选框_显示和蜂鸣.选中)
                驱动设备显示和蜂鸣 (远程IP, 远程端口, 机号)
            .否则
                .如果 (单选框_显示蜂鸣语音.选中)
                    驱动设备显示文字播报语音 (远程IP, 远程端口, 机号)
                .否则

                .如果结束

            .如果结束

        .如果结束

    .如果结束

.否则

.如果结束


.子程序 _按钮_拷贝报文_被单击
.局部变量 项目数, 整数型
.局部变量 拷贝信息, 文本型
.局部变量 i, 整数型

项目数 = 列表框_报文.取项目数 ()
.如果 (项目数 > 0)
    .计次循环首 (项目数, i)
        拷贝信息 = 拷贝信息 + 列表框_报文.取项目文本 (i - 1) + 字符 (13) + 字符 (10)
    .计次循环尾 ()
    置剪辑板文本 (拷贝信息)
    信息框 ("通讯报文已拷贝到剪辑板!!", 0, "提示", )

.否则

.如果结束


.子程序 _按钮_清空报文_被单击

列表框_报文.清空 ()
相关推荐
战族狼魂2 小时前
基于SpringBoot+Vue的基因调控网络推断系统
网络·vue.js·spring boot
bubiyoushang8882 小时前
OFDM系统信道估计MATLAB实现(LS、MMSE、DCT、LRMMSE方法)
开发语言·网络·matlab
lang201509282 小时前
Logback 过滤器深度指南:从“三值逻辑”到高性能拦截
java·网络·logback
嘿嘿潶黑黑2 小时前
Windows 下网络硬盘预览不可显示的问题解决
网络
网硕互联的小客服11 小时前
服务器防火墙是如何区分正常流量和攻击流量?
运维·服务器·网络
勇敢牛牛_13 小时前
【conreg-client】在Rust中使用向Feign一样的远程调用
网络·rust·feign
double2li13 小时前
linux/unix 段错误捕获【续】
linux·运维·服务器·网络·unix
qq_2602412313 小时前
将盾 CDN:网络网站安全防护体系与实践
网络·安全
dashizhi201513 小时前
禁止复制电脑文件、电脑机密数据禁止拷贝、禁止电脑文件复制到U盘和移动硬盘的方法
运维·网络·stm32·安全·电脑