📄 motormanloadingorexit.c
字号:
#include "Config.h"
////////////////////////////////////////////////////////////////////////////
uint8 gsm_BlindBorough=0; //GSM盲区标志位 =0非盲区 ;=1盲区
uint8 gprs_BlindBorough=0; //GPRS盲区标志位 =0非盲区 ;=1盲区
uint8 MotormanLoadSign=0; //盲区或无连接的时候,驾驶员拨打终端电话状态标志,0:表示未处理,1:表示退出,2:表示盲区,3:表示登陆。
/***********************************************************************************
*函数名称: BlindBoroughGprsOff()
*函数作用: 当GPRS连接断开,或者盲区时候有司机打电话后保存拨打司机的信息,并回复短信息
//处于盲区和GPRS连接没有时候给司机发送短信"您的操作已接受,请稍后"
//////////////////////////////////////////////////////////////
*入口参数: MotomanNum 司机拨打的号码
*出口参数: 无
************************************************************************************/
uint8 BlindBoroughGprsOff(char *MotomanNum)
{
if(gsm_BlindBorough==1) return FALSE;
if((ReConnect_OK!=2)||(gprs_BlindBorough==1)) //Connect_OK=0 GPRS没有连接 //gprs_BlindBorough=1 处于GPRS盲区
{
char len[4];
char MsgContent[TRANSLEN/2];
char * SMS_AT[]={"60A8768464CD4F5C5DF263A553D7002C8BF77A0D540E"}; //您的操作已接受,请稍后
memset(MsgContent,0,sizeof(MsgContent));
ChineseMsgCompages(MotomanNum,MsgContent,0); //0011000D91 683159614291F8 000800头
sprintf(len,"%02X",strlen(SMS_AT[0])/2+1);
strcat(MsgContent,len);
strcat(MsgContent,SMS_AT[0]);
SendPDUSMS(MsgContent);
return TRUE;
}
return FALSE;
}
//////////////////////////////////////////////////////////////
/***********************************************************************************
*函数名称: SaveDriverM()
*函数作用: 保存已登陆的驾驶员ID,并向flash中写数据
*入口参数: 无
*出口参数: 无
************************************************************************************/
uint8 SaveDriverM(char *MotomanNum,char *MotormanId)
{
STRU_D_SetupDriverID_Comm setupDriverID; ////已登陆的驾驶员ID及手机号
uint8 buff[LOGINDEVICE_LEN];
uint8 tempLen=0;
//保存已登陆的驾驶员ID 返回已登陆驾驶的ID,内容长度不定,
//当该字节为0时,表示无任何驾驶员登陆
memset(buff,0,sizeof(buff));
setupDriverID.pDriverID=(uint8 *)MotormanId; //已登陆的驾驶员ID
setupDriverID.driverID_Len=strlen((char *)setupDriverID.pDriverID);//已登陆的驾驶员ID长度
//根据协议要求,保存已登陆的驾驶员ID及长度
memcpy(buff,&setupDriverID.driverID_Len,sizeof(setupDriverID.driverID_Len)); //
tempLen+=sizeof(setupDriverID.driverID_Len);
memcpy(buff+tempLen,setupDriverID.pDriverID,strlen((char *)setupDriverID.pDriverID));
tempLen+=strlen((char *)setupDriverID.pDriverID);
setupDriverID.pDriverLoginMobile=(uint8 *)MotomanNum;//已登陆的驾驶员手机号
setupDriverID.driverLoginMobile_Len=strlen((char *)setupDriverID.pDriverLoginMobile);//已登陆的驾驶员手机号长度
//根据协议要求,保存已登陆的驾驶员手机号及长度
memcpy(buff+tempLen,&setupDriverID.driverLoginMobile_Len,sizeof(setupDriverID.driverLoginMobile_Len)); //
tempLen+=sizeof(setupDriverID.driverLoginMobile_Len);
memcpy(buff+tempLen,setupDriverID.pDriverLoginMobile,strlen((char *)setupDriverID.pDriverLoginMobile));
SaveParamValue(0x0707,buff); //保存已登陆的驾驶员ID
return TRUE;
}
//////////////////////////////////////////////////////////////
/***********************************************************************************
*函数名称:SendPDUSMS
*函数作用: 发送PDU信息
*入口参数: MsgContent发送的手机号
*出口参数: 无
************************************************************************************/
void SendPDUSMS(char * MsgContent)
{
char * SMS_AT[]={"\r\nAT+CMGF=0\r\n","\r\nAT+CMGS=","\x01a","\r\nAT+CMGF=1\r\n"};
char buff[20];
char str[4];
memset(buff,0,sizeof(buff));
memset(str,0,sizeof(str));
memcpy(buff,SMS_AT[1],strlen(SMS_AT[1]));
sprintf(str,"%d",strlen(MsgContent)/2);
strcat(buff,str);
strcat(buff,"\r\n");
uartWrite(UART2,(uint8 *)SMS_AT[0],strlen(SMS_AT[0]),NULL); //发送AT+CMGF=0
OSTimeDlyHMSM(0,0,0,600);
uartWrite(UART2,(uint8 *)buff,strlen(buff),NULL); //发送AT+CMGS=XX,XX表示总长度
OSTimeDlyHMSM(0,0,0,300);
strcat(MsgContent,SMS_AT[2]);
strcat(MsgContent,SMS_AT[2]);
uartWrite(UART2,(uint8 *)MsgContent,strlen(MsgContent),NULL); //发送文本信息
uartWrite(UART2,(uint8 *)SMS_AT[2],strlen(SMS_AT[2]),NULL); //发送AT+CMGF=1
OSTimeDlyHMSM(0,0,6,0);
uartWrite(UART2,(uint8 *)SMS_AT[3],strlen(SMS_AT[3]),NULL); //发送AT+CMGF=1
OSTimeDlyHMSM(0,0,0,600);
}
//AT+CMGS=29
// 0011000D91 683159614291F8 000801 0E 4F60 597D 6211 4EEC 5728 6D4B 8BD5
//| 固定长度 | 手机号码 | 固定 |文本长度+1|-----文本内容--------|
/***********************************************************************************
*函数名称: ChineseMsgCompages(char *sss,char *str1) //中文短信组合
*入口参数: Num为拨打终端电话的驾驶员电话号码
*出口参数: str1为内容头 例:0011000D91 683159614291F8 000800(13951624198)头
************************************************************************************/
uint8 ChineseMsgCompages(char * SendNum,char *MsgContent,uint16 textLen) //中文短信组合
{
char * MsgCompages[]={ "0011000D91","000801",};
uint8 i=0;
char s_Len[2];
char newNum[14];
char newNum_TW_[14];
char SendText[TRANSLEN];
memset(s_Len,0,sizeof(s_Len));
memset(newNum,0,sizeof(newNum));
memset(newNum_TW_,0,sizeof(newNum_TW_));
memset(SendText,0,sizeof(SendText));
#if !defined(_TW_)
//电话号码编码
newNum[0]=0x36;
newNum[1]=0x38;
for(i=0;i<6;i++)
{
newNum[i*2+3]=SendNum[i*2];
if(i==5)
{ newNum[12]=0x46;
newNum[13]=SendNum[10];
i++;
}
else
newNum[i*2+2]=SendNum[i*2+1];
}
#else
newNum_TW_[0]=0x38;
newNum_TW_[1]=0x38;
newNum_TW_[2]=SendNum[1];
newNum_TW_[3]=0x36;
for(i=1;i<=4;i++)
{
newNum_TW_[i*2+3]=SendNum[i*2];
newNum_TW_[i*2+2]=SendNum[i*2+1];
}
#endif // end of #if defined(_TW_)
//PDU发送格式编码组成
strcat(SendText,MsgCompages[0]); //固定的标准的PDU发送格式
//
#if !defined(_TW_)
strcat(SendText,newNum);
#else
strcat(SendText,newNum_TW_); // For TW //
#endif // end of #if defined(_TW_)
strcat(SendText,MsgCompages[1]);
if(textLen!=0) //为0表示登录无文本内容
{
textLen+=1;
sprintf(s_Len,"%02X",textLen);
strcat(SendText,s_Len);
strcat(SendText,MsgContent);
memset(MsgContent,0,strlen(SendText)+1); //
}
memcpy(MsgContent,SendText,strlen(SendText)); ////PDU发送格式编码组成
return TRUE;
}
/*****************************************************************
**函数名称:BuildMsgBag(uint8 SendMsg,char * sss,char * str)//建立信息组包
**入口函数:SendMsgflag 判断标志为,主要功能区分(1:退出登陆、 2:已经登录、3:登陆成功)3种状态
** MotomanNum 正在拨打车机的司机
MotormanId 已经登陆的司机ID
******************************************************************/
uint8 BuildMsgBag(uint8 SendMsgflag,char * MotomanNum,char *MotormanId,uint8 *uiReviceBuf0,uint16 *uiNum)
{
static char * MsgToCall[]={ "\r\nAT+CMGS=",
"767B96466210529F0021" , //登录成功!Ctrl+Z
"900051FA6210529F0021", //退出成功!Ctrl+Z
"5DF25728767B96460021", //已经登录!Ctrl+Z
"767B964659318D250021", //登录失败!
"\r\nAT+CMGF=0\r\n",
};
uint8 i=0;
char len[4];
char LoadMotorNum[DEVICE_LEN];
char str1[TRANSLEN/2]; //拨打电话的驾驶员信息,及PUD短信发送格式的固定格式
//0011000D91 683159614291F8 000800头
char str2[TRANSLEN/2]; //str2驾驶员登陆的ID,在短信内容中
char str3[20]; //发送AT+CMGS=XX,XX表示总长度
uint8 con=0; //CON求文本信息的总长度(必须要写)
memset(LoadMotorNum,0,sizeof(LoadMotorNum));
memset(str1,0,sizeof(str1));
ChineseMsgCompages(MotomanNum,str1,0); //0011000D91 683159614291F8 000800头
memset(str3,0,sizeof(str3));
memset(str2,0,sizeof(str2));
if(SendMsgflag==2)
strcat(str2,MsgToCall[4]); //登录失败! 090407
if((G_DriverLoginMobile[0]>=0x30)&&(G_DriverLoginMobile[0]<0x40))
memcpy(LoadMotorNum,G_DriverLoginMobile,strlen(G_DriverLoginMobile));
else
memcpy(LoadMotorNum,MotomanNum,strlen(MotomanNum));
//ID号的UNcode码
for(i=0;i<strlen(LoadMotorNum);i++)
{
char buff[4];
memset(buff,0,sizeof(buff));
strcat(buff,"00");
sprintf(buff+strlen(buff),"%02X",LoadMotorNum[i]);
strcat(str2,buff); //提示登陆成功或退出
}
if(SendMsgflag==1)
strcat(str2,MsgToCall[2]); //XXX退出成功!Ctrl+Z
//CON求文本信息的总长度(必须要写)
else if(SendMsgflag==2)
strcat(str2,MsgToCall[3]); //发送信息"XXX已经登陆"
else
strcat(str2,MsgToCall[1]); //发送信息"XXX登陆成功"
con=strlen(str2)/2+1; //表示文本的长度并加上长度所占的一个字节长度
sprintf(len,"%02X",con); //将总长度转化为ASCALL码格式。并复制给STR1
strcat(str1,len); //
strcat(str1,str2); //合并总长度字符串
if(SendMsgflag==3) //登陆成功信息
{
memcpy(G_DriverLoginMobile,MotomanNum,strlen(MotomanNum));
memcpy(G_LoadingMotorman,MotormanId,strlen(MotomanNum));
SaveDriverM(MotomanNum,MotormanId); //保存已登陆的驾驶员ID及手机号码
}
else
{
if(SendMsgflag==1)
{
uint8 buff[LOGINDEVICE_LEN];
memset(buff,0xff,sizeof(buff));
//根据协议要求,清除已登陆的驾驶员ID及长度
SaveParamValue(0x0707,buff); //清除已登陆的驾驶员ID
}
}
if(G_RestMsg==1) //是否需要将提示发给司机
{
OSTimeDlyHMSM(0,0,0,300);
//uartWrite(UART3,(uint8 *)str1,strlen(str1),NULL);
SendPDUSMS(str1);
}
return TRUE;
}
/*****************************************************************
**函数名称:void GetMotormanIdToFlash()
**作用 : 从FLASH中取已经存储的驾驶员信息
和拨打的电话号码进行比较,
**入口参数:SMS_YesNo_Flag 判断是否短信,1:表示短信,0:表示电话
MotormanInformetion 驾驶员信息
CallToTerminal 呼入终端的电话(正在拨打的驾驶员)
**出口参数: LoadingMotorman 已经登陆的驾驶员
MotormanId 驾驶员ID
******************************************************************/
uint8 GetMotormanIdToFlash(uint8 SMS_YesNo_Flag,char * CallToTerminal,char * MotormanId,char * LoadingMotorman)
{
uint16 iplace=0;
uint8 ss[ALLDEVICE_LEN];
memset(ss,0,sizeof(ss));
GetParamValue(0x0706,ss); //设置的驾驶员ID 根据设置驾驶员ID指令内容格式上传
iplace=0;
while ((INT16S)(sizeof(ss)-iplace)>0)
{
uint8 buff1[DEVICE_LEN];
uint8 buff2[DEVICE_LEN];
STRU_D_SetupDriverID_Comm temp;
memset(buff1,0,sizeof(buff1));
memset(buff2,0,sizeof(buff2));
temp.driverID_Len=ss[iplace++];
temp.pDriverID=buff1; //驾驶员ID
memcpy(temp.pDriverID,ss+iplace,temp.driverID_Len);
iplace+=temp.driverID_Len;
temp.driverLoginMobile_Len=ss[iplace++];
temp.pDriverLoginMobile=buff2; //驾驶员手机号
memcpy(temp.pDriverLoginMobile,ss+iplace,temp.driverLoginMobile_Len);
iplace+=temp.driverLoginMobile_Len;
if(memcmp(CallToTerminal,temp.pDriverLoginMobile,strlen(CallToTerminal))==0)
{
if((G_DriverLoginMobile[0]>=0x30)&&(G_DriverLoginMobile[0]<0x40)) //表示已登陆的ID
{
if(SMS_YesNo_Flag==0) //0:表示是有电话进入
{
//memcpy(MotormanId,G_LoadingMotorman,strlen((char *)G_LoadingMotorman));
memcpy(MotormanId,temp.pDriverID,strlen((char *)temp.pDriverID));
memcpy(LoadingMotorman,G_DriverLoginMobile,strlen((char *)G_DriverLoginMobile));
}
return TRUE;
}
else
{
memcpy(MotormanId,temp.pDriverID,strlen((char *)temp.pDriverID));
memset(LoadingMotorman,0,strlen(LoadingMotorman));
}
return TRUE;
}
}
return FALSE;
}
//RING
// +CLIP: "02552726209",161,,,,0
/*****************************************************************
**函数名称:void MotormanLoadingOrExit()
MotormanId 驾驶员ID
LoadingMotorman 已经登陆的驾驶员电话号码
CallToTerminal 拨打终端电话的电话号码
**入口函数:uiReviceBuf0 判断标志为,主要功能区分有人登陆、退出登陆、已经登陆3种状态
******************************************************************/
uint8 MotormanLoadingOrExit(uint8 *uiReviceBuf0,uint16 * uiNum)
{
char * p=NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -