1、状态机机制的gprs拨号

像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时。

所以用 状态机 + 超时 的机制来实现比较合理。

如下代码片段来描述数据透传 : 状态机 + 超时 这种机制(代码片段,仅用来描述一种思路)

以下程序是在没有操作系统调度机制下调试的,所以超时用的心跳,如果是linux下,有sleep更方便。

#include <stdio.h>
#include <string.h>
#include <stdlib.h> #define SERVER_IP "115.29.140.xxx"
#define SERVER_PORT "8082" #define BUFF_LEN 64
char aUart5RxBuffer[BUFF_LEN]; static int gprs_init_ok= ;
static int ppp_config_ok = ; void gprs_init(void)
{
if((strstr(aUart5RxBuffer, "command ready") == NULL)
/*||(strstr(aUart5RxBuffer, "+SIM READY") == NULL)*/)
{
gprs_init_ok = ;
}
else
{
gprs_init_ok = ;
} } void reset_gprs(void)
{
memset(aUart5RxBuffer, , BUFF_LEN);
gprs_init_ok= ;
ppp_config_ok = ;
//reset 3g module;
} void ppp_config(void)
{
static uint32_t ppp_config_step = ;
static uint32_t gprs_tick = ; switch (ppp_config_step)
{
case :
gprs_puts("AT+GTSET=\"LPMMODE\",0\r\n");
gprs_tick = msTicks;
ppp_config_step = ;
break;
case :
if((msTicks - gprs_tick) > )
{
if(strstr(aUart5RxBuffer, "OK") == NULL)
{
ppp_config_step = ;
}
else
{
ppp_config_step = ; }
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; case :
gprs_puts("AT+CPIN?\r\n");
ppp_config_step = ;
gprs_tick = msTicks;
break;
case :
if((msTicks - gprs_tick) > )
{
if((strstr(aUart5RxBuffer, "OK") == NULL) || (strstr(aUart5RxBuffer, "+CPIN: READY") == NULL))
{
ppp_config_step = ;
}
else
{
ppp_config_step = ; }
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; case :
gprs_puts("AT+CSQ\r\n");
ppp_config_step = ;
gprs_tick = msTicks;
break;
case :
if((msTicks - gprs_tick) > )
{
if(strstr(aUart5RxBuffer, "OK") == NULL)
{
ppp_config_step = ;
}
else
{
ppp_config_step = ;
}
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; case :
gprs_puts("AT+CREG?\r\n");
ppp_config_step = ;
gprs_tick = msTicks;
break;
case :
if((msTicks - gprs_tick) > )
{
if(strstr(aUart5RxBuffer, "+CREG: 0,0") == NULL)
{
ppp_config_step = ;
}
else
{
ppp_config_step = ;
}
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; case :
//gprs_puts("AT+MIPCALL=1,\"3GNET\"\r\n");
gprs_puts("AT+MIPCALL=1,\"xagfzqx.ydoa.snapn\"\r\n");
ppp_config_step = ;
gprs_tick = msTicks;
break;
case :
if((msTicks - gprs_tick) > )
{
if(strstr(aUart5RxBuffer, "+MIPCALL: 0") == NULL)
{
ppp_config_step = ;
ppp_config_ok = ;
}
else
{
ppp_config_step = ;
}
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; default:
break;
} } void http_Send_test(char *data)
{
static unsigned char http_send_step = ;
static int send_err_cnt = ; switch (http_send_step)
{
case :
memset(data_tx_buf, , sizeof(data_tx_buf));
strcat(data_tx_buf, data);
gprs_puts("GET /app/pulse-wave/commit?");
gprs_puts("%s",data_tx_buf);
gprs_puts("\r\n"); http_send_step = ;
gprs_tick = msTicks; break; case : if((strstr(aUart5RxBuffer, "{\"msg\":\"commit pulse-wave data success.\",\"result\":true}") != NULL)
&&(strstr(aUart5RxBuffer, "+MIPSTAT: 1,1") != NULL)
&&((msTicks - gprs_tick) < ))
{ }
else
{
if(++send_err_cnt > ) {
reset_gprs();
send_err_cnt = ;
} }
     
     memset(aUart5RxBuffer, 0, BUFF_LEN);   
        http_send_step = ;              

        break;                                              

    default:
break; }
} void main(void)
{
while()
{
if(!gprs_init_ok) { gprs_init(); } if((gprs_init_ok)&&(!ppp_config_ok)) { ppp_config(); } if(ppp_config_ok) { http_Send_test("hello,world"); }
}
}

初始化成功了就可以传输数据了,数据发送和接收都跟串口一样。主要工作都在初始化 ,和异常修复机制的实现。因为网络传输每一步都可能会失败,而且外部因素太多,所以异常修复机制尤其重要。

2、用开源的ppp/pppoe指令拨号也一样

end

GSM/GPRS/3G/4G的更多相关文章

  1. 4G DTU比GPRS/3G DTU的优势

    4G DTU一般来说是采用电脑和数据线连接来进行参数设置的,为了适应不同的工作环境,提高工作的效率,成都远向电子4G DTU还支持远程参数配置和远程固件升级,只需一部手机即可轻松完成操作.今天我们就来 ...

  2. 转:Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

  3. GSM Hacking:如何对GSM/GPRS网络测试进行测试

    写在前面 这里需要介绍的是GSM / GPRS网络测试的一些方法,随着现在硬件设备连网现象的普遍存在,例如智能电表.自动变速箱控制单元(TCU).POS机.报警系统等.这些设备通常需要与网络连接,GS ...

  4. Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

  5. 3G 4G 5G中的网络安全问题——文献汇总

    Modeling and Analysis of RRC-Based Signalling Storms in 3G Networks 还是使用状态机模型来做恶意UE识别 https://san.ee ...

  6. GPRS/3G

    像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时. 所以用 状态机 + 超时 的机制来实现比较合理. 如下代码片段来描述数据透传 : 状态机 + 超 ...

  7. iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

    前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也 ...

  8. (转)Android 判断用户2G/3G/4G移动数据网络

    在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需(要根据用户当前网络情况来做一些调整的,也可以在 App 的设置模块里,让用户自己选择,在 2G ...

  9. 通信网络 2G 3G 4G 和路由器2.4G 5G的区分和关系

    通信网络 2G 3G 4G 和路由器2.4G 5G的区分和关系 作者:魔仙圆缘链接:https://www.zhihu.com/question/34076333/answer/57850104来源: ...

随机推荐

  1. linux学习笔记13--命令head和tail

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  2. c# 中的UserControl是什么 用户控件和自定义控件有什么区别

    用户控件是许多控件的集成 自定义控件是自己写一个控件类,或者继承已有的控件类 复合控件是封装在公共容器内的 Windows 窗体控件的集合.这种控件有时称为“用户控件”.包含的控件称为“构成控件”. ...

  3. hdu1695 GCD 莫比乌斯反演做法+枚举除法的取值 (5,7),(7,5)看做同一对

    /** 题目:hdu1695 GCD 链接:http://acm.hdu.edu.cn/status.php 题意:对于给出的 n 个询问,每次求有多少个数对 (x,y) , 满足 a ≤ x ≤ b ...

  4. 【Android Studio】之构建项目报错

    问题1: 报错: Could not download fastutil.jar (it.unimi.dsi:fastutil:7.2.0): No cached version available ...

  5. 快使用阿里云的maven仓库

    自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从此不在浪费生命…… 仓库地址: ...

  6. Swift-7-闭包

    // Playground - noun: a place where people can play import UIKit // swift 中闭包与C和OC中的blocks比较相似 // 1. ...

  7. JQuery基本选择器和基本动画方法总结

    刚开始接触JQuery是在大三的时候,那时候先学的Javascript,然后跳跃到JQuery,就一个字,爽.但因为之前用的不是太多,所以很多都忘了,直接导致的后果就是之前在一家公司面试,面试官问我要 ...

  8. VS2008 调试出现错误 "Unable to start debugging."

    之前用的好好的调试功能,今天“F5”出现了 "Unable to start debugging." 的错误: 解决办法: 打开工程属性,选择“Debugging”,看看“Debu ...

  9. MySQL设置密码的三种方法

    其设置密码有三种方法: a. ./mysqladmin -u root -p oldpassword newpasswd(记住这个命令是在/usr/local/mysql/bin中外部命令) b. S ...

  10. Faster R-CNN利用新的网络结构来训练

    前言 最近利用Faster R-CNN训练数据,使用ZF模型,效果无法有效提高.就想尝试对ZF的网络结构进行改造,记录下具体操作. 一.更改网络,训练初始化模型 这里为了方便,我们假设更换的网络名为L ...