/************************************************************************
* 文件名称: LTE_DTU.c
* 功能名称: DTU模块驱动
* 实验平台: 物联开发板STM32F103RBT6
* OneNET 多协议平台 MQTT:
MQTT服务器IP: mqtt.heclouds.com
MQTT服务器端口:6002
主题topic:IOT_LBW、IOT_TOPIC
产品ID:220520
设备ID:657554468
设备密钥:LBWIOT
用到的MQTT指令:
1. @config@server@mqtt.heclouds.com,6002,657554468,60### --设置mqtt服务器IP和端口号,以及设备ID号和心跳保活时间
2. @config@user@220520,LBWIOT,0### ---设置MQTT账户名和密码
3. @config@remain@1,2018-10-31### -----设置会话
4. @config@will@0,0,0,0,0### ---设置无遗嘱模式
5. @config@sub@IOT_LBW,0### -----订阅主题
@config@sub@IOT_TOPIC,0### -----订阅主题
6. @config@pub@IOT_LBW,0,0,0### ---发布主题
@config@pub@IOT_TOPIC,0,0,0### ---发布主题
7. @config@para@save### ----保存参数
8. @get@platform connect state@ --查询登录平台状态
**************************************************************************/
#include "LTE_DTU.h"
#include <stdio.h>
#include "string.h"
#include "USART1.h"
#include "USART2.h"
#include "DelayTime.h"
/*变量声明*/
u8 TCP_Connectflag=0;//TCP连接标志,1 成功,0 失败
u8 Congfig_flag=0; //配置服务器参数标志 1 成功,0 失败
u8 DTU_Readyflag;//DTU运行状态标志;1 正常,0 异常
u8 Login_OneNET_flag=0; //登录OneNET平台标志(TCP模式),1 成功,0 失败
u8 Loginflag=0; //登录OneNET平台标志(mqtt模式),1 成功,0 失败
extern char Usart2_RX_Buf[]; //串口2缓存
extern u8 Usart2_RX_Data_Len; //串口2缓存首地址
extern char Usart2_TX_Buf[Usart2_TX_MAXLEN];
/* OneNET平台登陆报文格式示例:*产品ID号#鉴权信息#cupluas* (本次实验例程的鉴权信息使用模块IMEI号)
例如:*394915#868777055277606#cupluas*
*/
char LoginMessage[35]="*394915#";//初始值含有产品ID号
/*开辟缓存,注意设置的存储长度要=实际长度m+1*/
char Buf_IMEI[16]; //IMEI 缓存
char Buf_ICCID[21];//ICCID 缓存
char Buf_CSQ[3]; //信号质量 缓存
char Buf_longitude[13]={0}; //经度
char Buf_latitude[13]={0}; //纬度
/* TCP服务器配置参数*/
char tcp_agreement[]="tcp";//TCP协议
char DTU_HeartData[]="";//无需心跳包
char DTU_HeartTime[]="60";//心跳间隔默认60s
char DTU_IP[]="183.230.40.40";//OneNET TCP服务器IP地址
char DTU_PORT[]="1811";//OneNET服务器:TCP透传端口号
/* MQTT服务器配置登录账号信息*/
// 当采用MCU配置MQTT参数,才会用到下列三元组信息
char mqtt_deviceclientid[]="657554468"; // mqtt 客户端:设备ID
char mqtt_username[]="220520"; // mqtt 用户名:产品ID号
char mqtt_password[]="LBWIOT"; // mqtt 密码:设备密钥
//char mqtt_IP[]="183.230.40.39";//OneNET mqtt服务器域名mqtt.heclouds.com
char mqtt_IP[]="119.3.236.206";
char mqtt_PORT[]="18083";//OneNET mqtt 端口号
char mqtt_HeartTime[]="60";//心跳保活时间
char MQTT_Encryptflag[]="0";//用户信息加密
//此处修改您需要订阅的主题
char mqtt_subtopic[]="IOT_LBW"; //mqtt 订阅主题
char mqtt_pubtopic[]="IOT_LBW"; //mqtt 发布主题
char MQTT_Qos[]="0";//主题等级0~2
char MQTT_Dup[]="0";//消息是否重发,0 不重发,1 重发
char MQTT_Retain[]="0";//遗嘱消息是否存储到服务器,0不需要,1 需要
/***********************************************************
【函数名称】DTU_Initconfig()
【功 能】配置MQTT服务器连接初始化配置
【输入参数】无
【返回参数】Congfig_flag
【备 注】DTU_Mode:TCP=0、MQTT=1
***********************************************************/
void DTU_Initconfig(int DTU_Mode)
{
//首先要配置模块所处的工作模式
//选择联网方式
if(DTU_Mode==1)
{
Usart2_SendString("AT+CFGNET=1\r\n");//mqtt模式
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"AT+CFGNET=1\r\n"))
{
printf("已设置为MQTT模式,等待模块重启\n");
}
else
{
printf("配置失败\n");
}
Usart2_SendString("AT+CFGPARA=SAVE\r\n");//保存参数,并等待重启
Delay_Ns(6);
MQTT_Initconfig();
}
else
{
Usart2_SendString("AT+CFGNET=0\r\n");//mqtt模式
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"AT+CFGNET?\r\n"))
{
printf("已设置为TCP模式,等待模块重启\n");
}
Usart2_SendString("AT+CFGPARA=SAVE\r\n");//保存参数,并等待重启
Delay_Ns(6);
NETCongfig(tcp_agreement,DTU_HeartData,DTU_HeartTime,DTU_IP,DTU_PORT);
}
}
/***********************************************************
【函数名称】MQTT_Initconfig
【功 能】配置MQTT服务器连接初始化配置
【输入参数】
【返回参数】Congfig_flag
【备 注】非阿里云平台登录例程
***********************************************************/
void MQTT_Initconfig()
{
//配置服务器和客户端ID
MQTT_ServerCongfig(mqtt_IP,mqtt_PORT,mqtt_deviceclientid,mqtt_HeartTime);
//配置登录平台账户密码
MQTT_CountCongfig(mqtt_username,mqtt_password,MQTT_Encryptflag);
//设置会话模式
MQTT_RemainCongfig();
//设置遗嘱模式
MQTT_WILLCongfig();
//设置订阅主题:如果存在更换平台,要使用清除订阅主题指令@clean@sub@,清除旧的订阅主题,清除时需要发保存指令才能生效。
MQTT_SubTopicConfig(mqtt_subtopic,MQTT_Qos);
//设置发布主题
MQTT_PubTopicConfig(mqtt_pubtopic,MQTT_Qos,MQTT_Retain,MQTT_Dup);
//保存参数设置
Usart2_SendString("AT+CFGPARA=SAVE");//保存参数,并等待重启
Delay_Ns(6); //延时等待,注意:只要是模块重启操作,延时等待时间要求10秒以上
}
/***********************************************************
【函数名称】NETCongfig
【功 能】配置远程服务器参数
【输入参数】Mode 协议,tcp
HeartData 心跳包内容
Time 心跳间隔时间
IP 服务器IP地址
Port 端口号
【返回参数】Congfig_flag
【备 注】无
***********************************************************/
void NETCongfig(char*Mode,char*HeartData,char*Time,char*IP,char*Port)
{
int i,j;
//注意心跳包长度,Congfig_Server申请的空间长度要大于整条指令长度。
char Congfig_Server[50]="@config@server@";
char str2[]="###";
char str1[]=",";
strcat(Congfig_Server,Mode);
strcat(Congfig_Server,str1);
strcat(Congfig_Server,HeartData);
strcat(Congfig_Server,str1);
strcat(Congfig_Server,Time);
strcat(Congfig_Server,str1);
strcat(Congfig_Server,IP);
strcat(Congfig_Server,str1);
strcat(Congfig_Server,Port);
strcat(Congfig_Server,str2);
//打印拼接后的服务器配置指令
j=strlen(Congfig_Server); //计算出长度
// printf("j=%d\n",j);
for(i=0;i<=j;i++)
{
printf("%c",Congfig_Server[i]);
}
printf("\n");
// 清除串口2缓存数据
Clear_Usart2Buf();
Delay_Ns(1);
//TCP连接--服务器配置指令
Usart2_SendString((char*)Congfig_Server);
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"AT+CFGSERVER?"))
{
Usart2_SendString("AT+CFGPARA=SAVE");
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"AT+CFGPARA?"))
{
Congfig_flag=1;
printf("Congfig_flag=%d\n",Congfig_flag);
printf("IP和端口号已配置完成,等待模块重启\n");
}
else
{
Congfig_flag=0;
printf("Congfig_flag=%d\n",Congfig_flag);
printf("配置失败,模组串口无响应,请检查串口\n");
}
}
else
{
Congfig_flag=0;
// printf("Congfig_flag=%d\n",Congfig_flag);
printf("配置指令无响应,请检查串口\n");
}
}
/***********************************************************
【函数名称】MQTT_ServerCongfig
【功 能】配置远程MQTT服务器参数
【输入参数】
Time 心跳间隔时间
IP 服务器IP地址
Port 端口号
【返回参数】无
【备 注】示例@config@server@mqtt.heclouds.com,6002,657554468,60###
***********************************************************/
void MQTT_ServerCongfig(char*IP,char*Port,char*MQTT_Client,char*Time)
{
int i,j;
char Congfig_Server[50]="@config@server@";
char str2[]="###";
char str1[]=",";
strcat(Congfig_Server,IP);
strcat(Congfig_Server,str1);
strcat(Congfig_Server,Port);
strcat(Congfig_Server,str1);
strcat(Congfig_Server,MQTT_Client);
strcat(Congfig_Server,str1);
strcat(Congfig_Server,Time);
strcat(Congfig_Server,str2);
//打印拼接后的服务器配置指令
j=strlen(Congfig_Server); //计算出长度
printf("j=%d\n",j);
for(i=0;i<=j;i++)
{
printf("%c",Congfig_Server[i]);
}
printf("\n");
// 清除串口1缓存数据
Clear_Usart2Buf();
Delay_Ns(1);
Usart2_SendString((char*)Congfig_Server);
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"AT+CFGSERVER?"))
{
printf("Server Congfig OK\n");
}
else
{
printf("Server Congfig fail!\n");
}
}
/***********************************************************
【函数名称】MQTT_CountCongfig
【功 能】配置登录账户密码
【输入参数】
MQTT_User 用户名
MQTT_Keyword 秘钥
MQTT_Encrypt 用户信息加密
【返回参数】无
【备 注】示例@config@user@220520,LBWIOT,0###
***********************************************************/
void MQTT_CountCongfig(char*MQTT_User,char*MQTT_Keyword,char*MQTT_Encrypt)
{
int i,j;
char Congfig_User[50]="@config@user@";//开辟的存储长度要根据账户密码所占长度需求设定
char str2[]="###";
char str1[]=",";
strcat(Congfig_User,MQTT_User);
strcat(Congfig_User,str1);
strcat(Congfig_User,MQTT_Keyword);
strcat(Congfig_User,str1);
strcat(Congfig_User,MQTT_Encrypt);
strcat(Congfig_User,str2);
//打印拼接后的服务器配置指令
j=strlen(Congfig_User); //计算出长度
// printf("j=%d\n",j);
for(i=0;i<=j;i++)
{
printf("%c",Congfig_User[i]);
}
printf("\n");
// 清除串口1缓存数据
Clear_Usart2Buf();
Delay_Ns(1);
Usart2_SendString((char*)Congfig_User);
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@config@user@ok###"))
{
printf("UserCount Congfig OK\n");
}
else
{
printf("UserCount Congfig fail!\n");
}
}
/***********************************************************
【函数名称】MQTT_RemainCongfig
【功 能】配置MQTT会话
【输入参数】无
【返回参数】无
【备 注】示例@config@remain@1,2018-10-31###
***********************************************************/
void MQTT_RemainCongfig()
{
// 清除串口2缓存数据
Clear_Usart2Buf();
Delay_Ns(1);
Usart2_SendString("@config@remain@1,2018-10-31###");
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@config@remain@ok###"))
{
printf("Remain Congfig OK\n");
}
else
{
printf("Remain Congfig fail!\n");
}
}
/***********************************************************
【函数名称】MQTT_WILLCongfig
【功 能】配置MQTT遗嘱消息,默认无遗嘱模式
【输入参数】无
【返回参数】无
【备 注】示例@config@will@0,0,0,0,0###
若要遗嘱模式,请参考字节拼接函数的使用方法,用户自己定义一个函数
本示例只演示MQTT 无遗嘱模式连接服务器用法
***********************************************************/
void MQTT_WILLCongfig()
{
// 清除串口2缓存数据
Clear_Usart2Buf();
Delay_Ns(1);
Usart2_SendString("@config@will@0,0,0,0,0###");
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@config@will@ok###"))
{
printf("WILL Congfig OK\n");
}
else
{
printf("WILL Congfig fail!\n");
}
}
/***********************************************************
【函数名称】 MQTT_SubTopicConfig
【功 能】 设置订阅主题
【输入参数】topicMode,对MQTT主题的操作,订阅或者取消订阅
topicname, 主题名
qos,主题等级,分别有三个 0/1/2
【返回参数】无
【备 注】订阅@config@sub@OK4ZS40G93619F5Y/+,0###
若想取消订阅,则要清除订阅主题即可
***********************************************************/
void MQTT_SubTopicConfig(char*topicname,char*topic_qos)
{
int i,j;
//注意心跳包长度,Congfig_Server申请的空间长度要大于整条指令长度。
char SUB_Topic[50]="@config@sub@";
char str1[]=",";
char str2[]="###";
strcat(SUB_Topic,topicname);
strcat(SUB_Topic,str1);
strcat(SUB_Topic,topic_qos);
strcat(SUB_Topic,str2);
//打印拼接后的服务器配置指令
j=strlen(SUB_Topic); //计算出长度
printf("j=%d\n",j);
for(i=0;i<=j;i++)
{
printf("%c",SUB_Topic[i]);
}
printf("\n");
//订阅主题
//清除串口2缓存数据
Clear_Usart2Buf();
Delay_Ns(1);
Usart2_SendString((char*)SUB_Topic);
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@config@sub@ok###")||FindString(Usart2_RX_Buf,"@config@sub@repeat###"))//成功订阅主题
{
printf("Subtopic set ok!");
}
else
{
printf("Subtopic set fail!"); //订阅失败
}
}
/***********************************************************
【函数名称】 MQTT_PubTopicConfig
【功 能】配置发布主题
【输入参数】topicname 主题
qos 主题等级
mqtt_retain 遗嘱消息是否存储到服务器
mqtt_dup 消息是否重发
mqtt_messge 要发送的消息内容
【返回参数】无
【备 注】无;@config@pub@topic,qos,retain,dup,messge###
例如@config@pub@OK4ZS40G93619F5Y,0,0,0###
***********************************************************/
void MQTT_PubTopicConfig(char*topicname,char*qos,char*mqtt_retain,char*mqtt_dup)
{
int i,j;
//注意心跳包长度,Congfig_Server申请的空间长度要大于整条指令长度。
char PUB_PubTopic[50]="@config@pub@";
char str1[]=",";
char str2[]="###";
strcat(PUB_PubTopic,topicname);
strcat(PUB_PubTopic,str1);
strcat(PUB_PubTopic,qos);
strcat(PUB_PubTopic,str1);
strcat(PUB_PubTopic,mqtt_retain);
strcat(PUB_PubTopic,str1);
strcat(PUB_PubTopic,mqtt_dup);
strcat(PUB_PubTopic,str2);
//打印拼接后的服务器配置指令
j=strlen(PUB_PubTopic);//计算出长度
printf("j=%d\n",j);
for(i=0;i<=j;i++)
{
printf("%c",PUB_PubTopic[i]);
}
// 清除串口2缓存数据
Clear_Usart2Buf();
Delay_Ns(1);
Usart2_SendString((char*)PUB_PubTopic);
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@config@pub@ok###"))
{
printf("Pubtopic set ok");
}
else
{
printf("Pubtopic set fail");
}
}
/********************************************************************
【函数名称】 GET_GNSS()
【功 能】获取GNSS定位信息
【输入参数】无
【返回参数】无
【备 注】E是东经 W是西经
N是北纬 S是南纬
假设返回:@get@decode@E114.6027950,N27.3778766,0,01###
********************************************************************/
void GET_GNSS()
{
int i,j,lenth1,lenth2;
char *pFind_1 = NULL;//指针,地址1
char *pFind_2 = NULL;//指针,地址2
char *p_buf= NULL; //分割后的字符指针
char *delim1 = ","; //分隔符
Clear_Usart2Buf(); // 清除串口2缓存数据
Delay_Ns(1);
Usart2_SendString("@get@decode@");
Delay_Ns(5); //此时要等待,获取定位需要时间
if(FindString(Usart2_RX_Buf,"@get@gnss@NoFix###")==NULL )
{
printf("GNSS Get Faile!\n");
}
else
{
printf("GNSS Get sucess!\n");
//截取这段经度数据, E114.6027950
pFind_1=strstr(Usart2_RX_Buf, "@get@decode@");
pFind_2=strstr(Usart2_RX_Buf, ",");
lenth1=pFind_2-pFind_1; //求出该地址区间数据长度
printf("lenth1=%d\n",lenth1);
for(i=12;i<lenth1;i++)
{
Buf_longitude[i]=Usart2_RX_Buf[i];
printf("longitude=%c",Buf_longitude[i]);
}
//先分割字符串,分隔符为“ ,”
p_buf = strtok(Usart2_RX_Buf,delim1);
p_buf= strtok(NULL,delim1);
lenth2=strlen(p_buf);//计算出该区间数据长度
printf("latitude_lenth2=%d\n",lenth2);//计算出该区间数据长度
printf("latitude=");
//截取这段纬度数据,N27.3778766
for(j=0;j<lenth2;j++)
{
Buf_latitude[j]=p_buf[j];
printf("%c",Buf_latitude[j]);
}
}
}
/***********************************************************
【函数名称】 GET_IMEI()
【功 能】获取IMEI号
【输入参数】无
【返回参数】无
【备 注】无;IMEI号长度15个字节
***********************************************************/
void GET_IMEI()
{
int i,j=0,m;
for(m=0;m<3;m++)
{
Clear_Usart2Buf(); // 清除串口1缓存数据
Delay_Ns(1);
Usart2_SendString("@get@imei@");
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@get@imei@error"))
{
printf("IMEI号获取失败!\n");
printf("故障提示:(1)请检查模块是否开机?\n");
printf("故障提示:(2)请检查串口通信是否故障?\n");
}
else
{
printf("IMEI:");
for(i=10;i<25;i++)
{
Buf_IMEI[j]=Usart2_RX_Buf[i];
printf("%c",Buf_IMEI[j]);
j++;
}
printf("\n");
break ;
}
}
}
/***********************************************************
【函数名称】 GET_CSQ
【功 能】获取信号值
【输入参数】无
【返回参数】无
【备 注】无
***********************************************************/
void GET_CSQ()
{
int i,j=0,m;
for(m=0;m<3;m++)//查询5次
{
Clear_Usart2Buf();//清除串口1缓存数据
Delay_Ns(1);
Usart2_SendString("@get@csq@");
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@get@csq@error"))
{
printf("4G信号CSQ值获取失败!\n");
printf("故障提示:(1)请检查模块是否开机?\n");
printf("故障提示:(2)请检查串口通信是否故障?\n");
printf("故障提示:(3)请检查SIM卡是否插入?\n");
}
else
{
printf("4G信号CSQ=");
for(i=9;i<11;i++)
{
Buf_CSQ[j]=Usart2_RX_Buf[i];
printf("%c",Buf_CSQ[j]);
j++;
}
printf("\n");
break;
}
}
}
/***********************************************************
【函数名称】 GET_SIM_ICCID()
【功 能】获取ICCID号
【输入参数】无
【返回参数】无
【备 注】1获取成功,0获取失败
***********************************************************/
void GET_ICCID()
{
int i,j=0,m;
for(m=0;m<3;m++)//查询3次
{
Clear_Usart2Buf();// 清除串口2缓存数据
Delay_Ns(1);
Usart2_SendString("@get@iccid@");
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@get@iccid@error"))
{
printf("ICCID 获取失败!\n");
printf("故障提示:(1)请检查串口通信是否故障?\n");
printf("故障提示:(2)请检查SIM卡是否插入?\n");
}
else
{
printf("SIM卡ICCID:");
for(i=12;i<31;i++)
{
Buf_ICCID[j]=Usart2_RX_Buf[i];
printf("%c",Buf_ICCID[j]);
j++;
}
printf("\n");
break;
}
}
}
/***********************************************************
【函数名称】 GET_AGPS_Position()
【功 能】获取基站定位信息
【输入参数】无
【返回参数】无
【备 注】1获取成功,0获取失败
DTU指令: @get@position@
示例:模块反馈的信息 @get@position@113.3851478,023.1598603###
***********************************************************/
void GET_AGPS_Position()
{
int i,k=0,j=0,m;
char Buf_AGPS_LOG[]={0}; //经度
char Buf_AGPS_LAT[]={0}; //纬度
for(m=0;m<3;m++)//查询3次
{
Clear_Usart2Buf();// 清除串口1缓存数据
Delay_Ns(1);
Usart2_SendString("@get@position@");
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@get@position@error"))
{
printf("AGPS_Position基站定位信息获取失败!\n");
printf("故障提示:(1)请检查串口通信是否故障?\n");
printf("故障提示:(2)请检查SIM卡是否插入?\n");
}
else
{
printf("AGPS_Position基站定位信息:\n");
printf("经度:");
for(i=14;i<25;i++)
{
Buf_AGPS_LOG[j]=Usart2_RX_Buf[i];//获取经度
printf("%c",Buf_AGPS_LOG[j]);
j++;
}
printf("\n");
printf("纬度:");
for(i=26;i<37;i++)
{
Buf_AGPS_LAT[k]=Usart2_RX_Buf[i];//获取纬度
printf("%c",Buf_AGPS_LAT[k]);
k++;
}
printf("\n");
break;
}
}
}
/***********************************************************
【函数名称】 GET_Version()
【功 能】获取版本号
【输入参数】无
【返回参数】无
【备 注】1获取成功,0获取失败
DTU指令: @get@version@
示例:模块反馈的信息@get@version@V00.00.026###
***********************************************************/
void GET_Version()
{
int i,j=0,m;
for(m=0;m<3;m++)
{
Clear_Usart2Buf(); // 清除串口1缓存数据
Delay_Ns(1);
Usart2_SendString("@get@version@");
Delay_Ns(1);
if(FindString(Usart2_RX_Buf,"@get@position@error###"))
{
printf("版本号获取失败!\n");
printf("故障提示:(1)请检查模块是否开机?\n");
printf("故障提示:(2)请检查串口通信是否故障?\n");
}
else
{
printf("模块固件版本号Version:");
for(i=14;i<23;i++)
{
Buf_IMEI[j]=Usart2_RX_Buf[i];
printf("%c",Buf_IMEI[j]);
j++;
}
printf("\n");
break ;
}
}
}
/****************************************************************
【函数名称】 Check_DTU_network
【功 能】 检测模块状态
【输入参数】num 检测次数
【返回参数】无
【备 注】检测模块是否已就绪。每间隔1秒查询一次
*****************************************************************/
void Check_DTU_network(u8 num)
{
int k;
for(k=0;k<num;k++)//检测TCP连接状态
{
Clear_Usart2Buf(); // 清除串口2缓存数据
Delay_Nms(100);
Usart2_SendString("@get@netstate@");//查询网络连接状态
Delay_Nms(400);
if(FindString(Usart2_RX_Buf,"@get@netstate@ok"))
{
TCP_Connectflag=1;
printf("TCP_Connectflag=%d\n",TCP_Connectflag);
printf("TCP连接成功!\n");
break;
}
else
{
TCP_Connectflag=0;
printf("TCP_Connectflag=%d\n",TCP_Connectflag);
printf("TCP连接失败!\n");
printf("故障提示:(1)请检查模块IP地址和端口是否正确?\n");
printf("故障提示:(2)请检查SIM卡是否欠费?是否被地域限制和机卡绑定?\n");
}
}
}
/****************************************************************
【函数名称】 Login_OneNET_Server
【功 能】 登陆OneNET服务器平台
【输入参数】number 次数
【返回参数】无
【备 注】发送登录包,重发number次
*****************************************************************/
void Login_OneNET_Server(u8 number)
{
u8 j,m;
//如果登陆包发送成功,服务器会应答设备OK
for(j=0;j<number;j++)
{
for(m=0;m<=strlen(LoginMessage);m++)//打印登录包信息
{
printf("%c",LoginMessage[m]);
}
printf("\n");
Clear_Usart2Buf(); // 清除串口1缓存数据
Delay_Nms(100);
Usart2_SendString(LoginMessage);
Delay_Nms(400);//延时等待
if(FindString(Usart2_RX_Buf,"received"))
{
Login_OneNET_flag=1;
printf("登陆包发送成功!\n");
break;
}
else
{
Login_OneNET_flag=0;
printf("登陆包发送失败!\n");
printf("故障提示:(1)请检查服务器平台是否存在该设备编号?\n");
printf("故障提示:(2)请检登录包格式是否完整?\n");
}
}
}
/****************************************************************
【函数名称】 Login_Message
【功 能】 组建登录包
【输入参数】无
【返回参数】无
【备 注】检测模块是否已就绪。每间隔1秒查询一次,超时时间为20秒
使用strcat()函数向str1字符串追加内容的时候,由于str1空间比较小,
而追加的字符又很多,就会导致多出来的字符溢出到相邻的存储空间中,
导致软件运行奔溃。
*****************************************************************/
void Login_Message()
{
/*在OneNET平台上LUA脚本取名要与登录包中的脚本名称要一致*/
char str1[]="#cupluas*";//关联的LUA脚本名称:cupluas
strcat(LoginMessage,Buf_IMEI);//拼接IMEI
strcat(LoginMessage,str1);//拼接脚本名称
strcat(LoginMessage,"\0");//拼接结尾符
}
/****************************************************************
【函数名称】 FindString
【功 能】判断缓存中是否含有指定的字符串
【输入参数】字符串 p
【返回参数】整型值1或0
【备 注】调用extern char *strstr(char *str1, char *str2)该函数
*****************************************************************/
int FindString(char* p1,char* p2)
{
if(strstr(p1,p2)!=NULL)
{
return 1;
}
return 0;
}
/***********************************************************
【函数名称】LTE_KEYGPIOConfig
【功 能】配置LTE_KEY GPIO端口
【输入参数】无
【返回参数】无
【备 注】电源通断引脚KEY GPIO配置
***********************************************************/
void LTE_KEYGPIOConfig()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LTE_PWRKEY_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = LTE_PWRKEY;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LTE_PWRKEY_PORT, &GPIO_InitStructure);
}
/***********************************************************
【函数名称】LTE_RSTGPIOConfig
【功 能】配置LTE_RST GPIO端口
【输入参数】无
【返回参数】无
【备 注】推挽输出
***********************************************************/
void LTE_RSTGPIOConfig()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LTE_RST_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = LTE_RST;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LTE_RST_PORT, &GPIO_InitStructure);
}
/***********************************************************
【函数名称】LTE_DTU_RESET
【功 能】复位DTU模块
【输入参数】无
【返回参数】无
【备 注】推挽输出
***********************************************************/
void LTE_DTU_RESET()
{
LTE_RST_H;//拉高复位模块
Delay_Nms(200);//延时200ms
LTE_RST_L;//拉低,禁止复位
Delay_Ns(5);//延时5秒,等待模块完成重启
}
在不更改原代码的情况下,将DTU指令更改为AT指令
最新发布