📄 wireless.cpp
字号:
if (InputNumber(index,newNumber,nametemp))
return true;
else
return false;
}
extern "C" __declspec(dllexport) bool DelNumber(int index)
{
char ans[128] = "\0", send[] = "\0";
sprintf(send,"AT+CPBW=%d\r\n",index);
WriteComm(send,strlen(send));
if (ReadComm(ans,128) > 0)
{
TRACE("%s\r\n", ans);
if (strstr(ans,"OK") != NULL )
return true;
}
return false;
}
extern "C" __declspec(dllexport) bool InputNumber(int index, char *number, char *name)
{
char ans[128] = "\0", send[] = "\0";
int type = GetNumberType(number);
char buf[256];
unsigned char sendname[256];
int len = gsmEncodeUcs2(name, sendname, strlen(name));
int aa = gsmBytes2String(sendname, buf, len);
buf[aa] = '\0';
//伟文模块,如果index为0,那么会自动在SIM卡中找到适当的位置插入
sprintf(send,"AT+CPBW=%d,\"%s\",%d,\"%s\"\r\n",index,number,type,buf);
WriteComm(send,strlen(send));
if (ReadComm(ans,128) > 0)
{
TRACE("%s\r\n", ans);
if (strstr(ans,"OK") != NULL)
return true;
}
return false;
}
extern "C" __declspec(dllexport) bool SetBand(int band)
{
char ans[128] = "\0", *p = NULL, send[] = "\0";
switch(band)
{
case 1:
sprintf(send,"%s","AT+CBAND=\"EGSM_DCS_MODE\"\r\n");
break;
case 2:
sprintf(send,"%s","AT+CBAND=\"PGSM_MODE\"\r\n");
break;
case 3:
sprintf(send,"%s","AT+CBAND=\"DCS_MODE\"\r\n");
break;
case 4:
sprintf(send,"%s","AT+CBAND=\"PGSM_DCS_MODE\"\r\n");
break;
case 5:
sprintf(send,"%s","AT+CBAND=\"GSM850_PCS_MODE\"\r\n");
break;
}
WriteComm(send,strlen(send));
while(true)
{
if (ReadComm(ans,128) >0 )
{
TRACE("%s\r\n", ans);
if (strstr(ans,"ERROR") != NULL)
return false;
else
return true;
}
}
}
extern "C" __declspec(dllexport) bool SetNetwork(char *network)
{
char ans[128] = "\0", *p = NULL, send[] = "\0";
sprintf(send, "AT+COPS=4,0,\"%s\"\r\n",network);
WriteComm(send,strlen(send));
while(true)
{
if (ReadComm(ans,128) > 0)
{
TRACE("%s\r\n", ans);
if (strstr(ans, "OK") != NULL)
return true;
else if (strstr(ans, "ERROR") != NULL)
return false;
}
}
}
extern "C" __declspec(dllexport) int GetNetState()
{
// -1 failed
// 0 not registered, ME is not currently searching a new operator to register to
// 1 registered, home network
// 2 not registered, but ME is currently searching a new operator to register to
// 3 registration denied
// 4 unknown
// 5 registered, roaming
char ans[128] = "\0", *p = NULL, *send = "AT+CGREG?\r\n";
int state = -1;
WriteComm(send,strlen(send));
if (ReadComm(ans,128) > 0)
{
TRACE("%s\r\n", ans);
if ((p = strstr(ans,"+CGREG:")) != NULL)
{
p += 10;
CString temp = p;
int pos = temp.Find("\r\n");
char Noke[2] = "\0";
strcpy(Noke,temp.Left(pos));
state = atoi(Noke);
}
}
return state;
}
extern "C" __declspec(dllexport) int GetNetType()
{
char ans[128] = "\0", *p = NULL, *send = "AT+CGATT?\r\n";
WriteComm(send,strlen(send));
if (ReadComm(ans,128) > 0)
{
TRACE("%s\r\n", ans);
if ((strstr(ans ,"OK")) != NULL)
{
p = ans + 9;
int value1 = 0, value2 = 0;
char Noke[32] = "\0";
CString temp = p;
//NXP
//int pos = temp.Find(",");
//strcpy(Noke,temp.Left(pos));
//value1 = atoi(Noke);
//if (value1 == 0)
// netType = 1;
//else if (value1 == 1)
// netType = 3;
//p += (pos +1);
temp = p;
int pos = temp.Find("\r\n");
strcpy(Noke,temp.Left(pos));
netType = atoi(Noke);
}
}
int reNetType = 0;
switch(netType)
{
case 0://GPRS
reNetType = GPRS;
break;
case 2://CDMAf
reNetType = CDMA;
break;
case 1://EDGE
reNetType = EDGE;
break;
case 4://EVDO
reNetType = EVDO;
break;
case 5://GSM
reNetType = GSM;
break;
}
return reNetType;
}
extern "C" __declspec(dllexport) void ReStartCom(CWnd *msgwnd)
{
if (StartCom(msgwnd))
{
//InitModem();
}
}
extern "C" __declspec(dllexport) void OptAPN(IN LPCSTR HardwareId,char *szApn,BOOL read)
{
HDEVINFO DeviceInfoSet;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i,err;
BOOL Found;
//
// Create a Device Information Set with all present devices.
//
DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes
0,
0,
DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system
if (DeviceInfoSet == INVALID_HANDLE_VALUE)
{
TRACE(_T("GetClassDevs(All Present Devices)")) ;
return;
}
_tprintf(_T("\n\nSearch for Device ID: [%s]\n\n"),HardwareId);
//
// Enumerate through all Devices.
//
Found = FALSE;
i = err = 0;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
//for (i=0;SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData);i++)
while ( !Found && SetupDiEnumDeviceInfo(DeviceInfoSet, i++, &DeviceInfoData))
{
DWORD DataT;
LPTSTR p,buffer = NULL;
DWORD buffersize = 0;
if(winver == WIN98 || winver == WINME)
{
buffersize = 1024;
buffer = (char *)LocalAlloc(LPTR,buffersize);
}
//
// We won't know the size of the HardwareID buffer until we call
// this function. So call it with a null to begin with, and then
// use the required buffer size to Alloc the nessicary space.
// Keep calling we have success or an unknown failure.
//
while (!SetupDiGetDeviceRegistryProperty(
DeviceInfoSet,
&DeviceInfoData,
SPDRP_HARDWAREID,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() == ERROR_INVALID_DATA) {
//
// May be a Legacy Device with no HardwareID. Continue.
//
break;
}
else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
//
// We need to change the buffer size.
//
if (buffer)
LocalFree(buffer);
buffer = (char *)LocalAlloc(LPTR,buffersize);
}
else
{
//
// Unknown Failure.
//
TRACE(_T("GetDeviceRegistryProperty"));
err = 1;
break;
}
}
if (GetLastError() == ERROR_INVALID_DATA)
continue;
if( err) break;
//
// Compare each entry in the buffer multi-sz list with our HardwareID.
//
for (p=buffer;p&&*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR))
{
if (!_stricmp(HardwareId,p))
{
TRACE(_T("Found! [%s]\n"),p);
DWORD dwDataType,dwDataLen = 1024;
BYTE bData[128];
dwDataLen = 128;
ZeroMemory(bData,128);
{
if(SetupDiGetDeviceRegistryProperty(DeviceInfoSet,&DeviceInfoData,
SPDRP_DRIVER,&dwDataType,bData,dwDataLen,&dwDataLen))
{ //HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class
HKEY hk;
char szSubKey[256];
sprintf(szSubKey,"SYSTEM\\CurrentControlSet\\Control\\Class\\%s",(char *)bData);
if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,szSubKey,0,KEY_ALL_ACCESS,&hk) == ERROR_SUCCESS)
{
DWORD dwType = REG_SZ;
BYTE szPort[128];
memset(szPort,0,128);
DWORD dwRet = 128;
if(read)
{
RegQueryValueEx(hk,"UserInit",0,&dwType,szPort,&dwRet);
char *p = strrchr((char *)szPort, (int)',');
if(p)
{
strcpy(szApn, p+2);
szApn[strlen(szApn)-1] = 0;
}
}
else
{
sprintf((char*)szPort, "AT+CGDCONT=1,\"IP\",\"%s\"", szApn);
RegSetValueEx(hk, "UserInit", 0, REG_SZ, (LPBYTE)szPort, strlen((char*)szPort));
}
RegCloseKey(hk);
Found = 1;
}
}
}
break;
}
}
if (buffer) LocalFree(buffer);
if (Found) break;
}
if (GetLastError() != NO_ERROR)
{
TRACE(_T("EnumDeviceInfo %d"),GetLastError());
}
//
// Cleanup.
//
err = GetLastError();
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
SetLastError(err);
}
BOOL GetStringTCReg(LPSTR strRet, LPCSTR lpkey, DWORD nRet)
{
char szIniFile[_MAX_PATH];
ZeroMemory(szIniFile, _MAX_PATH);
GetModuleFileName(NULL, szIniFile, _MAX_PATH);
char *p = strrchr(szIniFile, (int)'\\');
if(p)
{
*(p+1) = 0;
strcat(szIniFile, "system.ini");
}
GetPrivateProfileString("APN", lpkey, "", strRet, nRet, szIniFile);
return FALSE;
}
APNLIST m_ApnList;
void GetApnList()
{
//初始APN列表
if(m_ApnList.GetSize())
{
for(int i = 0; i < m_ApnList.GetSize();i++)
{
LPAPNINFO lpat = m_ApnList.GetAt(i);
delete lpat;
}
m_ApnList.RemoveAll();
}
{
//读预制APN表
char szIniFile[_MAX_PATH];
ZeroMemory(szIniFile, _MAX_PATH);
GetModuleFileName(NULL, szIniFile, _MAX_PATH);
char *p = strrchr(szIniFile, (int)'\\');
if(p)
{
*(p+1) = 0;
strcat(szIniFile, "system.ini");
}
char szKeys[4086];
ZeroMemory(szKeys, 4086);
GetPrivateProfileString("APN",NULL, "", szKeys, 4086, szIniFile);
p = szKeys;
while(*p)
{
if(*p == '#')
{
p += strlen(p);
p++;
continue;
}
//
CString strName = p;
strName.TrimLeft();
strName.TrimRight();
char szApn[1024];
ZeroMemory(szApn, 1024);
GetPrivateProfileString("APN", strName, "", szApn, 1024, szIniFile);
CString str = szApn;
int pos = str.Find(';');
if(pos == -1) continue;
CString strApn = str.Left(pos);
strApn.TrimLeft();
strApn.TrimRight();
//
str = str.Mid(pos+1);
pos = str.Find(';');
if(pos == -1) continue;
CString strUser = str.Left(pos);
strUser.TrimLeft();
strUser.TrimRight();
//
str = str.Mid(pos+1);
pos = str.Find(';');
if(pos == -1) continue;
CString strPwd = str.Left(pos);
strPwd.TrimLeft();
strPwd.TrimRight();
//
str = str.Mid(pos+1);
pos = str.Find(';');
if(pos == -1) continue;
CString strNumber = str.Left(pos);
strNumber.TrimLeft();
strNumber.TrimRight();
//
str = str.Mid(pos+1);
pos = str.Find(';');
if(pos == -1) continue;
CString strDns1 = str.Left(pos);
strDns1.TrimLeft();
strDns1.TrimRight();
//
str = str.Mid(pos+1);
pos = str.Find(';');
CString strDns2;
if(pos != -1)
{
strDns2 = str.Left(pos);
strDns2.TrimLeft();
strDns2.TrimRight();
}
LPAPNINFO lpapn = new APNINFO;
ZeroMemory(lpapn, sizeof(APNINFO));
strcpy(lpapn->szName, strName);
strcpy(lpapn->szUser, strUser);
strcpy(lpapn->szPwd, strPwd);
strcpy(lpapn->szNumber, strNumber);
strcpy(lpapn->szApn, strApn);
strcpy(lpapn->szDns1, strDns1);
strcpy(lpapn->szDns2, strDns2);
m_ApnList.Add(lpapn);
p += strlen(p);
p++;
}
if(m_ApnList.GetSize() == 0)
{
LPAPNINFO lpapn = new APNINFO;
ZeroMemory(lpapn, sizeof(APNINFO));
if(m_DevInfo.ConnectType == CONNECTTYPE_GPRS || m_DevInfo.ConnectType == CONNECTTYPE_EDGE)
{
strcpy(lpapn->szName, "中国移动");
strcpy(lpapn->szUser, "");
strcpy(lpapn->szPwd, "");
strcpy(lpapn->szNumber, "*99***1#");
strcpy(lpapn->szApn, "CMNET");
strcpy(lpapn->szDns1, "");
strcpy(lpapn->szDns2, "");
}else
{
strcpy(lpapn->szName, "中国联通");
strcpy(lpapn->szUser, "card");
strcpy(lpapn->szPwd, "card");
strcpy(lpapn->szNumber, "#777");
strcpy(lpapn->szApn, "");
strcpy(lpapn->szDns1, "");
strcpy(lpapn->szDns2, "");
}
m_ApnList.Add(lpapn);
}
}
}
// PDU解码,用于接收、阅读短消息
// 输入: pSrc - 源PDU串指针
// 输出: pDst - 目标PDU参数指针
// 返回: 用户信息串长度
int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst)
{
int nDstLength; // 目标PDU串长度
unsigned char tmp; // 内部用的临时字节变量
unsigned char buf[256]; // 内部用的缓冲区
// SMSC地址信息段
gsmString2Bytes(pSrc, &tmp, 2); // 取长度
tmp = (tmp - 1) * 2; // SMSC号码串长度
pSrc += 4; // 指针后移,忽略了SMSC地址格式
gsmSerializeNumbers(pSrc, pDst->SCA, tmp); // 转换SMSC号码到目标PDU串
pSrc += tmp; // 指针后移
// TPDU段基本参数
gsmString2Bytes(pSrc, &tmp, 2); // 取基本参数
pSrc += 2; // 指针后移
// 取回复号码
gsmString2Bytes(pSrc, &tmp, 2); // 取长度
if(tmp & 1) tmp += 1; // 调整奇偶性
pSrc += 4; // 指针后移,忽略了回复地址(TP-RA)格式
gsmSerializeNumbers(pSrc, pDst->TPA, tmp); // 取TP-RA号码
pSrc += tmp; // 指针后移
// TPDU段协议标识、编码方式、用户信息等
gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2); // 取协议标识(TP-PID)
pSrc += 2; // 指针后移
gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2); // 取编码方式(TP-DCS)
pSrc += 2; // 指针后移
gsmSerializeNumbers(pSrc, pDst->TP_SCTS, 14); // 服务时间戳字符串(TP_SCTS)
pSrc += 14; // 指针后移
gsmString2Bytes(pSrc, &tmp, 2); // 用户信息长度(TP-UDL)
pSrc += 2; // 指针后移
if(pDst->TP_DCS == GSM_7BIT)
{
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -