SIM7070G Arduino NB-IoT/LTE/GPRS 扩展板

产品简介

这款NB-IoT扩展板专为Arduino控制器设计,兼容全球频段,支持CAT-M、NB-IoT、GSM、GPRS、EDGE的通信方式以及GNSS的卫星定位功能。

其超低功耗和精准定位特性,加上对CAT-M和GNSS卫星定位的支持,使它成为智慧物流、资产跟踪、智慧城市等领域的理想选择。

该扩展板不仅适用于原型开发,也适用于小批量生产,是低功耗、低延迟、中等吞吐量应用的最佳选择。它内置了GNSS卫星定位,如GPS、GLONASS、Galileo和BD,非常适合用于远程控制、移动追踪等物联网应用。

SIM7070G还内置了丰富的AT指令,并提供了详细的库、使用手册和应用文档,包括HTTP、MQTT、FTP、CoAP、NIDD、PING等网络通信协议的使用方法,让你无需深入学习底层网络协议,即可快速上手。

最重要的是,SIM7070G已通过全球多个国家和地区的相关认证,具体如下:

有了以上的相关机构的检测和认证,你可以放心的将SIM7070G用于你的产品或项⽬,无需担心合规问题。

产品特点

应用场景

产品参数

功能示意图

注意:

1.软硬串口切换开关:由于Arduino UNO/Mega等控制器默认D0和D1为硬件串口,与USB端相连。很多需要使用串口的扩展板,在使用时会出现串口冲突的问题,所有特别设计了一个软串口接口,用户可以使用软串口和Arduino进行通信。扩展阅读:

2.为了方便程序控制,Boot按键默认引至D12引脚,可以通过拉高D12引脚2秒实现模块的开机。SIM7070G开机后会有2秒左右初始化时间,初始化完成后可正常使用。

尺寸图

使用教程(基于SIM7070库)

准备工作

硬件连接

将扩展板插在Arduino UNO控制器上

样例代码(串口AT指令)

#include <DFRobot_SIM7070G.h>

#define PIN_TX     7
#define PIN_RX     8
SoftwareSerial     mySerial(PIN_RX, PIN_TX);
DFRobot_SIM7070G    sim7070g(&mySerial);

void setup()
{
  delay(1500);  
  Serial.begin(19200);
  mySerial.begin(19200);

  Serial.println("Turn ON SIM7070G......");
  if (sim7070g.turnON()) {      
    Serial.println("Turn ON !");
  }

  Serial.println("Set baud rate......");
  while (1) {
    if (sim7070g.setBaudRate(19200)) {              
      Serial.println("Set baud rate:19200");
      break;
    } else {
      Serial.println("Faile to set baud rate");
      delay(1000);
    }
  }

  Serial.println("For example, if you type AT\\r\\n, OK\\r\\n will be responsed!");
  Serial.println("Enter your AT command :");
}

