int[] dataServerShortOption = new int[8]; //2017-09-08 12:43:53 8个选项 特殊用

        void getdeviceNetInfo()
        {
            int ret = 0;
            //创建短报文 pkt

            WGPacketShort pkt = new WGPacketShort();

            pkt.iDevSn = long.Parse(strSN); // controllerSN;
            //pkt.IP = strIP; // ControllerIP;

            //	读取接收服务器的IP和端口 **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x92;
            ret            = pkt.run(strPCAddr);
            if (ret == 1)
            {
                dataServerShortIP    = string.Format("{0}.{1}.{2}.{3}", pkt.recv[8], pkt.recv[9], pkt.recv[10], pkt.recv[11]);
                dataServerShortPort  = pkt.recv[12] + (pkt.recv[13] << 8);
                dataServerShortCycle = pkt.recv[14];
                for (int i = 0; i < 8; i++)
                {
                    dataServerShortOption[i] = pkt.recv[15 + i];
                }

                this.txtHostIP.Text                = dataServerShortIP;
                this.txtPortShort.Text             = dataServerShortPort.ToString();
                this.nudCycle.Value                = dataServerShortCycle;
                chkUploadInputStatusChange.Checked = (pkt.recv[17] > 0);  //2018-01-31 12:30:29 状态变化立即上传
            }
            if (ret == 1)
            {
                pkt.Reset();
                pkt.functionID = 0xF4;
                pkt.data[0]    = 0x55;
                pkt.data[1]    = 0xaa;
                pkt.data[2]    = 0xaa;
                pkt.data[3]    = 0x55;
                pkt.data[4]    = 0x92; pkt.data[5] = 0x00; pkt.data[6] = 0x00;
                ret            = pkt.run(strPCAddr);
            }
            if (ret == 1)
            {
                if (pkt.recv[14] == 0xA5)
                {
                    this.optDhcp.Checked = true;
                }
                else
                {
                    this.optSetIP.Checked = true;
                }
            }
            this.grpIP.Enabled = this.optSetIP.Checked; //2017-09-08 13:18:15
        }
        private void btnOpenDoor_Click(object sender, EventArgs e)    //2018-03-20 18:09:24 增加开门指令...
        {
            if (this.dgvFoundControllers.SelectedRows.Count <= 0)
            {
                return;
            }

            int             ret          = 0;
            int             success      = 0; //0 失败, 1表示成功
            DataGridViewRow dgvdr        = this.dgvFoundControllers.SelectedRows[0];
            string          controllerSN = dgvdr.Cells["f_ControllerSN"].Value.ToString();
            string          ControllerIP = dgvdr.Cells["f_IP"].Value.ToString();

            //创建短报文 pkt
            WGPacketShort pkt = new WGPacketShort();

            pkt.iDevSn = long.Parse(controllerSN);
            pkt.IP     = ControllerIP;

            //1.10	远程开门[功能号: 0x40] **********************************************************************************
            int doorNO = 1;

            pkt.Reset();
            pkt.functionID = 0x40;
            pkt.data[0]    = (byte)(doorNO & 0xff); //2013-11-03 20:56:33
            ret            = pkt.run();
            success        = 0;
            if (ret > 0)
            {
                if (pkt.recv[8] == 1)
                {
                    //有效开门.....
                    //
                    MessageBox.Show("远程开门	 成功...");
                    success = 1;
                }
            }

            //结束  **********************************************************************************
            pkt.close();    //关闭通信
        }
