From a4f24a29fc201922d503e81d1f697a3b9ae90ff6 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Wed, 13 Oct 2021 17:22:28 +0800 Subject: [PATCH 1/4] add BC28 of nbiot for adapter --- APP_Framework/Framework/connection/adapter.h | 13 +- .../Framework/connection/nbiot/BC28/Kconfig | 40 ++ .../Framework/connection/nbiot/BC28/Makefile | 3 + .../Framework/connection/nbiot/BC28/bc28.c | 512 ++++++++++++++++++ .../Framework/connection/nbiot/Kconfig | 10 + .../Framework/connection/nbiot/Makefile | 4 + .../connection/nbiot/adapter_nbiot.c | 125 +++++ .../connection/nbiot/adapter_nbiot.h | 12 + .../Framework/connection/zigbee/E18/e18.c | 3 +- 9 files changed, 718 insertions(+), 4 deletions(-) create mode 100644 APP_Framework/Framework/connection/nbiot/adapter_nbiot.h diff --git a/APP_Framework/Framework/connection/adapter.h b/APP_Framework/Framework/connection/adapter.h index 380aaa65c..bfdf853d1 100644 --- a/APP_Framework/Framework/connection/adapter.h +++ b/APP_Framework/Framework/connection/adapter.h @@ -52,8 +52,15 @@ typedef struct AdapterProductInfo *AdapterProductInfoType; struct Socket { - int id; - struct Adapter *adapter; + 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 @@ -156,7 +163,7 @@ struct Adapter struct AdapterProductInfo *info; ATAgentType agent; - //struct Socket *socket; + struct Socket socket; enum NetProtocolType net_protocol; enum NetRoleType net_role; diff --git a/APP_Framework/Framework/connection/nbiot/BC28/Kconfig b/APP_Framework/Framework/connection/nbiot/BC28/Kconfig index e69de29bb..3b0341983 100644 --- a/APP_Framework/Framework/connection/nbiot/BC28/Kconfig +++ b/APP_Framework/Framework/connection/nbiot/BC28/Kconfig @@ -0,0 +1,40 @@ +config ADAPTER_NBIOT_BC28 + string "BC28 adapter name" + default "bc28" + +if ADD_XIUOS_FETURES + config ADAPTER_BC28_PWRKEY + int "BC28 PWRKEY pin number" + default "100" + + config ADAPTER_BC28_PIN_DRIVER + string "BC28 device pin driver path" + default "/dev/pin_dev" + + config ADAPTER_BC28_DRIVER_EXTUART + bool "Using extra uart to support nbiot" + default n + + config ADAPTER_BC28_DRIVER + string "BC28 device uart driver path" + default "/dev/uart2_dev2" + depends on !ADAPTER_BC28_DRIVER_EXTUART + + if ADAPTER_BC28_DRIVER_EXTUART + config ADAPTER_BC28_DRIVER + string "BC28 device extra uart driver path" + default "/dev/extuart_dev0" + + config ADAPTER_BC28_DRIVER_EXT_PORT + int "if BC28 device using extuart, choose port" + default "0" + endif +endif + +if ADD_NUTTX_FETURES + +endif + +if ADD_RTTHREAD_FETURES + +endif diff --git a/APP_Framework/Framework/connection/nbiot/BC28/Makefile b/APP_Framework/Framework/connection/nbiot/BC28/Makefile index e69de29bb..3963d112d 100644 --- a/APP_Framework/Framework/connection/nbiot/BC28/Makefile +++ b/APP_Framework/Framework/connection/nbiot/BC28/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := bc28.c + +include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/APP_Framework/Framework/connection/nbiot/BC28/bc28.c b/APP_Framework/Framework/connection/nbiot/BC28/bc28.c index e69de29bb..4c9ca13d1 100644 --- a/APP_Framework/Framework/connection/nbiot/BC28/bc28.c +++ b/APP_Framework/Framework/connection/nbiot/BC28/bc28.c @@ -0,0 +1,512 @@ +/* +* 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 bc28.c + * @brief Implement the connection nbiot adapter function, using BC28 device + * @version 1.1 + * @author AIIT XUOS Lab + * @date 2021.09.15 + */ + +#include +#include +#include "../adapter_nbiot.h" + +#define SOCKET_PROTOCOL_TCP (6) +#define SOCKET_PROTOCOL_UDP (17) + +#define NET_TYPE_AF_INET (0) +#define NET_TYPE_AF_INET6 (1) + +#define SOCKET_INVALID_ID (-1) + +static int BC28UartOpen(struct Adapter *adapter) +{ + if (NULL == adapter) { + return -1; + } + + /* Open device in read-write mode */ + adapter->fd = PrivOpen(ADAPTER_BC28_DRIVER,O_RDWR); + if (adapter->fd < 0) { + printf("BC28UartOpen get serial %s fd error\n", ADAPTER_BC28_DRIVER); + return -1; + } + /* set serial config, serial_baud_rate = 9600 */ + + struct SerialDataCfg cfg; + memset(&cfg, 0 ,sizeof(struct SerialDataCfg)); + + cfg.serial_baud_rate = BAUD_RATE_9600; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = BIT_ORDER_LSB; + cfg.serial_invert_mode = NRZ_NORMAL; + cfg.serial_buffer_size = SERIAL_RB_BUFSZ; + + /*aiit board use ch438, so it needs more serial configuration*/ +#ifdef ADAPTER_BC28_DRIVER_EXTUART + cfg.ext_uart_no = ADAPTER_BC28_DRIVER_EXT_PORT; + cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &cfg; + + PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); + PrivTaskDelay(1000); + + printf("NBIot uart config ready\n"); + return 0; +} + +static void BC28PowerSet(void) +{ + int pin_fd; + pin_fd = PrivOpen(ADAPTER_BC28_PIN_DRIVER, O_RDWR); + + struct PinParam pin_param; + pin_param.cmd = GPIO_CONFIG_MODE; + pin_param.mode = GPIO_CFG_OUTPUT; + pin_param.pin = ADAPTER_BC28_PWRKEY; + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = PIN_TYPE; + ioctl_cfg.args = &pin_param; + PrivIoctl(pin_fd, OPE_CFG, &ioctl_cfg); + + struct PinStat pin_stat; + pin_stat.pin = ADAPTER_BC28_PWRKEY; + pin_stat.val = GPIO_HIGH; + PrivWrite(pin_fd, &pin_stat, 1); + + PrivTaskDelay(200);//at least 200ms + + pin_stat.val = GPIO_LOW; + PrivWrite(pin_fd, &pin_stat, 1); + + PrivClose(pin_fd); +} +/** + * @description: NBIoT device create a socket connection + * @param adapter - NBIoT adapter AT + * @param socket_fd - socket file description + * @param type - socket type + * @param af_type - IPv4 or IPv6 + * @return success: EOK, failure: -ERROR + */ +int NBIoTSocketCreate(struct Adapter *adapter, struct Socket *socket ) +{ + int32 result = 0; + + if (!adapter || !socket){ + return -1; + } + + ATReplyType reply = CreateATReply(64); + if (NULL == reply) { + printf("at create failed ! \n"); + result = -1; + goto __exit; + } + + if ( socket->af_type == NET_TYPE_AF_INET6 ) { + printf("IPv6 not surport !\n"); + result = -1; + goto __exit; + } + + char *str_af_type = "AF_INET"; + char *str_type; + char str_fd[3] = {0}; + char *str_protocol ; + char at_cmd[64] = {0}; + char listen_port[] = {0}; + + if (socket->socket_id >= 0 && socket->socket_id < 7) { + itoa(socket->socket_id, str_fd, 10); + adapter->socket.socket_id = socket->socket_id; + } else { + printf("surport max 0-6, socket_id = [%d] is error!\n",socket->socket_id); + result = -1; + goto __exit; + } + + if( socket->listen_port >= 0 && socket->listen_port <= 65535){ + itoa(socket->listen_port, listen_port, 10); + } + + adapter->socket.af_type = NET_TYPE_AF_INET; + + if (socket->type == SOCKET_TYPE_STREAM) { //tcp = AT+NSOCR=STREAM,6,0,1,AF_INET + adapter->socket.protocal = SOCKET_PROTOCOL_TCP; + adapter->socket.type = SOCKET_TYPE_STREAM; + str_type = "STREAM"; + char *str_protocol = "6"; + + } else if ( socket->type == SOCKET_TYPE_DGRAM ){ //udp + adapter->socket.type = SOCKET_TYPE_DGRAM; + adapter->socket.protocal = SOCKET_PROTOCOL_UDP; + str_type = "DGRAM"; + char *str_protocol = "17"; + + } else { + printf("error socket type \n"); + result = -1; + goto __exit; + } + + memcpy(at_cmd, "AT+NSOCR=", 9); + strcat(at_cmd, str_type); + strcat(at_cmd, ","); + strcat(at_cmd, str_protocol); + strcat(at_cmd, ","); + strcat(at_cmd, listen_port); + strcat(at_cmd, ","); + strcat(at_cmd, str_fd); + strcat(at_cmd, ","); + strcat(at_cmd, str_af_type); + strcat(at_cmd, "\n"); + + printf("cmd : %s\n", at_cmd); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); + PrivTaskDelay(3000); + printf("bak : "); + for(int i = 0; i < strlen(reply->reply_buffer); i++) + printf(" 0x%02x", reply->reply_buffer[i]); + printf("\n"); + +__exit: + if (reply) { + DeleteATReply(reply); + } + + return result; +} + +/** + * @description: NBIoT device close a socket connection + * @param adapter - NBIoT adapter AT + * @param socket_fd - socket file description + * @return success: EOK, failure: -ERROR + */ +int NBIoTSocketDelete(struct Adapter *adapter ) +{ + int result = 0; + + if (!adapter){ + return -1; + } + + ATReplyType reply = CreateATReply(64); + if (NULL == reply) { + printf("at create failed ! \n"); + result = -1; + goto __exit; + } + + if (adapter->socket.socket_id >= 7) { + printf("socket fd error \n"); + result = -1; + goto __exit; + } + + char str_fd[2] = {0}; + char at_cmd[16] = {0}; + itoa(adapter->socket.socket_id, str_fd, 10); + + memcpy(at_cmd, "AT+NSOCL=", 9); + strcat(at_cmd, str_fd); + strcat(at_cmd, "\n"); + + printf("cmd : %s\n", at_cmd); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); + PrivTaskDelay(300); + + adapter->socket.socket_id = SOCKET_INVALID_ID; + +__exit: + if (reply) { + DeleteATReply(reply); + } + + return result; +} + +static int BC28Open(struct Adapter *adapter) +{ + int ret = 0; + struct Socket create_socket; + + if (NULL == adapter) { + return -1; + } + /*step1: open BC8 serial port*/ + ret = BC28UartOpen(adapter); + if (ret < 0) { + printf("bc18 setup failed.\n"); + return -1; + } + /*step2: init AT agent*/ + if (!adapter->agent) { + char *agent_name = "niot_device"; + if (EOK != InitATAgent(agent_name, adapter->fd, 512)) { + printf("at agent init failed !\n"); + return -1; + } + ATAgentType at_agent = GetATAgent(agent_name); + adapter->agent = at_agent; + } + create_socket.type = SOCKET_TYPE_STREAM; + create_socket.listen_port = 0; + create_socket.socket_id = 0; + create_socket.af_type = NET_TYPE_AF_INET; + + /*step3: create a tcp socket default */ + ret = NBIoTSocketCreate(adapter, &create_socket); + if(ret < 0){ + printf("NBIot create tcp socket failed.\n"); + return -1; + } + + printf("NBiot BC28 open successful\n"); + return 0; +} + +static int BC28Close(struct Adapter *adapter) +{ + NBIoTSocketDelete(adapter); + PrivClose(adapter->fd); + return 0; +} + +static int BC28Ioctl(struct Adapter *adapter, int cmd, void *args) +{ + int ret = 0; + switch (cmd) + { + case CONFIG_NBIOT_RESET: /* reset nbiot */ + BC28PowerSet(); + break; + case CONFIG_NBIOT_CREATE_SOCKET: /* create tcp/UDP socket */ + if(!args){ + return -1; + } + struct Socket *create_socket = ( struct Socket *) args; + ret = NBIoTSocketCreate(adapter, create_socket); + break; + case CONFIG_NBIOT_DELETE_SOCKET: /* close socket */ + ret = NBIoTSocketDelete(adapter); + break; + default: + ret = -1; + break; + } + + return ret; +} + +static int BC28Connect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type) +{ + int result = 0; + + ATReplyType reply = CreateATReply(64); + if (NULL == reply) { + printf("at create failed ! \n"); + result = -1; + goto __exit; + } + + if (adapter->socket.socket_id > 6) { + printf("socket fd error \n"); + result = -1; + goto __exit; + } + + if ( ip_type != SOCKET_TYPE_STREAM) { + printf("socket type error \n"); + } + + char at_cmd[64] = {0}; + char str_fd[2] = {0}; + + itoa(adapter->socket.socket_id, str_fd, 10); + + memcpy(at_cmd, "AT+NSOCO=", 9); + strcat(at_cmd, str_fd); + strcat(at_cmd, ","); + strcat(at_cmd, ip); + strcat(at_cmd, ","); + strcat(at_cmd, port); + strcat(at_cmd, "\n"); + + printf("cmd : %s\n", at_cmd); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); + PrivTaskDelay(300); + +__exit: + if (reply) { + DeleteATReply(reply); + } + + return result; +} + +static int BC28Send(struct Adapter *adapter, const void *buf, size_t len) +{ + uint32_t result = 0; + + ATReplyType reply = CreateATReply(64); + if (NULL == reply) { + printf("at create failed ! \n"); + result = -ERROR; + goto __exit; + } + + if (adapter->socket.type == SOCKET_TYPE_STREAM ) { + + char at_cmd[64] = {0}; + char str_fd[2] = {0}; + char size[2] = {0}; + + itoa(adapter->socket.socket_id, str_fd, 10); + size[0] = len + '0'; + + memcpy(at_cmd, "AT+NSOSD=", 9); + strcat(at_cmd, str_fd); + strcat(at_cmd, ","); + strcat(at_cmd, size); + strcat(at_cmd, ","); + strcat(at_cmd, buf); + strcat(at_cmd, "\n"); + + printf("cmd : %s\n", at_cmd); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); + PrivTaskDelay(300); + + } else if(adapter->socket.type == SOCKET_TYPE_DGRAM ) { + char at_cmd[64] = {0}; + char str_fd[2] = {0}; + char listen_port[] = {0}; + + itoa(adapter->socket.socket_id, str_fd, 10); + + itoa(adapter->socket.listen_port, listen_port, 10); + + memcpy(at_cmd, "AT+NSOST=", 9); + strcat(at_cmd, str_fd); + strcat(at_cmd, ","); + strcat(at_cmd, adapter->socket.dst_ip_addr); + strcat(at_cmd, ","); + strcat(at_cmd, listen_port); + strcat(at_cmd, ","); + strcat(at_cmd, buf); + strcat(at_cmd, "\n"); + + printf("cmd : %s\n", at_cmd); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); + PrivTaskDelay(300); + } + +__exit: + if (reply) { + DeleteATReply(reply); + } + + return result; +} + +static int BC28Recv(struct Adapter *adapter, void *buf, size_t len) +{ + char at_cmd[64] = {0}; + char str_fd[2] = {0}; + char size[2] = {0}; + + ATReplyType reply = CreateATReply(64); + if (NULL == reply) { + printf("at create failed ! \n"); + return -1; + } + + itoa(adapter->socket.socket_id, str_fd, 10); + size[0] = len + '0'; + + memcpy(at_cmd, "AT+NSORF=", 9); + strcat(at_cmd, str_fd); + strcat(at_cmd, ","); + strcat(at_cmd, size); + strcat(at_cmd, "\n"); + + printf("cmd : %s\n", at_cmd); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); + PrivTaskDelay(300); + + buf = GetReplyText(reply); + if (!buf) { + printf("%s %n get reply failed.\n",__func__,__LINE__); + } + + if (reply) { + DeleteATReply(reply); + } + + return 0; +} + +static int BC28Disconnect(struct Adapter *adapter) +{ + if (!adapter) { + return -1; + } + + return NBIoTSocketDelete(adapter); +} + +static const struct IpProtocolDone BC28_done = +{ + .open = BC28Open, + .close = BC28Close, + .ioctl = BC28Ioctl, + .setup = NULL, + .setdown = NULL, + .setaddr = NULL, + .setdns = NULL, + .setdhcp = NULL, + .ping = NULL, + .netstat = NULL, + .connect = BC28Connect, + .send = BC28Send, + .recv = BC28Recv, + .disconnect = BC28Disconnect, +}; + +AdapterProductInfoType BC28Attach(struct Adapter *adapter) +{ + struct AdapterProductInfo *product_info = malloc(sizeof(struct AdapterProductInfo)); + if (!product_info) { + printf("BC28Attach malloc product_info error\n"); + return NULL; + } + memset(product_info, 0, sizeof(struct AdapterProductInfo)); + + strncpy(product_info->model_name, ADAPTER_NBIOT_BC28,sizeof(product_info->model_name)); + product_info->model_done = (void *)&BC28_done; + + BC28PowerSet(); + return product_info; +} + + + diff --git a/APP_Framework/Framework/connection/nbiot/Kconfig b/APP_Framework/Framework/connection/nbiot/Kconfig index e69de29bb..f707070a8 100644 --- a/APP_Framework/Framework/connection/nbiot/Kconfig +++ b/APP_Framework/Framework/connection/nbiot/Kconfig @@ -0,0 +1,10 @@ +if CONNECTION_ADAPTER_NB + config ADAPTER_BC28 + bool "Using nbiot adapter device BC28" + default y + + if ADAPTER_BC28 + source "$APP_DIR/Framework/connection/nbiot/BC28/Kconfig" + endif + +endif diff --git a/APP_Framework/Framework/connection/nbiot/Makefile b/APP_Framework/Framework/connection/nbiot/Makefile index 3dc3423a2..f1cc98d35 100644 --- a/APP_Framework/Framework/connection/nbiot/Makefile +++ b/APP_Framework/Framework/connection/nbiot/Makefile @@ -1,3 +1,7 @@ SRC_FILES := adapter_nbiot.c +ifeq ($(CONFIG_ADAPTER_BC28),y) + SRC_DIR += BC28 +endif + include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c index 04f98462b..645469a80 100644 --- a/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c +++ b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c @@ -17,3 +17,128 @@ * @author AIIT XUOS Lab * @date 2021.06.25 */ +#include + + +#ifdef ADAPTER_BC28 +extern AdapterProductInfoType BC28Attach(struct Adapter *adapter); +#endif + +#define ADAPTER_NBIOT_NAME "nbiot" + +static int AdapterNbiotRegister(struct Adapter *adapter) +{ + int ret = 0; + + strncpy(adapter->name, ADAPTER_NBIOT_NAME, NAME_NUM_MAX); + + adapter->net_protocol = IP_PROTOCOL; + adapter->net_role = CLIENT; + + adapter->adapter_status = UNREGISTERED; + + ret = AdapterDeviceRegister(adapter); + if (ret < 0) { + printf("AdapterNbiot register error\n"); + return -1; + } + + return ret; +} + +int AdapterNbiotInit(void) +{ + int ret = 0; + + struct Adapter *adapter = malloc(sizeof(struct Adapter)); + if (!adapter) { + printf("malloc adapter failed.\n"); + return -1; + } + memset(adapter, 0, sizeof(struct Adapter)); + ret = AdapterNbiotRegister(adapter); + if (ret < 0) { + printf("register nbiot adapter error\n"); + free(adapter); + return -1; + } +#ifdef ADAPTER_BC28 + AdapterProductInfoType product_info = BC28Attach(adapter); + if (!product_info) { + printf("bc28 attach error\n"); + free(adapter); + return -1; + } + + adapter->product_info_flag = 1; + adapter->info = product_info; + adapter->done = product_info->model_done; +#endif + + return ret; +} + +/******************TEST*********************/ +// int openzigbee(void) +// { +// int ret = 0; + +// struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_ZIGBEE_NAME); + +// #ifdef ADAPTER_E18 +// ret = AdapterDeviceOpen(adapter); +// if(ret < 0){ +// printf("open adapter failed\n"); +// return -1; +// } + +// adapter->info->work_mode = 1; +// ret = AdapterDeviceControl(adapter, CONFIG_ZIGBEE_NET_MODE,NULL); +// if(ret < 0){ +// printf("control adapter failed\n"); +// return -1; +// } +// ret = AdapterDeviceJoin(adapter, NULL); +// if(ret < 0){ +// printf("join adapter failed\n"); +// return -1; +// } +// #endif + +// return 0; +// } +// SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, openzigbee, openzigbee, show adapter zigbee information); + +// int sendzigbee(int argc, char *argv[]) +// { +// const char *send_msg = argv[1]; +// int ret = 0; + +// struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_ZIGBEE_NAME); + +// printf("send argv1 %s\n",argv[1]); +// ret = AdapterDeviceSend(adapter, send_msg, strlen(send_msg)); +// if(ret < 0){ +// printf(" adapter send failed\n"); +// return -1; +// } +// printf("zigbee send msg %s\n", send_msg); + + +// return 0; +// } +// SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(2)|SHELL_CMD_DISABLE_RETURN, sendzigbee, sendzigbee, show adapter zigbee information); + +// int recvzigbee(void) +// { +// char recv_msg[128]; +// struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_ZIGBEE_NAME); +// memset(recv_msg,0,128); +// AdapterDeviceRecv(adapter, recv_msg, 128); +// PrivTaskDelay(2000); +// printf("zigbee recv msg %s\n", recv_msg); + +// return 0; +// } +// SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, recvzigbee, recvzigbee, show adapter zigbee information); + diff --git a/APP_Framework/Framework/connection/nbiot/adapter_nbiot.h b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.h new file mode 100644 index 000000000..97c698622 --- /dev/null +++ b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.h @@ -0,0 +1,12 @@ +#ifndef ADAPTER_NBIOT_H +#define ADAPTER_NBIOT_H + +#define CONFIG_NBIOT_RESET (0) +#define CONFIG_NBIOT_CREATE_SOCKET (1) +#define CONFIG_NBIOT_DELETE_SOCKET (2) + +#define SOCKET_TYPE_DGRAM (0) +#define SOCKET_TYPE_STREAM (1) + + +#endif \ No newline at end of file diff --git a/APP_Framework/Framework/connection/zigbee/E18/e18.c b/APP_Framework/Framework/connection/zigbee/E18/e18.c index 7bd814a74..b01695889 100644 --- a/APP_Framework/Framework/connection/zigbee/E18/e18.c +++ b/APP_Framework/Framework/connection/zigbee/E18/e18.c @@ -438,7 +438,8 @@ AdapterProductInfoType E18Attach(struct Adapter *adapter) printf("E18Attach malloc product_info error\n"); return NULL; } - + memset(product_info, 0, sizeof(struct AdapterProductInfo)); + strncpy(product_info->model_name, ADAPTER_ZIGBEE_E18,sizeof(product_info->model_name)); product_info->model_done = (void *)&E18_done; From 267528408e57e57341b562a2705797aeb95cb795 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Mon, 18 Oct 2021 18:04:46 +0800 Subject: [PATCH 2/4] repair wait time for 'ATOrderSend',optimize bc28 api --- APP_Framework/Applications/framework_init.c | 4 + APP_Framework/Framework/connection/at_agent.h | 2 +- .../connection/bluetooth/HC08/hc08.c | 2 +- .../Framework/connection/nbiot/BC28/Kconfig | 8 +- .../Framework/connection/nbiot/BC28/bc28.c | 142 ++++++++---------- .../connection/nbiot/adapter_nbiot.c | 131 +++++++++------- .../Framework/connection/wifi/HFA21/hfa21.c | 2 +- .../Framework/connection/zigbee/E18/e18.c | 2 +- 8 files changed, 156 insertions(+), 137 deletions(-) diff --git a/APP_Framework/Applications/framework_init.c b/APP_Framework/Applications/framework_init.c index d09159525..d21aeb7a1 100644 --- a/APP_Framework/Applications/framework_init.c +++ b/APP_Framework/Applications/framework_init.c @@ -17,6 +17,7 @@ extern int SensorFrameworkInit(void); extern int AdapterFrameworkInit(void); extern int Adapter4GInit(void); +extern int AdapterNbiotInit(void); extern int AdapterBlueToothInit(void); extern int AdapterWifiInit(void); extern int AdapterZigbeeInit(void); @@ -94,6 +95,9 @@ static struct InitDesc connection_desc[] = #ifdef CONNECTION_ADAPTER_4G { "4G adpter", Adapter4GInit}, #endif +#ifdef CONNECTION_ADAPTER_NB + { "NB adpter", AdapterNbiotInit}, +#endif #ifdef CONNECTION_ADAPTER_ZIGBEE { "zigbee adpter", AdapterZigbeeInit}, #endif diff --git a/APP_Framework/Framework/connection/at_agent.h b/APP_Framework/Framework/connection/at_agent.h index d9acd71e5..f686e9540 100755 --- a/APP_Framework/Framework/connection/at_agent.h +++ b/APP_Framework/Framework/connection/at_agent.h @@ -81,6 +81,6 @@ int ParseATReply(char* str, const char *format, ...); void DeleteATReply(ATReplyType reply); int ATOrderSend(ATAgentType agent, uint32 timeout_s, ATReplyType reply, const char *cmd_expr, ...); -#define REPLY_TIME_OUT 3000 +#define REPLY_TIME_OUT 3 #endif \ No newline at end of file diff --git a/APP_Framework/Framework/connection/bluetooth/HC08/hc08.c b/APP_Framework/Framework/connection/bluetooth/HC08/hc08.c index d2d94ee0e..1ad4595ea 100644 --- a/APP_Framework/Framework/connection/bluetooth/HC08/hc08.c +++ b/APP_Framework/Framework/connection/bluetooth/HC08/hc08.c @@ -355,7 +355,7 @@ static int Hc08Send(struct Adapter *adapter, const void *buf, size_t len) static int Hc08Recv(struct Adapter *adapter, void *buf, size_t len) { if (adapter->agent) { - return EntmRecv(adapter->agent, (char *)buf, len, 40000); + return EntmRecv(adapter->agent, (char *)buf, len, 40); } else { printf("Hc08Recv can not find agent\n"); } diff --git a/APP_Framework/Framework/connection/nbiot/BC28/Kconfig b/APP_Framework/Framework/connection/nbiot/BC28/Kconfig index 3b0341983..b4224090e 100644 --- a/APP_Framework/Framework/connection/nbiot/BC28/Kconfig +++ b/APP_Framework/Framework/connection/nbiot/BC28/Kconfig @@ -3,8 +3,8 @@ config ADAPTER_NBIOT_BC28 default "bc28" if ADD_XIUOS_FETURES - config ADAPTER_BC28_PWRKEY - int "BC28 PWRKEY pin number" + config ADAPTER_BC28_RESETPIN + int "BC28 RESET pin number" default "100" config ADAPTER_BC28_PIN_DRIVER @@ -23,11 +23,11 @@ if ADD_XIUOS_FETURES if ADAPTER_BC28_DRIVER_EXTUART config ADAPTER_BC28_DRIVER string "BC28 device extra uart driver path" - default "/dev/extuart_dev0" + default "/dev/extuart_dev5" config ADAPTER_BC28_DRIVER_EXT_PORT int "if BC28 device using extuart, choose port" - default "0" + default "5" endif endif diff --git a/APP_Framework/Framework/connection/nbiot/BC28/bc28.c b/APP_Framework/Framework/connection/nbiot/BC28/bc28.c index 4c9ca13d1..142d65876 100644 --- a/APP_Framework/Framework/connection/nbiot/BC28/bc28.c +++ b/APP_Framework/Framework/connection/nbiot/BC28/bc28.c @@ -30,6 +30,38 @@ #define SOCKET_INVALID_ID (-1) +static int AtCmdConfigAndCheck(ATAgentType agent, char *cmd, char *check) +{ + char *result = NULL; + if (NULL == agent || NULL == cmd || NULL == check ) { + return -1; + } + + ATReplyType reply = CreateATReply(64); + if (NULL == reply) { + printf("%s %d at_create_resp failed!\n",__func__,__LINE__); + return -1; + } + + ATOrderSend(agent, REPLY_TIME_OUT, reply, cmd); + PrivTaskDelay(300); + + result = GetReplyText(reply); + if (!result) { + printf("%s %n get reply failed.\n",__func__,__LINE__); + goto __exit; + } + if(0 != strncmp(result, check, strlen(check))) { + printf("%s %d check[%s] reply[%s] failed.\n",__func__,__LINE__,check,result); + goto __exit; + } + return 0; + +__exit: + DeleteATReply(reply); + return -1; +} + static int BC28UartOpen(struct Adapter *adapter) { if (NULL == adapter) { @@ -80,7 +112,7 @@ static void BC28PowerSet(void) struct PinParam pin_param; pin_param.cmd = GPIO_CONFIG_MODE; pin_param.mode = GPIO_CFG_OUTPUT; - pin_param.pin = ADAPTER_BC28_PWRKEY; + pin_param.pin = ADAPTER_BC28_RESETPIN; struct PrivIoctlCfg ioctl_cfg; ioctl_cfg.ioctl_driver_type = PIN_TYPE; @@ -88,7 +120,7 @@ static void BC28PowerSet(void) PrivIoctl(pin_fd, OPE_CFG, &ioctl_cfg); struct PinStat pin_stat; - pin_stat.pin = ADAPTER_BC28_PWRKEY; + pin_stat.pin = ADAPTER_BC28_RESETPIN; pin_stat.val = GPIO_HIGH; PrivWrite(pin_fd, &pin_stat, 1); @@ -115,22 +147,15 @@ int NBIoTSocketCreate(struct Adapter *adapter, struct Socket *socket ) return -1; } - ATReplyType reply = CreateATReply(64); - if (NULL == reply) { - printf("at create failed ! \n"); - result = -1; - goto __exit; - } - if ( socket->af_type == NET_TYPE_AF_INET6 ) { printf("IPv6 not surport !\n"); result = -1; - goto __exit; + goto out; } char *str_af_type = "AF_INET"; char *str_type; - char str_fd[3] = {0}; + char str_fd[3] = {1}; char *str_protocol ; char at_cmd[64] = {0}; char listen_port[] = {0}; @@ -141,7 +166,7 @@ int NBIoTSocketCreate(struct Adapter *adapter, struct Socket *socket ) } else { printf("surport max 0-6, socket_id = [%d] is error!\n",socket->socket_id); result = -1; - goto __exit; + goto out; } if( socket->listen_port >= 0 && socket->listen_port <= 65535){ @@ -154,18 +179,18 @@ int NBIoTSocketCreate(struct Adapter *adapter, struct Socket *socket ) adapter->socket.protocal = SOCKET_PROTOCOL_TCP; adapter->socket.type = SOCKET_TYPE_STREAM; str_type = "STREAM"; - char *str_protocol = "6"; + str_protocol = "6"; } else if ( socket->type == SOCKET_TYPE_DGRAM ){ //udp adapter->socket.type = SOCKET_TYPE_DGRAM; adapter->socket.protocal = SOCKET_PROTOCOL_UDP; str_type = "DGRAM"; - char *str_protocol = "17"; + str_protocol = "17"; } else { printf("error socket type \n"); result = -1; - goto __exit; + goto out; } memcpy(at_cmd, "AT+NSOCR=", 9); @@ -181,18 +206,13 @@ int NBIoTSocketCreate(struct Adapter *adapter, struct Socket *socket ) strcat(at_cmd, "\n"); printf("cmd : %s\n", at_cmd); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); - PrivTaskDelay(3000); - printf("bak : "); - for(int i = 0; i < strlen(reply->reply_buffer); i++) - printf(" 0x%02x", reply->reply_buffer[i]); - printf("\n"); - -__exit: - if (reply) { - DeleteATReply(reply); + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(result < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); + result = -1; } +out: return result; } @@ -204,23 +224,14 @@ __exit: */ int NBIoTSocketDelete(struct Adapter *adapter ) { - int result = 0; - if (!adapter){ + if (!adapter) { return -1; } - ATReplyType reply = CreateATReply(64); - if (NULL == reply) { - printf("at create failed ! \n"); - result = -1; - goto __exit; - } - if (adapter->socket.socket_id >= 7) { printf("socket fd error \n"); - result = -1; - goto __exit; + return -1; } char str_fd[2] = {0}; @@ -232,17 +243,12 @@ int NBIoTSocketDelete(struct Adapter *adapter ) strcat(at_cmd, "\n"); printf("cmd : %s\n", at_cmd); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, at_cmd); PrivTaskDelay(300); adapter->socket.socket_id = SOCKET_INVALID_ID; -__exit: - if (reply) { - DeleteATReply(reply); - } - - return result; + return 0; } static int BC28Open(struct Adapter *adapter) @@ -322,13 +328,6 @@ static int BC28Connect(struct Adapter *adapter, enum NetRoleType net_role, const { int result = 0; - ATReplyType reply = CreateATReply(64); - if (NULL == reply) { - printf("at create failed ! \n"); - result = -1; - goto __exit; - } - if (adapter->socket.socket_id > 6) { printf("socket fd error \n"); result = -1; @@ -337,6 +336,8 @@ static int BC28Connect(struct Adapter *adapter, enum NetRoleType net_role, const if ( ip_type != SOCKET_TYPE_STREAM) { printf("socket type error \n"); + result = -1; + goto __exit; } char at_cmd[64] = {0}; @@ -353,32 +354,25 @@ static int BC28Connect(struct Adapter *adapter, enum NetRoleType net_role, const strcat(at_cmd, "\n"); printf("cmd : %s\n", at_cmd); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); - PrivTaskDelay(300); - -__exit: - if (reply) { - DeleteATReply(reply); + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(result < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); + result = -1; } +__exit: return result; } static int BC28Send(struct Adapter *adapter, const void *buf, size_t len) { uint32_t result = 0; + char at_cmd[64] = {0}; + char str_fd[2] = {0}; - ATReplyType reply = CreateATReply(64); - if (NULL == reply) { - printf("at create failed ! \n"); - result = -ERROR; - goto __exit; - } if (adapter->socket.type == SOCKET_TYPE_STREAM ) { - - char at_cmd[64] = {0}; - char str_fd[2] = {0}; + char size[2] = {0}; itoa(adapter->socket.socket_id, str_fd, 10); @@ -392,13 +386,8 @@ static int BC28Send(struct Adapter *adapter, const void *buf, size_t len) strcat(at_cmd, buf); strcat(at_cmd, "\n"); - printf("cmd : %s\n", at_cmd); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); - PrivTaskDelay(300); - } else if(adapter->socket.type == SOCKET_TYPE_DGRAM ) { - char at_cmd[64] = {0}; - char str_fd[2] = {0}; + char listen_port[] = {0}; itoa(adapter->socket.socket_id, str_fd, 10); @@ -415,14 +404,13 @@ static int BC28Send(struct Adapter *adapter, const void *buf, size_t len) strcat(at_cmd, buf); strcat(at_cmd, "\n"); - printf("cmd : %s\n", at_cmd); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); - PrivTaskDelay(300); } -__exit: - if (reply) { - DeleteATReply(reply); + printf("cmd : %s\n", at_cmd); + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(result < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); + result = -1; } return result; diff --git a/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c index 645469a80..a48eb93f7 100644 --- a/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c +++ b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c @@ -79,66 +79,93 @@ int AdapterNbiotInit(void) } /******************TEST*********************/ -// int openzigbee(void) -// { -// int ret = 0; +int opennb(void) +{ + int ret = 0; -// struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_ZIGBEE_NAME); + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_NBIOT_NAME); -// #ifdef ADAPTER_E18 -// ret = AdapterDeviceOpen(adapter); -// if(ret < 0){ -// printf("open adapter failed\n"); -// return -1; -// } +#ifdef ADAPTER_BC28 + ret = AdapterDeviceOpen(adapter); + if(ret < 0){ + printf("open adapter failed\n"); + return -1; + } -// adapter->info->work_mode = 1; -// ret = AdapterDeviceControl(adapter, CONFIG_ZIGBEE_NET_MODE,NULL); -// if(ret < 0){ -// printf("control adapter failed\n"); -// return -1; -// } -// ret = AdapterDeviceJoin(adapter, NULL); -// if(ret < 0){ -// printf("join adapter failed\n"); -// return -1; -// } -// #endif +#endif -// return 0; -// } -// SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, openzigbee, openzigbee, show adapter zigbee information); + return 0; + } + SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, opennb, opennb, show adapter nb information); +int closenb(void) +{ + int ret = 0; -// int sendzigbee(int argc, char *argv[]) -// { -// const char *send_msg = argv[1]; -// int ret = 0; + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_NBIOT_NAME); -// struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_ZIGBEE_NAME); +#ifdef ADAPTER_BC28 + ret = AdapterDeviceClose(adapter); + if(ret < 0){ + printf("open adapter failed\n"); + return -1; + } -// printf("send argv1 %s\n",argv[1]); -// ret = AdapterDeviceSend(adapter, send_msg, strlen(send_msg)); -// if(ret < 0){ -// printf(" adapter send failed\n"); -// return -1; -// } -// printf("zigbee send msg %s\n", send_msg); +#endif + + return 0; + } + SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, closenb, closenb, show adapter nb information); + + int connectnb(int argc, char *argv[]) + { + const char *send_msg = argv[1]; + int ret = 0; + + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_NBIOT_NAME); + + + ret = AdapterDeviceConnect(adapter, 1, "192.168.131.20","3333",1); + if(ret < 0){ + printf(" adapter send failed\n"); + return -1; + } -// return 0; -// } -// SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(2)|SHELL_CMD_DISABLE_RETURN, sendzigbee, sendzigbee, show adapter zigbee information); -// int recvzigbee(void) -// { -// char recv_msg[128]; -// struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_ZIGBEE_NAME); -// memset(recv_msg,0,128); -// AdapterDeviceRecv(adapter, recv_msg, 128); -// PrivTaskDelay(2000); -// printf("zigbee recv msg %s\n", recv_msg); - -// return 0; -// } -// SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, recvzigbee, recvzigbee, show adapter zigbee information); + return 0; + } + SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(2)|SHELL_CMD_DISABLE_RETURN, connectnb, connectnb, show adapter nb information); + + int sendnb(int argc, char *argv[]) + { + const char *send_msg = argv[1]; + int ret = 0; + + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_NBIOT_NAME); + + printf("send argv1 %s\n",argv[1]); + ret = AdapterDeviceSend(adapter, send_msg, strlen(send_msg)); + if(ret < 0){ + printf(" adapter send failed\n"); + return -1; + } + printf("nb send msg %s\n", send_msg); + + + return 0; + } + SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(2)|SHELL_CMD_DISABLE_RETURN, sendnb, sendnb, show adapter nb information); + + int recvnb(void) + { + char recv_msg[128]; + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_NBIOT_NAME); + memset(recv_msg,0,128); + AdapterDeviceRecv(adapter, recv_msg, 128); + PrivTaskDelay(2000); + printf("nb recv msg %s\n", recv_msg); + + return 0; + } + SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, recvnb, recvnb, show adapter nb information); diff --git a/APP_Framework/Framework/connection/wifi/HFA21/hfa21.c b/APP_Framework/Framework/connection/wifi/HFA21/hfa21.c index 0d1d18e30..31a126521 100755 --- a/APP_Framework/Framework/connection/wifi/HFA21/hfa21.c +++ b/APP_Framework/Framework/connection/wifi/HFA21/hfa21.c @@ -116,7 +116,7 @@ static int Hfa21Receive(struct Adapter *adapter, void *rev_buffer, size_t buffer printf("hfa21 receive waiting ... \n"); if (adapter->agent) { - return EntmRecv(adapter->agent, (char *)rev_buffer, buffer_len, 40000); + return EntmRecv(adapter->agent, (char *)rev_buffer, buffer_len, 40); } else { printf("Can not find agent \n"); } diff --git a/APP_Framework/Framework/connection/zigbee/E18/e18.c b/APP_Framework/Framework/connection/zigbee/E18/e18.c index b01695889..94049cac8 100644 --- a/APP_Framework/Framework/connection/zigbee/E18/e18.c +++ b/APP_Framework/Framework/connection/zigbee/E18/e18.c @@ -388,7 +388,7 @@ static int E18Recv(struct Adapter *adapter, void *buf, size_t len) if(!adapter->agent){ PrivRead(adapter->fd, buf, len); } else { - EntmRecv(adapter->agent, buf, len, 3000);/* wait timeout 3000ms*/ + EntmRecv(adapter->agent, buf, len, 3);/* wait timeout 3000ms*/ } break; case STT_MODE2: From abe138ab27bd0b1aaae3239be098b039786c4040 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Mon, 18 Oct 2021 18:17:24 +0800 Subject: [PATCH 3/4] remove redefinition and repair compile error --- .../Framework/connection/nbiot/Kconfig | 2 +- .../Framework/connection/nbiot/Makefile | 2 +- .../Framework/connection/nbiot/bc28/bc28.c | 31 -- .../Framework/connection/zigbee/E18/e18.c | 417 ++++++++++++++++++ 4 files changed, 419 insertions(+), 33 deletions(-) create mode 100644 APP_Framework/Framework/connection/zigbee/E18/e18.c diff --git a/APP_Framework/Framework/connection/nbiot/Kconfig b/APP_Framework/Framework/connection/nbiot/Kconfig index f707070a8..bf9a087df 100644 --- a/APP_Framework/Framework/connection/nbiot/Kconfig +++ b/APP_Framework/Framework/connection/nbiot/Kconfig @@ -4,7 +4,7 @@ if CONNECTION_ADAPTER_NB default y if ADAPTER_BC28 - source "$APP_DIR/Framework/connection/nbiot/BC28/Kconfig" + source "$APP_DIR/Framework/connection/nbiot/bc28/Kconfig" endif endif diff --git a/APP_Framework/Framework/connection/nbiot/Makefile b/APP_Framework/Framework/connection/nbiot/Makefile index f1cc98d35..29f2e7d12 100644 --- a/APP_Framework/Framework/connection/nbiot/Makefile +++ b/APP_Framework/Framework/connection/nbiot/Makefile @@ -1,7 +1,7 @@ SRC_FILES := adapter_nbiot.c ifeq ($(CONFIG_ADAPTER_BC28),y) - SRC_DIR += BC28 + SRC_DIR += bc28 endif include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/connection/nbiot/bc28/bc28.c b/APP_Framework/Framework/connection/nbiot/bc28/bc28.c index 142d65876..bdb96d441 100644 --- a/APP_Framework/Framework/connection/nbiot/bc28/bc28.c +++ b/APP_Framework/Framework/connection/nbiot/bc28/bc28.c @@ -30,37 +30,6 @@ #define SOCKET_INVALID_ID (-1) -static int AtCmdConfigAndCheck(ATAgentType agent, char *cmd, char *check) -{ - char *result = NULL; - if (NULL == agent || NULL == cmd || NULL == check ) { - return -1; - } - - ATReplyType reply = CreateATReply(64); - if (NULL == reply) { - printf("%s %d at_create_resp failed!\n",__func__,__LINE__); - return -1; - } - - ATOrderSend(agent, REPLY_TIME_OUT, reply, cmd); - PrivTaskDelay(300); - - result = GetReplyText(reply); - if (!result) { - printf("%s %n get reply failed.\n",__func__,__LINE__); - goto __exit; - } - if(0 != strncmp(result, check, strlen(check))) { - printf("%s %d check[%s] reply[%s] failed.\n",__func__,__LINE__,check,result); - goto __exit; - } - return 0; - -__exit: - DeleteATReply(reply); - return -1; -} static int BC28UartOpen(struct Adapter *adapter) { diff --git a/APP_Framework/Framework/connection/zigbee/E18/e18.c b/APP_Framework/Framework/connection/zigbee/E18/e18.c new file mode 100644 index 000000000..e1a0afbd2 --- /dev/null +++ b/APP_Framework/Framework/connection/zigbee/E18/e18.c @@ -0,0 +1,417 @@ +/* +* 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 e18.c + * @brief Implement the connection zigbee adapter function, using E18 device + * @version 1.1 + * @author AIIT XUOS Lab + * @date 2021.09.15 + */ + +#include +#include +#include "../adapter_zigbee.h" +#include "e18.h" + +char *cmd_hex2at = "+++"; +char *cmd_exit = "AT+EXIT"; +char *cmd_ask_panid = "AT+PANID=?"; +char *cmd_set_panid = "AT+PANID=A1B2"; +char *cmd_ask_mode = "AT+MODE=?"; +char *cmd_mode_as_tt = "AT+MODE=1"; /*mode 1:transparent transmission*/ +char *cmd_mode_as_stt = "AT+MODE=2"; /*mode 2:Semi transparent transmission*/ +char *cmd_mode_as_protocol = "AT+MODE=3"; /*mode 3:Protocol mode*/ +char *cmd_ask_role = "AT+DEV=?"; +char *cmd_role_as_c = "AT+DEV=C"; /*set device type for coordinater*/ +char *cmd_role_as_e = "AT+DEV=E"; /*set device type for end device*/ +char *cmd_role_as_r = "AT+DEV=R"; /*set device type for router*/ +char *cmd_set_ch = "AT+CH=11"; /*set channel as 11*/ + +static int E18UartOpen(struct Adapter *adapter) +{ + if (NULL == adapter) { + return -1; + } + + /* Open device in read-write mode */ + adapter->fd = PrivOpen(ADAPTER_E18_DRIVER,O_RDWR); + if (adapter->fd < 0) { + printf("E18UartSetUp get serial %s fd error\n", ADAPTER_E18_DRIVER); + return -1; + } + /* set serial config, serial_baud_rate = 115200 */ + + struct SerialDataCfg cfg; + memset(&cfg, 0 ,sizeof(struct SerialDataCfg)); + + cfg.serial_baud_rate = BAUD_RATE_115200; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = BIT_ORDER_LSB; + cfg.serial_invert_mode = NRZ_NORMAL; + cfg.serial_buffer_size = SERIAL_RB_BUFSZ; + + /*aiit board use ch438, so it needs more serial configuration*/ +#ifdef ADAPTER_E18_DRIVER_EXTUART + cfg.ext_uart_no = ADAPTER_E18_DRIVER_EXT_PORT; + cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &cfg; + + PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); + PrivTaskDelay(1000); + + printf("Zigbee uart config ready\n"); + return 0; +} + +static int E18NetworkModeConfig(struct Adapter *adapter) +{ + int ret = 0; + if (NULL == adapter) { + return -1; + } + ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); + ret = -1; + goto out; + } + + switch (adapter->info->work_mode) + { + case TT_MODE1: + ret = AtCmdConfigAndCheck(adapter->agent, cmd_mode_as_tt, "+OK"); + ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_mode, "MODE=1"); + if(ret < 0) { + printf("%s %d config net mode as transparent transmission failed!\n",__func__,__LINE__); + ret = -1; + goto out; + } + break; + case STT_MODE2: + ret = AtCmdConfigAndCheck(adapter->agent, cmd_mode_as_stt, "+OK"); + ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_mode, "MODE=2"); + if(ret < 0) { + printf("%s %d config net mode as semi transparent transmission failed!\n",__func__,__LINE__); + ret = -1; + goto out; + } + break; + case PROTOCOL_MODE3: + ret = AtCmdConfigAndCheck(adapter->agent, cmd_mode_as_protocol, "+OK"); + ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_mode, "MODE=3"); + if(ret < 0) { + printf("%s %d config net mode as protocol failed!\n",__func__,__LINE__); + ret = -1; + goto out; + } + break; + default : + ret = -1; + break; + } + +out: + AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); + return ret; +} + +static int E18NetRoleConfig(struct Adapter *adapter) +{ + int ret = 0; + + if (NULL == adapter) { + printf("%s %d adapter is null!\n",__func__,__LINE__); + ret = -1; + goto out; + } + + ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); + ret = -1; + goto out; + } + + switch (adapter->net_role) + { + case COORDINATOR: + ret = AtCmdConfigAndCheck(adapter->agent, cmd_role_as_c, "+OK"); + ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_role, "DEV=C"); + if(ret < 0) { + printf("%s %d config net role as coordinator failed!\n",__func__,__LINE__); + ret = -1; + goto out; + } + break; + case ROUTER: + ret = AtCmdConfigAndCheck(adapter->agent, cmd_role_as_r, "+OK"); + ret |= AtCmdConfigAndCheck(adapter->agent, cmd_role_as_r, "DEV=R"); + if(ret < 0) { + printf("%s %d config net role as router failed!\n",__func__,__LINE__); + ret = -1; + goto out; + } + break; + case END_DEVICE: + ret = AtCmdConfigAndCheck(adapter->agent, cmd_role_as_e, "+OK"); + ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_role, "DEV=E"); + if(ret < 0) { + printf("%s %d config net role as device failed!\n",__func__,__LINE__); + ret = -1; + goto out; + } + break; + default : + ret = -1; + break; + } + +out: + AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); + return ret; +} + +static int E18Open(struct Adapter *adapter) +{ + int ret = 0; + int try_times = 5; + + if (NULL == adapter) { + return -1; + } + /*step1: open e18 serial port*/ + ret = E18UartOpen(adapter); + if (ret < 0) { + printf("e18 setup failed.\n"); + return -1; + } + /*step2: init AT agent*/ + if (!adapter->agent) { + char *agent_name = "zigbee_device"; + if (EOK != InitATAgent(agent_name, adapter->fd, 512)) { + printf("at agent init failed !\n"); + return -1; + } + ATAgentType at_agent = GetATAgent(agent_name); + adapter->agent = at_agent; + } + +try_again: + while(try_times--){ + ret = E18NetRoleConfig(adapter); + if(ret < 0){ + printf("E18NetRoleConfig failed [%d] times.\n",try_times); + goto try_again; + } + } + + if(ret < 0){ + printf("E18NetRoleConfig failed\n"); + return -1; + } + + printf("Zigbee E18 open successful\n"); + return 0; +} + +static int E18Close(struct Adapter *adapter) +{ + PrivClose(adapter->fd); + return 0; +} + +static int E18Ioctl(struct Adapter *adapter, int cmd, void *args) +{ + int ret = 0; + switch (cmd) + { + case CONFIG_ZIGBEE_NET_ROLE: /* config E18 net role */ + ret = E18NetRoleConfig(adapter); + break; + case CONFIG_ZIGBEE_NET_MODE: /* config E18 network mode */ + ret = E18NetworkModeConfig(adapter); + break; + default: + ret = -1; + break; + } + + return ret; +} + +static int E18Join(struct Adapter *adapter, const char *priv_net_group) +{ + int ret = 0; + + ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); + ret = -1; + goto out; + } + + switch (adapter->net_role) + { + case COORDINATOR: + case ROUTER: + case END_DEVICE: + /* config panid */ + ret = AtCmdConfigAndCheck(adapter->agent, cmd_set_panid, "+OK"); + ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_panid, "PANID=A1B2"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_set_panid); + ret = -1; + goto out; + } + + /* config channel*/ + ret = AtCmdConfigAndCheck(adapter->agent, cmd_set_ch, "+OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_set_ch); + ret = -1; + goto out; + } + break; + default : + ret = -1; + break; + } + + // switch (adapter->info->work_mode) + // { + // case TT_MODE1: + // break; + // case STT_MODE2: + // /* need to do */ + // ret = 0; + // break; + // case PROTOCOL_MODE3: + // /* need to do */ + // ret = 0; + // break; + // default: + // ret = -1; + // break; + + // } + if(!ret){ + ret = AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_exit); + ret = -1; + } + } + +out: + return ret; +} + +static int E18Send(struct Adapter *adapter, const void *buf, size_t len) +{ + int ret = 0; + switch (adapter->info->work_mode) + { + case TT_MODE1: + EntmSend(adapter->agent, buf, len); + break; + case STT_MODE2: + /* need to do */ + ret = 0; + break; + case PROTOCOL_MODE3: + /* need to do */ + ret = 0; + break; + default: + ret = -1; + break; + + } + return 0; +} + +static int E18Recv(struct Adapter *adapter, void *buf, size_t len) +{ + int ret = 0; + switch (adapter->info->work_mode) + { + case TT_MODE1: + if(!adapter->agent){ + PrivRead(adapter->fd, buf, len); + } else { + EntmRecv(adapter->agent, buf, len, 3);/* wait timeout 3000ms*/ + } + break; + case STT_MODE2: + /* need to do */ + ret = 0; + break; + case PROTOCOL_MODE3: + /* need to do */ + ret = 0; + break; + default: + ret = -1; + break; + } + + return 0; +} + +static int E18Quit(struct Adapter *adapter) +{ + + return 0; +} + +static const struct PrivProtocolDone E18_done = +{ + .open = E18Open, + .close = E18Close, + .ioctl = E18Ioctl, + .setup = NULL, + .setdown = NULL, + .setaddr = NULL, + .setdns = NULL, + .setdhcp = NULL, + .ping = NULL, + .netstat = NULL, + .join = E18Join, + .send = E18Send, + .recv = E18Recv, + .quit = E18Quit, +}; + +AdapterProductInfoType E18Attach(struct Adapter *adapter) +{ + struct AdapterProductInfo *product_info = malloc(sizeof(struct AdapterProductInfo)); + if (!product_info) { + printf("E18Attach malloc product_info error\n"); + return NULL; + } + memset(product_info, 0, sizeof(struct AdapterProductInfo)); + + strncpy(product_info->model_name, ADAPTER_ZIGBEE_E18,sizeof(product_info->model_name)); + product_info->model_done = (void *)&E18_done; + + return product_info; +} + + + From 281a3b672a7abaeefc300825d01b8f0fb5b24e87 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Thu, 21 Oct 2021 15:17:14 +0800 Subject: [PATCH 4/4] debug nbiot pass with some modification --- .../Framework/connection/adapter_agent.c | 4 +- .../connection/nbiot/adapter_nbiot.c | 7 +- .../Framework/connection/nbiot/bc28/Kconfig | 2 +- .../Framework/connection/nbiot/bc28/bc28.c | 94 +++- .../Framework/connection/zigbee/E18/e18.c | 417 ------------------ .../Framework/connection/zigbee/e18/e18.c | 4 +- 6 files changed, 98 insertions(+), 430 deletions(-) delete mode 100644 APP_Framework/Framework/connection/zigbee/E18/e18.c diff --git a/APP_Framework/Framework/connection/adapter_agent.c b/APP_Framework/Framework/connection/adapter_agent.c index 401dec9a2..5cc8d9d5b 100755 --- a/APP_Framework/Framework/connection/adapter_agent.c +++ b/APP_Framework/Framework/connection/adapter_agent.c @@ -309,9 +309,9 @@ static int GetCompleteATReply(ATAgentType agent) while (1) { PrivRead(agent->fd, &ch, 1); - +#ifdef CONNECTION_FRAMEWORK_DEBUG printf(" %c (0x%x)\n", ch, ch); - +#endif if (agent->receive_mode == ENTM_MODE){ if (agent->entm_recv_len < ENTM_RECV_MAX) { PrivMutexObtain(&agent->lock); diff --git a/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c index a48eb93f7..e4ef085dd 100644 --- a/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c +++ b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c @@ -124,7 +124,7 @@ int closenb(void) struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_NBIOT_NAME); - ret = AdapterDeviceConnect(adapter, 1, "192.168.131.20","3333",1); + ret = AdapterDeviceConnect(adapter, 1, "101.68.82.219","9898",1); if(ret < 0){ printf(" adapter send failed\n"); return -1; @@ -139,12 +139,13 @@ int closenb(void) int sendnb(int argc, char *argv[]) { const char *send_msg = argv[1]; + int msg_len = atoi(argv[2]); int ret = 0; struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_NBIOT_NAME); - printf("send argv1 %s\n",argv[1]); - ret = AdapterDeviceSend(adapter, send_msg, strlen(send_msg)); + printf("send argv1 %s len = %d\n",argv[1],msg_len); + ret = AdapterDeviceSend(adapter, send_msg, msg_len); if(ret < 0){ printf(" adapter send failed\n"); return -1; diff --git a/APP_Framework/Framework/connection/nbiot/bc28/Kconfig b/APP_Framework/Framework/connection/nbiot/bc28/Kconfig index b4224090e..6f7d7500d 100644 --- a/APP_Framework/Framework/connection/nbiot/bc28/Kconfig +++ b/APP_Framework/Framework/connection/nbiot/bc28/Kconfig @@ -17,7 +17,7 @@ if ADD_XIUOS_FETURES config ADAPTER_BC28_DRIVER string "BC28 device uart driver path" - default "/dev/uart2_dev2" + default "/dev/usart2_dev2" depends on !ADAPTER_BC28_DRIVER_EXTUART if ADAPTER_BC28_DRIVER_EXTUART diff --git a/APP_Framework/Framework/connection/nbiot/bc28/bc28.c b/APP_Framework/Framework/connection/nbiot/bc28/bc28.c index bdb96d441..7135b0913 100644 --- a/APP_Framework/Framework/connection/nbiot/bc28/bc28.c +++ b/APP_Framework/Framework/connection/nbiot/bc28/bc28.c @@ -100,6 +100,76 @@ static void BC28PowerSet(void) PrivClose(pin_fd); } + +int NBIoTStatusCheck(struct Adapter *adapter ) +{ + int32 result = 0; + + if (!adapter ){ + return -1; + } + + char at_cmd[64] = {0}; + + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); /* set receive end flag as 'OK'*/ + + memcpy(at_cmd, "AT+CSQ", 6); + strcat(at_cmd, "\n"); + printf("cmd : %s\n", at_cmd); + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(result < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); + result = -1; + } + + memcpy(at_cmd, "AT+CFUN?", 8); + strcat(at_cmd, "\n"); + printf("cmd : %s\n", at_cmd); + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(result < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); + result = -1; + } + + memcpy(at_cmd, "AT+CIMI", 7); + strcat(at_cmd, "\n"); + printf("cmd : %s\n", at_cmd); + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(result < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); + result = -1; + } + + memcpy(at_cmd, "AT+CEREG?", 9); + strcat(at_cmd, "\n"); + printf("cmd : %s\n", at_cmd); + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(result < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); + result = -1; + } + + memcpy(at_cmd, "AT+CGATT?", 9); + strcat(at_cmd, "\n"); + printf("cmd : %s\n", at_cmd); + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(result < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); + result = -1; + } + + memcpy(at_cmd, "AT+CGPADDR", 10); + strcat(at_cmd, "\n"); + printf("cmd : %s\n", at_cmd); + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(result < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); + result = -1; + } + + return result; +} + /** * @description: NBIoT device create a socket connection * @param adapter - NBIoT adapter AT @@ -175,6 +245,9 @@ int NBIoTSocketCreate(struct Adapter *adapter, struct Socket *socket ) strcat(at_cmd, "\n"); printf("cmd : %s\n", at_cmd); + + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); /* set receive end flag as 'OK'*/ + result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); if(result < 0) { printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); @@ -212,6 +285,7 @@ int NBIoTSocketDelete(struct Adapter *adapter ) strcat(at_cmd, "\n"); printf("cmd : %s\n", at_cmd); + AtSetReplyCharNum(adapter->agent, 1); ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, at_cmd); PrivTaskDelay(300); @@ -246,9 +320,14 @@ static int BC28Open(struct Adapter *adapter) } create_socket.type = SOCKET_TYPE_STREAM; create_socket.listen_port = 0; - create_socket.socket_id = 0; + create_socket.socket_id = 1; create_socket.af_type = NET_TYPE_AF_INET; + BC28PowerSet(); /* reset bc28 module by set reset pin */ + PrivTaskDelay(6000); + + NBIoTStatusCheck(adapter); /* ask module status*/ + /*step3: create a tcp socket default */ ret = NBIoTSocketCreate(adapter, &create_socket); if(ret < 0){ @@ -323,6 +402,7 @@ static int BC28Connect(struct Adapter *adapter, enum NetRoleType net_role, const strcat(at_cmd, "\n"); printf("cmd : %s\n", at_cmd); + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); if(result < 0) { printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); @@ -376,6 +456,7 @@ static int BC28Send(struct Adapter *adapter, const void *buf, size_t len) } printf("cmd : %s\n", at_cmd); + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); result = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); if(result < 0) { printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,at_cmd); @@ -390,6 +471,7 @@ static int BC28Recv(struct Adapter *adapter, void *buf, size_t len) char at_cmd[64] = {0}; char str_fd[2] = {0}; char size[2] = {0}; + char *result = NULL; ATReplyType reply = CreateATReply(64); if (NULL == reply) { @@ -398,7 +480,7 @@ static int BC28Recv(struct Adapter *adapter, void *buf, size_t len) } itoa(adapter->socket.socket_id, str_fd, 10); - size[0] = len + '0'; + itoa(len, size, 10); memcpy(at_cmd, "AT+NSORF=", 9); strcat(at_cmd, str_fd); @@ -409,11 +491,12 @@ static int BC28Recv(struct Adapter *adapter, void *buf, size_t len) printf("cmd : %s\n", at_cmd); ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, at_cmd); PrivTaskDelay(300); - - buf = GetReplyText(reply); - if (!buf) { + + result = GetReplyText(reply); + if (!result) { printf("%s %n get reply failed.\n",__func__,__LINE__); } + memcpy(buf, result, reply->reply_len); if (reply) { DeleteATReply(reply); @@ -461,7 +544,6 @@ AdapterProductInfoType BC28Attach(struct Adapter *adapter) strncpy(product_info->model_name, ADAPTER_NBIOT_BC28,sizeof(product_info->model_name)); product_info->model_done = (void *)&BC28_done; - BC28PowerSet(); return product_info; } diff --git a/APP_Framework/Framework/connection/zigbee/E18/e18.c b/APP_Framework/Framework/connection/zigbee/E18/e18.c deleted file mode 100644 index e1a0afbd2..000000000 --- a/APP_Framework/Framework/connection/zigbee/E18/e18.c +++ /dev/null @@ -1,417 +0,0 @@ -/* -* 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 e18.c - * @brief Implement the connection zigbee adapter function, using E18 device - * @version 1.1 - * @author AIIT XUOS Lab - * @date 2021.09.15 - */ - -#include -#include -#include "../adapter_zigbee.h" -#include "e18.h" - -char *cmd_hex2at = "+++"; -char *cmd_exit = "AT+EXIT"; -char *cmd_ask_panid = "AT+PANID=?"; -char *cmd_set_panid = "AT+PANID=A1B2"; -char *cmd_ask_mode = "AT+MODE=?"; -char *cmd_mode_as_tt = "AT+MODE=1"; /*mode 1:transparent transmission*/ -char *cmd_mode_as_stt = "AT+MODE=2"; /*mode 2:Semi transparent transmission*/ -char *cmd_mode_as_protocol = "AT+MODE=3"; /*mode 3:Protocol mode*/ -char *cmd_ask_role = "AT+DEV=?"; -char *cmd_role_as_c = "AT+DEV=C"; /*set device type for coordinater*/ -char *cmd_role_as_e = "AT+DEV=E"; /*set device type for end device*/ -char *cmd_role_as_r = "AT+DEV=R"; /*set device type for router*/ -char *cmd_set_ch = "AT+CH=11"; /*set channel as 11*/ - -static int E18UartOpen(struct Adapter *adapter) -{ - if (NULL == adapter) { - return -1; - } - - /* Open device in read-write mode */ - adapter->fd = PrivOpen(ADAPTER_E18_DRIVER,O_RDWR); - if (adapter->fd < 0) { - printf("E18UartSetUp get serial %s fd error\n", ADAPTER_E18_DRIVER); - return -1; - } - /* set serial config, serial_baud_rate = 115200 */ - - struct SerialDataCfg cfg; - memset(&cfg, 0 ,sizeof(struct SerialDataCfg)); - - cfg.serial_baud_rate = BAUD_RATE_115200; - cfg.serial_data_bits = DATA_BITS_8; - cfg.serial_stop_bits = STOP_BITS_1; - cfg.serial_parity_mode = PARITY_NONE; - cfg.serial_bit_order = BIT_ORDER_LSB; - cfg.serial_invert_mode = NRZ_NORMAL; - cfg.serial_buffer_size = SERIAL_RB_BUFSZ; - - /*aiit board use ch438, so it needs more serial configuration*/ -#ifdef ADAPTER_E18_DRIVER_EXTUART - cfg.ext_uart_no = ADAPTER_E18_DRIVER_EXT_PORT; - cfg.port_configure = PORT_CFG_INIT; -#endif - - struct PrivIoctlCfg ioctl_cfg; - ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; - ioctl_cfg.args = &cfg; - - PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); - PrivTaskDelay(1000); - - printf("Zigbee uart config ready\n"); - return 0; -} - -static int E18NetworkModeConfig(struct Adapter *adapter) -{ - int ret = 0; - if (NULL == adapter) { - return -1; - } - ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); - ret = -1; - goto out; - } - - switch (adapter->info->work_mode) - { - case TT_MODE1: - ret = AtCmdConfigAndCheck(adapter->agent, cmd_mode_as_tt, "+OK"); - ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_mode, "MODE=1"); - if(ret < 0) { - printf("%s %d config net mode as transparent transmission failed!\n",__func__,__LINE__); - ret = -1; - goto out; - } - break; - case STT_MODE2: - ret = AtCmdConfigAndCheck(adapter->agent, cmd_mode_as_stt, "+OK"); - ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_mode, "MODE=2"); - if(ret < 0) { - printf("%s %d config net mode as semi transparent transmission failed!\n",__func__,__LINE__); - ret = -1; - goto out; - } - break; - case PROTOCOL_MODE3: - ret = AtCmdConfigAndCheck(adapter->agent, cmd_mode_as_protocol, "+OK"); - ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_mode, "MODE=3"); - if(ret < 0) { - printf("%s %d config net mode as protocol failed!\n",__func__,__LINE__); - ret = -1; - goto out; - } - break; - default : - ret = -1; - break; - } - -out: - AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); - return ret; -} - -static int E18NetRoleConfig(struct Adapter *adapter) -{ - int ret = 0; - - if (NULL == adapter) { - printf("%s %d adapter is null!\n",__func__,__LINE__); - ret = -1; - goto out; - } - - ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); - ret = -1; - goto out; - } - - switch (adapter->net_role) - { - case COORDINATOR: - ret = AtCmdConfigAndCheck(adapter->agent, cmd_role_as_c, "+OK"); - ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_role, "DEV=C"); - if(ret < 0) { - printf("%s %d config net role as coordinator failed!\n",__func__,__LINE__); - ret = -1; - goto out; - } - break; - case ROUTER: - ret = AtCmdConfigAndCheck(adapter->agent, cmd_role_as_r, "+OK"); - ret |= AtCmdConfigAndCheck(adapter->agent, cmd_role_as_r, "DEV=R"); - if(ret < 0) { - printf("%s %d config net role as router failed!\n",__func__,__LINE__); - ret = -1; - goto out; - } - break; - case END_DEVICE: - ret = AtCmdConfigAndCheck(adapter->agent, cmd_role_as_e, "+OK"); - ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_role, "DEV=E"); - if(ret < 0) { - printf("%s %d config net role as device failed!\n",__func__,__LINE__); - ret = -1; - goto out; - } - break; - default : - ret = -1; - break; - } - -out: - AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); - return ret; -} - -static int E18Open(struct Adapter *adapter) -{ - int ret = 0; - int try_times = 5; - - if (NULL == adapter) { - return -1; - } - /*step1: open e18 serial port*/ - ret = E18UartOpen(adapter); - if (ret < 0) { - printf("e18 setup failed.\n"); - return -1; - } - /*step2: init AT agent*/ - if (!adapter->agent) { - char *agent_name = "zigbee_device"; - if (EOK != InitATAgent(agent_name, adapter->fd, 512)) { - printf("at agent init failed !\n"); - return -1; - } - ATAgentType at_agent = GetATAgent(agent_name); - adapter->agent = at_agent; - } - -try_again: - while(try_times--){ - ret = E18NetRoleConfig(adapter); - if(ret < 0){ - printf("E18NetRoleConfig failed [%d] times.\n",try_times); - goto try_again; - } - } - - if(ret < 0){ - printf("E18NetRoleConfig failed\n"); - return -1; - } - - printf("Zigbee E18 open successful\n"); - return 0; -} - -static int E18Close(struct Adapter *adapter) -{ - PrivClose(adapter->fd); - return 0; -} - -static int E18Ioctl(struct Adapter *adapter, int cmd, void *args) -{ - int ret = 0; - switch (cmd) - { - case CONFIG_ZIGBEE_NET_ROLE: /* config E18 net role */ - ret = E18NetRoleConfig(adapter); - break; - case CONFIG_ZIGBEE_NET_MODE: /* config E18 network mode */ - ret = E18NetworkModeConfig(adapter); - break; - default: - ret = -1; - break; - } - - return ret; -} - -static int E18Join(struct Adapter *adapter, const char *priv_net_group) -{ - int ret = 0; - - ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); - ret = -1; - goto out; - } - - switch (adapter->net_role) - { - case COORDINATOR: - case ROUTER: - case END_DEVICE: - /* config panid */ - ret = AtCmdConfigAndCheck(adapter->agent, cmd_set_panid, "+OK"); - ret |= AtCmdConfigAndCheck(adapter->agent, cmd_ask_panid, "PANID=A1B2"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_set_panid); - ret = -1; - goto out; - } - - /* config channel*/ - ret = AtCmdConfigAndCheck(adapter->agent, cmd_set_ch, "+OK"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_set_ch); - ret = -1; - goto out; - } - break; - default : - ret = -1; - break; - } - - // switch (adapter->info->work_mode) - // { - // case TT_MODE1: - // break; - // case STT_MODE2: - // /* need to do */ - // ret = 0; - // break; - // case PROTOCOL_MODE3: - // /* need to do */ - // ret = 0; - // break; - // default: - // ret = -1; - // break; - - // } - if(!ret){ - ret = AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_exit); - ret = -1; - } - } - -out: - return ret; -} - -static int E18Send(struct Adapter *adapter, const void *buf, size_t len) -{ - int ret = 0; - switch (adapter->info->work_mode) - { - case TT_MODE1: - EntmSend(adapter->agent, buf, len); - break; - case STT_MODE2: - /* need to do */ - ret = 0; - break; - case PROTOCOL_MODE3: - /* need to do */ - ret = 0; - break; - default: - ret = -1; - break; - - } - return 0; -} - -static int E18Recv(struct Adapter *adapter, void *buf, size_t len) -{ - int ret = 0; - switch (adapter->info->work_mode) - { - case TT_MODE1: - if(!adapter->agent){ - PrivRead(adapter->fd, buf, len); - } else { - EntmRecv(adapter->agent, buf, len, 3);/* wait timeout 3000ms*/ - } - break; - case STT_MODE2: - /* need to do */ - ret = 0; - break; - case PROTOCOL_MODE3: - /* need to do */ - ret = 0; - break; - default: - ret = -1; - break; - } - - return 0; -} - -static int E18Quit(struct Adapter *adapter) -{ - - return 0; -} - -static const struct PrivProtocolDone E18_done = -{ - .open = E18Open, - .close = E18Close, - .ioctl = E18Ioctl, - .setup = NULL, - .setdown = NULL, - .setaddr = NULL, - .setdns = NULL, - .setdhcp = NULL, - .ping = NULL, - .netstat = NULL, - .join = E18Join, - .send = E18Send, - .recv = E18Recv, - .quit = E18Quit, -}; - -AdapterProductInfoType E18Attach(struct Adapter *adapter) -{ - struct AdapterProductInfo *product_info = malloc(sizeof(struct AdapterProductInfo)); - if (!product_info) { - printf("E18Attach malloc product_info error\n"); - return NULL; - } - memset(product_info, 0, sizeof(struct AdapterProductInfo)); - - strncpy(product_info->model_name, ADAPTER_ZIGBEE_E18,sizeof(product_info->model_name)); - product_info->model_done = (void *)&E18_done; - - return product_info; -} - - - diff --git a/APP_Framework/Framework/connection/zigbee/e18/e18.c b/APP_Framework/Framework/connection/zigbee/e18/e18.c index e1a0afbd2..09088625b 100644 --- a/APP_Framework/Framework/connection/zigbee/e18/e18.c +++ b/APP_Framework/Framework/connection/zigbee/e18/e18.c @@ -211,7 +211,9 @@ static int E18Open(struct Adapter *adapter) ATAgentType at_agent = GetATAgent(agent_name); adapter->agent = at_agent; } - + + AtSetReplyLrEnd(adapter->agent, 1); + try_again: while(try_times--){ ret = E18NetRoleConfig(adapter);