Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2014, 23:11   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию Нужно программно включить/отключить usb-модем и считать данные об уровне сигнала.

Всем привет! Использую SetupAPI. Завтра напишу код, который якобы должен это делать, а пока расклад такой. Использую
Код:
HDEVINFO dev_info = SetupDiGetClassDev(&GUID_DEVCLASS_NET, TEXT("USB"), NULL, DIGCF_PRESENT);
цикл
{
    SetupDiEnumDeviceInfo(dev_info, <индекс>, &<информация об устройстве>);
    и две функции, названия которых не помню (что-то вроде SetupDi...ClassInstaller, SetupDi...Install)
}
Беда в том, что последняя функция постоянно возвращает FALSE (код ошибки: 2 (не может открыть файл - по msdn) и изменение состояния в силу не вступает. А как считать данные о сигнале я и понятия не имею, ведь эти модемы не создают виртуальных ком портов! От куда тянуть эти данные (если можно, то пример кода) и правильно ли я подхожу к решению задачи, использую SetupAPI (если можно дайте посмотреть на рабочий код)?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 26.05.2014, 23:53   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
А как считать данные о сигнале я и понятия не имею
'AT+CSQ' + #13 + #10

Цитата:
ведь эти модемы не создают виртуальных ком портов
тогда беда. А какие эти? Даже хуавеи 3g последней китайской выделки и то имеют такую возможность.

Решение:
1- искать API производителя
2- взять нормальный (промышленный терминал) модем, именно модем с RS-232 или UART
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 27.05.2014, 00:14   #3
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
'AT+CSQ' + #13 + #10

тогда беда. А какие эти? Даже хуавеи 3g последней китайской выделки и то имеют такую возможность.

Решение:
1- искать API производителя
2- взять нормальный (промышленный терминал) модем, именно модем с RS-232 или UART
raxp, здравствуйте. Модемы Huawei E303 HiLink и какой-то LTE от ZTE.
Вопрос: что делать с этим?
Цитата:
'AT+CSQ' + #13 + #10
1. Даже если я найду API производителя, то смогу написать программу только для этих моделей и не будет никакой автоматизации. А писать под всех производителей - дело неблагодарное. Тем более ПО свободное, а времени у меня мало.
2. Уже нельзя. Деньги потрачены и со мной не советовались.
Еще какие-нибудь варианты есть?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 27.05.2014, 07:41   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
что делать с этим?
это AT-команда, в ответ на которую нормальные модемы с последовательным портом отвечают за уровень сигнала.

Цитата:
1. Даже если я найду API производителя, то смогу написать программу только для этих моделей и не будет никакой автоматизации.
а вы думали все модемы одинаковые? Вот на это и существует AT стандарт.

Цитата:
А писать под всех производителей - дело неблагодарное.
а не надо под всех, есть стандарт. Другой вопрос, что не все производители придерживаются стандарта.

Цитата:
Тем более ПО свободное, а времени у меня мало.
это карма свободного ПО.

Цитата:
2. Уже нельзя. Деньги потрачены и со мной не советовались.
Еще какие-нибудь варианты есть?
да, купить нормальные терминалы. Тем, кем это задумывалось должно и расхлебываться. С вами ведь не советовались при покупке. Я бы не стал взаимодействовать с таким заказчиком, если он не приемлет аргументы.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 27.05.2014, 09:06   #5
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Вот что у меня получилось. SetupDiCallClassInstaller постоянно возвращает FALSE. Может я чего-то не знаю? msdn говорит, что необходимо обладать правами администратора для того, чтобы выполнить эту функцию. Пытаюсь программу запустить без отладки с правами - тоже самое (устройство не отключается). Перелопатил исходники devcon. Вроде как все по фен-шую у меня, но опять-таки не работает. Беда в том, что я понимаю, что я делаю, но не понимаю почему не работает. Дескриптор получаю, информацию получаю. Флаги поставлены везде на смену состояния... Даже не знаю уже.
Код:
#include "stdafx.h"

#include <iostream>
#include <Windows.h>
#include <SetupAPI.h>
#include <cfgmgr32.h>
#include <devguid.h>
 
#include <windowsx.h>
#include <winioctl.h>
#include <setupapi.h>
#include <shellapi.h>
#include <shlwapi.h>
#include <objbase.h>
#include <initguid.h>

using namespace std;

void _enum_net_handle();
bool _change_state(HDEVINFO hdev_info, PSP_DEVINFO_DATA psp_devinfo_data);
bool _change_dev_state(HDEVINFO hdev_info, PSP_DEVINFO_DATA psp_devinfo_data, DWORD scope);

int _tmain(int argc, _TCHAR* argv[])
{
	_enum_net_handle();

	cin.get();

	return 0;
}

void _enum_net_handle()
{
	HDEVINFO hdev_info = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, TEXT("USB"), NULL, DIGCF_PRESENT);

	if (hdev_info != INVALID_HANDLE_VALUE)
	{
		SP_DEVINFO_DATA sp_devinfo_data;
		sp_devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA);

		for (int index = 0; SetupDiEnumDeviceInfo(hdev_info, index, &sp_devinfo_data); index++)
		{
			_change_state(hdev_info, &sp_devinfo_data);
		}
	}
}

bool _change_state(HDEVINFO hdev_info, PSP_DEVINFO_DATA psp_devinfo_data)
{

	if (_change_dev_state(hdev_info, psp_devinfo_data, DICS_FLAG_GLOBAL))
	{
		return true;
	}
	else
	{
		return _change_dev_state(hdev_info, psp_devinfo_data, DICS_FLAG_CONFIGSPECIFIC);
	}
}

bool _change_dev_state(HDEVINFO hdev_info, PSP_DEVINFO_DATA psp_devinfo_data, DWORD scope)
{
	SP_PROPCHANGE_PARAMS sp_propchange_params;
	sp_propchange_params.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
	sp_propchange_params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
	sp_propchange_params.StateChange = DICS_DISABLE;
	sp_propchange_params.Scope = scope;
	sp_propchange_params.HwProfile = NULL;

	bool result = SetupDiSetClassInstallParams(hdev_info, psp_devinfo_data, &sp_propchange_params.ClassInstallHeader, sizeof(sp_propchange_params));

	if (result)
	{
		result = SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hdev_info, psp_devinfo_data);
	}

	return result;
}
Цитата:
да, купить нормальные терминалы. Тем, кем это задумывалось должно и расхлебываться. С вами ведь не советовались при покупке. Я бы не стал взаимодействовать с таким заказчиком, если он не приемлет аргументы.
заказчики = мои постоянные работодатели. Программа нужна для демонстрации алгоритма. Мне без нее никак на работе...
Цитата:
это AT-команда, в ответ на которую нормальные модемы с последовательным портом отвечают за уровень сигнала.
Это я понимаю. Не понимаю, куда мне ее отправлять, если ком-портов нет и какие функции c++ для этого использовать.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 27.05.2014, 11:46   #6
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Нашел у себя в коде ошибки и переделал вот так. Но ничего не поменялось. Оборудование не отключается. Подскажите, где я ошибся. Код Ошибки GetLasError = Error 2; по msdn не понял что мне надо сделать, чтобы ее устранить.
Код:
#include "stdafx.h"

#include <iostream>
#include <Windows.h>
#include <SetupAPI.h>
#include <cfgmgr32.h>
#include <devguid.h>
 
#include <windowsx.h>
#include <winioctl.h>
#include <setupapi.h>
#include <shellapi.h>
#include <shlwapi.h>
#include <objbase.h>
#include <initguid.h>

#define MAX_DEVICE_INSTALL_STATE_LEN 200

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	GUID* guid = (GUID*)&GUID_DEVCLASS_NET;

	HDEVINFO hDevInfo = SetupDiGetClassDevs(guid, TEXT("USB"), NULL, DIGCF_PRESENT);

	if (hDevInfo != INVALID_HANDLE_VALUE)
	{
		SP_DEVINFO_DATA spDevInfoData;
		spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

		for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
		{
			WCHAR classDescription[MAX_DEVICE_INSTALL_STATE_LEN];

			SP_PROPCHANGE_PARAMS spPropChangeParams;
			spPropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);

			if (SetupDiSetClassInstallParams(hDevInfo, &spDevInfoData, &spPropChangeParams.ClassInstallHeader, sizeof(SP_PROPCHANGE_PARAMS)))
			{
				spPropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
				spPropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
				spPropChangeParams.StateChange = DICS_FLAG_CONFIGSPECIFIC;
				spPropChangeParams.HwProfile = NULL;
				spPropChangeParams.Scope = DICS_DISABLE;
				
				if (SetupDiSetClassInstallParams(hDevInfo, &spDevInfoData, &spPropChangeParams.ClassInstallHeader, sizeof(SP_PROPCHANGE_PARAMS)));
				{
					if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &spDevInfoData))						
					{	
						cin.get();
						return 0;
					}
				}
			}
		}
	}
	return 0;
}
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 27.05.2014 в 15:53.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 28.05.2014, 17:48   #7
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Код в последнем сообщении рабочий. Устройство выключается с его помощью. Надо было просто компилятор 64 битный использовать. НО УСТРОЙСТВО НЕ ВКЛЮЧАЕТСЯ!!!! Когда я меняю флаг DICS_DISABLE на DICS_ENABLE - ничего не происходит...
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 29.05.2014, 14:37   #8
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

С включением/отключением разобрался, спасибо.
Как считать уровень сигнала у usb-модема, который не создает виртуальных com-портов? Дайте хотя бы наводку. Может быть надо с драйвером напрямую работать? Как дескриптор драйвера получить? Какие функции какой библиотеки использовать? Неужели никто об этом ничего не знает...
UPD: Прочитал, что можно с помощью CreateFile получить HANDLE устройства или драйвера. Кто-нибудь знает как это сделать? Какое имя использовать в первом параметре?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 29.05.2014 в 16:04.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 29.05.2014, 18:16   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...вот вы не новичок, а темы свои смешиваете. Вот зачем тут последний пост, если под него отдельная тема ваша есть?

Ответ дан:
1- купить нормальные модемы
2- перевести в режим эмуляции виртуального порта
3- искать API производителя
4- отреверсить ПО производителя, если оно само по себе такой параметр получает.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 30.05.2014, 08:54   #10
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Так этот вопрос второй по списку. Вы просто не понимаете всей серьезности моей ситуации. Ай, ладно... Спасибо за помощь.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сетевые подключения. Найти модем, включить и выключить его. Человек_Борща Работа с сетью в Delphi 16 01.06.2013 08:51
Включить-отключить кнопку в дельфи asiya Помощь студентам 7 09.05.2011 09:42
Как отключить/включить сетевое соединение? W0LF Работа с сетью в Delphi 4 13.01.2010 23:50
подача сигнала на USB порт dimonbest Общие вопросы Delphi 3 08.02.2008 12:00
Програмно отключить(включить) сетевое подключение oleg kutkov Работа с сетью в Delphi 2 03.09.2007 09:12