基本信息
源码名称:基于SIM7000防盗标签之IIC代码
源码大小:0.43M
文件格式:.rar
开发语言:C/C++
更新时间:2018-05-08
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
基于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; }