Example #3
0
        /// <summary>
        /// 基本功能测试
        /// </summary>
        /// <param name="ControllerIP">控制器IP地址</param>
        /// <param name="controllerSN"> 控制器序列号</param>
        /// <returns>小于或等于0 失败, 1表示成功</returns>
        int testBasicFunction(String ControllerIP, long controllerSN)
        {
            int ret     = 0;
            int success = 0;  //0 失败, 1表示成功


            //创建短报文 pkt
            WGPacketShort pkt = new WGPacketShort();

            pkt.iDevSn = controllerSN;
            pkt.IP     = ControllerIP;

            //1.4	查询控制器状态[功能号: 0x20](实时监控用) **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x20;
            ret            = pkt.run();

            success = 0;
            if (ret == 1)
            {
                //读取信息成功...
                success = 1;
                log("1.4 查询控制器状态 成功...");

                //	    最后一条记录的信息
                displayRecordInformation(pkt.recv); //2015-06-09 20:01:21

                //	其他信息
                int[] doorStatus = new int[4];
                //28	1号门门磁(0表示关上, 1表示打开)	1	0x00
                doorStatus[1 - 1] = pkt.recv[28];
                //29	2号门门磁(0表示关上, 1表示打开)	1	0x00
                doorStatus[2 - 1] = pkt.recv[29];
                //30	3号门门磁(0表示关上, 1表示打开)	1	0x00
                doorStatus[3 - 1] = pkt.recv[30];
                //31	4号门门磁(0表示关上, 1表示打开)	1	0x00
                doorStatus[4 - 1] = pkt.recv[31];

                int[] pbStatus = new int[4];
                //32	1号门按钮(0表示松开, 1表示按下)	1	0x00
                pbStatus[1 - 1] = pkt.recv[32];
                //33	2号门按钮(0表示松开, 1表示按下)	1	0x00
                pbStatus[2 - 1] = pkt.recv[33];
                //34	3号门按钮(0表示松开, 1表示按下)	1	0x00
                pbStatus[3 - 1] = pkt.recv[34];
                //35	4号门按钮(0表示松开, 1表示按下)	1	0x00
                pbStatus[4 - 1] = pkt.recv[35];

                //36	故障号
                //等于0 无故障
                //不等于0, 有故障(先重设时间, 如果还有问题, 则要返厂家维护)	1
                int errCode = pkt.recv[36];

                //37	控制器当前时间
                //时	1	0x21
                //38	分	1	0x30
                //39	秒	1	0x58

                //40-43	流水号	4
                long sequenceId = 0;
                sequenceId = byteToLong(pkt.recv, 40, 4);

                //48
                //特殊信息1(依据实际使用中返回)
                //键盘按键信息	1


                //49	继电器状态	1	 [0表示门上锁, 1表示门开锁. 正常门上锁时, 值为0000]
                int relayStatus = pkt.recv[49];
                if ((relayStatus & 0x1) > 0)
                {
                    //一号门 开锁
                }
                else
                {
                    //一号门 上锁
                }
                if ((relayStatus & 0x2) > 0)
                {
                    //二号门 开锁
                }
                else
                {
                    //二号门 上锁
                }
                if ((relayStatus & 0x4) > 0)
                {
                    //三号门 开锁
                }
                else
                {
                    //三号门 上锁
                }
                if ((relayStatus & 0x8) > 0)
                {
                    //四号门 开锁
                }
                else
                {
                    //四号门 上锁
                }

                //50	门磁状态的8-15bit位[火警/强制锁门]
                //Bit0  强制锁门
                //Bit1  火警
                int otherInputStatus = pkt.recv[50];
                if ((otherInputStatus & 0x1) > 0)
                {
                    //强制锁门
                }
                if ((otherInputStatus & 0x2) > 0)
                {
                    //火警
                }

                //51	V5.46版本支持 控制器当前年	1	0x13
                //52	V5.46版本支持 月	1	0x06
                //53	V5.46版本支持 日	1	0x22

                string controllerTime = "2000-01-01 00:00:00"; //控制器当前时间
                controllerTime = string.Format("{0:X2}{1:X2}-{2:X2}-{3:X2} {4:X2}:{5:X2}:{6:X2}",
                                               0x20, pkt.recv[51], pkt.recv[52], pkt.recv[53], pkt.recv[37], pkt.recv[38], pkt.recv[39]);
            }
            else
            {
                log("1.4 查询控制器状态 失败?????...");
                return(-1);
            }

            //1.5	读取日期时间(功能号: 0x32) **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x32;
            ret            = pkt.run();
            success        = 0;
            if (ret > 0)
            {
                string controllerTime = "2000-01-01 00:00:00"; //控制器当前时间
                controllerTime = string.Format("{0:X2}{1:X2}-{2:X2}-{3:X2} {4:X2}:{5:X2}:{6:X2}",
                                               pkt.recv[8], pkt.recv[9], pkt.recv[10], pkt.recv[11], pkt.recv[12], pkt.recv[13], pkt.recv[14]);

                log("1.5 读取日期时间 成功...");
                success = 1;
            }

            //1.6	设置日期时间[功能号: 0x30] **********************************************************************************
            //按电脑当前时间校准控制器.....
            pkt.Reset();
            pkt.functionID = 0x30;

            DateTime ptm = DateTime.Now;

            pkt.data[0] = (byte)GetHex((ptm.Year - ptm.Year % 100) / 100);
            pkt.data[1] = (byte)GetHex((int)((ptm.Year) % 100)); //st.GetMonth());
            pkt.data[2] = (byte)GetHex(ptm.Month);
            pkt.data[3] = (byte)GetHex(ptm.Day);
            pkt.data[4] = (byte)GetHex(ptm.Hour);
            pkt.data[5] = (byte)GetHex(ptm.Minute);
            pkt.data[6] = (byte)GetHex(ptm.Second);
            ret         = pkt.run();
            success     = 0;
            if (ret > 0)
            {
                Boolean bSame = true;
                for (int i = 0; i < 7; i++)
                {
                    if (pkt.data[i] != pkt.recv[8 + i])
                    {
                        bSame = false;
                        break;
                    }
                }
                if (bSame)
                {
                    log("1.6 设置日期时间 成功...");
                    success = 1;
                }
            }

            //1.7	获取指定索引号的记录[功能号: 0xB0] **********************************************************************************
            //(取索引号 0x00000001的记录)
            long recordIndexToGet = 0;

            pkt.Reset();
            pkt.functionID = 0xB0;
            pkt.iDevSn     = controllerSN;

            //	(特殊
            //如果=0, 则取回最早一条记录信息
            //如果=0xffffffff则取回最后一条记录的信息)
            //记录索引号正常情况下是顺序递增的, 最大可达0xffffff = 16,777,215 (超过1千万) . 由于存储空间有限, 控制器上只会保留最近的20万个记录. 当索引号超过20万后, 旧的索引号位的记录就会被覆盖, 所以这时查询这些索引号的记录, 返回的记录类型将是0xff, 表示不存在了.
            recordIndexToGet = 1;
            LongToBytes(ref pkt.data, 0, recordIndexToGet);

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                log("1.7 获取索引为1号记录的信息	 成功...");
                //	    索引为1号记录的信息
                displayRecordInformation(pkt.recv); //2015-06-09 20:01:21

                success = 1;
            }

            //. 发出报文 (取最早的一条记录 通过索引号 0x00000000) [此指令适合于 刷卡记录超过20万时环境下使用]
            pkt.Reset();
            pkt.functionID   = 0xB0;
            recordIndexToGet = 0;
            LongToBytes(ref pkt.data, 0, recordIndexToGet);

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                log("1.7 获取最早一条记录的信息	 成功...");
                //	    最早一条记录的信息
                displayRecordInformation(pkt.recv); //2015-06-09 20:01:21

                success = 1;
            }

            //发出报文 (取最新的一条记录 通过索引 0xffffffff)
            pkt.Reset();
            pkt.functionID   = 0xB0;
            recordIndexToGet = 0xffffffff;
            LongToBytes(ref pkt.data, 0, recordIndexToGet);
            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                log("1.7 获取最新一条记录的信息	 成功...");
                //	    最新一条记录的信息
                displayRecordInformation(pkt.recv); //2015-06-09 20:01:21
                success = 1;
            }

            ////1.8	设置已读取过的记录索引号[功能号: 0xB2] **********************************************************************************
            //pkt.Reset();
            //pkt.functionID = 0xB2;
            //// (设为已读取过的记录索引号为5)
            //int recordIndexGot = 0x5;
            //LongToBytes(ref pkt.data, 0, recordIndexGot);

            ////12	标识(防止误设置)	1	0x55 [固定]
            //LongToBytes(ref pkt.data, 4, WGPacketShort.SpecialFlag);

            //ret = pkt.run();
            //success = 0;
            //if (ret > 0)
            //{
            //    if (pkt.recv[8] == 1)
            //    {
            //        log("1.8 设置已读取过的记录索引号	 成功...");
            //        success = 1;
            //    }
            //}

            ////1.9	获取已读取过的记录索引号[功能号: 0xB4] **********************************************************************************
            //pkt.Reset();
            //pkt.functionID = 0xB4;
            //int recordIndexGotToRead = 0x0;
            //ret = pkt.run();
            //success = 0;
            //if (ret > 0)
            //{
            //    recordIndexGotToRead = (int)byteToLong(pkt.recv, 8, 4);
            //    log("1.9 获取已读取过的记录索引号	 成功...");
            //    success = 1;
            //}

            ////1.8	设置已读取过的记录索引号[功能号: 0xB2] **********************************************************************************
            ////恢复已提取过的记录, 为1.9的完整提取操作作准备-- 实际使用中, 在出现问题时才恢复, 正常不用恢复...
            //pkt.Reset();
            //pkt.functionID = 0xB2;
            //// (设为已读取过的记录索引号为5)
            //int recordIndexGot = 0x0;
            //LongToBytes(ref pkt.data, 0, recordIndexGot);
            ////12	标识(防止误设置)	1	0x55 [固定]
            //LongToBytes(ref pkt.data, 4, WGPacketShort.SpecialFlag);

            //ret = pkt.run();
            //success = 0;
            //if (ret > 0)
            //{
            //    if (pkt.recv[8] == 1)
            //    {
            //        log("1.8 设置已读取过的记录索引号	 成功...");
            //        success = 1;
            //    }
            //}


            //1.9	提取记录操作
            //1. 通过 0xB4指令 获取已读取过的记录索引号 recordIndex
            //2. 通过 0xB0指令 获取指定索引号的记录  从recordIndex + 1开始提取记录, 直到记录为空为止
            //3. 通过 0xB2指令 设置已读取过的记录索引号  设置的值为最后读取到的刷卡记录索引号
            //经过上面三个步骤, 整个提取记录的操作完成
            log("1.9 提取记录操作	 开始...");
            pkt.Reset();
            pkt.functionID = 0xB4;
            ret            = pkt.run();
            success        = 0;
            if (ret > 0)
            {
                long recordIndexGotToRead = 0x0;
                recordIndexGotToRead = (long)byteToLong(pkt.recv, 8, 4);
                pkt.Reset();
                pkt.functionID = 0xB0;
                pkt.iDevSn     = controllerSN;
                long recordIndexToGetStart = recordIndexGotToRead + 1;
                long recordIndexValidGet   = 0;
                int  cnt = 0;
                do
                {
                    if (bStopBasicFunction)
                    {
                        return(0);  //2015-06-10 09:08:14 停止
                    }
                    LongToBytes(ref pkt.data, 0, recordIndexToGetStart);
                    ret     = pkt.run();
                    success = 0;
                    if (ret > 0)
                    {
                        success = 1;

                        //12	记录类型
                        //0=无记录
                        //1=刷卡记录
                        //2=门磁,按钮, 设备启动, 远程开门记录
                        //3=报警记录	1
                        //0xFF=表示指定索引位的记录已被覆盖掉了.  请使用索引0, 取回最早一条记录的索引值
                        int recordType = pkt.recv[12];
                        if (recordType == 0)
                        {
                            break;              //没有更多记录
                        }
                        if (recordType == 0xff) //此索引号无效  重新设置索引值
                        {
                            //取最早一条记录的索引位
                            pkt.Reset();
                            pkt.functionID   = 0xB0;
                            recordIndexToGet = 0;
                            LongToBytes(ref pkt.data, 0, recordIndexToGet);

                            ret     = pkt.run();
                            success = 0;
                            if (ret > 0)
                            {
                                log("1.7 获取最早一条记录的信息	 成功...");
                                recordIndexGotToRead  = (int)byteToLong(pkt.recv, 8, 4);
                                recordIndexToGetStart = recordIndexGotToRead;
                                continue;
                            }
                            success = 0;
                            break;
                        }
                        recordIndexValidGet = recordIndexToGetStart;

                        displayRecordInformation(pkt.recv); //2015-06-09 20:01:21

                        //.......对收到的记录作存储处理
                        //*****
                        //###############
                    }
                    else
                    {
                        //提取失败
                        break;
                    }
                    recordIndexToGetStart++;
                } while (cnt++ < 200000);
                if (success > 0)
                {
                    //通过 0xB2指令 设置已读取过的记录索引号  设置的值为最后读取到的刷卡记录索引号
                    pkt.Reset();
                    pkt.functionID = 0xB2;
                    LongToBytes(ref pkt.data, 0, recordIndexValidGet);

                    //12	标识(防止误设置)	1	0x55 [固定]
                    LongToBytes(ref pkt.data, 4, WGPacketShort.SpecialFlag);

                    ret     = pkt.run();
                    success = 0;
                    if (ret > 0)
                    {
                        if (pkt.recv[8] == 1)
                        {
                            //完全提取成功....
                            log("1.9 完全提取成功	 成功...");
                            success = 1;
                        }
                    }
                }
            }

            //1.10	远程开门[功能号: 0x40] **********************************************************************************
            int doorNO = 1;

            pkt.Reset();
            pkt.functionID = 0x40;
            pkt.data[0]    = (byte)(doorNO & 0xff); //2013-11-03 20:56:33
            ret            = pkt.run();
            success        = 0;
            if (ret > 0)
            {
                if (pkt.recv[8] == 1)
                {
                    //有效开门.....
                    log("1.10 远程开门	 成功...");
                    success = 1;
                }
            }

            //1.11	权限添加或修改[功能号: 0x50] **********************************************************************************
            //增加卡号0D D7 37 00, 通过当前控制器的所有门
            pkt.Reset();
            pkt.functionID = 0x50;
            //0D D7 37 00 要添加或修改的权限中的卡号 = 0x0037D70D = 3659533 (十进制)
            long cardNOOfPrivilege = 0x0037D70D;

            LongToBytes(ref pkt.data, 0, cardNOOfPrivilege);

            //20 10 01 01 起始日期:  2010年01月01日   (必须大于2001年)
            pkt.data[4] = 0x20;
            pkt.data[5] = 0x10;
            pkt.data[6] = 0x01;
            pkt.data[7] = 0x01;
            //20 29 12 31 截止日期:  2029年12月31日
            pkt.data[8]  = 0x20;
            pkt.data[9]  = 0x29;
            pkt.data[10] = 0x12;
            pkt.data[11] = 0x31;
            //01 允许通过 一号门 [对单门, 双门, 四门控制器有效]
            pkt.data[12] = 0x01;
            //01 允许通过 二号门 [对双门, 四门控制器有效]
            pkt.data[13] = 0x01;  //如果禁止2号门, 则只要设为 0x00
            //01 允许通过 三号门 [对四门控制器有效]
            pkt.data[14] = 0x01;
            //01 允许通过 四号门 [对四门控制器有效]
            pkt.data[15] = 0x01;

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                if (pkt.recv[8] == 1)
                {
                    //这时 刷卡号为= 0x0037D70D = 3659533 (十进制)的卡, 1号门继电器动作.
                    log("1.11 权限添加或修改	 成功...");
                    success = 1;
                }
            }

            //1.12	权限删除(单个删除)[功能号: 0x52] **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x52;
            pkt.iDevSn     = controllerSN;
            //要删除的权限卡号0D D7 37 00  = 0x0037D70D = 3659533 (十进制)
            long cardNOOfPrivilegeToDelete = 0x0037D70D;

            LongToBytes(ref pkt.data, 0, cardNOOfPrivilegeToDelete);

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                if (pkt.recv[8] == 1)
                {
                    //这时 刷卡号为= 0x0037D70D = 3659533 (十进制)的卡, 1号门继电器不会动作.
                    log("1.12 权限删除(单个删除)	 成功...");
                    success = 1;
                }
            }

            //1.13	权限清空(全部清掉)[功能号: 0x54] **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x54;
            pkt.iDevSn     = controllerSN;
            LongToBytes(ref pkt.data, 0, WGPacketShort.SpecialFlag);

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                if (pkt.recv[8] == 1)
                {
                    //这时清空成功
                    log("1.13 权限清空(全部清掉)	 成功...");
                    success = 1;
                }
            }

            //1.14	权限总数读取[功能号: 0x58] **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x58;
            ret            = pkt.run();
            success        = 0;
            if (ret > 0)
            {
                int privilegeCount = 0;
                privilegeCount = (int)byteToLong(pkt.recv, 8, 4);
                log("1.14 权限总数读取	 成功...");

                success = 1;
            }


            //再次添加为查询操作 1.11	权限添加或修改[功能号: 0x50] **********************************************************************************
            //增加卡号0D D7 37 00, 通过当前控制器的所有门
            pkt.Reset();
            pkt.functionID = 0x50;
            //0D D7 37 00 要添加或修改的权限中的卡号 = 0x0037D70D = 3659533 (十进制)
            cardNOOfPrivilege = 0x0037D70D;
            LongToBytes(ref pkt.data, 0, cardNOOfPrivilege);
            //20 10 01 01 起始日期:  2010年01月01日   (必须大于2001年)
            pkt.data[4] = 0x20;
            pkt.data[5] = 0x10;
            pkt.data[6] = 0x01;
            pkt.data[7] = 0x01;
            //20 29 12 31 截止日期:  2029年12月31日
            pkt.data[8]  = 0x20;
            pkt.data[9]  = 0x29;
            pkt.data[10] = 0x12;
            pkt.data[11] = 0x31;
            //01 允许通过 一号门 [对单门, 双门, 四门控制器有效]
            pkt.data[12] = 0x01;
            //01 允许通过 二号门 [对双门, 四门控制器有效]
            pkt.data[13] = 0x01;  //如果禁止2号门, 则只要设为 0x00
            //01 允许通过 三号门 [对四门控制器有效]
            pkt.data[14] = 0x01;
            //01 允许通过 四号门 [对四门控制器有效]
            pkt.data[15] = 0x01;

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                if (pkt.recv[8] == 1)
                {
                    //这时 刷卡号为= 0x0037D70D = 3659533 (十进制)的卡, 1号门继电器动作.
                    log("1.11 权限添加或修改	 成功...");
                    success = 1;
                }
            }

            //1.15	权限查询[功能号: 0x5A] **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x5A;
            pkt.iDevSn     = controllerSN;
            // (查卡号为 0D D7 37 00的权限)
            long cardNOOfPrivilegeToQuery = 0x0037D70D;

            LongToBytes(ref pkt.data, 0, cardNOOfPrivilegeToQuery);

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                long cardNOOfPrivilegeToGet = 0;
                cardNOOfPrivilegeToGet = byteToLong(pkt.recv, 8, 4);
                if (cardNOOfPrivilegeToGet == 0)
                {
                    //没有权限时: (卡号部分为0)
                    log("1.15      没有权限信息: (卡号部分为0)");
                }
                else
                {
                    //具体权限信息...
                    log("1.15     有权限信息...");
                }
                log("1.15 权限查询	 成功...");
                success = 1;
            }

            //1.16  获取指定索引号的权限[功能号: 0x5C] **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x5C;
            pkt.iDevSn     = controllerSN;
            long QueryIndex = 1; //索引号(从1开始);

            LongToBytes(ref pkt.data, 0, QueryIndex);

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                long cardNOOfPrivilegeToGet = 0;
                cardNOOfPrivilegeToGet = byteToLong(pkt.recv, 8, 4);
                if (4294967295 == cardNOOfPrivilegeToGet) //FFFFFFFF对应于4294967295
                {
                    log("1.16      没有权限信息: (权限已删除)");
                }
                else if (cardNOOfPrivilegeToGet == 0)
                {
                    //没有权限时: (卡号部分为0)
                    log("1.16       没有权限信息: (卡号部分为0)--此索引号之后没有权限了");
                }
                else
                {
                    //具体权限信息...
                    log("1.16      有权限信息...");
                }
                log("1.16 获取指定索引号的权限	 成功...");
                success = 1;
            }


            //1.17	设置门控制参数(在线/延时) [功能号: 0x80] **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x80;
            //(设置2号门 在线  开门延时 3秒)
            pkt.data[0] = 0x02; //2号门
            pkt.data[1] = 0x03; //在线
            pkt.data[2] = 0x03; //开门延时

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                if (pkt.data[0] == pkt.recv[8] && pkt.data[1] == pkt.recv[9] && pkt.data[2] == pkt.recv[10])
                {
                    //成功时, 返回值与设置一致
                    log("1.17 设置门控制参数	 成功...");
                    success = 1;
                }
                else
                {
                    //失败
                }
            }

            //1.21	权限按从小到大顺序添加[功能号: 0x56] 适用于权限数过1000, 少于8万 **********************************************************************************
            //此功能实现 完全更新全部权限, 用户不用清空之前的权限. 只是将上传的权限顺序从第1个依次到最后一个上传完成. 如果中途中断的话, 仍以原权限为主
            //建议权限数更新超过50个, 即可使用此指令

            log("1.21	权限按从小到大顺序添加[功能号: 0x56]	开始...");
            log("       1万条权限...");

            //以10000个卡号为例, 此处简化的排序, 直接是以50001开始的10000个卡. 用户按照需要将要上传的卡号排序存放
            int cardCount = 10000;  //2015-06-09 20:20:20 卡总数量

            long[] cardArray = new long[cardCount];
            for (int i = 0; i < cardCount; i++)
            {
                cardArray[i] = 50001 + i;
            }

            for (int i = 0; i < cardCount; i++)
            {
                if (bStopBasicFunction)
                {
                    return(0);  //2015-06-10 09:08:14 停止
                }
                pkt.Reset();
                pkt.functionID = 0x56;

                cardNOOfPrivilege = cardArray[i];
                LongToBytes(ref pkt.data, 0, cardNOOfPrivilege);

                //其他参数简化时 统一, 可以依据每个卡的不同进行修改
                //20 10 01 01 起始日期:  2010年01月01日   (必须大于2001年)
                pkt.data[4] = 0x20;
                pkt.data[5] = 0x10;
                pkt.data[6] = 0x01;
                pkt.data[7] = 0x01;
                //20 29 12 31 截止日期:  2029年12月31日
                pkt.data[8]  = 0x20;
                pkt.data[9]  = 0x29;
                pkt.data[10] = 0x12;
                pkt.data[11] = 0x31;
                //01 允许通过 一号门 [对单门, 双门, 四门控制器有效]
                pkt.data[12] = 0x01;
                //01 允许通过 二号门 [对双门, 四门控制器有效]
                pkt.data[13] = 0x01;  //如果禁止2号门, 则只要设为 0x00
                //01 允许通过 三号门 [对四门控制器有效]
                pkt.data[14] = 0x01;
                //01 允许通过 四号门 [对四门控制器有效]
                pkt.data[15] = 0x01;

                LongToBytes(ref pkt.data, 32 - 8, cardCount); //总的权限数
                LongToBytes(ref pkt.data, 35 - 8, i + 1);     //当前权限的索引位(从1开始)

                ret     = pkt.run();
                success = 0;
                if (ret > 0)
                {
                    if (pkt.recv[8] == 1)
                    {
                        success = 1;
                    }
                    if (pkt.recv[8] == 0xE1)
                    {
                        log("1.21	权限按从小到大顺序添加[功能号: 0x56]	 =0xE1 表示卡号没有从小到大排序...???");
                        success = 0;
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            if (success == 1)
            {
                log("1.21	权限按从小到大顺序添加[功能号: 0x56]	 成功...");
            }
            else
            {
                log("1.21	权限按从小到大顺序添加[功能号: 0x56]	 失败...????");
            }


            //其他指令  **********************************************************************************


            // **********************************************************************************

            //结束  **********************************************************************************
            pkt.close();  //关闭通信
            return(success);
        }
Example #4
0
        /// <summary>
        /// 接收服务器设置测试
        /// </summary>
        /// <param name="ControllerIP">被设置的控制器IP地址</param>
        /// <param name="controllerSN">被设置的控制器序列号</param>
        /// <param name="watchServerIP">要设置的服务器IP</param>
        /// <param name="watchServerPort">要设置的端口</param>
        /// <returns>0 失败, 1表示成功</returns>
        int testWatchingServer(string ControllerIP, long controllerSN, string watchServerIP, int watchServerPort)  //接收服务器测试 -- 设置
        {
            int ret     = 0;
            int success = 0;  //0 失败, 1表示成功

            WGPacketShort pkt = new WGPacketShort();

            pkt.iDevSn = controllerSN;
            pkt.IP     = ControllerIP;

            //1.18	设置接收服务器的IP和端口 [功能号: 0x90] **********************************************************************************
            //(如果不想让控制器发出数据, 只要将接收服务器的IP设为0.0.0.0 就行了)
            //接收服务器的端口: 61005
            //每隔5秒发送一次: 05
            pkt.Reset();
            pkt.functionID = 0x90;
            string[] strIP = watchServerIP.Split('.');
            if (strIP.Length == 4)
            {
                pkt.data[0] = byte.Parse(strIP[0]);
                pkt.data[1] = byte.Parse(strIP[1]);
                pkt.data[2] = byte.Parse(strIP[2]);
                pkt.data[3] = byte.Parse(strIP[3]);
            }
            else
            {
                return(0);
            }

            //接收服务器的端口: 61005
            pkt.data[4] = (byte)((watchServerPort & 0xff));
            pkt.data[5] = (byte)((watchServerPort >> 8) & 0xff);

            //每隔5秒发送一次: 05 (定时上传信息的周期为5秒 [正常运行时每隔5秒发送一次  有刷卡时立即发送])
            pkt.data[6] = 5;

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                if (pkt.recv[8] == 1)
                {
                    log("1.18 设置接收服务器的IP和端口 	 成功...");
                    success = 1;
                }
            }


            //1.19	读取接收服务器的IP和端口 [功能号: 0x92] **********************************************************************************
            pkt.Reset();
            pkt.functionID = 0x92;

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                log("1.19 读取接收服务器的IP和端口 	 成功...");
                success = 1;
            }
            pkt.close();
            return(success);
        }
Example #5
0
        private void btnOK_Click(object sender, EventArgs e)
        {
            //新的值
            int itemp;

            if (this.txtf_ControllerSN.ReadOnly == false)
            {
                this.txtf_ControllerSN.Text = this.txtf_ControllerSN.Text.Trim();
                if (!int.TryParse(this.txtf_ControllerSN.Text, out itemp))
                {
                    MessageBox.Show("Controller SN  Wrong");
                    return;
                }
            }

            this.txtf_IP.Text = this.txtf_IP.Text.Replace(" ", ""); // '排除空格
            if (!isIPAddress(this.txtf_IP.Text))
            {
                MessageBox.Show("IP  Wrong");
                return;
            }

            this.txtf_mask.Text = this.txtf_mask.Text.Replace(" ", ""); // '排除空格
            if (!isIPAddress(this.txtf_mask.Text))
            {
                MessageBox.Show("mask  Wrong");
                return;
            }

            this.txtf_gateway.Text = this.txtf_gateway.Text.Replace(" ", ""); // '排除空格
            if (!string.IsNullOrEmpty(this.txtf_gateway.Text))
            {
                if (!isIPAddress(this.txtf_gateway.Text))
                {
                    MessageBox.Show("gateway  Wrong");
                    return;
                }
            }

            this.txtHostIP.Text = this.txtHostIP.Text.Replace(" ", ""); // '排除空格
            if (!string.IsNullOrEmpty(this.txtHostIP.Text))
            {
                if (!isIPAddress(this.txtHostIP.Text))
                {
                    MessageBox.Show("HostIP  Wrong");
                    return;
                }
            }

            strSN      = this.txtf_ControllerSN.Text;
            strMac     = this.txtf_MACAddr.Text;
            strIP      = this.txtf_IP.Text;
            strMask    = this.txtf_mask.Text;
            strGateway = this.txtf_gateway.Text;

            //修改IP
            int ret = 0;
            //创建短报文 pkt

            WGPacketShort pkt = new WGPacketShort();

            pkt.iDevSn = long.Parse(strSN); // controllerSN;
            //设置接收服务器
            if (this.chkEditDateServer.Checked)
            {
                pkt.Reset();
                pkt.functionID = 0x90;
                if (!string.IsNullOrEmpty(this.txtHostIP.Text))
                {
                    IPAddress adr = IPAddress.Parse(this.txtHostIP.Text);
                    Array.Copy(adr.GetAddressBytes(), 0, pkt.data, 0, 4);  //新的接收服务器IP
                }
                int port = int.Parse(this.txtPortShort.Text);
                pkt.data[4] = (byte)(port & 0xff);         //新的port
                pkt.data[5] = (byte)((port >> 8) & 0xff);

                pkt.data[6] = (byte)(this.nudCycle.Value); // 新的cycle
                ret         = pkt.run(strPCAddr);
                if (ret == 1)
                {
                    //修改OK
                }
                else
                {
                    MessageBox.Show("修改接收服务器失败...");
                    return;
                }
            }



            //修改IP
            pkt.Reset();
            pkt.functionID = 0x96;
            IPAddress adrA = IPAddress.Parse(this.txtf_IP.Text);

            Array.Copy(adrA.GetAddressBytes(), 0, pkt.data, 0, 4);  //新IP
            adrA = IPAddress.Parse(this.txtf_mask.Text);
            Array.Copy(adrA.GetAddressBytes(), 0, pkt.data, 4, 4);  //新掩码
            if (!string.IsNullOrEmpty(strGateway))
            {
                adrA = IPAddress.Parse(this.txtf_gateway.Text);
                Array.Copy(adrA.GetAddressBytes(), 0, pkt.data, 8, 4);  //新网关
            }
            if (this.optDhcp.Checked)
            {
                //选择动态获取IP DHCP 则IP设置为00
                pkt.data[0] = 0x0;
                pkt.data[1] = 0x0;
                pkt.data[2] = 0x0;
                pkt.data[3] = 0x0;
            }
            pkt.data[12] = 0x55;
            pkt.data[13] = 0xaa;
            pkt.data[14] = 0xaa;
            pkt.data[15] = 0x55;
            ret          = pkt.run(strPCAddr);
            //if (ret == 1)
            //{
            //    //修改OK
            //}
            //else
            //{
            //    MessageBox.Show("修改IP失败...");
            //    return;
            //}


            this.DialogResult = DialogResult.OK;
            this.Close();
        }
        private void btnOK_Click(object sender, EventArgs e)
        {
            //新的值
            int itemp;

            if (this.txtf_ControllerSN.ReadOnly == false)
            {
                this.txtf_ControllerSN.Text = this.txtf_ControllerSN.Text.Trim();
                if (!int.TryParse(this.txtf_ControllerSN.Text, out itemp))
                {
                    // MessageBox.Show("Controller SN  Wrong");
                    // MessageBox.Show("Controller 控制器 SN 不正确...");
                    MessageBox.Show(string.Format("Controller 控制器 SN: {0}  不正确", this.txtf_ControllerSN.Text));
                    return;
                }
            }

            if (optSetIP.Checked)
            {
                this.txtf_IP.Text = this.txtf_IP.Text.Replace(" ", ""); // '排除空格
                if (!isIPAddress(this.txtf_IP.Text))
                {
                    //               MessageBox.Show("IP  Wrong");
                    //MessageBox.Show("控制器IP地址 不正确...");
                    MessageBox.Show(string.Format("控制器IP地址: {0}  不正确", this.txtf_IP.Text));
                    return;
                }
                this.txtf_mask.Text = this.txtf_mask.Text.Replace(" ", ""); // '排除空格
                if (!isIPAddress(this.txtf_mask.Text))
                {
                    //MessageBox.Show("Subnet Mask 掩码  不正确");
                    MessageBox.Show(string.Format("Subnet Mask 掩码: {0}  不正确", this.txtf_mask.Text));
                    return;
                }

                this.txtf_gateway.Text = this.txtf_gateway.Text.Replace(" ", ""); // '排除空格
                if (!string.IsNullOrEmpty(this.txtf_gateway.Text))
                {
                    if (!isIPAddress(this.txtf_gateway.Text))
                    {
                        // MessageBox.Show("Gateway 网关  不正确");
                        MessageBox.Show(string.Format("Gateway 网关: {0}  不正确", this.txtf_gateway.Text));
                        return;
                    }
                }
            }

            if (this.chkEditDateServer.Checked)
            {
                this.txtHostIP.Text = this.txtHostIP.Text.Replace(" ", ""); // '排除空格
                if (!string.IsNullOrEmpty(this.txtHostIP.Text))
                {
                    if (!isIPAddress(this.txtHostIP.Text))
                    {
                        MessageBox.Show(string.Format("接收服务器IP: {0}  不正确", this.txtHostIP.Text));
                        return;
                    }
                }
            }

            strSN      = this.txtf_ControllerSN.Text;
            strMac     = this.txtf_MACAddr.Text;
            strIP      = this.txtf_IP.Text;
            strMask    = this.txtf_mask.Text;
            strGateway = this.txtf_gateway.Text;

            //修改IP
            int ret = 0;
            //创建短报文 pkt

            WGPacketShort pkt = new WGPacketShort();

            pkt.iDevSn = long.Parse(strSN); // controllerSN;
            //设置接收服务器
            if (this.chkEditDateServer.Checked)
            {
                pkt.Reset();
                pkt.functionID = 0x90;
                if (!string.IsNullOrEmpty(this.txtHostIP.Text))
                {
                    IPAddress adr = IPAddress.Parse(this.txtHostIP.Text);
                    Array.Copy(adr.GetAddressBytes(), 0, pkt.data, 0, 4);  //新的接收服务器IP
                }
                int port = int.Parse(this.txtPortShort.Text);
                pkt.data[4] = (byte)(port & 0xff);         //新的port
                pkt.data[5] = (byte)((port >> 8) & 0xff);

                pkt.data[6] = (byte)(this.nudCycle.Value);                        // 新的cycle

                pkt.data[9] = (byte)(chkUploadInputStatusChange.Checked ? 1 : 0); //2018-01-31 12:30:29 状态变化立即上传
                ret         = pkt.run(strPCAddr);
                if (ret == 1)
                {
                    //修改OK
                }
                else
                {
                    MessageBox.Show("修改接收服务器失败...");
                    return;
                }
            }



            //修改IP
            pkt.Reset();
            pkt.functionID = 0x96;
            IPAddress adrA = IPAddress.Parse(this.txtf_IP.Text);

            Array.Copy(adrA.GetAddressBytes(), 0, pkt.data, 0, 4);  //新IP
            adrA = IPAddress.Parse(this.txtf_mask.Text);
            Array.Copy(adrA.GetAddressBytes(), 0, pkt.data, 4, 4);  //新掩码
            if (!string.IsNullOrEmpty(strGateway))
            {
                adrA = IPAddress.Parse(this.txtf_gateway.Text);
                Array.Copy(adrA.GetAddressBytes(), 0, pkt.data, 8, 4);  //新网关
            }
            if (this.optDhcp.Checked)
            {
                //选择动态获取IP DHCP 则IP设置为00
                pkt.data[0] = 0x0;
                pkt.data[1] = 0x0;
                pkt.data[2] = 0x0;
                pkt.data[3] = 0x0;
            }
            pkt.data[12] = 0x55;
            pkt.data[13] = 0xaa;
            pkt.data[14] = 0xaa;
            pkt.data[15] = 0x55;
            ret          = pkt.run(strPCAddr);
            //修改IP会导致控制器设备重启, 所以不会有数据返回, ret的值不为1..
            //IP是否修改成功, 要搜索控制器再次确认


            this.DialogResult = DialogResult.OK;
            this.Close();
        }
        private void btnSendCommand_Click(object sender, EventArgs e)    //2018-04-20 15:28:04 发送指令
        {
            if (this.dgvFoundControllers.SelectedRows.Count <= 0)
            {
                return;
            }
            string strCommand = this.txt64Command.Text;

            byte[] bytArr = new byte[64];
            // strToByteArr(filedetail[1], ref arr, arr.Length);
            if (strCommand.Split(' ').Length == (64 - 1))
            {
                string[] str = strCommand.Split(' ');
                for (int i = 0; i < 64; i++)
                {
                    bytArr[i] = byte.Parse(str[i], System.Globalization.NumberStyles.AllowHexSpecifier);
                }
            }
            else
            {
                if (strCommand.Replace(" ", "").Length == (64 * 2))
                {
                    strToByteArr(strCommand.Replace(" ", ""), ref bytArr, bytArr.Length);
                }
                else
                {
                    MessageBox.Show("输入的指令无效");
                    return;
                }
            }
            int             ret          = 0;
            int             success      = 0; //0 失败, 1表示成功
            DataGridViewRow dgvdr        = this.dgvFoundControllers.SelectedRows[0];
            string          controllerSN = dgvdr.Cells["f_ControllerSN"].Value.ToString();
            string          ControllerIP = dgvdr.Cells["f_IP"].Value.ToString();

            //创建短报文 pkt
            WGPacketShort pkt = new WGPacketShort();

            pkt.iDevSn = long.Parse(controllerSN);
            pkt.IP     = ControllerIP;

            // **********************************************************************************
            int doorNO = 1;

            pkt.Reset();
            pkt.functionID = bytArr[1];
            pkt.data[0]    = (byte)(doorNO & 0xff); //2013-11-03 20:56:33
            for (int i = 0; i < 56; i++)
            {
                pkt.data[i] = bytArr[8 + i];
            }
            this.txt64CommandSent.Text = System.BitConverter.ToString(pkt.getCommandByte()).Replace("-", " ");
            this.txtInfo.AppendText(DateTime.Now.ToString("HH:mm:ss") + " " + "指令发出" + "\r\n");    //2014-03-23 12:15:15开始时间

            ret     = pkt.run();
            success = 0;
            if (ret > 0)
            {
                //if (pkt.recv[8] == 1)
                //{
                //    //有效开门.....
                //    //
                //    MessageBox.Show("远程开门	 成功...");
                //    success = 1;
                //}
                this.txt64CommandRecved.Text = System.BitConverter.ToString(pkt.recv).Replace("-", " ");
                this.txtInfo.AppendText(DateTime.Now.ToString("HH:mm:ss") + " " + "通信成功" + "\r\n");   //2014-03-23 12:15:15开始时间
            }
            else
            {
                this.txt64CommandRecved.Text = "通信失败???";
                this.txtInfo.AppendText(DateTime.Now.ToString("HH:mm:ss") + " " + "通信失败???" + "\r\n");   //2014-03-23 12:15:15开始时间
            }
            //结束  **********************************************************************************
            pkt.close();    //关闭通信
        }