forked from xuos/xiuos
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user