SerialProc.c 7.3 KB
#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;
}