SerialProc.c
7.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "./SerialProc.h"
#include "./ActivateMAT/ActivateMAT.h"
#include "JZsdkLib.h"
#include "JZsdk_Base/JZsdk_Code/JZsdk_SMT_Code.h"
// 负载型号 (4位)+ CN/EN + F 1(默认) + 年(1) + 月(1) + 4位的计数(1-ffff 的16进制) + 2位CRC校验位
#define SNM_PATH "/root/num" //序列号存放地址
#define SERIAL_NUMBER_LENGTH STANDARD_JZ_2_SUM_LENGTH
static int SerialNumberLength; //序列号长度
static int SerialNumberType = UNDEFINED_SNM; //序列号类型
static int SerialNumberStatus = SNM_NOT_EXISTS; //激活状态,未存在序列号
static unsigned char SerialNumber[17]; //序列号
static unsigned char DJI_SkyPort_SerialNumber[15]; //大疆转接环序列号 默认为空
static T_JZsdkReturnCode SerialMAT_NumberGet();
/******************
*
* 序列号管理模块初始化
*
* ******************/
T_JZsdkReturnCode SerialMAT_Init()
{
T_JZsdkReturnCode ret;
// 1、获取序列号与类型
ret = SerialMAT_NumberGet();
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("序列号获取错误");
}
// 2、根据上一步获取的情况,确认激活状态
ret = ActivateMAT_DeviceActivateStatus(SerialNumberType, &SerialNumberStatus);
// 3、进行属地的初始化
FOMAT_FirewareOriginRegion_Init(SerialNumberType, SerialNumber, SerialNumberLength);
JZSDK_LOG_INFO("序列号模块初始化完成");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*************
*
* 设置大疆序列号
* 固定长度14位
* ***********/
T_JZsdkReturnCode SerialMAT_Set_DJI_SkyPort_SerialNumber(char *str)
{
memcpy(DJI_SkyPort_SerialNumber, str, 14);
DJI_SkyPort_SerialNumber[14] = '\0';
}
/***************
*
* 获取序列号
*
* **************/
T_JZsdkReturnCode SerialMAT_Get_SerialNumber(char *str, int *strlen)
{
if (str != NULL)
{
memcpy(str, SerialNumber, SerialNumberLength);
}
if (strlen != NULL)
{
*strlen = SerialNumberLength;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*********
*
* 读取,并获取序列号 暂时不开启对外使用
*
* *************/
T_JZsdkReturnCode SerialMAT_Read_SerialNumber(char *str, int *strlen)
{
SerialMAT_NumberGet();
SerialMAT_Get_SerialNumber(str, strlen);
}
/******************
*
* 获取激活状态
* SNM_NOT_EXISTS = 0x0000, // (未存在序列号)
SNM_HAVE_ACTIVATED = 0x0001, // 已激活
SNM_NOT_ACTIVATED = 0x0002, // 未激活
SNM_ERROR_ACTIVATED = 0x0003, //激活错误状态
* ******************/
T_JZsdkReturnCode SerialMAT_Get_SerialNumberStatus()
{
return SerialNumberStatus;
}
/**********************************
*
* 判断是否需要激活/反激活,且进行激活或者反激活
* 输入字符串 及长度
* 无任何操作发生 返回JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE
* 有进行了激活或者 反激活 返回JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS
* *******************************/
T_JZsdkReturnCode SerialMAT_ActivateInterface(unsigned char *data, int data_length)
{
T_JZsdkReturnCode ret;
ret = ActivateMAT_ActivateInterface(SerialNumberStatus, SerialNumber, data, data_length ) ;
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return ret;
}
//操作完后,重新检测激活状态
ActivateMAT_DeviceActivateStatus(SerialNumberType, &SerialNumberStatus);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/******************
*
* 获取序列号,及序列号类型
*
* ******************/
static T_JZsdkReturnCode SerialMAT_NumberGet()
{
FILE *num_file;
char num_char[128];
memset(num_char, 0, sizeof(num_char));
memset(SerialNumber, 0, sizeof(SerialNumber));
T_JZsdkReturnCode ret;
//1、判断是否拥有大疆环的序列号
ret = JZsdk_Array_isEmpty(DJI_SkyPort_SerialNumber, sizeof(DJI_SkyPort_SerialNumber));
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
SerialNumberType = STANDARD_DJI_SNM;
//拥有转接环序列号
memcpy(SerialNumber,DJI_SkyPort_SerialNumber, sizeof(DJI_SkyPort_SerialNumber));
SerialNumberLength = sizeof(DJI_SkyPort_SerialNumber);
JZSDK_LOG_INFO("带SkyPort设备,序列号%s",SerialNumber);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//2、未有转接环序列号,正常读取序列号
num_file = fopen(SNM_PATH, "rb+");
if (num_file == NULL)
{
SerialNumberType = UNDEFINED_SNM;
JZSDK_LOG_ERROR("不存在序列号文件");
memcpy(SerialNumber, "SN none", sizeof("SN none"));
SerialNumberLength = sizeof("SN none");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
if (fseek(num_file, 0, SEEK_SET) != 0)
{
JZSDK_LOG_ERROR("序列号读取时,发生计数错误");
SerialNumberType = UNDEFINED_SNM;
memcpy(SerialNumber, "SN ERROR", sizeof("SN ERROR"));
SerialNumberLength = sizeof("SN ERROR");
fclose(num_file);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
ret = fread((char *)&num_char, 1, SERIAL_NUMBER_LENGTH, num_file);
if (ret == 0)
{
JZSDK_LOG_ERROR("序列号读取到的长度为0");
SerialNumberType = UNDEFINED_SNM;
memcpy(SerialNumber, "SN none", sizeof("SN none"));
SerialNumberLength = sizeof("SN none");
fclose(num_file);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//判断是否是极至标准1的序列号
else if ( (ret <= 14) && (ret >= 12))
{
JZSDK_LOG_INFO("标准一序列号");
SerialNumberType = STANDARD_JZ_1_SNM;
memcpy(SerialNumber, num_char, ret);
SerialNumberLength = ret;
JZSDK_LOG_INFO("序列号%s",SerialNumber);
}
//判断是否是极至标准2的序列号
//目前只靠长度判断
else if(ret == 16)
{
JZSDK_LOG_INFO("标准二序列号");
SerialNumberType = STANDARD_JZ_2_SNM;
memcpy(SerialNumber, num_char, ret);
SerialNumberLength = ret;
JZSDK_LOG_INFO("序列号%s",SerialNumber);
}
else
{
JZSDK_LOG_ERROR("序列号长度错误%d",ret);
memcpy(SerialNumber, "SN ERROR", sizeof("SN ERROR"));
SerialNumberLength = sizeof("SN ERROR");
fclose(num_file);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//检测序列号中是否存在换行符,如果有,替换成结束符
JZsdk_replace_newlines_with_null_terminator(SerialNumber);
fclose(num_file);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/******************************
*
* 设置序列号
*
*
* ************************/
T_JZsdkReturnCode SerialMAT_SetSerialNumber(unsigned char *SerialNumber, unsigned int SerialNumberLen)
{
FILE *num_file = fopen(SNM_PATH, "wb+");
if (num_file == NULL)
{
JZSDK_LOG_ERROR("写入序列号失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
if( fwrite(SerialNumber, 1, SerialNumberLen, num_file) != SerialNumberLen)
{
JZSDK_LOG_ERROR("写入序列号失败");
fclose(num_file);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
fclose(num_file);
//刷新序列号
SerialMAT_NumberGet();
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}