1、support 4G tcp connect in webserver; 2、support 4G MQTT connect in webserver,using mqttx to test send/receive data。developer need to support mqtt application if the project need the webserver mqtt function; 3、fix LoRa bug in webserver

it is OK
This commit is contained in:
xuedongliang
2024-02-02 10:22:02 +08:00
32 changed files with 243 additions and 6590 deletions

View File

@@ -54,6 +54,10 @@ static const char* s_enable_hexdump = "no";
static const char* s_ssi_pattern = "#.html";
static const char* web_version = "XiUOS WebServer 1.0";
static const char* net_carrier_china_mobile = "中国移动";
static const char* net_carrier_china_unicom = "中国联通";
static const char* net_carrier_china_telecom = "中国电信";
static struct netdev* p_netdev_webserver;
static struct netdev* p_netdev_ethernet;
static pthread_t tid;
@@ -78,17 +82,27 @@ static int wb_event;
static unsigned int status = 0;
static pthread_t wb_event_task;
enum ModulesType
{
MODULES_NULL = 0, // null
MODULES_4G, // support 4G modules
MODULES_LORA, // support LoRa modules
MODULES_ALL, //all
};
/*define device info*/
#ifdef APPLICATION_WEBSERVER_XISHUTONG_4G
static const char* device_name = "矽数通4G";
static const char* device_type = "xishutong-arm32";
static const char* device_serial_num = "123456789";
static int support_module = MODULES_ALL;
#endif
#ifdef APPLICATION_WEBSERVER_XISHUTONG
static const char* device_name = "矽数通";
static const char* device_type = "xishutong-arm32";
static const char* device_serial_num = "123456789";
static int support_module = MODULES_LORA;
#endif
/*define webserver info*/
@@ -107,24 +121,29 @@ int rs485_uart_fd = -1;
#define RS485_DEVICE_PATH "/dev/usart4_dev4"
#ifdef APPLICATION_WEBSERVER_XISHUTONG_4G
/*define net 4G info*/
static struct net_4g_info {
char map_ip[20];
char connect_ip[20];
char connect_ip[40];
char operator[20];
char signal_strength[20];
char connect_port[20];
int net_4g_init_flag;
int connect_status;
} net_4g_info;
struct Adapter* adapter;
static struct net_4g_mqtt_info {
char topic[20];
char username[20];
char password[20];
int client_id;
char topic[40];
char username[40];
char password[40];
char client_id[40];
int connect_status;
} net_4g_mqtt_info;
#endif
/*define net LoRa info*/
struct net_lora_info
@@ -162,6 +181,31 @@ static uint16_t tcp_socket_port = 8888;
static char *plc_json;
#define JSON_FILE_NAME "test_recipe.json"
/*******************************************************************************
* Function implementation - judge using 4G modules or LoRa modules
******************************************************************************/
static int JudgeModulesType(void)
{
int ret;
int retry = 5;
#ifdef APPLICATION_WEBSERVER_XISHUTONG_4G
extern int TestLoraRadio(int argc, char *argv[]);
char* check_params[2] = {"TestLoraRadio", "check"};
do {
ret = TestLoraRadio(2, check_params);
if (ret > 0) {
retry = 0;
support_module = MODULES_LORA;
} else {
retry--;
}
} while (retry > 0);
#endif
return support_module;
}
/*******************************************************************************
* Function implementation - define interface info
******************************************************************************/
@@ -249,24 +293,67 @@ static void Rs485Configure(int baud_rate, int data_bit, int stop_bit, int parity
#ifdef APPLICATION_WEBSERVER_XISHUTONG_4G
static void Net4gGetInfo(char *ip, char *operator, char *signal_strength)
{
//to do
if (net_4g_info.net_4g_init_flag) {
strcpy(ip, adapter->network_info.ip_address);
sprintf(signal_strength, "%d", adapter->network_info.signal_strength);
switch (adapter->network_info.carrier_type)
{
case CARRIER_CHINA_MOBILE:
strcpy(operator, net_carrier_china_mobile);
break;
case CARRIER_CHINA_UNICOM:
strcpy(operator, net_carrier_china_unicom);
break;
case CARRIER_CHINA_TELECOM:
strcpy(operator, net_carrier_china_telecom);
break;
default:
break;
}
}
}
static void Net4gConnect(void)
{
int ec200a_baud_rate = 115200;
int ret = -1;
int ec200a_baud_rate;
const char *send_msg = "Adapter_4G Test";
adapter->socket.socket_id = 0;
AdapterDeviceOpen(adapter);
AdapterDeviceControl(adapter, OPE_INT, &ec200a_baud_rate);
AdapterDeviceConnect(adapter, CLIENT, net_4g_info.connect_ip, net_4g_info.connect_port, IPV4);
if (0 == net_4g_info.net_4g_init_flag) {
adapter->socket.socket_id = 0;
ec200a_baud_rate = 115200;
AdapterDeviceOpen(adapter);
AdapterDeviceControl(adapter, OPE_INT, &ec200a_baud_rate);
AdapterDeviceNetstat(adapter);
net_4g_info.net_4g_init_flag = 1;
}
if (1 == net_4g_mqtt_info.connect_status) {
AdapterDeviceMqttDisconnect(adapter);
net_4g_mqtt_info.connect_status = 0;
}
if (0 == net_4g_info.connect_status) {
ret = AdapterDeviceConnect(adapter, CLIENT, net_4g_info.connect_ip, net_4g_info.connect_port, IPV4);
if (ret < 0) {
net_4g_info.connect_status = 0;
printf("webserver %s fail\n", __func__);
} else {
net_4g_info.connect_status = 1;
AdapterDeviceSend(adapter, send_msg, strlen(send_msg));
printf("webserver %s success\n", __func__);
}
}
}
static void Net4gDisconnect(void)
{
uint8_t priv_net_group = IP_PROTOCOL;
AdapterDeviceDisconnect(adapter, &priv_net_group);
if (1 == net_4g_info.connect_status) {
uint8_t priv_net_group = IP_PROTOCOL;
AdapterDeviceDisconnect(adapter, &priv_net_group);
net_4g_info.connect_status = 0;
}
}
/*******************************************************************************
@@ -274,12 +361,57 @@ static void Net4gDisconnect(void)
******************************************************************************/
static void NetMqttConnect(void)
{
//to do
int ret = -1;
int ec200a_baud_rate = 0;
//for test
const char *send_msg = "Adapter_4G MQTT Test";
char recv_msg[256] = {0};
int send_cnt = 1;
if (0 == net_4g_info.net_4g_init_flag) {
adapter->socket.socket_id = 0;
ec200a_baud_rate = 115200;
AdapterDeviceOpen(adapter);
AdapterDeviceControl(adapter, OPE_INT, &ec200a_baud_rate);
AdapterDeviceNetstat(adapter);
net_4g_info.net_4g_init_flag = 1;
}
if (1 == net_4g_info.connect_status) {
uint8_t priv_net_group = IP_PROTOCOL;
AdapterDeviceDisconnect(adapter, &priv_net_group);
net_4g_info.connect_status = 0;
}
if (0 == net_4g_mqtt_info.connect_status) {
ret = AdapterDeviceMqttConnect(adapter, net_4g_info.connect_ip, net_4g_info.connect_port,
net_4g_mqtt_info.client_id, net_4g_mqtt_info.username, net_4g_mqtt_info.password);
if (ret < 0) {
net_4g_mqtt_info.connect_status = 0;
printf("webserver %s fail\n", __func__);
} else {
net_4g_mqtt_info.connect_status = 1;
//for test
while (send_cnt < 11) {
AdapterDeviceMqttSend(adapter, net_4g_mqtt_info.topic, send_msg, strlen(send_msg));
AdapterDeviceMqttRecv(adapter, net_4g_mqtt_info.topic, recv_msg, sizeof(recv_msg));
printf("[%d]4G mqtt test recv msg %s\n", send_cnt, recv_msg);
send_cnt++;
}
printf("webserver %s success\n", __func__);
}
}
}
static void NetMqttDisconnect(void)
{
//to do
if (1 == net_4g_mqtt_info.connect_status) {
AdapterDeviceMqttDisconnect(adapter);
net_4g_mqtt_info.connect_status = 0;
}
}
#endif
@@ -288,25 +420,24 @@ static void NetMqttDisconnect(void)
******************************************************************************/
static void NetLoraConnect(void)
{
char* init_params[2] = {"TestLoraRadio", "probe"};
char* tx_params[4] = {"TestLoraRadio", "tx", "1", "2000"};
extern int TestLoraRadio(int argc, char *argv[]);
if (MODULES_LORA == support_module) {
char* tx_params[5] = {"TestLoraRadio", "tx", "1", "2000", "2"};
extern int TestLoraRadio(int argc, char *argv[]);
if (0 == net_lora_info.lora_init_flag) {
TestLoraRadio(2, init_params);
net_lora_info.lora_init_flag = 1;
if (0 == net_lora_info.lora_init_flag) {
net_lora_info.lora_init_flag = 1;
}
TestLoraRadio(5, tx_params);
net_lora_info.connect_status = 1;
}
TestLoraRadio(4, tx_params);
net_lora_info.connect_status = 1;
}
static void NetLoraDisconnect(void)
{
char* disconnect_params[2] = {"TestLoraRadio", "txdone"};
extern int TestLoraRadio(int argc, char *argv[]);
TestLoraRadio(2, disconnect_params);
net_lora_info.connect_status = 0;
if (MODULES_LORA == support_module) {
net_lora_info.connect_status = 0;
}
}
/*******************************************************************************
@@ -494,8 +625,14 @@ static void fn(struct mg_connection* c, int ev, void* ev_data, void* fn_data)
{
if (ev == MG_EV_HTTP_MSG) {
struct mg_http_message *hm = (struct mg_http_message*)ev_data, tmp = { 0 };
/*define modules info*/
if (mg_http_match_uri(hm, "/net/getModulesInfo")) {
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
"{%m:%d}\n",
MG_ESC("modulesStatus"), JudgeModulesType());
}
/*define device info*/
if (mg_http_match_uri(hm, "/getSystemInfo")) {
else if (mg_http_match_uri(hm, "/getSystemInfo")) {
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
"{%m:%m, %m:%m, %m:%m, %m:%m, %m:%m, %m:%m}\n",
MG_ESC("deviceName"), MG_ESC(device_name),
@@ -551,12 +688,16 @@ static void fn(struct mg_connection* c, int ev, void* ev_data, void* fn_data)
Net4gGetInfo(net_4g_info.map_ip, net_4g_info.operator, net_4g_info.signal_strength);
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
"{%m:%m, %m:%m, %m:%d}\n",
"{%m:%m, %m:%m, %m:%m, %m:%m, %m:%m, %m:%d}\n",
MG_ESC("mapIp"), MG_ESC(net_4g_info.map_ip),
MG_ESC("operator"), MG_ESC(net_4g_info.operator),
MG_ESC("signalIntensity"), MG_ESC(net_4g_info.signal_strength));
MG_ESC("signalIntensity"), MG_ESC(net_4g_info.signal_strength),
MG_ESC("publicIp"), MG_ESC(net_4g_info.connect_ip),
MG_ESC("publicPort"), MG_ESC(net_4g_info.connect_port),
MG_ESC("status"), net_4g_info.connect_status);
} else if (mg_http_match_uri(hm, "/net/set4gInfo")) {
struct mg_str json = hm->body;
printf("json: %s\n", json.ptr);
update_config_array(json, "$.publicIp", net_4g_info.connect_ip);
update_config_array(json, "$.publicPort", net_4g_info.connect_port);
@@ -571,18 +712,20 @@ static void fn(struct mg_connection* c, int ev, void* ev_data, void* fn_data)
mg_http_reply(c, 200, "Content-Type: application/json\r\n", "{\"status\":\"success\"}\r\n");
} else if (mg_http_match_uri(hm, "/net/getMQTTInfo")) {
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
"{%m:%m, %m:%m, %m:%m, %m:%d, %m:%d}\n",
"{%m:%m, %m:%m, %m:%m, %m:%m, %m:%d}\n",
MG_ESC("topic"), MG_ESC(net_4g_mqtt_info.topic),
MG_ESC("username"), MG_ESC(net_4g_mqtt_info.username),
MG_ESC("password"), MG_ESC(net_4g_mqtt_info.password),
MG_ESC("client_id"), net_4g_mqtt_info.client_id,
MG_ESC("clientId"), MG_ESC(net_4g_mqtt_info.client_id),
MG_ESC("status"), net_4g_mqtt_info.connect_status);
} else if (mg_http_match_uri(hm, "/net/setMQTTInfo")) {
struct mg_str json = hm->body;
printf("json: %s\n", json.ptr);
update_config_array(json, "$.topic", net_4g_mqtt_info.topic);
update_config_array(json, "$.username", net_4g_mqtt_info.username);
update_config_array(json, "$.password", net_4g_mqtt_info.password);
net_4g_mqtt_info.client_id = mg_json_get_long(json, "$.client_id", 0);
update_config_array(json, "$.clientId", net_4g_mqtt_info.client_id);
mg_http_reply(c, 200, "Content-Type: application/json\r\n", "{\"status\":\"success\"}\r\n");
} else if (mg_http_match_uri(hm, "/net/connectMQTT")) {
//enable 4G MQTT connect function
@@ -727,6 +870,11 @@ static void* do_webserver(void* args)
adapter = AdapterDeviceFindByName(ADAPTER_4G_NAME);
#endif
//4g init param
net_4g_info.net_4g_init_flag = 0;
net_4g_info.connect_status = 0;
net_4g_mqtt_info.connect_status = 0;
//lora init param
net_lora_info.bw = 2;//bw 0:125 kHz 1:250 kHz 2:500 kHz,
net_lora_info.sf = 12;//sf12