从WinCE设备拨号RAS
本文关键字:RAS WinCE | 更新日期: 2023-09-27 17:58:02
我正在进行一个更大的项目,该项目的一部分是为摩托罗拉MC9596扫描仪创建软件,但我一直在使用FTP服务器通过GPRS移动连接进行数据传输。
为此,我使用OpenNETCF。
问题是我无法拨打我创建的条目的连接。这意味着设备的电话簿中有两个条目,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",这是硬编码的,通过手动配置连接,可以获得设备生成的设置的精确副本。奇怪的是,如果我在调试模式下比较两个条目,它们都相等——这意味着所有属性都相等,唯一的区别是名称。我确信这一点,也用反射来比较物体。
我拨号连接:
RasError re = cEntry.Dial(false, new RasDialParams(CONNAME, USER, PWD));
在Test1的情况下,我得到"成功",在Test2的情况下"未知"错误。
你能帮我解决那个棘手的问题吗?
现在,我手动添加了必要的注册表项,只是在创建连接之前和之后检查了注册表中的差异。不是一个干净的解决方案,但没有找到其他解决方案。它似乎工作稳定,我可以拨号连接创建这样。我会看看,在生产阶段是否可以。
主要问题是通过代码拨号:当我尝试时,我遇到了其他问题。尽管上面的代码来自Hogo,帮助很大,但很少有技巧对无障碍编码有用:
首先,以下提示要求您手动拨号连接,并通过在internet explorer上运行任何网站来测试您的internet。若互联网正常工作,那个么你们可以通过代码拨号
手动操作:
使用"网络和拨号连接"建立名为"GPRS"的新连接(使用此链接:http://www.e-consystems.com/gprs.asp)。如果您正在使用airtel SIM卡,请将波特率从19200更改为115200。连接并检查互联网是否正常工作。
拨号代码:
-
当您手动创建名为"GPRS"的连接时,GPRS文件夹下会进行3次注册。(HKEY_CURRENT_USER''Comm''RasBook''GPRS)。这些文件夹无法正常查看。要求在读取寄存器的PDA中安装应用程序。没有必要看到里面的东西,如果你看到了,然后根据windows版本下载它们。
-
在创建的3个寄存器中,只有两个是相关的(DevCfg和Entry)。一旦您手动拨号并连接到互联网,请将数据从DevCfg和Entry寄存器复制到文本文件(DevCfg.txt和Entry.txt)中,以便稍后可以复制回这些值。要将寄存器复制到/从寄存器复制到文本文件,请使用:RegQueryValueEx(…)、RegOpenKeyEx(..)、RegSetValueEx(.)和其他相关函数(请参阅http://msdn.microsoft.com/en-us/library/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.";
}
- 现在,为了拨号通过代码,我们使用RasEntry(添加必要的库;在使用C#for windows CE 5.0编程进行GPRS连接时检查Hogo的答案?)
a) 创建RasEntry对象
b) 从创建的文本文件"Entry.txt和DevCfg.txt"中复制数据分别注册Entry和DevCfg。
c) Dial RasError re=cEntry。拨号(…)
例如:
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的代码与此代码的区别在于RasEntry不是在这里创建的。它由寄存器提供。我在创建对象时遇到了困难,因此提出了这个建议。希望有帮助:)