在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Android手机应用开发 → 基于SIM7000防盗标签之IIC代码

基于SIM7000防盗标签之IIC代码

Android手机应用开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.43M
  • 下载次数:8
  • 浏览次数:326
  • 发布时间:2018-05-08
  • 实例类别:Android手机应用开发
  • 发 布 人:wgang
  • 文件格式:.rar
  • 所需积分:2
 相关标签: c 标签 IM 7 代码

实例介绍

【实例简介】基于SIM7000的防盗标签部分之IIC通信

【实例截图】

from clipboard

【核心代码】



#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; 

}

标签: c 标签 IM 7 代码

实例下载地址

基于SIM7000防盗标签之IIC代码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警