从WinCE设备拨打RAS

时间:2013-02-07 10:04:08

标签: c# windows-ce gprs ras

我正在开发一个更大的项目,其中一部分是为摩托罗拉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个条目,两者都相等 - 这意味着所有属性都相等,唯一的区别是Name。我确信这个,也用反射来比较对象。

我拨打连接:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

主要问题是拨打代码:我正在尝试面对其他问题。虽然上面代码来自Hogo,但帮助很多,但是很少有提示可以用于无忧编码:

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

手动执行:

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

通过代码拨号:

  1. 当您创建名为" GPRS"的连接时手动,在GPRS文件夹下制作3个寄存器。 (HKEY_CURRENT_USER \ Comm \ RasBook \ GPRS)。这些文件夹无法正常查看。需要将应用程序安装在读取寄存器的PDA中。如果你这样做,则无需查看内部版本。

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

  3. 例如: 读取注册和写入文本文件:

    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(添加必要的库;在Making GPRS Connection programmatically using C# for windows CE 5.0?查看Hogo的答案)
    2. a)创建RasEntry对象

      b)从创建的文本文件中复制数据&#34; Entry.txt和DevCfg.txt&#34;  分别注册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);
      

      }             }

      // SImilary来自lpValueName2

      }}

      hogo的代码和这之间的区别在于RasEntry没有在这里创建。它来自寄存器。我在创建对象时遇到了困难,因此提出了建议。希望它有所帮助:)