test lora p2p
|
@ -0,0 +1,116 @@
|
|||
# 基于RISC-V终端,实现LoRa节点和LoRa网关通信私有协议
|
||||
|
||||
## 1.简介
|
||||
在RISC-V终端上实现LoRa节点和LoRa网关私有协议通信功能,客户端可以通过SHELL终端连接\断开网关,并可以向网关发送数据.
|
||||
|
||||
## 2.数据结构设计说明
|
||||
|
||||
```c
|
||||
enum ClientState
|
||||
{
|
||||
CLIENT_DISCONNECT = 0,
|
||||
CLIENT_CONNECT,
|
||||
};
|
||||
struct LoraClientParam
|
||||
{
|
||||
uint8_t client_id;
|
||||
uint8_t panid;
|
||||
uint8_t gateway_id;
|
||||
enum ClientState client_state;
|
||||
int client_mtx;
|
||||
};
|
||||
```
|
||||
Lora客户端基础数据结构,`ClientState`为客户端状态,仅有断开和连接两种状态,`LoraClientParam`为客户端参数数据结构,`client_mtx`是Lora硬件互斥量.
|
||||
```c
|
||||
struct LoraGatewayParam
|
||||
{
|
||||
uint8_t gateway_id;
|
||||
uint8_t panid;
|
||||
uint8_t client_id[GATEWAY_MAX_CLIENT_NUM];
|
||||
int client_num;
|
||||
int gateway_mtx;
|
||||
};
|
||||
```
|
||||
Lora网关参数数据结构,`gateway_mtx`是Lora硬件互斥量.
|
||||
```c
|
||||
struct LoraHeaderFormat
|
||||
{
|
||||
uint8_t client_id; //1
|
||||
uint8_t panid;//1
|
||||
uint8_t gateway_id; //1
|
||||
uint8_t lora_data_type; //1
|
||||
uint8_t data; //1
|
||||
uint8_t crc_lo;
|
||||
uint8_t crc_hi; //2
|
||||
};
|
||||
enum LoraDataType
|
||||
{
|
||||
/*****C ---> G*/
|
||||
CLIENT_JOIN_NET_REQUEST = 0,
|
||||
CLIENT_QUIT_NET_REQUEST,
|
||||
CLIENT_SEND_TEST_DATA_TO_GATEWAY_REQUEST,
|
||||
/*****G ---> C*/
|
||||
GATEWAY_REPLY_CLIENT_RESULT_EXPECTED,
|
||||
GATEWAY_REPLY_CLIENT_RESULT_UN_EXPECTED,
|
||||
};
|
||||
```
|
||||
`LoraHeaderFormat`是主要的数据结构,包含基本参数,数据类型,附带数据,校验信息.`LoraDataType`标识数据报头的类型
|
||||
|
||||
```c
|
||||
static int (*gateway_handlers[])(struct Adapter*,struct LoraHeaderFormat*) =
|
||||
{
|
||||
[CLIENT_JOIN_NET_REQUEST] = ClientJoinNetHandler,
|
||||
[CLIENT_QUIT_NET_REQUEST] = ClientQuitNetHandler,
|
||||
[CLIENT_SEND_TEST_DATA_TO_GATEWAY_REQUEST] = ClientSendTestDataHandler,
|
||||
};
|
||||
```
|
||||
`gateway_handlers`是网关人物处理相关事物的映射表,网关会根据不同的信息类型调用不同的处理函数.
|
||||
|
||||
## 3.测试程序说明
|
||||
|
||||
1. 第一步: 启动网关任务
|
||||
> 网关任务启动后会一直监听信道,在接收到数据后,首先对数据进行过滤,判断是否是发送给当前网关的数据,启动网关的命令: `StartGatewayTask`
|
||||
2. 第二步: 初始化客户端,
|
||||
> `ClientInit`命令可以初始化相关参数并打开Lora设备.
|
||||
3. 第三步:客户端连接网关
|
||||
> `ClientConnect`命令可以向客户端配置的网络发送入网请求,当该入网请求被该网络中的网关接受处理后即可完成入网.
|
||||
4. 第四步:客户端发送数据
|
||||
> `ClientSend` 命令在客户端入网后可以向网关发送数据.
|
||||
5. 第五步:客户端断开连接
|
||||
> `ClientDisConnect`命令可以向客户端配置的网络发送退网请求,当该退网请求被指定网关接受处理后即可完成退网.
|
||||
|
||||
## 4. 运行结果(##需结合运行测试截图按步骤说明##)
|
||||
|
||||
1. 修改Lora的初始化和注册函数,将原来的注册函数更换为自定义的初始化函数:<br>
|
||||
在文件 `APP_Framework/Framework/framework_init.c` 第 28 行添加 外部函数声明 <br>`extern int UsrAdapterLoraInit(void);`,<br>
|
||||
将第170行的`AdapterLoraInit`改为`UsrAdapterLoraInit`.
|
||||
2. 修改对应的Makefile文件将测试代码加入编译.
|
||||
3. 在工作区终端进入指定目录并输入命令`make BOARD=edu-riscv64 menuconfig`进入配置模式:<br>
|
||||
> (1) 依次进入: `APP_Framework -> Framework `开启 `support connection framework` 并进入;<br>
|
||||
<br>
|
||||
> (2) 开启 `Using lora adapter device` 并进入<br>
|
||||
<br>
|
||||
> (3) 选择 `Lora device adapter select net role type`,将角色配置为网关角色,其他配置如下图所示<br>
|
||||
<br>
|
||||
> (4) 依次进入: `APP_Framework > Applications > test app` 开启 `Enable application test function` 并进入, 开启`Config test lora p2p`选项.<br>
|
||||
<br>
|
||||
<br>
|
||||
> (5) 保存配置.
|
||||
1. 使用命令`make BOARD=edu-riscv64`获得网关服务的运行文件,烧录进一个硬件作为网关
|
||||
2. 使用同样的方法配置编译一个客户端可执行文件并烧录(配置的第三步将其配置为客户端角色)
|
||||
3. 连接两个硬件并开始测试.
|
||||
4. 开启网关服务
|
||||
<br>
|
||||
<br>
|
||||
1. 初始化客户端
|
||||
<br>
|
||||
<br>
|
||||
1. 客户端连接网关
|
||||
<br>
|
||||
<br>
|
||||
1. 客户端发送数据到网关
|
||||
<br>
|
||||
<br>
|
||||
1. 客户端断开网关
|
||||
<br>
|
||||
<br>
|
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 186 KiB |
After Width: | Height: | Size: 201 KiB |
After Width: | Height: | Size: 113 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 155 KiB |
After Width: | Height: | Size: 199 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 203 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 189 KiB |
|
@ -0,0 +1,754 @@
|
|||
#include "test_lora_p2p.h"
|
||||
|
||||
/**************************PublicOperations*********************************/
|
||||
static const uint8_t table_crc_hi[] = {
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
|
||||
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
|
||||
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
|
||||
};
|
||||
|
||||
static const uint8_t table_crc_lo[] = {
|
||||
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
|
||||
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
|
||||
0x1E,0xDE, 0xDF, 0x1F,0xDD,0x1D,0x1C,0xDC, 0x14, 0xD4,0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
|
||||
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
|
||||
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
|
||||
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
|
||||
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
|
||||
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
|
||||
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
|
||||
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
|
||||
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
|
||||
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
|
||||
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,0x43, 0x83, 0x41, 0x81, 0x80, 0x40
|
||||
};
|
||||
|
||||
void CalCrc(uint8_t const *data_src, uint16_t raw_data_len, uint8_t* crc_lo_dst, uint8_t* crc_hi_dst)
|
||||
{
|
||||
uint8_t crc_hi = 0xFF;
|
||||
uint8_t crc_lo = 0xFF;
|
||||
unsigned int i;
|
||||
|
||||
while (raw_data_len--) {
|
||||
i = crc_hi ^ *data_src++;
|
||||
crc_hi = crc_lo ^ table_crc_hi[i];
|
||||
crc_lo = table_crc_lo[i];
|
||||
}
|
||||
*crc_lo_dst = crc_lo;
|
||||
*crc_hi_dst = crc_hi;
|
||||
}
|
||||
|
||||
int CheckCrc(uint8_t const *data_src, uint16_t raw_data_len, uint8_t crc_lo_dst, uint8_t crc_hi_dst)
|
||||
{
|
||||
uint8_t crc_hi = 0xFF;
|
||||
uint8_t crc_lo = 0xFF;
|
||||
unsigned int i;
|
||||
|
||||
while (raw_data_len--) {
|
||||
i = crc_hi ^ *data_src++;
|
||||
crc_hi = crc_lo ^ table_crc_hi[i];
|
||||
crc_lo = table_crc_lo[i];
|
||||
}
|
||||
|
||||
if (crc_lo == crc_lo_dst && crc_hi == crc_hi_dst)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint8_t crc_data_buffer[LORA_DATA_MAX_LENGTH];
|
||||
uint8_t crc_header_buffer[LORA_HEADER_RAW_LENGTH];
|
||||
|
||||
void ShowHeader(struct LoraHeaderFormat* header)
|
||||
{
|
||||
printf("Header(client_id: %X panid: %X gateway_id: %X data_type: %d data: %d crc_lo: %X crc_hi: %X)\n",header->client_id,header->panid,header->gateway_id,header->lora_data_type,header->data,header->crc_lo,header->crc_hi);
|
||||
}
|
||||
|
||||
void CalHeaderCrc(struct LoraHeaderFormat* header)
|
||||
{
|
||||
memcpy(crc_header_buffer,header,LORA_HEADER_RAW_LENGTH);
|
||||
CalCrc(crc_header_buffer,LORA_HEADER_RAW_LENGTH,&header->crc_lo,&header->crc_hi);
|
||||
ShowHeader(header);
|
||||
}
|
||||
|
||||
uint16_t CheckHeaderCrc(struct LoraHeaderFormat* header)
|
||||
{
|
||||
printf("Start the datagram integrity check: ");
|
||||
ShowHeader(header);
|
||||
|
||||
memcpy(crc_header_buffer,header,LORA_HEADER_RAW_LENGTH);
|
||||
if (0 == CheckCrc(crc_header_buffer,LORA_HEADER_RAW_LENGTH,header->crc_lo,header->crc_hi))
|
||||
{
|
||||
printf("The datagram integrity check passes\n");
|
||||
return 0;
|
||||
}
|
||||
printf("Datagram integrity check failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct LoraHeaderFormat header_send_buffer;
|
||||
struct LoraHeaderFormat header_recv_buffer;
|
||||
|
||||
static int LoraRecvHeader(struct Adapter* adapter, struct LoraHeaderFormat* header)
|
||||
{
|
||||
UserTaskDelay(1000);
|
||||
|
||||
if (LORA_HEADER_LENGTH == AdapterDeviceRecv(adapter,header,LORA_HEADER_LENGTH ))
|
||||
{
|
||||
if (0 == CheckHeaderCrc(header))
|
||||
{
|
||||
UserTaskDelay(500);
|
||||
return LORA_HEADER_LENGTH;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int LoraSendHeader(struct Adapter* adapter, struct LoraHeaderFormat* header)
|
||||
{
|
||||
UserTaskDelay(500);
|
||||
|
||||
CalHeaderCrc(header);
|
||||
|
||||
if (LORA_HEADER_LENGTH == AdapterDeviceSend(adapter,header,LORA_HEADER_LENGTH ))
|
||||
{
|
||||
UserTaskDelay(1000);
|
||||
return LORA_HEADER_LENGTH;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int LoraSendData(struct Adapter* adapter,uint8_t* src_data, uint16_t raw_data_length)
|
||||
{
|
||||
if (raw_data_length > LORA_DATA_MAX_LENGTH - 2)
|
||||
{
|
||||
printf("The amount of data exceeds the limit\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
UserTaskDelay(500);
|
||||
|
||||
CalCrc(src_data,raw_data_length,src_data + raw_data_length, src_data + raw_data_length + 1);
|
||||
|
||||
if (raw_data_length + 2 == AdapterDeviceSend(adapter,src_data,raw_data_length + 2 ))
|
||||
{
|
||||
uint8_t crc_lo = src_data[raw_data_length];
|
||||
uint8_t crc_hi = src_data[raw_data_length + 1];
|
||||
src_data[raw_data_length] = '\0';
|
||||
|
||||
printf("Send data : %s crc_lo: %X crc_hi: %X \n",src_data,crc_lo,crc_hi);
|
||||
|
||||
UserTaskDelay(1000);
|
||||
return raw_data_length + 2;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int LoraRecvData(struct Adapter* adapter, uint8_t* dest_data, uint16_t data_length)
|
||||
{
|
||||
|
||||
if (data_length > LORA_DATA_MAX_LENGTH)
|
||||
{
|
||||
printf("The amount of data exceeds the limit\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
UserTaskDelay(1000);
|
||||
|
||||
if (data_length == AdapterDeviceRecv(adapter,dest_data,data_length))
|
||||
{
|
||||
UserTaskDelay(500);
|
||||
if (0 == CheckCrc(dest_data,data_length -2,dest_data[data_length-2],dest_data[data_length-1]))
|
||||
{
|
||||
return data_length;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**************************ClientOperations*********************************/
|
||||
uint8_t client_data_send_buffer[LORA_DATA_MAX_LENGTH];
|
||||
static int LoraClientJoinNet()
|
||||
{
|
||||
struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME);
|
||||
if (adapter == NULL)
|
||||
{
|
||||
printf("Connection framework fundamental error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct LoraClientParam* client_param =(struct LoraClientParam*) adapter->adapter_param;
|
||||
|
||||
if (INSTALL != adapter->adapter_status || 0 != AdapterDeviceOpen(adapter))
|
||||
{
|
||||
printf("The Lora device failed to open\n");
|
||||
return -1;
|
||||
}
|
||||
UserMutexObtain(client_param->client_mtx, -1);
|
||||
|
||||
memset(&header_send_buffer,0,LORA_HEADER_LENGTH);
|
||||
|
||||
header_send_buffer.client_id=client_param->client_id;
|
||||
header_send_buffer.panid = client_param->panid;
|
||||
header_send_buffer.lora_data_type = CLIENT_JOIN_NET_REQUEST;
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraSendHeader(adapter,&header_send_buffer))
|
||||
{
|
||||
printf("The header of the incoming request failed to be sent\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&header_recv_buffer,0,LORA_HEADER_LENGTH);
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraRecvHeader(adapter,&header_recv_buffer))
|
||||
{
|
||||
printf("Failed to receive the gateway inbound response data\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (header_recv_buffer.lora_data_type == GATEWAY_REPLY_CLIENT_RESULT_UN_EXPECTED)
|
||||
{
|
||||
printf("The gateway cannot accept the client from the network\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
client_param->client_state = CLIENT_CONNECT;
|
||||
client_param->gateway_id = header_recv_buffer.gateway_id;
|
||||
|
||||
printf("The client successfully joins the network through the gateway\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int LoraClientSendData(void* data, uint16_t raw_data_length)
|
||||
{
|
||||
if (raw_data_length > LORA_DATA_MAX_LENGTH - 2)
|
||||
{
|
||||
printf("The data load exceeds the limit\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME);
|
||||
if (adapter == NULL)
|
||||
{
|
||||
printf("Connection framework fundamental error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct LoraClientParam* client_param =(struct LoraClientParam*) adapter->adapter_param;
|
||||
|
||||
if (INSTALL != adapter->adapter_status || 0 != AdapterDeviceOpen(adapter))
|
||||
{
|
||||
printf("The Lora device failed to open\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (client_param->client_state != CLIENT_CONNECT)
|
||||
{
|
||||
printf("This client has not connected to gateway\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
UserMutexObtain(client_param->client_mtx, -1);
|
||||
|
||||
memset(&header_send_buffer,0,LORA_HEADER_LENGTH);
|
||||
|
||||
header_send_buffer.client_id=client_param->client_id;
|
||||
header_send_buffer.panid = client_param->panid;
|
||||
header_send_buffer.gateway_id = client_param->gateway_id;
|
||||
header_send_buffer.data = raw_data_length + 2;
|
||||
header_send_buffer.lora_data_type = CLIENT_SEND_TEST_DATA_TO_GATEWAY_REQUEST;
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraSendHeader(adapter,&header_send_buffer))
|
||||
{
|
||||
printf("The header of the incoming request failed to be sent\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&header_recv_buffer,0,LORA_HEADER_LENGTH);
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraRecvHeader(adapter,&header_recv_buffer))
|
||||
{
|
||||
printf("Failed to receive the gateway inbound response data\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (header_recv_buffer.lora_data_type == GATEWAY_REPLY_CLIENT_RESULT_UN_EXPECTED)
|
||||
{
|
||||
printf("The gateway cannot accept client data\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((raw_data_length + 2)!= LoraSendData(adapter,data,raw_data_length))
|
||||
{
|
||||
printf("The client gets permission to upload the data, but the send fails\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
printf("The client successfully sends the data\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int LoraClientQuitNet()
|
||||
{
|
||||
struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME);
|
||||
if (adapter == NULL)
|
||||
{
|
||||
printf("Connection framework fundamental error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct LoraClientParam* client_param =(struct LoraClientParam*) adapter->adapter_param;
|
||||
|
||||
if (INSTALL != adapter->adapter_status || 0 != AdapterDeviceOpen(adapter))
|
||||
{
|
||||
printf("The Lora device failed to open\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
UserMutexObtain(client_param->client_mtx, -1);
|
||||
memset(&header_send_buffer,0,LORA_HEADER_LENGTH);
|
||||
|
||||
header_send_buffer.client_id=client_param->client_id;
|
||||
header_send_buffer.panid = client_param->panid;
|
||||
header_send_buffer.gateway_id = client_param->gateway_id;
|
||||
header_send_buffer.lora_data_type = CLIENT_QUIT_NET_REQUEST;
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraSendHeader(adapter,&header_send_buffer))
|
||||
{
|
||||
printf("The header of the incoming request failed to be sent\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&header_recv_buffer,0,LORA_HEADER_LENGTH);
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraRecvHeader(adapter,&header_recv_buffer))
|
||||
{
|
||||
printf("Failed to receive the gateway inbound response data\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (header_recv_buffer.lora_data_type == GATEWAY_REPLY_CLIENT_RESULT_UN_EXPECTED)
|
||||
{
|
||||
printf("Client exit from the network failed\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
client_param->client_state = CLIENT_DISCONNECT;
|
||||
client_param->gateway_id = 0;
|
||||
|
||||
printf("The client successfully quit the network through the gateway\n");
|
||||
UserMutexAbandon(client_param->client_mtx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**************************GatewayOperations*********************************/
|
||||
uint8_t gateway_recv_buffer[LORA_DATA_MAX_LENGTH];
|
||||
|
||||
static int ClientJoinNetHandler(struct Adapter* adapter,struct LoraHeaderFormat* header)
|
||||
{
|
||||
struct LoraGatewayParam* gateway_param = (struct LoraGatewayParam*)adapter->adapter_param;
|
||||
|
||||
header->gateway_id = gateway_param->gateway_id;
|
||||
|
||||
if (gateway_param->client_num == GATEWAY_MAX_CLIENT_NUM)
|
||||
{
|
||||
header->lora_data_type = GATEWAY_REPLY_CLIENT_RESULT_UN_EXPECTED;
|
||||
printf("%X : Clients connected to the gateway have reached the upper limit\n",header->client_id);
|
||||
|
||||
LoraSendHeader(adapter,header);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < gateway_param->client_num; i++)
|
||||
{
|
||||
if (gateway_param->client_id[i] == header->client_id)
|
||||
{
|
||||
header->lora_data_type = GATEWAY_REPLY_CLIENT_RESULT_EXPECTED;
|
||||
printf("%X : The client has already connected to this gateway before\n",header->client_id);
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraSendHeader(adapter,header))
|
||||
{
|
||||
printf("The gateway failed to respond to the client's network connection request\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
gateway_param->client_id[gateway_param->client_num] = header->client_id;
|
||||
gateway_param->client_num ++;
|
||||
header->lora_data_type = GATEWAY_REPLY_CLIENT_RESULT_EXPECTED;
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraSendHeader(adapter,header))
|
||||
{
|
||||
printf("The gateway failed to respond to the client's network connection request\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("%X - %X : The client joins the gateway network successfully\n",header->client_id,gateway_param->gateway_id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ClientQuitNetHandler(struct Adapter* adapter,struct LoraHeaderFormat* header)
|
||||
{
|
||||
struct LoraGatewayParam* gateway_param = (struct LoraGatewayParam*)adapter->adapter_param;
|
||||
|
||||
header->gateway_id = gateway_param->gateway_id;
|
||||
|
||||
for (int i = 0; i < gateway_param->client_num; i++)
|
||||
{
|
||||
if (gateway_param->client_id[i] == header->client_id)
|
||||
{
|
||||
for (int j = i; j < gateway_param->client_num - 1; j++)
|
||||
{
|
||||
gateway_param->client_id[j] = gateway_param->client_id[j+1];
|
||||
}
|
||||
gateway_param->client_num --;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
header->lora_data_type = GATEWAY_REPLY_CLIENT_RESULT_EXPECTED;
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraSendHeader(adapter,header))
|
||||
{
|
||||
printf("The gateway failed to respond to the client's decommissioning request\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("%X - %X : The client quit the gateway network successfully\n",header->client_id,gateway_param->gateway_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ClientSendTestDataHandler(struct Adapter* adapter,struct LoraHeaderFormat* header)
|
||||
{
|
||||
struct LoraGatewayParam* gateway_param = (struct LoraGatewayParam*)adapter->adapter_param;
|
||||
|
||||
int data_length = header->data;
|
||||
|
||||
if (data_length > LORA_DATA_MAX_LENGTH)
|
||||
{
|
||||
header->lora_data_type = GATEWAY_REPLY_CLIENT_RESULT_UN_EXPECTED;
|
||||
LoraSendHeader(adapter,header);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
header->lora_data_type = GATEWAY_REPLY_CLIENT_RESULT_EXPECTED;
|
||||
|
||||
if (LORA_HEADER_LENGTH != LoraSendHeader(adapter,header))
|
||||
{
|
||||
printf("The gateway failed to respond to a client data transfer request\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(gateway_recv_buffer,0,data_length);
|
||||
|
||||
if (data_length != LoraRecvData(adapter,gateway_recv_buffer,data_length))
|
||||
{
|
||||
printf("The gateway failed to receive client data\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint8_t crc_lo = gateway_recv_buffer[data_length - 2];
|
||||
uint8_t crc_hi = gateway_recv_buffer[data_length - 1];
|
||||
|
||||
gateway_recv_buffer[data_length - 2] = '\0';
|
||||
gateway_recv_buffer[data_length - 1] = '\0';
|
||||
|
||||
printf("Receive data: %s crc_lo: %X crc_hi: %X\n",gateway_recv_buffer,crc_lo,crc_hi);
|
||||
|
||||
//todo
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************GatewayAutoTask********************************************/
|
||||
static void * LoraGatewayAutoTask(void * parameter)
|
||||
{
|
||||
printf("Starting the gateway service...\n");
|
||||
struct Adapter* gateway_adapter = (struct Adapter*) parameter;
|
||||
struct LoraGatewayParam* gateway_param = (struct LoraGatewayParam*)gateway_adapter->adapter_param;
|
||||
|
||||
if (gateway_adapter == NULL || gateway_param == NULL)
|
||||
{
|
||||
printf("Connection framework foundation error, task exit!\n");
|
||||
goto END;
|
||||
}
|
||||
|
||||
if (INSTALL != gateway_adapter->adapter_status)
|
||||
{
|
||||
if (0 != AdapterDeviceOpen(gateway_adapter))
|
||||
{
|
||||
printf("Open lora device fail, task exit!\n");
|
||||
goto END;
|
||||
}
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
UserMutexObtain(gateway_param->gateway_mtx,-1);
|
||||
memset(&header_recv_buffer, 0, LORA_HEADER_LENGTH);
|
||||
|
||||
if (LORA_HEADER_LENGTH == LoraRecvHeader(gateway_adapter,&header_recv_buffer))
|
||||
{
|
||||
if (header_recv_buffer.panid == gateway_param->panid)
|
||||
{
|
||||
if (header_recv_buffer.gateway_id == gateway_param->gateway_id || header_recv_buffer.lora_data_type == CLIENT_JOIN_NET_REQUEST)
|
||||
{
|
||||
printf("This header is for the gateway, start processing the data header\n");
|
||||
gateway_handlers[header_recv_buffer.lora_data_type](gateway_adapter,&header_recv_buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UserMutexAbandon(gateway_param->gateway_mtx);
|
||||
}
|
||||
|
||||
END:
|
||||
printf("Gateway task end\n");
|
||||
}
|
||||
|
||||
/*******************LORA ADAPTER FUNCTION********************/
|
||||
static int UsrAdapterLoraRegister(struct Adapter *adapter)
|
||||
{
|
||||
int ret = 0;
|
||||
struct LoraGatewayParam *lora_gateway;
|
||||
struct LoraClientParam *lora_client;
|
||||
|
||||
strncpy(adapter->name, ADAPTER_LORA_NAME, NAME_NUM_MAX);
|
||||
adapter->net_protocol = PRIVATE_PROTOCOL;
|
||||
|
||||
#ifdef AS_LORA_GATEWAY_ROLE
|
||||
lora_gateway = PrivMalloc(sizeof(struct LoraGatewayParam));
|
||||
if (!lora_gateway) {
|
||||
PrivFree(lora_gateway);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(lora_gateway, 0, sizeof(struct LoraGatewayParam));
|
||||
|
||||
lora_gateway->gateway_id = DEAFULT_GATEWAY_ID;
|
||||
lora_gateway->panid = DEAFULT_PANID;
|
||||
lora_gateway->gateway_mtx = UserMutexCreate();
|
||||
if (lora_gateway->gateway_mtx < 0)
|
||||
{
|
||||
printf("create lora gateway mutex fail\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
adapter->net_role = GATEWAY;
|
||||
adapter->net_role_id = DEAFULT_GATEWAY_ID;
|
||||
adapter->adapter_param = (void *)lora_gateway;
|
||||
#else //AS_LORA_CLIENT_ROLE
|
||||
lora_client = PrivMalloc(sizeof(struct LoraClientParam));
|
||||
if (!lora_client) {
|
||||
PrivFree(lora_client);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(lora_client, 0, sizeof(struct LoraClientParam));
|
||||
|
||||
lora_client->client_id = DEAFULT_CLIENT_ID;
|
||||
lora_client->client_state = CLIENT_DISCONNECT;
|
||||
lora_client->panid = DEAFULT_PANID;
|
||||
lora_client->client_mtx = UserMutexCreate();
|
||||
if (lora_client->client_mtx < 0)
|
||||
{
|
||||
printf("create lora client mutex fail\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
adapter->net_role = CLIENT;
|
||||
adapter->net_role_id = DEAFULT_CLIENT_ID;
|
||||
adapter->adapter_param = (void *)lora_client;
|
||||
#endif
|
||||
adapter->adapter_status = UNREGISTERED;
|
||||
ret = AdapterDeviceRegister(adapter);
|
||||
if (ret < 0) {
|
||||
printf("Adapter4G register error\n");
|
||||
if (lora_gateway)
|
||||
PrivFree(lora_gateway);
|
||||
if (lora_client)
|
||||
PrivFree(lora_client);
|
||||
|
||||
return -1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int UsrAdapterLoraInit(void)
|
||||
{
|
||||
int ret = 0;
|
||||
struct Adapter *adapter = PrivMalloc(sizeof(struct Adapter));
|
||||
if (!adapter) {
|
||||
PrivFree(adapter);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(adapter, 0, sizeof(struct Adapter));
|
||||
|
||||
ret = UsrAdapterLoraRegister(adapter);
|
||||
if (ret < 0) {
|
||||
printf("AdapterLoraInit register lora adapter error\n");
|
||||
PrivFree(adapter);
|
||||
return -1;
|
||||
}
|
||||
|
||||
AdapterProductInfoType product_info = E220Attach(adapter);
|
||||
if (!product_info) {
|
||||
printf("AdapterLoraInit e220 attach error\n");
|
||||
PrivFree(adapter);
|
||||
return -1;
|
||||
}
|
||||
adapter->product_info_flag = 1;
|
||||
adapter->info = product_info;
|
||||
adapter->done = product_info->model_done;
|
||||
PrivSemaphoreCreate(&adapter->sem, 0, 0);
|
||||
PrivMutexCreate(&adapter->lock, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**********************************TestFunction***************************/
|
||||
|
||||
#ifdef AS_LORA_GATEWAY_ROLE
|
||||
struct Adapter* gateway_adapter = NULL;
|
||||
UtaskType gateway_task;
|
||||
int gateway_task_id = -1;
|
||||
|
||||
int StartGatewayTask(void)
|
||||
{
|
||||
gateway_adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME);
|
||||
printf("gateway_priv: %d\n", gateway_adapter->net_protocol);
|
||||
|
||||
if (gateway_adapter != NULL)
|
||||
{
|
||||
gateway_task.prio = 25;
|
||||
gateway_task.stack_size = 4096;
|
||||
gateway_task.func_entry = LoraGatewayAutoTask;
|
||||
gateway_task.func_param = gateway_adapter;
|
||||
strncpy(gateway_task.name,"lora_gateway_task",strlen("lora_gateway_task"));
|
||||
gateway_task_id = UserTaskCreate(gateway_task);
|
||||
if (gateway_task_id >= 0)
|
||||
{
|
||||
if (0 == UserTaskStartup(gateway_task_id))
|
||||
{
|
||||
printf("start gateway task success!\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(StartGatewayTask, start the lora gateway task, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
|
||||
int StopLoraGateway(void)
|
||||
{
|
||||
if (gateway_task_id < 0)
|
||||
{
|
||||
printf("gateway task not exist!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
UserTaskDelete(gateway_task_id);
|
||||
gateway_task_id = -1;
|
||||
printf("delete gateway task success!\n");
|
||||
}
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(StopLoraGateway, stop the lora gateway task, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
|
||||
int ShowGateway(void)
|
||||
{
|
||||
if (gateway_adapter != NULL)
|
||||
{
|
||||
struct LoraGatewayParam* gateway_param = (struct LoraGatewayParam*) gateway_adapter->adapter_param;
|
||||
printf("ROLE: Gateway\n");
|
||||
printf("panid: %X, gateway_id:%X, client_num: %X \n", gateway_param->panid, gateway_param->gateway_id,gateway_param->client_num);
|
||||
printf("clients: \n");
|
||||
for (int i = 0; i < gateway_param->client_num; i++)
|
||||
{
|
||||
printf("client %d - > %X\t",i,gateway_param->client_id[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(ShowGateway, display some info about the gateway after the task started, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
#else //AS_LORA_CLIENT_ROLE
|
||||
|
||||
struct Adapter* client_adapter = NULL;
|
||||
struct LoraClientParam * client_param = NULL;
|
||||
int client_is_init = -1;
|
||||
|
||||
uint8_t client_input_data_buffer[100];
|
||||
|
||||
void ClientInit(void)
|
||||
{
|
||||
if (0 != client_is_init)
|
||||
{
|
||||
client_adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME);
|
||||
client_param =(struct LoraClientParam *) client_adapter->adapter_param;
|
||||
|
||||
if (0 == AdapterDeviceOpen(client_adapter))
|
||||
{
|
||||
client_is_init = 0;
|
||||
printf("client init success: client_id: %X, panid: %X, gateway_id: %X, client_state: %d \n",client_param->client_id,client_param->panid,client_param->gateway_id,client_param->client_state);
|
||||
return;
|
||||
}
|
||||
}
|
||||
printf("client init success before: client_id: %X, panid: %X, gateway_id: %X, client_state: %d \n",client_param->client_id,client_param->panid,client_param->gateway_id,client_param->client_state);
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(ClientInit, init the lora client such as open the lora model etc, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
|
||||
void ShowClient(void)
|
||||
{
|
||||
printf("ROLE: client client_id: %X, panid: %X, gateway_id: %X, client_state: %d \n",client_param->client_id,client_param->panid,client_param->gateway_id,client_param->client_state);
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(ShowClient, show some info about the lora client, PRIV_SHELL_CMD_FUNC_ATTR);
|
||||
|
||||
void ClientConnect()
|
||||
{
|
||||
LoraClientJoinNet();
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(ClientConnect, connect to the certen vlan, PRIV_SHELL_CMD_FUNC_ATTR);
|
||||
|
||||
void ClientDisConnect()
|
||||
{
|
||||
LoraClientQuitNet();
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(ClientDisConnect, disconnect to the certen vlan, PRIV_SHELL_CMD_FUNC_ATTR);
|
||||
|
||||
void ClientSend(char *data)
|
||||
{
|
||||
memcpy(client_input_data_buffer,data,strlen(data));
|
||||
LoraClientSendData(client_input_data_buffer,strlen(data));
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(ClientSend, send data to gateway after connected, PRIV_SHELL_CMD_FUNC_ATTR);
|
||||
#endif
|
|
@ -0,0 +1,74 @@
|
|||
#include<adapter.h>
|
||||
#include<transform.h>
|
||||
|
||||
#define LORA_DATA_MAX_LENGTH 128
|
||||
|
||||
#define LORA_HEADER_LENGTH 7
|
||||
#define LORA_HEADER_RAW_LENGTH 5
|
||||
#define LORA_USER_DATA_MAX_LENGTH LORA_DATA_MAX_LENGTH - LORA_HEADER_LENGTH
|
||||
|
||||
#define GATEWAY_MAX_CLIENT_NUM 20
|
||||
|
||||
#define DEAFULT_PANID 0XA
|
||||
#define DEAFULT_CLIENT_ID 0XB
|
||||
#define DEAFULT_GATEWAY_ID 0XC
|
||||
|
||||
extern AdapterProductInfoType E220Attach(struct Adapter *adapter);
|
||||
|
||||
enum ClientState
|
||||
{
|
||||
CLIENT_DISCONNECT = 0,
|
||||
CLIENT_CONNECT,
|
||||
};
|
||||
|
||||
struct LoraClientParam
|
||||
{
|
||||
uint8_t client_id;
|
||||
uint8_t panid;
|
||||
uint8_t gateway_id;
|
||||
enum ClientState client_state;
|
||||
int client_mtx;
|
||||
};
|
||||
|
||||
struct LoraGatewayParam
|
||||
{
|
||||
uint8_t gateway_id;
|
||||
uint8_t panid;
|
||||
uint8_t client_id[GATEWAY_MAX_CLIENT_NUM];
|
||||
int client_num;
|
||||
int gateway_mtx;
|
||||
};
|
||||
|
||||
enum LoraDataType
|
||||
{
|
||||
/*****C ---> G*/
|
||||
CLIENT_JOIN_NET_REQUEST = 0,
|
||||
CLIENT_QUIT_NET_REQUEST,
|
||||
CLIENT_SEND_TEST_DATA_TO_GATEWAY_REQUEST,
|
||||
/*****G ---> C*/
|
||||
GATEWAY_REPLY_CLIENT_RESULT_EXPECTED,
|
||||
GATEWAY_REPLY_CLIENT_RESULT_UN_EXPECTED,
|
||||
};
|
||||
|
||||
struct LoraHeaderFormat
|
||||
{
|
||||
uint8_t client_id; //1
|
||||
uint8_t panid;//1
|
||||
uint8_t gateway_id; //1
|
||||
uint8_t lora_data_type; //1
|
||||
uint8_t data; //1
|
||||
uint8_t crc_lo;
|
||||
uint8_t crc_hi; //2
|
||||
};
|
||||
|
||||
/**************************gateway_handlers*********************************/
|
||||
static int ClientJoinNetHandler(struct Adapter* adapter,struct LoraHeaderFormat* header);
|
||||
static int ClientQuitNetHandler(struct Adapter* adapter,struct LoraHeaderFormat* header);
|
||||
static int ClientSendTestDataHandler(struct Adapter* adapter,struct LoraHeaderFormat* header);
|
||||
|
||||
static int (*gateway_handlers[])(struct Adapter*,struct LoraHeaderFormat*) =
|
||||
{
|
||||
[CLIENT_JOIN_NET_REQUEST] = ClientJoinNetHandler,
|
||||
[CLIENT_QUIT_NET_REQUEST] = ClientQuitNetHandler,
|
||||
[CLIENT_SEND_TEST_DATA_TO_GATEWAY_REQUEST] = ClientSendTestDataHandler,
|
||||
};
|