304 lines
8.8 KiB
C
304 lines
8.8 KiB
C
/*
|
||
* Copyright (c) 2020 AIIT XUOS Lab
|
||
* XiUOS is licensed under Mulan PSL v2.
|
||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||
* You may obtain a copy of Mulan PSL v2 at:
|
||
* http://license.coscl.org.cn/MulanPSL2
|
||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||
* See the Mulan PSL v2 for more details.
|
||
*/
|
||
|
||
/**
|
||
* @file adapter.h
|
||
* @brief Structure and function declarations of the connection adapter framework
|
||
* @version 1.1
|
||
* @author AIIT XUOS Lab
|
||
* @date 2021.05.10
|
||
*/
|
||
|
||
#ifndef ADAPTER_H
|
||
#define ADAPTER_H
|
||
|
||
#include <list.h>
|
||
#include <transform.h>
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <stdint.h>
|
||
#include <sys/types.h>
|
||
#include <at_agent.h>
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#define ADAPTER_BUFFSIZE 64
|
||
|
||
#define ADAPTER_AT_OPERATION 1
|
||
#define ADAPTER_LWIP_OPERATION 2
|
||
#define ADAPTER_RAWIP_OPERATION 3
|
||
|
||
#ifdef CONNECTION_FRAMEWORK_DEBUG
|
||
#define ADAPTER_DEBUG printf
|
||
#else
|
||
#define ADAPTER_DEBUG
|
||
#endif
|
||
|
||
#define ADAPTER_4G_NAME "4G"
|
||
#define ADAPTER_BLUETOOTH_NAME "bluetooth"
|
||
#define ADAPTER_ETHERNET_NAME "ethernet"
|
||
#define ADAPTER_ETHERCAT_NAME "ethercat"
|
||
#define ADAPTER_LORA_NAME "lora"
|
||
#define ADAPTER_NBIOT_NAME "nbiot"
|
||
#define ADAPTER_WIFI_NAME "wifi"
|
||
#define ADAPTER_ZIGBEE_NAME "zigbee"
|
||
#define ADAPTER_MODBUS_RTU_NAME "modbus_rtu"
|
||
|
||
struct Adapter;
|
||
struct AdapterProductInfo;
|
||
typedef struct Adapter *AdapterType;
|
||
typedef struct AdapterProductInfo *AdapterProductInfoType;
|
||
|
||
struct Socket
|
||
{
|
||
uint8_t type; ///< socket type:DGRAM->UDP,STREAM->TCP
|
||
uint8_t protocal; ///< udp or tcp
|
||
unsigned short listen_port; ///< 0-65535
|
||
uint8_t socket_id; ///< socket id
|
||
uint8_t recv_control; ///< receive control
|
||
uint8_t af_type; ///< IPv4 or IPv6
|
||
char *src_ip_addr; ///< source P address
|
||
char *dst_ip_addr; ///< destination IP address
|
||
};
|
||
|
||
enum AdapterType
|
||
{
|
||
ADAPTER_TYPE_LORA = 0,
|
||
ADAPTER_TYPE_4G ,
|
||
ADAPTER_TYPE_NBIOT ,
|
||
ADAPTER_TYPE_WIFI ,
|
||
ADAPTER_TYPE_ETHERNET ,
|
||
ADAPTER_TYPE_BLUETOOTH ,
|
||
ADAPTER_TYPE_ZIGBEE ,
|
||
ADAPTER_TYPE_5G ,
|
||
};
|
||
|
||
enum NetProtocolType
|
||
{
|
||
PRIVATE_PROTOCOL = 1,
|
||
IP_PROTOCOL,
|
||
PROTOCOL_NONE,
|
||
};
|
||
|
||
enum NetRoleType
|
||
{
|
||
CLIENT = 1,
|
||
SERVER,
|
||
MASTER,
|
||
SLAVE,
|
||
COORDINATOR,
|
||
ROUTER,
|
||
END_DEVICE,
|
||
GATEWAY,
|
||
ROLE_NONE,
|
||
};
|
||
|
||
enum AdapterStatus
|
||
{
|
||
REGISTERED = 1,
|
||
UNREGISTERED,
|
||
INSTALL,
|
||
UNINSTALL,
|
||
};
|
||
|
||
enum IpType
|
||
{
|
||
IPV4 = 1,
|
||
IPV6,
|
||
};
|
||
|
||
enum CarrierType {
|
||
CARRIER_CHINA_MOBILE = 1,
|
||
CARRIER_CHINA_UNICOM,
|
||
CARRIER_CHINA_TELECOM,
|
||
CARRIER_UNKNOWN,
|
||
};
|
||
|
||
struct NetworkInfo {
|
||
enum CarrierType carrier_type;
|
||
int signal_strength;
|
||
char ip_address[16];
|
||
#ifdef ADAPTER_GM800TF
|
||
unsigned char workMode; // 工作模式,1为NET,2为MQTT,NOR
|
||
unsigned short port; // 目的端口号
|
||
unsigned char is_connected; // SOCKET连接状态,0为失败,1为成功
|
||
unsigned char mqttSwitch; // MQTT开关
|
||
char mqttServerIp[16]; // MQTT目的IP地址
|
||
unsigned short mqttServerPort; // MQTT目的端口号
|
||
char mqttClientId[64]; // MQTT客户端ID
|
||
char mqttUsername[64]; // MQTT用户名
|
||
char mqttPassword[64]; // MQTT密码
|
||
unsigned char mqttIsConnected; // MQTT连接状态,0为失败,1为成功
|
||
#endif
|
||
};
|
||
|
||
struct AdapterData
|
||
{
|
||
uint32 len;
|
||
uint8 *buffer;
|
||
};
|
||
|
||
struct AdapterProductInfo
|
||
{
|
||
uint32_t functions;
|
||
char vendor_name[NAME_NUM_MAX];
|
||
char model_name[NAME_NUM_MAX];
|
||
uint32_t work_mode;
|
||
|
||
void *model_done;
|
||
};
|
||
|
||
struct IpProtocolDone
|
||
{
|
||
int (*open)(struct Adapter *adapter);
|
||
int (*close)(struct Adapter *adapter);
|
||
int (*ioctl)(struct Adapter *adapter, int cmd, void *args);
|
||
int (*setup)(struct Adapter *adapter);
|
||
int (*setdown)(struct Adapter *adapter);
|
||
int (*setaddr)(struct Adapter *adapter, const char *ip, const char *gateway, const char *netmask);
|
||
int (*setdns)(struct Adapter *adapter, const char *dns_addr, uint8 dns_count);
|
||
int (*setdhcp)(struct Adapter *adapter, int enable);
|
||
int (*ping)(struct Adapter *adapter, const char *destination);
|
||
int (*netstat)(struct Adapter *adapter);
|
||
int (*connect)(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type);
|
||
int (*send)(struct Adapter *adapter, const void *buf, size_t len);
|
||
int (*recv)(struct Adapter *adapter, void *buf, size_t len);
|
||
int (*disconnect)(struct Adapter *adapter);
|
||
int (*mqttconnect)(struct Adapter *adapter, const char *ip, const char *port, const char *client_id, const char *username, const char *password);
|
||
int (*mqttdisconnect)(struct Adapter *adapter);
|
||
int (*mqttsend)(struct Adapter *adapter, const char *topic, const void *buf, size_t len);
|
||
int (*mqttrecv)(struct Adapter *adapter, const char *topic, void *buf, size_t len);
|
||
};
|
||
|
||
struct PrivProtocolDone
|
||
{
|
||
int (*open)(struct Adapter *adapter);
|
||
int (*close)(struct Adapter *adapter);
|
||
int (*ioctl)(struct Adapter *adapter, int cmd, void *args);
|
||
int (*setup)(struct Adapter *adapter);
|
||
int (*setdown)(struct Adapter *adapter);
|
||
int (*setaddr)(struct Adapter *adapter, const char *ip, const char *gateway, const char *netmask);
|
||
int (*setdns)(struct Adapter *adapter, const char *dns_addr, uint8 dns_count);
|
||
int (*setdhcp)(struct Adapter *adapter, int enable);
|
||
int (*ping)(struct Adapter *adapter, const char *destination);
|
||
int (*netstat)(struct Adapter *adapter);
|
||
int (*join)(struct Adapter *adapter, unsigned char *priv_net_group);
|
||
int (*send)(struct Adapter *adapter, const void *buf, size_t len);
|
||
int (*recv)(struct Adapter *adapter, void *buf, size_t len);
|
||
int (*quit)(struct Adapter *adapter, unsigned char *priv_net_group);
|
||
};
|
||
|
||
struct Adapter
|
||
{
|
||
char name[NAME_NUM_MAX];
|
||
int fd;
|
||
|
||
int product_info_flag;
|
||
struct AdapterProductInfo *info;
|
||
ATAgentType agent;
|
||
|
||
struct Socket socket;
|
||
|
||
int net_role_id;
|
||
enum NetProtocolType net_protocol;
|
||
enum NetRoleType net_role;
|
||
enum AdapterStatus adapter_status;
|
||
|
||
struct NetworkInfo network_info;
|
||
|
||
char buffer[ADAPTER_BUFFSIZE];
|
||
|
||
void *done;
|
||
void *adapter_param;
|
||
|
||
sem_t sem;
|
||
pthread_mutex_t lock;
|
||
|
||
struct DoublelistNode link;
|
||
};
|
||
|
||
/*Init adapter framework*/
|
||
int AdapterFrameworkInit(void);
|
||
|
||
/*Find adapter device by name*/
|
||
AdapterType AdapterDeviceFindByName(const char *name);
|
||
|
||
/*Register the adapter to the linked list*/
|
||
int AdapterDeviceRegister(struct Adapter *adapter);
|
||
|
||
/*Unregister the adapter from the linked list*/
|
||
int AdapterDeviceUnregister(struct Adapter *adapter);
|
||
|
||
/*Open adapter device*/
|
||
int AdapterDeviceOpen(struct Adapter *adapter);
|
||
|
||
/*Close adapter device*/
|
||
int AdapterDeviceClose(struct Adapter *adapter);
|
||
|
||
/*Receice data from adapter*/
|
||
ssize_t AdapterDeviceRecv(struct Adapter *adapter, void *dst, size_t len);
|
||
|
||
/*Send data to adapter*/
|
||
ssize_t AdapterDeviceSend(struct Adapter *adapter, const void *src, size_t len);
|
||
|
||
/*Configure adapter device*/
|
||
int AdapterDeviceControl(struct Adapter *adapter, int cmd, void *args);
|
||
|
||
/*Connect to a certain ip net, only support IP_PROTOCOL*/
|
||
int AdapterDeviceConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type);
|
||
|
||
/*Join to a certain private net, only support PRIVATE_PROTOCOL*/
|
||
int AdapterDeviceJoin(struct Adapter *adapter, unsigned char *priv_net_group);
|
||
|
||
/*Adapter disconnect from ip net or private net group*/
|
||
int AdapterDeviceDisconnect(struct Adapter *adapter, unsigned char *priv_net_group);
|
||
|
||
/*Set up to net*/
|
||
int AdapterDeviceSetUp(struct Adapter *adapter);
|
||
|
||
/*Set down from net*/
|
||
int AdapterDeviceSetDown(struct Adapter *adapter);
|
||
|
||
/*Set ip/gateway/netmask address*/
|
||
int AdapterDeviceSetAddr(struct Adapter *adapter, const char *ip, const char *gateway, const char *netmask);
|
||
|
||
/*Set DNS function*/
|
||
int AdapterDeviceSetDns(struct Adapter *adapter, const char *dns_addr, uint8 dns_count);
|
||
|
||
/*Set DHCP function*/
|
||
int AdapterDeviceSetDhcp(struct Adapter *adapter, int enable);
|
||
|
||
/*ping function*/
|
||
int AdapterDevicePing(struct Adapter *adapter, const char *destination);
|
||
|
||
/*Show the net status*/
|
||
int AdapterDeviceNetstat(struct Adapter *adapter);
|
||
|
||
/*Connect to a certain mqtt server*/
|
||
int AdapterDeviceMqttConnect(struct Adapter *adapter, const char *ip, const char *port, const char *client_id, const char *username, const char *password);
|
||
|
||
/*Adapter disconnect from mqtt server*/
|
||
int AdapterDeviceMqttDisconnect(struct Adapter *adapter);
|
||
|
||
/*Send data to mqtt server*/
|
||
ssize_t AdapterDeviceMqttSend(struct Adapter *adapter, const char *topic, const void *buf, size_t len);
|
||
|
||
/*Receice data from mqtt server*/
|
||
ssize_t AdapterDeviceMqttRecv(struct Adapter *adapter, const char *topic, void *buf, size_t len);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif |