?? mobilecontrol.h
字號:
// MobileControl.h: interface for the CMobileControl class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MOBILECONTROL_H__EEC1B542_F4AC_4CF1_9E7E_8B6423BDB690__INCLUDED_)
#define AFX_MOBILECONTROL_H__EEC1B542_F4AC_4CF1_9E7E_8B6423BDB690__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "HwMobile.h"
/*
【 手機(jī)與callgle之間的短信通信協(xié)議 】
1、手機(jī)發(fā)短信給callgle
1.1 短信腳本:
1.1.1 #!##<SMSType>#[GroupName1,2,3 ...]#<SMS Content>
! : 表示發(fā)送結(jié)果需要回應(yīng)
<SMSType> : 短信類型。公告、公眾、公益
以上表示短信類型的代碼可以由客戶端程序界面修改。
[GroupName1] : 第一個(gè)群組名,指定接收的群組,如果不指定,就是發(fā)送給公司所有人。客戶端可以鎖定某些手機(jī)號碼
具有這種“發(fā)給所有人”的權(quán)限,如果不鎖定即所有手機(jī)都可以發(fā)送。
[GroupName2] : 第二個(gè)群組名
<SMS Content> : 短信內(nèi)容本身
1.1.2 #!#<Recver1,Recver2,Recver3 ...>#<SMS Content>
! : 表示發(fā)送結(jié)果需要回應(yīng)
<Recver1> : 第一個(gè)接收者PM帳號
<Recver2> : 第二個(gè)接收者名字或PM帳號
<SMS Content> : 短信內(nèi)容本身
1.1.3 %<OptCommand>,<CtrlCode>%<None SMS>
<OptCommand> : 操作指令 0 - 無效; 1 - 續(xù)用(續(xù)租); 2 - 注入新安全碼; 3 - 刪除安全碼; 4 - 停用; 5 - 恢復(fù);
6 - 設(shè)置 Callgle 系統(tǒng)的基本數(shù)據(jù);
<CtrlCmd> : 控制代碼
<None SMS> : 不需要輸入任何短信內(nèi)容,輸入也不起作用
1.1.4 <SMS Content>
<SMS Content> : 短信內(nèi)容本身
這種短信未指定短信類型和接收者,如果發(fā)送者是callgle用戶,即公司自己人,那么該短信會(huì)作為公開信息送給
公司所有人,否則,將送給某一指定用戶,默認(rèn)是系統(tǒng)管理員,可以在客戶端修改這一配置。
1.1.5 #? 或者 #help
獲取系統(tǒng)幫助
1.2 舉例:
1.3.3 #101#同仁們:今天上海展銷很成功
私聊短信,發(fā)送給PM帳號為101的用戶,內(nèi)容是“同仁們:今天上海展銷很成功”。
1.2.2 ##1968#通知:明天下午全公司開作戰(zhàn)會(huì)議
公告信息,發(fā)送給公司所有人,此時(shí)不需要指定接收者,指定了也不起作用,內(nèi)容是“通知:明天
下午全公司開作戰(zhàn)會(huì)議”
1.2.3 現(xiàn)在天氣真熱,大家要做好防暑準(zhǔn)備
“現(xiàn)在天氣真熱,大家要做好防暑準(zhǔn)備”這條短信會(huì)被送給系統(tǒng)管理員或者某一指定的短信管理員
1.2.4 #!##公告#開發(fā)部#昨天下午,誰最后一個(gè)離開公司,請告訴我一聲
發(fā)給"開發(fā)部"的公告信息, 內(nèi)容為"昨天下午,誰最后一個(gè)離開公司,請告訴我一聲"。Callgle系統(tǒng)收到后會(huì)回應(yīng)結(jié)果短信給發(fā)送者
1.2.5 %2384232*329#9232*934#24#%
通過手機(jī)給callgle發(fā)送續(xù)用碼
2、callgle發(fā)短信給手機(jī)
沒有特殊的規(guī)定,只要指定接收者,便可將要發(fā)送的短信文字發(fā)送出去,超過140個(gè)字符的會(huì)自動(dòng)被分作多條短信來發(fā)送。
只是每條有空余17個(gè)位置的短信末尾會(huì)加上一句話“sent by \"callgle\"”
3、callgle自主發(fā)送短信
在以下幾種情況,callgle會(huì)自主發(fā)送手機(jī)短信
3.1 當(dāng)用戶不在線,有來電時(shí),如該用戶有“不在線時(shí)可以收到短信通知”的短信權(quán)限,那么callgle會(huì)自主地將該來話信息
發(fā)送給他的手機(jī)。
3.2 當(dāng)用戶不在線,有文字傳訊信息或公告信息時(shí),如該用戶有“不在線時(shí)可以收到短信通知”的短信權(quán)限,那么callgle會(huì)自主
地將該來話信息發(fā)送給他的手機(jī)。
3.3 當(dāng)有人發(fā)送尋求幫助的信息時(shí),callgle也會(huì)自主發(fā)送包含幫助信息的文字給求助者。
4、用戶短信權(quán)限定義
每個(gè)用戶都有一個(gè)短信權(quán)限,分別為:
4.1 允許發(fā)送短信
4.2 允許接收短信
4.2 不在線時(shí)可以收到短信通知
*/
#ifndef _2Lines
// 收到短消息時(shí)回調(diào)這個(gè)函數(shù)來處理
typedef LRESULT (*FUNC_ReceivedSMS) ( SM_PARAM *pSMRecv, WPARAM wParam, LPARAM lParam );
// 發(fā)送短消息完成時(shí)回調(diào)這個(gè)函數(shù)來處理
typedef LRESULT (*FUNC_SendSMSEnd) ( ENUM_ERROR_TYPE eResult, WPARAM wParam, LPARAM lParam );
// 兩次選擇電話本的時(shí)間間隔 (秒),否則選擇將失敗
#define SELECT_PHONEBOOK_INTVERVAL 2
// 最大短信隊(duì)列數(shù)
#define MAX_SMSQUEUE_NUM 3000
// 初始化接口的時(shí)間間隔 ( 秒 )
#ifdef _DEBUG
#define INITIALIZE_INTERFACE_INTERVAL 1
#else
#define INITIALIZE_INTERFACE_INTERVAL 3
#endif
// 完全相同的短信發(fā)送必須間隔的時(shí)長(秒)
#define SAME_SMS_INTERVAL_TIMELONG 60
typedef LRESULT (*FUNC_HandleMobileStatusChange) ( ENUM_ERROR_TYPE eMobileStatus_Old, ENUM_ERROR_TYPE eMobileStatus_New );
class DLL_INTERNAL CMobileControl : public CHwMobile
{
public:
HANDLE m_EvtThreadCanRun; // 如果該事件被置位表示線程可以運(yùn)行了
t_MobileParameter* m_pMobileParameter;
DWORD* m_pdwSentSMSCount;
CHwMysql_PMData* m_pHwMysql_PMData;
CHwMysql_PMMsg* m_pHwMysql_PMMsg;
CHwMysql_PMFullPN* m_pHwMysql_PMFullPN;
BOOL SMSModuleEnable ( BOOL bEnable );
// 運(yùn)行狀態(tài)
typedef enum _enum_run_state
{
ENUM_RunState_Start, // 開始
ENUM_RunState_Init, // 初始化
ENUM_RunState_Runing, // 正在運(yùn)行
ENUM_RunState_NUM,
} ENUM_RunState;
static LPCTSTR GetObjectName();
// 待發(fā)送的短信隊(duì)列
typedef struct _sms_send_queue
{
SM_PARAM sm; // 要發(fā)送的短信
DWORD dwPMAccount_Sender;
FUNC_SendSMSEnd Proc_SendSMSEnd; // 發(fā)送完成時(shí)通過該回調(diào)函數(shù)來通知請求者
WPARAM wParam;
LPARAM lParam;
ENUM_MOBILESMSTYPE eMobileSMSType;
} t_SMS_SendQueue;
typedef CArray<t_SMS_SendQueue,t_SMS_SendQueue&> t_Ary_SMS_SendQueue;
CMobileControl(LOG_FUNC ExternLog);
virtual ~CMobileControl();
inline void SetParameter ( FUNC_ReceivedSMS Proc_ReceivedSMS, WPARAM wParam, LPARAM lParam )
{
m_Proc_ReceivedSMS = Proc_ReceivedSMS;
m_wParam = wParam;
m_lParam = lParam;
}
BOOL ThreadProc_Mobile();
int Runing();
ENUM_ERROR_TYPE CMobileControl::SendSMS (
ENUM_MOBILESMSTYPE eMobileSMSType,
LPCTSTR lpszReceiverMobileNO,
LPCTSTR lpszSMSContent_Byte,
WCHAR *wzSMSContent_Wide=NULL,
DWORD dwPMAccount_Sender=INVALID_PMACCOUNT,
FUNC_SendSMSEnd Proc_SendSMSEnd=NULL,
WPARAM wParam=NULL,
LPARAM lParam=NULL
);
ENUM_ERROR_TYPE CMobileControl::SendOnePartSMS (
ENUM_MOBILESMSTYPE eMobileSMSType,
LPCTSTR lpszReceiverMobileNO,
BOOL bInternationalMobileNO,
LPCTSTR lpszSMSContent_Byte,
WCHAR *wzSMSContent_Wide=NULL,
DWORD dwPMAccount_Sender=INVALID_PMACCOUNT,
FUNC_SendSMSEnd Proc_SendSMSEnd=NULL,
WPARAM wParam=NULL,
LPARAM lParam=NULL
);
BOOL Init (
BOOL bRunAsServer, // 是否當(dāng)作服務(wù)器運(yùn)行
BOOL bRecvSMSEnable, // 是否允許自動(dòng)收取手機(jī)短信
HANDLE hEvt_TerminateSys,
int nComNO,
int nBaudRate
);
t_Ary_PhoneBook* ReadPhoneBook ();
int ParseSMSRecved (
IN LPCTSTR lpszSMSContent,
IN LPCTSTR lpszSenderMobileNO,
OUT CStringArray **ppStrAry_GroupName_Recver,
OUT CStringArray **ppStrAry_PMAccount_Recver,
OUT char *szSMSContent,
int nSMSContentSize,
BOOL &bRequireEchoSMS,
LPCTSTR lpszSendTime
);
void ClearSendQueue ();
ENUM_ERROR_TYPE GetMobileStatus ();
FUNC_HandleMobileStatusChange m_Proc_HandleMobileStatusChange;
WPARAM m_paraHandleMobileStatusChange;
int IsMobileNO ( LPCTSTR lpszPhoneNO, t_MobileNOHead *pMobileNOHead=NULL, CString *pShortMobileNO=NULL );
t_Ary_MobileNOHead m_Ary_MobileNOHead;
void ConfigParameter ( t_Ary_MobileNOHead *pAry_MobileNOHead );
ENUM_ERROR_TYPE StandardMobileNO ( CString &csMobileNO, BOOL *pbInternationalMobileNO=NULL, CString *pSimplifyMobileNO=NULL );
private:
LRESULT ChangeMobileStatus( ENUM_ERROR_TYPE eMobileStatus_New );
int m_InitializeInterfaceInterval;
CString m_csPartString;
ENUM_RunState m_eRunState;
BOOL m_bRecvSMSEnable;
BOOL m_bRunAsServer;
BOOL ReadExistSMSInMobile ();
BOOL SendSMSQueue ();
BOOL ReadNewSMS ();
CString StandardSMSContent ( LPCTSTR lpszSMSContent );
BOOL SendOneSMSQueue ( t_SMS_SendQueue &SMS_SendQueue );
int HandleSMSCtrlCode (
IN LPCTSTR lpszSMSContent,
OUT CStringArray **ppStrAry_PMAccount_Recver,
OUT char *szSMSContent,
int nSMSContentSize
);
int CompareNOHead ( LPCTSTR lpszPhoneNO, LPCTSTR lpszPhoneNOHead, BOOL bSikpZeroBeforeCompare );
LPCTSTR CheckHeadStr ( LPCTSTR lpszStr, LPCTSTR lpszHead1, LPCTSTR lpszHead2, LPCTSTR lpszHead3 );
int HandleSMSCommon (
IN LPCTSTR lpszSMSContent,
IN LPCTSTR lpszSenderMobileNO,
OUT CStringArray **ppStrAry_GroupName_Recver,
OUT CStringArray **ppStrAry_PMAccount_Recver,
OUT char *szSMSContent,
int nSMSContentSize,
ENUM_MOBILESMSTYPE &eMobileSMSType
);
BOOL ParseRecverAndContent (
char *pHandlePos,
OUT CStringArray **ppStrAry_Recver,
OUT char *szSMSContent,
int nSMSContentSize
);
int HandleSMSMultiRecver (
IN LPCTSTR lpszSMSContent,
IN LPCTSTR lpszSenderMobileNO,
OUT CStringArray **ppStrAry_GroupName_Recver,
OUT char *szSMSContent,
int nSMSContentSize
);
int HandleSMSSingleRecver (
IN LPCTSTR lpszSMSContent,
IN LPCTSTR lpszSenderMobileNO,
OUT CStringArray **ppStrAry_PMAccount_Recver,
OUT char *szSMSContent,
int nSMSContentSize
);
BOOL InitMobileControl ();
BOOL InitMobileModule ( int &nComNO );
BOOL InitMobileOneCOM ( int nComNO );
BOOL IsSameSMSType ( CString &csSMSType, CString csSMSType_Bulletin );
CString SimplifyMobileNO ( LPCTSTR lpszMobileNO );
ENUM_ERROR_TYPE InfillSMParam (
OUT SM_PARAM &SmParam,
IN CString csReceiverMobileNO
);
ENUM_ERROR_TYPE StandardMobileNOHead ( CString &csMobileNOHead );
int FindFromMobileNOHeadAry (
LPCTSTR lpszPhoneNO,
CString &csCountryCode,
CString &csAreaCode
);
HANDLE m_hThread_Mobile;
// 短消息接收處理時(shí)的回調(diào)函數(shù)和參數(shù)
FUNC_ReceivedSMS m_Proc_ReceivedSMS;
WPARAM m_wParam;
LPARAM m_lParam;
// 短消息發(fā)送隊(duì)列
t_Ary_SMS_SendQueue m_Ary_SMS_SendQueue;
CCriticalSection m_CSFor_SMSSendQueue;
HANDLE m_hEvt_SMSSendQueue;
ENUM_ERROR_TYPE m_eMobileStatus; // 手機(jī)狀態(tài),如果是禁用了手機(jī)模塊,這個(gè)狀態(tài)值一直是“禁用”,直到被控制碼啟用以后才會(huì)改變
ENUM_ERROR_TYPE m_eMobileStatus_Real; // 手機(jī)的真實(shí)狀態(tài),不管是禁用還是啟用,手機(jī)當(dāng)前的狀態(tài)就保存到此了
CCriticalSection m_CSFor_MobileStatus;
HANDLE m_hEvt_TerminateSys;
int m_nComNO_UserDefine;
protected:
virtual BOOL HandleRecvSMS(SM_PARAM *pSMRecv);
virtual int HandleCOMRW ( int nRet );
void StandardShortMobileNO ( IN OUT CString &csShortMobileNO, IN LPCTSTR lpszMobileNOHead );
};
#endif
#endif // !defined(AFX_MOBILECONTROL_H__EEC1B542_F4AC_4CF1_9E7E_8B6423BDB690__INCLUDED_)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -