1

我正在做一个更大的项目,其中一部分是为摩托罗拉 MC9596 扫描仪创建软件,但我坚持使用 FTP 服务器通过 GPRS 移动连接进行数据传输。

为此,我正在使用 OpenNETCF。

问题是我无法与我创建的条目拨号连接。这意味着设备的电话簿中有 2 个条目,test1 - 由设备生成,当我手动配置设备上的连接时,test2 是使用以下程序以编程方式创建的:

private const string CONNAME = "test2";
private const string PHONENR = "~GPRS!xxx.xxx-xxxxxxxx.eu";
private const string USER = "xx";
private const string PWD = "xx";
private const string DEVICE_TYPE = "modem";
private const string DEVICE_NAME = "Cellular Line";

private void createConnectionEntry()
{
    RasEntry rasEnt = new RasEntry()
    {
        Name = CONNAME,
        CountryCode = 0,
        AreaCode = "",
        PhoneNumber = PHONENR,
        DeviceName = DEVICE_NAME,
        DeviceType = DEVICE_TYPE,
        IPAddress = "0.0.0.0",
        IPAddressDns = "0.0.0.0"
    };

    /*rasEnt.Options |= (int)ConnectionOptions.UseCountryAndAreaCodes;
    rasEnt.Options |= (int)ConnectionOptions.UseLogonCredentials;*/
    rasEnt.Options = 4194304;

    RasDialParams dialParams = new RasDialParams()
    {
        UserName = USER,
        Password = PWD,
    };

    cEntry = Ras.CreateEntry(rasEnt, dialParams);
}

注意“rasEnt.Options = 4194304”,这是硬编码的,通过手动配置连接来获得设备生成的设置的精确副本。奇怪的是,如果我在调试模式下比较 2 个条目,两者都相等 - 这意味着所有属性都相等,唯一的区别是名称。我确信这一点,也使用反射来比较对象。

我拨打连接:

RasError re = cEntry.Dial(false, new RasDialParams(CONNAME, USER, PWD));

如果 Test1 我得到“成功”,如果 Test2 “未知”错误。

你能帮我解决这个讨厌的问题吗?

4

2 回答 2

1

现在我以手动添加必要的注册表项结束 - 只是在创建连接之前和之后检查了注册表的差异。不是一个干净的解决方案,但没有找到其他解决方案。它似乎工作稳定,我可以拨打这种方式创建的连接。我会看看,如果它在生产阶段还可以。

于 2013-02-11T18:34:34.427 回答
0

主要问题是通过代码拨号:当我尝试时,我遇到了其他问题。虽然上面来自 Hogo 的代码帮助很大,但有一些技巧对无忧编码有用:

首先,以下提示要求您手动拨号连接并通过在 Internet Explorer 上运行任何网站来测试您的 Internet。如果互联网正常工作,那么您最好通过代码拨号。

要手动执行:

使用“网络和拨号连接”建立一个名为“GPRS”的新连接(使用此链接:http ://www.e-consystems.com/gprs.asp )。如果您使用 airtel SIM 将波特率从 19200 更改为 115200。连接它并检查互联网是否正常工作。

通过代码拨号:

  1. 当您手动创建名为“GPRS”的连接时,GPRS 文件夹下会生成 3 个寄存器。(HKEY_CURRENT_USER\Comm\RasBook\GPRS) 。这些文件夹无法正常查看。需要在PDA中安装读取寄存器的应用程序。无需查看里面的内容,如果您这样做,则根据windows版本下载它们。

  2. 在创建的 3 个寄存器中,只有两个是相关的(DevCfg 和 Entry)。手动拨号并连接到 Internet 后,将数据从 DevCfg 和 Entry 寄存器复制到文本文件(DevCfg.txt 和 Entry.txt),以便以后可以复制回这些值。要将寄存器复制到/从寄存器复制到文本文件,请使用:RegQueryValueEx(...)、RegOpenKeyEx(..)、RegSetValueEx(...) 和其他相关函数(请参阅http://msdn.microsoft.com/en-us/库/windows/desktop/ms724911%28v=vs.85%29.aspx )

例如:读取寄存器并写入文本文件:

public static bool ReadRegString(IntPtr hKey, string lpszSubKey, string lpValueName)
    {
        try
        {
            string str = "";
            byte[] lpData = new byte[684];
            uint lpcbValue = 684;
            uint dwType = Utils.REG_BINARY;
            IntPtr phkResult = new IntPtr();
            Utils.RegOpenKeyEx(hKey, lpszSubKey, 0, 0, ref phkResult);
            if (phkResult != IntPtr.Zero)
            {
                int x = Utils.RegQueryValueEx(phkResult, lpValueName, 0, ref dwType, lpData, ref lpcbValue);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 684; i++)
                {
                    if (i != 683)
                        sb.Append(lpData[i].ToString() + "|");
                    else
                        sb.Append(lpData[i].ToString());
                }
                using (System.IO.StreamWriter outfile = new System.IO.StreamWriter(filePath))
                {
                    outfile.Write(sb.ToString());
                }
                Utils.RegCloseKey(phkResult);
        }
     }

if (Utils.ReadRegString(Utils.HKEY_CURRENT_USER, @"Comm\RasBook\GPRS", "DevCfg"))
        {
            textBoxSysVers.Text = "Succeeded Make Text File.";

        }
  1. 现在通过代码拨打我们使用RasEntry(添加必要的库;检查Hogo在Making GPRS Connection programmatically using C# for windows CE 5.0中的答案?

a) 创建 RasEntry 对象

b) 将创建的文本文件“Entry.txt 和 DevCfg.txt”中的数据分别复制到寄存器 Entry 和 DevCfg。

c) 拨号 RasError re = cEntry.Dial(...)

