sim800驱动对接
SIM800工作频率为GSM/GPRS 850/900/1800/1900MHz,可以低功耗实现SMS和数据信息的传输。
网络对接层
在yoc移植的过程中,如果需要支持WiFi功能(例如有配网需求,参考netmgr即 网络管理器),则需要对相关接口进行移植实现,包含net
及gprs
两部分:
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
命令测试网络是否连接外网,下图所示已连接