实例介绍
【实例简介】基于SIM7000的防盗标签部分之IIC通信
【实例截图】
【核心代码】
#include "stm32f10x_map.h"
#include "stm32f10x_type.h"
#include "EEPROM.h"
#include "USART.h"
#include "GSM.h"
#include "timer.h"
#include "strs.h"
#include "USBData.h"
extern u16 gsm_num;
extern u8 gsm_datas[1000],time_now[2],time_set[3];
extern u8 httpdata[10][15],httpnum[10];
u8 SendServerData[250]="GET /location_service?";
u8 SendServerNum=0;
//----------------------------------------------------------------------------------------------------------------------------------------------
//等待接收字符串,超时时间10秒
//返回值:0--正确,其他--错误
u8 WaitForStr(u8 *p,u16 num,u8 timeout)
{
u8 i,j=0,tim=0,err=0;
LED_ON();
while(j<timeout)
{
if(gsm_num>0)
{
i=FindStr(gsm_datas,p,gsm_num,num);
if(i>0)
{
break;
}
}
delay_ms(100);
tim ;
if(tim>10) //超时
{
j ;
tim=0;
}
}
if(j>=timeout)
err=1;
LED_OFF();
delay_ms(100);
gsm_num=0;
return err;
}
//----------------------------------------------------------------------------------------------------------------------------------------------
//判断信号质量是否符合要求
//返回值:0--正确,其他--错误
u8 AssertCSQ(void)
{
u8 i,j,k,err=0,tim=0,dat[4],*p;
LED_ON();
while(1)
{
if(gsm_num>0)
{
i=FindStr(gsm_datas,"CSQ:",gsm_num,4);
if(i>0)
{
break;
}
}
delay_ms(20);
tim ;
if(tim>100) //超时
{
err=1;
break;
}
}
LED_OFF();
if(err==0) //非超时
{
if(i>0) //已经找到信号质量标志数据
{
p=gsm_datas;
p =i;
dat[0]=0;
for(j=0;j<10;j )
{
p ;
if(*p>0x2F && *p<0x3A) //数字
{
dat[0]*= 10;
k=*p-0x30;
dat[0] =k;
}
else if(*p==',')
break;
}
dat[1]=0;
for(j=0;j<10;j )
{
p ;
if(*p>0x2F && *p<0x3A) //数字
{
dat[1]*= 10;
k=*p-0x30;
dat[1] =k;
}
else if(*p==0x0D || *p==0x0A)
break;
}
if(dat[0]>1 && dat[0]<32) //2-31信号正常
{
if(dat[1]>7) //0-7信号正常
err=2;
}
else err=2;
}
}
gsm_num=0;
delay_100ms(2);
return err;
}
//----------------------------------------------------------------------------------------------------------------------------------------------
//读取IMEI
//AT GSN 861262010657850 OK
void AssertIMEI(void)
{
u8 i,j,k,tim=0,err=0,*p;
LED_ON();
while(1)
{
if(gsm_num>0)
{
i=FindStr(gsm_datas,"GSN",gsm_num,3);
if(i>0)
{
break;
}
}
delay_ms(20);
tim ;
if(tim>100) //超时
{
err=1;
break;
}
}
LED_OFF();
if(err==0) //非超时
{
if(i>0) //已经找到IMEI数据
{
p=gsm_datas;
p =i;
k=0;
for(j=0;j<20;j )
{
p ;
if(*p>0x2F && *p<0x3A) //数字
{
httpdata[0][k]=*p;
k ;
}
if(k>=15)
break;
}
httpnum[0]=k;
}
}
gsm_num=0;
delay_100ms(2);
}
//----------------------------------------------------------------------------------------------------------------------------------------------
//读取电池电量
//AT CBC CBC: 0,100,4220 OK
void AssertBATT(void)
{
u8 i,j,k,tim=0,err=0,dat[4],*p;
LED_ON();
while(1)
{
if(gsm_num>0)
{
i=FindStr(gsm_datas,"CBC:",gsm_num,4);
if(i>0)
{
break;
}
}
delay_ms(20);
tim ;
if(tim>100) //超时
{
err=1;
break;
}
}
LED_OFF();
if(err==0) //非超时
{
if(i>0) //已经找到电池电量标志数据
{
p=gsm_datas;
p =i;
for(j=0;j<10;j ) //找到逗号
{
p ;
if(*p==',')
break;
}
dat[0]=0;
for(j=0;j<10;j )
{
p ;
if(*p>0x2F && *p<0x3A) //数字
{
dat[0]*= 10;
k=*p-0x30;
dat[0] =k;
}
else if(*p==',')
break;
}
if(dat[0]<101) //0-100正常
{
httpdata[9][0]=dat[0]/100 0x30;
k=dat[0]%100;
httpdata[9][1]=k/10 0x30;
httpdata[9][2]=k%10 0x30;
httpnum[9]=3;
}
}
}
gsm_num=0;
delay_100ms(2);
}
//----------------------------------------------------------------------------------------------------------------------------------------------
//判断服务器返回值是否正确
//返回值:0--正确,其他--错误
u8 AssertData(void)
{
u16 i,j,k,tim=0;
u8 err=0,dat[5],*p,tmp[5];
LED_ON();
while(1)
{
if(gsm_num>0)
{
i=FindStr(gsm_datas,"ok,",gsm_num,3);
if(i>0)
{
break;
}
}
delay_ms(100);
tim ;
if(tim>200) //超时
{
err=1;
break;
}
}
LED_OFF();
if(err==0) //非超时
{
i=FindStr(gsm_datas,"Date:",gsm_num,5);
print("SeverOK");
if(i>0) //已经找到服务器时间数据
{
p=gsm_datas;
p=p i 20;
print("ServerTimeOK");
//==================================================
//校准时钟
for(j=0;j<15;j ) //找到时钟数据中的第一个冒号
{
p ;
if(*p==':')
break;
}
//读取小时
dat[0]=0;
j=*(p-2);
if(j=='1')
dat[0]=10;
else if(j=='2')
dat[0]=20;
j=*(p-1);
if(j>0x2F && j<0x3A)
{
j-=0x30;
dat[0] =j;
}
//读取分钟
dat[1]=0;
p ;
j=*p;
if(j>0x2F && j<0x3A)
{
j-=0x30;
dat[1]=j;
}
p ;
j=*p;
if(j>0x2F && j<0x3A)
{
j-=0x30;
dat[1]*=10;
dat[1] =j;
}
if(dat[0]<24 && dat[1]<60)
{
time_now[0]=dat[0];
time_now[1]=dat[1]; //时间校准
tmp[0]=dat[0]/10 0x30;
tmp[1]=dat[0]%10 0x30;
tmp[2]=':';
tmp[3]=dat[1]/10 0x30;
tmp[4]=dat[1]%10 0x30;
print(tmp);
}
//==================================================
//查看服务器返回数据
p =8;
for(j=0;j<6;j ) //找到返回数据中的第一个逗号
{
p ;
if(*p==',')
break;
}
//数据发生变化才写入数据
if(k>0)
{
SaveSettings();
LoadSettings();
}
}
}
gsm_num=0;
delay_100ms(2);
return err;
}
//----------------------------------------------------------------------------------------------------------------------------------------------
//GPRS联网
u8 GPRSConnect(void)
{
u8 i,err=0;
//设定工作模式ECHO
SendAT("ATE1",4);
err=WaitForStr("OK",2,2); //ATE1 OK
if(err>0)
return err;
//查询信号质量
SendAT("AT CSQ",6);
i=AssertCSQ(); //AT CSQ CSQ: 12,0 OK
if(i==0)
{
print("GSMCSQOK");
//是否注册网络
SendAT("AT CGREG?",9);
err=WaitForStr(" CGREG:",7,2); //AT CGREG? CGREG: 0,3 OK
if(err>0)
return err;
//是否附着gprs网络
SendAT("AT CGATT?",9);
err=WaitForStr(" CGATT:",7,2); //AT CGATT? CGATT: 0 OK
if(err>0)
return err;
delay_100ms(10);
//先关闭所有场景
SendAT("AT CIPSHUT",10);
err=WaitForStr("SHUT OK",7,15); //AT CIPSHUT SHUT OK
if(err>0)
return err;
delay_100ms(10);
//打开APN
SendAT("AT CSTT",7);
err=WaitForStr("OK",2,5); //AT CSTT OK
if(err>0)
return err;
delay_100ms(20);
//打开移动场景
SendAT("AT CIICR",8);
delay_100ms(20);
err=WaitForStr("OK",2,10); //AT CIICR OK
if(err>0)
return err;
delay_100ms(5);
//获取本机IP
SendAT("AT CIFSR",8);
err=WaitForStr(" CIFSR",6,2); //AT CIFSR 10.222.243.153
if(err>0)
return err;
}
else return err;
return err;
}
u8 GPRSSendData(void)
{
u8 i,j;
j=0;
while(j<3)
{
//建立TCP连接
j ;
print("GSMConnectSever");
SendAT("AT CIPSTART=\"TCP\",\"115.28.48.200\",80",36);
delay_100ms(20);
i=WaitForStr("CONNECT OK",10,20); //AT CIPSTART="TCP","115.28.48.200",80 OK CONNECT OK
if(i>0) //未能成功连接
GPRSConnect();
else break;
}
if(i==0) //成功连接
{
delay_100ms(5);
print("GSMSendData");
//发送HTTP数据
SendAT("AT CIPSEND",10);
WaitForStr(">",1,2); //AT CIPSTART="TCP","115.28.48.200",80 OK CONNECT OK
SendATData(SendServerData,SendServerNum);
delay_100ms(10);
i=AssertData();
delay_100ms(10);
if(i==0)
print("GSMSendSuccess");
else print("GSMSendError");
//关闭连接
SendAT("AT CIPCLOSE",11);
WaitForStr("CLOSE OK",8,5); //AT CIPCLOSE CLOSE OK
return 0;
}
else return 1;
}
u8 GPRSSleep(void)
{
u8 err=0,j=0;
print("GSMEnterSleep");
while(j<5) //连接5次,如果成功则进行数据发送,失败则直接结束程序
{
SendAT("AT CSCLK=1",10);
err=WaitForStr("OK",2,2); //AT CSTT OK
if(err==0)
break;
else j ;
}
return err;
}
u8 GPRSWakeup(void)
{
u8 i,j=0;
gsm_num=0;
while(j<20)
{
for(i=0;i<20;i )
{
SendAT("AT CSCLK=0",10);
delay_ms(30);
}
delay_ms(150);
j ;
i=FindStr(gsm_datas,"OK",gsm_num,2);
if(i>0)
break;
}
delay_ms(800);
gsm_num=0;
if(j>=10) //唤醒失败则返回错误
return 1;
else return 0;
}
u8 GPRSPowerOn(void)
{
u8 i,err=0;
u16 j;
if(GSM_STA==0) //关机状态
{
LED_ON();
GSM_ON();
j=0;
while(GSM_STA==0)
{
delay_100ms(2);
j ;
if(j>20)
break;
}
delay_100ms(2);
GSM_OFF();
LED_OFF();
if(j>100) //开机失败则返回错误
err=2;
else
{
delay_100ms(40);
//等待模块正常工作
WaitForStr("Ready",5,20);
delay_100ms(80);
j=0;
while(j<5) //连接5次,如果成功则进行数据发送,失败则直接结束程序
{
i=GPRSConnect();
if(i==0)
break;
else j ;
}
if(i>0)
err=1;
}
}
else
{
j=0;
while(j<5) //唤醒5次,如果成功则进行数据发送,失败则直接结束程序
{
err=GPRSWakeup(); //休眠状态
if(err==0)
break;
else j ;
}
}
return err;
}
//----------------------------------------------------------------------------------------------------------------------------------------------
//发送GPRS数据
u8 SendGPSData(void)
{
u8 err=0;
err=GPRSPowerOn();
if(err==0) //开机并联网成功
{
print("GSMPowONSuccess");
//读取IMEI
if(httpdata[0][0]!='8') //只读取一次IMEI
{
SendAT("AT GSN",6);
AssertIMEI(); //AT GSN 861262010657850 OK
}
//读取电量
SendAT("AT CBC",6);
AssertBATT(); //AT CBC CBC: 0,100,4220 OK
//数据编码
EncodeData();
//发送数据
GPRSSendData();
//休眠
err=GPRSSleep();
}
return err;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------------------------------
//HTTP编码
void EncodeData(void)
{
u8 i,j,num=0;
u8 httphost[58]=" HTTP/1.1\r\nHost: 111.20.22.205\r\nConnection: Keep-Alive\r\n\r\n";
u8 httpratio[10][10]={"dev=","&lat=","&long=","&lad=","&lod=","&accu=","&sp=","&direct=","&alt=","&bat="};
u8 httprationum[10]={4,5,6,5,5,6,4,8,5,5};
num=22;
//写数据部分
for(i=0;i<10;i )
{
//写参数名称
for(j=0;j<10;j )
{
if(j>= httprationum[i])
break;
else
{
SendServerData[num]=httpratio[i][j];
num ;
}
}
//写参数内容
for(j=0;j<15;j )
{
if(j>= httpnum[i])
break;
else
{
SendServerData[num]=httpdata[i][j];
num ;
}
}
}
//写结尾部分
for(i=0;i<58;i )
{
SendServerData[num]=httphost[i];
num ;
}
SendServerNum=num;
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论