sim800驱动对接

SIM800工作频率为GSM/GPRS 850/900/1800/1900MHz,可以低功耗实现SMS和数据信息的传输。

网络对接层

在yoc移植的过程中,如果需要支持WiFi功能(例如有配网需求,参考netmgr即 网络管理器),则需要对相关接口进行移植实现,包含netgprs两部分:

  • NET HAL的接口定义请查看头文件:net_impl.h

  • GPRS HAL的接口定义请查看头文件:gprs_impl.h

NET模块结构体

首先,先了解一下NETHAL相关的一个重要结构体net_ops_t。WiFi特有相关的操作和接口都封装在net_ops_t这个结构体中,相关定义在文件:wifi_impl.h

typedef struct net_ops {
    int (*get_mac_addr)(aos_dev_t *dev, uint8_t *mac);
    int (*set_mac_addr)(aos_dev_t *dev, const uint8_t *mac);

    int (*get_dns_server)(aos_dev_t *dev, ip_addr_t ipaddr[], uint32_t num);
    int (*set_dns_server)(aos_dev_t *dev, ip_addr_t ipaddr[], uint32_t num);

    int (*set_hostname)(aos_dev_t *dev, const char *name);
    const char* (*get_hostname)(aos_dev_t *dev);

    int (*set_link_up)(aos_dev_t *dev);
    int (*set_link_down)(aos_dev_t *dev);

    int (*start_dhcp)(aos_dev_t *dev);
    int (*stop_dhcp)(aos_dev_t *dev);
    int (*set_ipaddr)(aos_dev_t *dev, const ip_addr_t *ipaddr, const ip_addr_t *netmask, const ip_addr_t *gw);
    int (*get_ipaddr)(aos_dev_t *dev, ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw);
    int (*ping)(aos_dev_t *dev, int type, char *remote_ip);

    int (*subscribe)(aos_dev_t *dev, uint32_t event, event_callback_t cb, void *param);
    int (*unsubscribe)(aos_dev_t *dev, uint32_t event, event_callback_t cb, void *param);
} net_ops_t;

NET接口说明

  • get_mac_addr、set_mac_addr

    设置(获取)mac地址

  • get_dns_server、set_dns_server

    设置(获取)dns地址

  • set_hostname、get_hostname

    设置(获取)主机名

  • set_link_up、set_link_down

    断开(连接)设备

  • start_dhcp、stop_dhcp

    启动(停止)dhcp

  • set_ipaddr、get_ipaddr

    设置(获取)ip相关信息,ipaddr、netmask及gw

  • ping

    网络测试(Packet Internet Groper)

  • subscribe、 unsubscribe

    订阅及取消订阅相关事件

GPRS模块结构体

首先,先了解一下GPRS HAL相关的一个重要结构体gprs_driver_t。WiFi特有相关的操作和接口都封装在gprs_driver_t这个结构体中,相关定义在文件:gprs_impl.h。

typedef struct gprs_driver {
    /*common*/
    int (*set_mode)(aos_dev_t *dev, gprs_mode_t mode);
    int (*get_mode)(aos_dev_t *dev, gprs_mode_t *mode);
    int (*reset)(aos_dev_t *dev);
    int (*start)(aos_dev_t *dev);
    int (*stop)(aos_dev_t *dev);
    /*configuration*/
    int (*set_if_config)(aos_dev_t *dev, uint32_t baud, uint8_t flow_control);
    /*connection*/
    int (*module_init_check)(aos_dev_t *dev);
    int (*connect_to_gprs)(aos_dev_t *dev);
    int (*disconnect_from_gprs)(aos_dev_t *dev);
    int (*get_link_status)(aos_dev_t *dev, gprs_status_link_t *link_status);
    int (*get_ipaddr)(aos_dev_t *dev, char ip[16]);
    int (*sms_send)(aos_dev_t *dev, char *sca, char *da, char *content);
    int (*sms_set_cb)(aos_dev_t *dev, recv_sms_cb cb);
    int (*get_imsi)(aos_dev_t *dev, char *imsi);
    int (*get_imei)(aos_dev_t *dev, char *imei);
    int (*get_csq)(aos_dev_t *dev, int *csq);
    int (*get_simcard_info)(aos_dev_t *dev, char ccid[21], int *insert);
} gprs_driver_t;
  • set_mode、get_mode

    设置(获取)连接方式

    typedef enum {
        CONNECT_MODE_CSD = 0,    /**< CSD mode */
        CONNECT_MODE_GPRS,       /**< GPRS mode */
    } gprs_mode_t;
    
  • reset

    复位设备

  • start、stop

    启动(停止)设备

  • set_if_config

    设置波特率及流控

  • module_init_check

    模块初始化检查

  • connect_to_gprs、disconnect_from_gprs

    连接(断开)GPRS

  • get_link_status

    获取工作状态

    typedef enum {
        GPRS_STATUS_LINK_DISCONNECTED = 0,
        GPRS_STATUS_LINK_CONNECTED,
    } gprs_status_link_t;
    
  • get_ipaddr

    获取ip地址

  • sms_send

    发送短信

  • sms_set_cb

    设置接收短信回调函数recv_sms_cb

  • get_imsi

    获取imsi(International Mobile Subscriber Identification Number),移动用户识别码,

    用于区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。其总长度不超过15位,使用0~9的数字

  • get_imei

    获取imei(International Mobile Equipment Identity,移动设备国际识别码,又称为国际移动设备标识)

  • get_csq

    获取网络信号质量

  • get_simcard_info

    获取sim卡信息,比如是否插入、SIM卡的标识等

使用说明

驱动注册

  void gprs_sim800_register(utask_t *task, esp_wifi_param_t *param)
  • 示例详解

    主要流程为注册网卡驱动----->启动netmgr微服务(netmgr详细说明 网络管理器

#include <devices/sim800.h>
#include <yoc/netmgr.h>
#include <pin.h>

netmgr_hdl_t app_netmgr_hdl;
void sim800_init(void)
{
    sim_gprs_param_t sim_param;

    sim_param.device_name    = "uart1";                    //外设uart
    sim_param.baud           = 115200;                      //uart 波特率
    sim_param.buf_size       = 4096;                        //uart 底层缓存buffer大小
    sim_param.enable_flowctl = 0;                           //uart 流控
    sim_param.reset_pin      = GPRS_SIM800_PIN_PWR;         //复位脚
    sim_param.state_pin      = GPRS_SIM800_PIN_STATUS;      //状态管脚

    gprs_sim800_register(NULL, &sim_param);                 //注册sim800驱动
    netmgr_hdl_t app_netmgr_hdl = netmgr_dev_gprs_init();   //初始化netmgr gprs
    if (app_netmgr_hdl) {
        netmgr_service_init(NULL);                          //初始化netmgr微服务
        netmgr_start(app_netmgr_hdl);                       //启动netmgr微服务
    }
}

​ 在src/init/init.c,board_yoc_init()调用sim800初始化

void board_yoc_init(void)
{
    ...
    sim800_init();
    ...
}

console网络测试

  • 在src/init/cli_cmd.c中的console 命令行增加网络相关命令,方便测试网卡功能
void board_cli_init(utask_t *task)
{
    ...
    cli_reg_cmd_ping();
    cli_reg_cmd_ifconfig();  
    ...
}
  • ifconfig

    执行ifconfig 即可获取gprs 设置信息,如下图所示

  • ping

    确认连接网络后,使用ping命令测试网络是否连接外网,下图所示已连接

参考资料

http://www.simcom.com/product/64-cn.html

results matching ""

    No results matching ""