Набор номера RAS с устройства WinCE
Я работаю над большим проектом, частью которого является создание программного обеспечения для сканера Motorola MC9596, но я застрял с передачей данных через мобильное соединение GPRS с использованием FTP-сервера.
Для этого я использую 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 "неизвестная" ошибка.
Не могли бы вы помочь мне с этой неприятной проблемой?
2 ответа
На данный момент я закончил с добавлением необходимых записей реестра вручную - просто проверил разницу в реестре до и после создания соединения. Не чистое решение, но другого не нашел. Вроде работает стабильно, могу набрать соединение созданное таким образом. Я посмотрю, все ли в порядке в продуктивной фазе.
Основная проблема заключается в наборе кода: во время попытки я столкнулся с другими проблемами. Хотя приведенный выше код от Hogo, очень помог, но есть несколько советов, которые были бы полезны для беспроблемного кодирования:
Прежде всего, следующие советы требуют, чтобы вы набрали ваше соединение вручную и проверили ваш интернет, запустив любой веб-сайт в вашем Internet Explorer. Если интернет работает, вы можете набрать его через код.
Чтобы сделать это вручную:
Создайте новое соединение с именем "GPRS", используя "Сеть и удаленные подключения"(используйте эту ссылку: http://www.e-consystems.com/gprs.asp). Если вы используете airtel SIM, измените скорость передачи данных с 19200 на 115200. Подключите ее и проверьте, работает ли интернет.
Набор номера через код:
Когда вы создаете соединение с именем "GPRS" вручную, в папке GPRS создаются 3 регистра. (HKEY_CURRENT_USER\Comm\RasBook\GPRS) . эти папки не могут быть просмотрены нормально. Требуется, чтобы на КПК было установлено приложение, которое считывает регистры. Нет необходимости видеть, что находится внутри, если вы это сделаете, загрузите их в соответствии с версиями 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(добавьте необходимые библиотеки; проверьте ответ Hogo в разделе " Создание GPRS-соединения программно с использованием C# для Windows CE 5.0?")
а) создать объект RasEntry
б) Скопировать данные из текстового файла, созданного "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);
}}
// SImilary сделать это из lpValueName2
}}
Разница между кодом hogo и этим заключается в том, что RasEntry здесь не создается. Он подается из регистров. Я столкнулся с трудностями при создании объекта и, следовательно, с предложением. Надеюсь, поможет:)