void loop()
{
  mySerial.listen();
  while (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  mySerial.flush();
  while (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

结果

在串口监视器里发送AT命令来控制SIM7070G扩展板,并查看扩展板的响应

样例代码(GNSS定位)

#include <DFRobot_SIM7070G.h>

#define PIN_TX     7
#define PIN_RX     8
SoftwareSerial     mySerial(PIN_RX, PIN_TX);
DFRobot_SIM7070G    sim7070g(&mySerial);

void setup()
{
  delay(1500);   
  Serial.begin(115200);
  mySerial.begin(19200);

  Serial.println("Turn ON SIM7070G......");
  if (sim7070g.turnON()) {                                          
    Serial.println("Turn ON !");
  }

  Serial.println("Set baud rate......");
  while (1) {
    if (sim7070g.setBaudRate(19200)) {                            
      Serial.println("Set baud rate:19200");
      break;
    } else {
      Serial.println("Faile to set baud rate");
      delay(1000);
    }
  }

  Serial.println("Check SIM card......");
  if (sim7070g.checkSIMStatus()) {                                  
    Serial.println("SIM card READY");
  } else {
    Serial.println("SIM card ERROR, Check if you have insert SIM card and restart SIM7070G");
    while (1);
  }

  Serial.println("Init positioning function......");
  while (1) {
    if (sim7070g.initPos()) {
      Serial.println("Positioning function initialized");
      break;
    } else {
      Serial.println("Fail to init positioning function");
      delay(1000);
    }
  }
}

void loop()
{
  Serial.println("Enter anything end with CRLF to get positioning ");
  char loge[10];
  readSerial(loge);
  Serial.println("Getting position......");
  if (sim7070g.getPosition()) {                                     
    Serial.print(" Longitude : ");
    Serial.println(sim7070g.getLongitude());                    
    Serial.print(" Latitude : ");
    Serial.println(sim7070g.getLatitude());                    
  } else {
    Serial.println("Wrong data try again");
  }
}

int readSerial(char result[])
{
  int i = 0;
  while (1) {
    while (Serial.available() > 0) {
      char inChar = Serial.read();
      if (inChar == '\n') {
        result[i] = '\0';
        Serial.flush();
        return 0;
      }
      if (inChar != '\r') {
        result[i] = inChar;
        i++;
      }
    }
  }
}

结果

串口监视器上会打印一些初始化成功的信息,之后会打印经纬度信息

样例代码(MQTT连接)

#include <DFRobot_SIM7070G.h>

#define serverIP        "iot.dfrobot.com"
#define IOT_USERNAME    "USERNAME"
#define IOT_KEY         "PASSWORD"
#define IOT_TOPIC       "TOPIC"
#define IOT_CLIENT      "dfrobot"

#define PIN_TX          7
#define PIN_RX          8

SoftwareSerial          mySerial(PIN_RX, PIN_TX);
DFRobot_SIM7070G         sim7070g(&mySerial);

void setup()
{
  delay(1500);   
  int signalStrength;
  Serial.begin(115200);
  mySerial.begin(19200);

  Serial.println("Turn ON SIM7070G......");
  if (sim7070g.turnON()) {                                        
    Serial.println("Turn ON !");
  }

  Serial.println("Set baud rate......");
  while (1) {
    if (sim7070g.setBaudRate(19200)) {                          
      Serial.println("Set baud rate:19200");
      break;
    } else {
      Serial.println("Faile to set baud rate");
      delay(1000);
    }
  }

  Serial.println("Check SIM card......");
  if (sim7070g.checkSIMStatus()) {                                
    Serial.println("SIM card READY");
  } else {
    Serial.println("SIM card ERROR, Check if you have insert SIM card and restart SIM7070G");
    while (1);
  }


  Serial.println("Set net mode......");
  while (1) {
    if (sim7070g.setNetMode(sim7070g.eNB)) {                              
      Serial.println("Set NB mode");
      break;
    } else {
      Serial.println("Fail to set mode");
      delay(1000);
    }
  }

  Serial.println("Get signal quality......");
  delay(1500);
  signalStrength = sim7070g.checkSignalQuality();                 
  Serial.print("signalStrength =");
  Serial.println(signalStrength);
  delay(500);

  Serial.println("Attaching service......");
  while (1) {
    if (sim7070g.attacthService()) {                            
      Serial.println("Attach service");
      break;
    } else {
      Serial.println("Fail to Attach service");
      delay(1000);
    }
  }
}

void loop()
{
  String  sendData;
  Serial.print("Connect to :");
  Serial.println(serverIP);
  if (sim7070g.openNetwork(sim7070g.eTCP, serverIP, 1883)) {                  //Connect to server
    Serial.println("Connected !");
  } else {
    Serial.println("Failed to connect");
    return;
  }
  delay(200);

  Serial.print("Connect to : ");
  Serial.println(IOT_USERNAME);
  if (sim7070g.mqttConnect(IOT_CLIENT, IOT_USERNAME, IOT_KEY)) {    
    Serial.println("Connected !");
  } else {
    Serial.println("Failed to connect");
    return;
  }
  delay(200);

  Serial.println("Input data end with CRLF : ");
  sendData = readSerial(sendData);
  Serial.print("Send data : ");
  Serial.print(sendData);
  Serial.println(" ......");
  if (sim7070g.mqttPublish(IOT_TOPIC, sendData)) {                 
    Serial.println("Send OK");
  } else {
    Serial.println("Failed to send");
    return;
  }
  delay(200);

  Serial.println("Close connection......");
  if (sim7070g.closeNetwork()) {                                  
    Serial.println("Close connection !");
  } else {
    Serial.println("Fail to close connection !");
    return;
  }
  delay(2000);
}

String readSerial(String result)
{
  int i = 0;
  while (1) {
    while (Serial.available() > 0) {
      char inChar = Serial.read();
      if (inChar == '\n') {
        result += '\0';
        while (Serial.read() >= 0);
        return result;
      }
      if (i == 50) {
        Serial.println("The data is too long");
        result += '\0';
        while (Serial.read() >= 0);
        return result;
      }
      if (inChar != '\r') {
        result += inChar;
        i++;
      }
    }
  }
}

结果

串口监视器会打印一些信息,读取你输入的数据,并将数据发送到指定的主题

API函数

 /**
   * @fn DFRobot_SIM7070G
   * @brief DFRobot_SIMcore 抽象类的构造函数。构建串行端口。
   * @param s 抽象类的类指针对象,这里可以填入串口对象的指针。
   * @return None
   */
  DFRobot_SIM7070G(Stream *s);
  ~DFRobot_SIM7070G(){};

  /**
   * @fn recv
   * @brief 接收数据
   * @param buf 接收数据内容
   * @param maxlen 接收数据长度
   * @return int 获取数据长度
   */
  int recv(char* buf, int maxlen);

  /**
   * @fn checkSignalQuality
   * @brief 检查信号质量
   * @return 0-30:信号质量
   */
  int checkSignalQuality(void);

  /**
   * @fn batteryPower
   * @brief 充电等级
   * @return int 充电等级
   */
  int batteryPower(void);

  /**
   * @fn setNetMode
   * @brief 设置网络模式
   * @param net 网络模式
   * @n    GPRS: GPRS 模式
   * @n    NB:   NB-IOT 模式
   * @return bool类型,表示设置状态
   * @retval ture Success 
   * @retval false Failed
   */
  bool setNetMode(eNet net);

  /**
   * @fn attacthService
   * @brief 打开连接
   * @return bool类型,表示打开连接状态
   * @retval true Success 
   * @retval false Failed
   */
  bool attacthService(void);

  /**
   * @fn setBaudRate
   * @brief 修改波特率避免出错
   * @param rate 波特率值
   * @n    可选值:1200 2400 4800 9600 19200 38400
   * @note SIM7070G默认波特率为115200,请降低波特率,避免失真
   * @return bool类型,表示设置状态
   * @retval true Success 
   * @retval false Failed
   */
  bool setBaudRate(long rate);

  /**
   * @fn checkSIMStatus
   * @brief 检测SIM卡
   * @return bool类型,表示检测卡状态
   * @retval true 有卡 
   * @retval false 无卡
   */
  bool checkSIMStatus(void);

  /**
   * @fn openNetwork
   * @brief 开始连接
   * @param ptl  选择连接协议
   * @n    TCP  选择 TCP
   * @n    UDP  选择 UDP
   * @param host 主机域名
   * @param port  端口号
   * @return bool类型,表示打开状态
   * @retval true Success 
   * @retval false Failed
   */
  bool openNetwork(eProtocol ptl, const char *host, uint16_t port);

  /**
   * @fn closeNetwork
   * @brief 结束连接
   * @return bool类型,表示关闭状态
   * @retval true Success 
   * @retval false Failed
   */
  bool closeNetwork(void);

  /**
   * @fn turnON
   * @brief 打开SIM7070G
   * @return bool类型,表示开机状态
   * @retval true Success 
   * @retval false Failed
   */
  bool turnON(void);

  /**
   * @fn initPos
   * @brief 初始化 SIM7070G 定位模式
   * @return bool类型,表示初始化状态
   * @retval true Success 
   * @retval false Failed
   */
  bool initPos(void);

  /** 
   * @fn mqttConnect
   * @brief MQTT 连接请求
   * @param iot_client 用户定义客户端名称
   * @param iot_username 用户名标识正在连接的用户的名称
   * @param iot_key 用户密码
   * @return bool类型,表示连接状态
   * @retval true Success 
   * @retval false Failed
   */
  bool mqttConnect(char* iot_client, char* iot_username, char* iot_key);

  /**
   * @fn mqttPublish
   * @brief MQTT 发送命令
   * @param iot_topic 目标标题
   * @param iot_data  你想要发送的数据
   * @return bool类型,表示发送状态
   * @retval true Success 
   * @retval false Failed
   */
  bool mqttPublish(char* iot_topic, String iot_data);

  /**
   * @fn mqttSubscribe
   * @brief 订阅MQTT频道
   * @param iot_topic 订阅的MQTT密钥 
   * @return bool类型,表示订阅状态
   * @retval true Success 
   * @retval false Failed
   */
  bool mqttSubscribe(char* iot_topic);

  /**
   * @fn mqttUnsubscribe
   * @brief 取消订阅MQTT频道
   * @param iot_topic 取消订阅的MQTT密钥
   * @return bool类型,表示取消订阅状态
   * @retval true Success 
   * @retval false Failed
   */
  bool mqttUnsubscribe(char* iot_topic);

  /**
   * @fn mqttRecv
   * @brief MQTT发送数据
   * @param iot_topic 订阅频道密钥
   * @param buf 发送数据
   * @param maxlen 发送数据长度
   * @return bool类型,表示订阅状态
   * @retval true Success 
   * @retval false Failed
   */
  bool mqttRecv(char* iot_topic, char* buf,int maxlen);

  /**
   * @fn mqttDisconnect
   * @brief MQTT断开连接
   * @return bool类型,表示断开连接状态
   * @retval true Success 
   * @retval false Failed
   */
  bool mqttDisconnect(void);

  /**
   * @fn httpInit
   * @brief 初始化 HTTP 服务
   * @param net 网络模式
   * @n    eGPRS: GPRS 模式
   * @n    eNB:   NB-IOT 模式
   * @return bool类型,表示初始化状态
   * @retval true Success 
   * @retval false Failed
   */
  bool httpInit(eNet net);

  /**
   * @fn httpConnect
   * @brief 配置服务
   * @param Host 服务器IP
   * @return bool类型,表示连接状态
   * @retval true Success 
   * @retval false Failed
   */
  bool httpConnect(const char *Host);

  /**
   * @fn httpPost
   * @brief HTTP POST
   * @param Host 网址
   * @param data POST 数据
   * @return bool类型,表示请求状态
   * @retval true Success 
   * @retval false Failed
   */
  bool httpPost(const char *Host , String data);

  /**
   * @fn httpGet
   * @brief HTTP GET 这个函数用来打印get数据
   * @param Host URL
   */
  void httpGet(const char *Host);

  /**
   * @fn httpDisconnect
   * @brief 断开与服务器的连接并取消初始化
   */
  void httpDisconnect(void);

  /**
   * @fn send
   * @brief 发送指定长度的数据
   * @param buf 存储数据的buffer
   * @param len 发送数据的长度
   * @return bool类型,表示发送状态
   * @retval true Success 
   * @retval false Failed
   */
  bool send(void *buffer,size_t len);

  /**
   * @fn send
   * @brief 发送数据
   * @param data 发送的数据
   * @return bool类型,表示发送状态
   * @retval true Success 
   * @retval false Failed
   */
  bool send(char *data);

  /**
   * @fn getPosition
   * @brief 
   * @return bool类型,表示发送状态
   * @retval true Success 
   * @retval false Failed
   */
  bool getPosition(void);

  /**
   * @fn getLatitude
   * @brief 获取纬度
   * @return 纬度数据
   */
  char* getLatitude(void);

  /**
   * @fn getLongitude
   * @brief 获取经度
   * @return 经度数据
   */
  char* getLongitude(void);

更多资料下载

常见问题

问:烧录示例代码后,串口输出没法初始化?

答:(1)检查是否外部供电7~12V,通过主板DC2.1黑色圆孔供电,或者通过扩展板vin,gnd端口供电。(2)检查是否安装两个天线。(3)检查扩展板上的拨码开关TX>D8,RX>D7(4)查看扩展板上的红色电源指示灯是否常亮,NET指示灯是否闪烁(5)检查是否插上NB卡。检查后,按下Boot按键重启观察

问:SIM7070G可以同时使用通信和GNSS定位吗?

答:SIM7070G不能同时使用通信和GNSS定位功能

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。