例如:

 private const string CONNAME = "GPRS";
    private const string PHONENR = "*99#";
    private const string USER = "xx";
    private const string PWD = "xx";
    private const string DEVICE_TYPE = "modem";
    private const string DEVICE_NAME = "Cellular Line";

 { RasEntry cEntry = new RasEntry()
    {
        Name = CONNAME,
        CountryCode = 91,
        AreaCode = "120",
        PhoneNumber = PHONENR,
        DeviceName = DEVICE_NAME,
        DeviceType = DEVICE_TYPE,
        IPAddress = "0.0.0.0",
        IPAddressDns = "0.0.0.0",Options=4194304
    };

        RasDialParams dialParams = new RasDialParams()
        {
            UserName = USER,
            Password = PWD,
            EntryName = CONNAME,
            Domain = " "
        }

        if (Utils.WriteRegValue(Utils.HKEY_CURRENT_USER, @"Comm\RasBook\GPRS", "DevCfg","Entry",3))
        {
            RasError re = cEntry.Dial(false, new RasDialParams(CONNAME, USER, PWD));

            RasError rs = re;
            textBoxInfo.Text = re.ToString() + " : Dial Status";
            if(rs.ToString()=="Success")
            textBoxInfo.Text = cEntry.Status.State.ToString() + " : Dial Status";
        }
  }

public static Boolean WriteRegValue(IntPtr hKey, string lpszSubKey, string lpValueName1, string lpValueName1,uint dwType)
    {
        int iOper = 1;
        filePath = @"`enter code here`\DevCfg.txt";
        IntPtr phkResult = new IntPtr();
        Utils.RegOpenKeyEx(hKey, lpszSubKey, 0, 0, ref phkResult);
        if (phkResult == IntPtr.Zero)
        {
            int iSecurity = 0;
            int dwDisp = 0;
            RegCreateKeyEx(hKey, lpszSubKey, 0, null, 0, 0, ref iSecurity, ref phkResult, ref dwDisp);
        }
        if (phkResult != IntPtr.Zero)
        {
            byte[] bytes = new byte[684];
            string[] text = new string[684];
            using (System.IO.StreamReader streamReader = new System.IO.StreamReader(filePath, Encoding.UTF8))
            {
                text = streamReader.ReadToEnd().Split('|');
            }
            for (int i = 0; i < 684; i++)
            {
                bytes[i] = Convert.ToByte(Convert.ToInt32(text[i]));
            }
            iOper = Utils.RegSetValueEx(phkResult, lpValueName1, 0, dwType, bytes, (uint)bytes.Length);
            Utils.RegCloseKey(phkResult);

} }

// 类似地从 lpValueName2 做

}}

hogo 的代码和 this 之间的区别在于 RasEntry 不是在这里创建的。它由寄存器提供。我在创建对象时遇到了困难,因此提出了建议。希望能帮助到你 :)

于 2014-07-22T11:40:56.930 回答